Merge remote-tracking branch 'citadel/master' into eldritch_affairs
This commit is contained in:
@@ -236,6 +236,7 @@
|
||||
#define APHRO_TRAIT "aphro"
|
||||
#define BLOODSUCKER_TRAIT "bloodsucker"
|
||||
#define CLOTHING_TRAIT "clothing" //used for quirky carrygloves
|
||||
#define SHOES_TRAIT "shoes" //inherited from your sweet kicks
|
||||
|
||||
// unique trait sources, still defines
|
||||
#define STATUE_MUTE "statue"
|
||||
|
||||
@@ -320,8 +320,8 @@
|
||||
parts += "[FOURSPACES]<i>Nobody died this shift!</i>"
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
parts += "[FOURSPACES]Threat level: [mode.threat_level]"
|
||||
parts += "[FOURSPACES]Threat left: [mode.threat]"
|
||||
parts += "[FOURSPACES]Final threat level: [mode.threat_level]"
|
||||
parts += "[FOURSPACES]Final threat: [mode.threat]"
|
||||
parts += "[FOURSPACES]Executed rules:"
|
||||
for(var/datum/dynamic_ruleset/rule in mode.executed_rules)
|
||||
parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - <b>[rule.name]</b>: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat"
|
||||
@@ -331,7 +331,7 @@
|
||||
for(var/entry in mode.threat_tallies)
|
||||
parts += "[FOURSPACES][FOURSPACES][entry] added [mode.threat_tallies[entry]]"
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat_level,"Final threat level")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat,"Threat left")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat,"Final Threat")
|
||||
return parts.Join("<br>")
|
||||
|
||||
/client/proc/roundend_report_file()
|
||||
|
||||
@@ -400,6 +400,10 @@
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/keyed_list/antag_threat
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/number/monkeycap
|
||||
config_entry_value = 64
|
||||
min_val = 0
|
||||
|
||||
@@ -72,9 +72,9 @@
|
||||
|
||||
return {"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
|
||||
[head_content]
|
||||
</head>
|
||||
<body scroll=auto>
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
var/html = {"
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>[title]</title>
|
||||
<style>
|
||||
body {
|
||||
|
||||
+4
-4
@@ -412,13 +412,13 @@
|
||||
|
||||
switch(deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 4))
|
||||
if(G_MALE)
|
||||
set_gender(MALE, TRUE)
|
||||
set_gender(MALE, TRUE, forced = TRUE)
|
||||
if(G_FEMALE)
|
||||
set_gender(FEMALE, TRUE)
|
||||
set_gender(FEMALE, TRUE, forced = TRUE)
|
||||
if(G_PLURAL)
|
||||
set_gender(PLURAL, TRUE)
|
||||
set_gender(PLURAL, TRUE, forced = TRUE)
|
||||
else
|
||||
set_gender(NEUTER, TRUE)
|
||||
set_gender(NEUTER, TRUE, forced = TRUE)
|
||||
|
||||
/mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutations_overlay_update=0)
|
||||
..()
|
||||
|
||||
@@ -72,7 +72,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
|
||||
var/atom/target = locate(href_list["show_flavor"])
|
||||
var/text = texts_by_atom[target]
|
||||
if(text)
|
||||
usr << browse("<HTML><HEAD><TITLE>[target.name]</TITLE></HEAD><BODY><TT>[replacetext(texts_by_atom[target], "\n", "<BR>")]</TT></BODY></HTML>", "window=[target.name];size=500x200")
|
||||
usr << browse("<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[target.name]</TITLE></HEAD><BODY><TT>[replacetext(texts_by_atom[target], "\n", "<BR>")]</TT></BODY></HTML>", "window=[target.name];size=500x200")
|
||||
onclose(usr, "[target.name]")
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -15,4 +15,4 @@
|
||||
|
||||
/datum/element/sword_point/proc/point(datum/source, atom/target, mob/user, proximity_flag, params)
|
||||
if(!proximity_flag && ismob(target))
|
||||
user.visible_message("<span class='notice'>[user] points the tip of [source] at [target].</span>", "<span class='notice'>You point the tip of [src] at [target].</span>")
|
||||
user.visible_message("<span class='notice'>[user] points the tip of [source] at [target].</span>", "<span class='notice'>You point the tip of [source] at [target].</span>")
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
name = "Asteroid 1"
|
||||
description = "I-spy with my little eye, something beginning with R."
|
||||
|
||||
|
||||
/datum/map_template/ruin/space/asteroid2
|
||||
id = "asteroid2"
|
||||
suffix = "asteroid2.dmm"
|
||||
@@ -187,6 +186,7 @@
|
||||
name = "Abandoned Teleporter"
|
||||
description = "In space construction the teleporter is often the first system brought online. \
|
||||
This lonely half built teleporter is a sign of a proposed structure that for one reason or another just never got built."
|
||||
always_place = TRUE
|
||||
|
||||
/datum/map_template/ruin/space/crashedclownship
|
||||
id = "crashedclownship"
|
||||
@@ -268,6 +268,7 @@
|
||||
suffix = "whiteshipdock.dmm"
|
||||
name = "Whiteship Dock"
|
||||
description = "An abandoned but functional vessel parked in deep space, ripe for the taking."
|
||||
always_place = TRUE
|
||||
|
||||
/datum/map_template/ruin/space/cat_experiments
|
||||
id = "meow"
|
||||
@@ -287,6 +288,7 @@
|
||||
suffix = "hilbertshoteltestingsite.dmm"
|
||||
name = "Hilbert Research Facility"
|
||||
description = "A research facility of great bluespace discoveries. Long since abandoned, willingly or not..."
|
||||
|
||||
/datum/map_template/ruin/space/augmentation
|
||||
id = "augmentationfacility"
|
||||
suffix = "augmentationfacility.dmm"
|
||||
@@ -376,13 +378,13 @@
|
||||
id = "roid8"
|
||||
suffix = "roid8.dmm"
|
||||
name = "Dead wizard Roid"
|
||||
description = "Mineral asteroid. Ft. Dead wizard and toilet paradox bag."
|
||||
description = "Mineral asteroid. Ft. Dead wizard and toilet wand."
|
||||
|
||||
/datum/map_template/ruin/spacenearstation/roid9
|
||||
id = "roid9"
|
||||
suffix = "roid9.dmm"
|
||||
name = "Monitoring Roid"
|
||||
description = "Mineral asteroid. Ft. Station monitoring, syndie toolbox and erp."
|
||||
description = "Mineral asteroid. Ft. Station monitoring, toolbox and erp."
|
||||
|
||||
/datum/map_template/ruin/spacenearstation/roid10
|
||||
id = "roid10"
|
||||
|
||||
@@ -353,5 +353,5 @@ Credit where due:
|
||||
|
||||
/obj/item/paper/servant_primer/oui_getcontent(mob/target)
|
||||
if(!is_servant_of_ratvar(target) && !isobserver(target))
|
||||
return "<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)]<HR>[stamps]</BODY></HTML>"
|
||||
return "<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)]<HR>[stamps]</BODY></HTML>"
|
||||
return ..()
|
||||
|
||||
@@ -57,13 +57,13 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
|
||||
/// Target threat level right now. Events and antags will try to keep the round at this level.
|
||||
var/threat_level = 0
|
||||
/// The current antag threat. Recalculated every time a ruletype starts or ends.
|
||||
var/threat = 0
|
||||
var/threat = 0
|
||||
/// Starting threat level, for things that increase it but can bring it back down.
|
||||
var/initial_threat_level = 0
|
||||
/// Things that cause a rolling threat adjustment to be displayed at roundend.
|
||||
var/list/threat_tallies = list()
|
||||
/// Running information about the threat. Can store text or datum entries.
|
||||
var/list/threat_log = list()
|
||||
var/list/threat_log = list()
|
||||
/// As above, but with info such as refunds.
|
||||
var/list/threat_log_verbose = list()
|
||||
/// List of roundstart rules used for selecting the rules.
|
||||
@@ -150,11 +150,11 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
|
||||
GLOB.dynamic_first_midround_delay_max = CONFIG_GET(number/dynamic_first_midround_delay_max)*600
|
||||
|
||||
/datum/game_mode/dynamic/admin_panel()
|
||||
var/list/dat = list("<html><head><title>Game Mode Panel</title></head><body><h1><B>Game Mode Panel</B></h1>")
|
||||
var/list/dat = list("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Game Mode Panel</title></head><body><h1><B>Game Mode Panel</B></h1>")
|
||||
dat += "Dynamic Mode <a href='?_src_=vars;[HrefToken()];Vars=[REF(src)]'>\[VV\]</A><a href='?src=\ref[src];[HrefToken()]'>\[Refresh\]</A><BR>"
|
||||
dat += "Threat Level: <b>[threat_level]</b><br/>"
|
||||
dat += "Target threat: <b>[threat_level]</b><br/>"
|
||||
|
||||
dat += "Threat to Spend: <b>[threat]</b> <a href='?src=\ref[src];[HrefToken()];adjustthreat=1'>\[Adjust\]</A> <a href='?src=\ref[src];[HrefToken()];threatlog=1'>\[View Log\]</a><br/>"
|
||||
dat += "Current threat: <b>[threat]</b> <a href='?src=\ref[src];[HrefToken()];adjustthreat=1'>\[Adjust\]</A> <a href='?src=\ref[src];[HrefToken()];threatlog=1'>\[View Log\]</a><br/>"
|
||||
dat += "<br/>"
|
||||
dat += "Storyteller: <b>[storyteller.name]</b><br/>"
|
||||
dat += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].<br/>"
|
||||
@@ -339,9 +339,10 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
|
||||
storyteller = new GLOB.dynamic_storyteller_type // this is where all the initialization happens
|
||||
storyteller.on_start()
|
||||
SSblackbox.record_feedback("text","dynamic_storyteller",1,storyteller.name)
|
||||
message_admins("Dynamic mode parameters for the round:")
|
||||
message_admins("Centre is [GLOB.dynamic_curve_centre], Width is [GLOB.dynamic_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].")
|
||||
message_admins("Stacking limit is [GLOB.dynamic_stacking_limit], Classic secret is [GLOB.dynamic_classic_secret ? "Enabled" : "Disabled"], High population limit is [GLOB.dynamic_high_pop_limit].")
|
||||
message_admins("Dynamic mode parameters for the round:\n\
|
||||
Storyteller is [storyteller.name].\n\
|
||||
Centre is [GLOB.dynamic_curve_centre], Width is [GLOB.dynamic_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].\n\
|
||||
Stacking limit is [GLOB.dynamic_stacking_limit], Classic secret is [GLOB.dynamic_classic_secret ? "Enabled" : "Disabled"], High population limit is [GLOB.dynamic_high_pop_limit].")
|
||||
log_game("DYNAMIC: Dynamic mode parameters for the round:")
|
||||
log_game("DYNAMIC: Centre is [GLOB.dynamic_curve_centre], Width is [GLOB.dynamic_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].")
|
||||
log_game("DYNAMIC: Stacking limit is [GLOB.dynamic_stacking_limit], Classic secret is [GLOB.dynamic_classic_secret ? "Enabled" : "Disabled"], High population limit is [GLOB.dynamic_high_pop_limit].")
|
||||
@@ -403,7 +404,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
|
||||
|
||||
/datum/game_mode/dynamic/post_setup(report)
|
||||
update_playercounts()
|
||||
|
||||
|
||||
for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules)
|
||||
addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay)
|
||||
..()
|
||||
@@ -641,7 +642,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
|
||||
return TRUE
|
||||
stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.")
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/game_mode/dynamic/process()
|
||||
if (pop_last_updated < world.time - (120 SECONDS))
|
||||
pop_last_updated = world.time
|
||||
@@ -654,7 +655,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic)
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets_finished",1,rule.get_blackbox_info())
|
||||
|
||||
storyteller.do_process()
|
||||
|
||||
|
||||
if (midround_injection_cooldown < world.time)
|
||||
if (GLOB.dynamic_forced_extended)
|
||||
return
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
|
||||
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
|
||||
|
||||
var/threat = round(mode.threat_level/10)
|
||||
var/threat = CLAMP(round(mode.threat_level/10),1,10)
|
||||
if (job_check < required_enemies[threat])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
|
||||
return FALSE
|
||||
@@ -216,7 +216,7 @@
|
||||
var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len
|
||||
var/antag_count = mode.current_players[CURRENT_LIVING_ANTAGS].len
|
||||
var/max_traitors = round(player_count / 10) + 1
|
||||
if ((antag_count < max_traitors) && prob(mode.threat_level))//adding traitors if the antag population is getting low
|
||||
if ((antag_count < max_traitors) && prob(min(100,mode.threat_level)))//adding traitors if the antag population is getting low
|
||||
return ..()
|
||||
else
|
||||
return FALSE
|
||||
|
||||
@@ -53,11 +53,13 @@ Property weights are:
|
||||
if(H.stat != DEAD && is_station_level(T.z) && !("Station" in H.faction))
|
||||
threat += H.threat()
|
||||
for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS])
|
||||
if (M.stat != DEAD && M.mind && M.mind.assigned_role)
|
||||
if(length(M.mind.antag_datums))
|
||||
threat += SSjob.GetJob(M.mind.assigned_role).GetThreat()
|
||||
else
|
||||
threat -= SSjob.GetJob(M.mind.assigned_role).GetThreat()
|
||||
if (M?.mind?.assigned_role && M.stat != DEAD)
|
||||
var/datum/job/J = SSjob.GetJob(M.mind.assigned_role)
|
||||
if(J)
|
||||
if(length(M.mind.antag_datums))
|
||||
threat += J.GetThreat()
|
||||
else
|
||||
threat -= J.GetThreat()
|
||||
threat += (mode.current_players[CURRENT_DEAD_PLAYERS].len)*dead_player_weight
|
||||
return round(threat,0.1)
|
||||
|
||||
|
||||
@@ -240,10 +240,10 @@
|
||||
to_chat(AI, "<b>[U]</b> holds <a href='?_src_=usr;show_paper=1;'>\a [itemname]</a> up to one of your cameras ...")
|
||||
else
|
||||
to_chat(AI, "<b><a href='?src=[REF(AI)];track=[html_encode(U.name)]'>[U]</a></b> holds <a href='?_src_=usr;show_paper=1;'>\a [itemname]</a> up to one of your cameras ...")
|
||||
AI.last_paper_seen = "<HTML><HEAD><TITLE>[itemname]</TITLE></HEAD><BODY><TT>[info]</TT></BODY></HTML>"
|
||||
AI.last_paper_seen = "<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[itemname]</TITLE></HEAD><BODY><TT>[info]</TT></BODY></HTML>"
|
||||
else if (O.client && O.client.eye == src)
|
||||
to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...")
|
||||
O << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", itemname, info), text("window=[]", itemname))
|
||||
O << browse(text("<HTML><HEAD<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", itemname, info), text("window=[]", itemname))
|
||||
return
|
||||
|
||||
else if(istype(I, /obj/item/camera_bug))
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
icon = 'icons/obj/doors/shutters_window.dmi'
|
||||
icon_state = "closed"
|
||||
opacity = 0
|
||||
glass = 1
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/window/preopen
|
||||
icon_state = "open"
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
if(href_list["photo"])
|
||||
var/mob/M = usr
|
||||
M << browse_rsc(picture.picture_image, "pda_photo.png")
|
||||
M << browse("<html><head><title>PDA Photo</title></head>" \
|
||||
M << browse("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>PDA Photo</title></head>" \
|
||||
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
|
||||
+ "<img src='pda_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' />" \
|
||||
+ "</body></html>", "window=pdaphoto;size=[picture.psize_x]x[picture.psize_y];can-close=true")
|
||||
|
||||
@@ -42,7 +42,9 @@
|
||||
|
||||
/obj/mecha/combat/honker/get_stats_html()
|
||||
var/output = {"<html>
|
||||
<head><title>[src.name] data</title>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>[src.name] data</title>
|
||||
<style>
|
||||
body {color: #00ff00; background: #32CD32; font-family:"Courier",monospace; font-size: 12px;}
|
||||
hr {border: 1px solid #0f0; color: #fff; background-color: #000;}
|
||||
|
||||
@@ -125,6 +125,7 @@
|
||||
return
|
||||
return {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>[patient] statistics</title>
|
||||
<script language='javascript' type='text/javascript'>
|
||||
[js_byjax]
|
||||
@@ -259,7 +260,8 @@
|
||||
. = ..()
|
||||
create_reagents(max_volume, NO_REACT)
|
||||
syringes = new
|
||||
known_reagents = list(/datum/reagent/medicine/epinephrine = "Epinephrine", /datum/reagent/medicine/charcoal = "Charcoal")
|
||||
known_reagents = list(/datum/reagent/medicine/epinephrine = "Epinephrine", /datum/reagent/medicine/charcoal = "Charcoal", /datum/reagent/medicine/prussian_blue = "Prussian Blue", \
|
||||
/datum/reagent/medicine/dexalin = "Dexalin", /datum/reagent/medicine/insulin = "Insulin", /datum/reagent/medicine/kelotane = "Kelotane", /datum/reagent/medicine/bicaridine = "Bicaridine")
|
||||
processed_reagents = new
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach()
|
||||
@@ -390,6 +392,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_page()
|
||||
var/output = {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>Reagent Synthesizer</title>
|
||||
<script language='javascript' type='text/javascript'>
|
||||
[js_byjax]
|
||||
|
||||
@@ -297,7 +297,8 @@
|
||||
left_part += "<hr><a href='?src=[REF(src)];screen=main'>Return</a>"
|
||||
dat = {"<html>
|
||||
<head>
|
||||
<title>[name]</title>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>[name] data</title>
|
||||
<style>
|
||||
.res_name {font-weight: bold; text-transform: capitalize;}
|
||||
.red {color: #f00;}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/obj/machinery/computer/mecha/ui_interact(mob/user)
|
||||
. = ..()
|
||||
var/dat = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
var/dat = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
if(screen == 0)
|
||||
dat += "<h3>Tracking beacons data</h3>"
|
||||
var/list/trackerlist = list()
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
|
||||
/obj/mecha/proc/get_stats_html()
|
||||
. = {"<html>
|
||||
<head><title>[src.name] data</title>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>[name] data</title>
|
||||
<style>
|
||||
body {color: #00ff00; background: #000000; font-family:"Lucida Console",monospace; font-size: 12px;}
|
||||
hr {border: 1px solid #0f0; color: #0f0; background-color: #0f0;}
|
||||
@@ -149,7 +151,7 @@
|
||||
|
||||
|
||||
/obj/mecha/proc/get_log_html()
|
||||
. = "<html><head><title>[src.name] Log</title></head><body style='font: 13px 'Courier', monospace;'>"
|
||||
. = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[src.name] Log</title></head><body style='font: 13px 'Courier', monospace;'>"
|
||||
for(var/list/entry in log)
|
||||
. += {"<div style='font-weight: bold;'>[entry["time"]] [time2text(entry["date"],"MMM DD")] [entry["year"]]</div>
|
||||
<div style='margin-left:15px; margin-bottom:10px;'>[entry["message"]]</div>
|
||||
@@ -162,7 +164,9 @@
|
||||
if(!id_card || !user)
|
||||
return
|
||||
. = {"<html>
|
||||
<head><style>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style>
|
||||
h1 {font-size:15px;margin-bottom:4px;}
|
||||
body {color: #00ff00; background: #000000; font-family:"Courier New", Courier, monospace; font-size: 12px;}
|
||||
a {color:#0f0;}
|
||||
@@ -192,6 +196,7 @@
|
||||
return
|
||||
. = {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style>
|
||||
body {color: #00ff00; background: #000000; font-family:"Courier New", Courier, monospace; font-size: 12px;}
|
||||
a {padding:2px 5px; background:#32CD32;color:#000;display:block;margin:2px;text-align:center;text-decoration:none;}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
|
||||
/obj/item/areaeditor/attack_self(mob/user)
|
||||
add_fingerprint(user)
|
||||
. = "<BODY><HTML><head><title>[src]</title></head> \
|
||||
. = "<BODY><HTML><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\
|
||||
<title>[src]</title></head> \
|
||||
<h2>[station_name()] [src.name]</h2> \
|
||||
<small>[fluffnotice]</small><hr>"
|
||||
switch(get_area_type())
|
||||
|
||||
@@ -271,7 +271,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = "<!DOCTYPE html><html><head><title>Personal Data Assistant</title><link href=\"https://fonts.googleapis.com/css?family=Orbitron|Share+Tech+Mono|VT323\" rel=\"stylesheet\"></head><body bgcolor=\"" + background_color + "\"><style>body{" + font_mode + "}ul,ol{list-style-type: none;}a, a:link, a:visited, a:active, a:hover { color: #000000;text-decoration:none; }img {border-style:none;}a img{padding-right: 9px;}</style>"
|
||||
var/dat = "<!DOCTYPE html><html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Personal Data Assistant</title><link href=\"https://fonts.googleapis.com/css?family=Orbitron|Share+Tech+Mono|VT323\" rel=\"stylesheet\"></head><body bgcolor=\"" + background_color + "\"><style>body{" + font_mode + "}ul,ol{list-style-type: none;}a, a:link, a:visited, a:active, a:hover { color: #000000;text-decoration:none; }img {border-style:none;}a img{padding-right: 9px;}</style>"
|
||||
dat += assets.css_tag()
|
||||
dat += emoji_s.css_tag()
|
||||
|
||||
@@ -1192,7 +1192,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
if(incapacitated())
|
||||
return
|
||||
if(!isnull(aiPDA))
|
||||
var/HTML = "<html><head><title>AI PDA Message Log</title></head><body>[aiPDA.tnote]</body></html>"
|
||||
var/HTML = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>AI PDA Message Log</title></head><body>[aiPDA.tnote]</body></html>"
|
||||
user << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
|
||||
else
|
||||
to_chat(user, "You do not have a PDA. You should make an issue report about this.")
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
//book contents below
|
||||
dat = {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style>
|
||||
h1 {font-size: 18px; margin: 15px 0px 5px;}
|
||||
h2 {font-size: 15px; margin: 15px 0px 5px;}
|
||||
@@ -49,6 +50,7 @@
|
||||
title = "APLU \"Ripley\" Construction and Operation Manual"
|
||||
dat = {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style>
|
||||
h1 {font-size: 18px; margin: 15px 0px 5px;}
|
||||
h2 {font-size: 15px; margin: 15px 0px 5px;}
|
||||
@@ -122,6 +124,7 @@
|
||||
title = "Chef Recipes"
|
||||
dat = {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style>
|
||||
h1 {font-size: 18px; margin: 15px 0px 5px;}
|
||||
h2 {font-size: 15px; margin: 15px 0px 5px;}
|
||||
@@ -202,6 +205,10 @@
|
||||
author = "Syndicate"
|
||||
title = "Fission Mailed: Nuclear Sabotage 101"
|
||||
dat = {"<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
</head>
|
||||
<body>
|
||||
Nuclear Explosives 101:<br>
|
||||
Hello and thank you for choosing the Syndicate for your nuclear information needs.<br>
|
||||
Today's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.<br>
|
||||
@@ -229,6 +236,7 @@
|
||||
<b>Disk, Code, Safety, Timer, Disk, RUN!</b><br>
|
||||
Intelligence Analysts believe that normal Nanotrasen procedure is for the Captain to secure the nuclear authorisation disk.<br>
|
||||
Good luck!
|
||||
</body>
|
||||
</html>"}
|
||||
|
||||
// Wiki books that are linked to the configured wiki link.
|
||||
@@ -249,6 +257,7 @@
|
||||
dat = {"
|
||||
|
||||
<html><head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style>
|
||||
iframe {
|
||||
display: none;
|
||||
@@ -284,6 +293,7 @@
|
||||
dat = {"
|
||||
|
||||
<html><head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style>
|
||||
iframe {
|
||||
display: none;
|
||||
|
||||
@@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
||||
return
|
||||
// If H is the Chaplain, we can set the icon_state of the bible (but only once!)
|
||||
if(!GLOB.bible_icon_state && H.job == "Chaplain")
|
||||
var/dat = "<html><head><title>Pick Bible Style</title></head><body><center><h2>Pick a bible style</h2></center><table>"
|
||||
var/dat = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Pick Bible Style</title></head><body><center><h2>Pick a bible style</h2></center><table>"
|
||||
for(var/i in 1 to GLOB.biblestates.len)
|
||||
var/icon/bibleicon = icon('icons/obj/storage.dmi', GLOB.biblestates[i])
|
||||
var/nicename = GLOB.biblenames[i]
|
||||
|
||||
@@ -89,7 +89,7 @@ FLOOR SAFES
|
||||
var/obj/item/P = contents[i]
|
||||
dat += "<tr><td><a href='?src=[REF(src)];retrieve=[REF(P)]'>[P.name]</a></td></tr>"
|
||||
dat += "</table></center>"
|
||||
user << browse("<html><head><title>[name]</title></head><body>[dat]</body></html>", "window=safe;size=350x300")
|
||||
user << browse("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[name]</title></head><body>[dat]</body></html>", "window=safe;size=350x300")
|
||||
|
||||
/obj/structure/safe/Topic(href, href_list)
|
||||
if(!ishuman(usr))
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
// by default, vis_contents is inherited from the turf that was here before
|
||||
vis_contents.Cut()
|
||||
|
||||
if(color)
|
||||
add_atom_colour(color, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
assemble_baseturfs()
|
||||
|
||||
levelupdate()
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.")
|
||||
return
|
||||
|
||||
var/body = "<html><head><title>Options for [M.key]</title></head>"
|
||||
var/body = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Options for [M.key]</title></head>"
|
||||
body += "<body>Options panel for <b>[M]</b>"
|
||||
if(M.client)
|
||||
body += " played by <b>[M.client]</b> "
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
if(!SSticker.HasRoundStarted())
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
var/list/dat = list("<html><head><title>Round Status</title></head><body><h1><B>Round Status</B></h1>")
|
||||
var/list/dat = list("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Round Status</title></head><body><h1><B>Round Status</B></h1>")
|
||||
if(SSticker.mode.replacementmode)
|
||||
dat += "Former Game Mode: <B>[SSticker.mode.name]</B><BR>"
|
||||
dat += "Replacement Game Mode: <B>[SSticker.mode.replacementmode.name]</B><BR>"
|
||||
|
||||
@@ -83,7 +83,9 @@
|
||||
<hr style='background:#000000; border:0; height:1px'>"}
|
||||
qdel(query_check_unused_rank)
|
||||
else if(!action)
|
||||
output += {"<head>
|
||||
output += {"
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<title>Permissions Panel</title>
|
||||
<script type='text/javascript' src='search.js'></script>
|
||||
</head>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!check_rights())
|
||||
return
|
||||
log_admin("[key_name(usr)] checked the player panel.")
|
||||
var/dat = "<html><head><title>Player Panel</title></head>"
|
||||
var/dat = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Player Panel</title></head>"
|
||||
|
||||
//javascript, the part that does most of the work~
|
||||
dat += {"
|
||||
|
||||
@@ -79,7 +79,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
title = "Resolved Tickets"
|
||||
if(!l2b)
|
||||
return
|
||||
var/list/dat = list("<html><head><title>[title]</title></head>")
|
||||
var/list/dat = list("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[title]</title></head>")
|
||||
dat += "<A href='?_src_=holder;[HrefToken()];ahelp_tickets=[state]'>Refresh</A><br><br>"
|
||||
for(var/I in l2b)
|
||||
var/datum/admin_help/AH = I
|
||||
@@ -401,7 +401,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
|
||||
//Show the ticket panel
|
||||
/datum/admin_help/proc/TicketPanel()
|
||||
var/list/dat = list("<html><head><title>Ticket #[id]</title></head>")
|
||||
var/list/dat = list("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Ticket #[id]</title></head>")
|
||||
var/ref_src = "[REF(src)]"
|
||||
dat += "<h4>Admin Help Ticket #[id]: [LinkedReplyName(ref_src)]</h4>"
|
||||
dat += "<b>State: "
|
||||
|
||||
@@ -934,7 +934,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
id_select += "</select>"
|
||||
|
||||
var/dat = {"
|
||||
<html><head><title>Create Outfit</title></head><body>
|
||||
<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Create Outfit</title></head><body>
|
||||
<form name="outfit" action="byond://?src=[REF(src)];[HrefToken()]" method="get">
|
||||
<input type="hidden" name="src" value="[REF(src)]">
|
||||
[HrefTokenFormField()]
|
||||
@@ -1360,7 +1360,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
return
|
||||
|
||||
var/list/msg = list()
|
||||
msg += "<html><head><title>Playtime Report</title></head><body>Playtime:<BR><UL>"
|
||||
msg += "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Playtime Report</title></head><body>Playtime:<BR><UL>"
|
||||
for(var/client/C in GLOB.clients)
|
||||
msg += "<LI> - [key_name_admin(C)]: <A href='?_src_=holder;[HrefToken()];getplaytimewindow=[REF(C.mob)]'>" + C.get_exp_living() + "</a></LI>"
|
||||
msg += "</UL></BODY></HTML>"
|
||||
@@ -1377,7 +1377,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
return
|
||||
|
||||
var/list/body = list()
|
||||
body += "<html><head><title>Playtime for [C.key]</title></head><BODY><BR>Playtime:"
|
||||
body += "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Playtime for [C.key]</title></head><BODY><BR>Playtime:"
|
||||
body += C.get_exp_report()
|
||||
body += "<A href='?_src_=holder;[HrefToken()];toggleexempt=[REF(C)]'>Toggle Exempt status</a>"
|
||||
body += "</BODY></HTML>"
|
||||
|
||||
@@ -241,6 +241,9 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
|
||||
/// Gets our threat level. Defaults to threat var, override for custom stuff like different traitor goals having different threats.
|
||||
/datum/antagonist/proc/threat()
|
||||
. = CONFIG_GET(keyed_list/antag_threat)[lowertext(name)]
|
||||
if(. == null)
|
||||
return threat
|
||||
return threat
|
||||
|
||||
//This one is created by admin tools for custom objectives
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE)
|
||||
|
||||
/datum/antagonist/bloodsucker/threat()
|
||||
return threat+3*vamplevel
|
||||
return ..()+3*vamplevel
|
||||
|
||||
|
||||
/datum/antagonist/bloodsucker/proc/SelectFirstName()
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
threat = -3
|
||||
|
||||
/datum/antagonist/vamphunter/threat()
|
||||
return bad_dude ? -threat : threat
|
||||
return bad_dude ? -(..()) : ..()
|
||||
|
||||
/datum/antagonist/vamphunter/on_gain()
|
||||
|
||||
|
||||
@@ -114,7 +114,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
var/ascendable = FALSE
|
||||
|
||||
/datum/antagonist/devil/threat()
|
||||
return threat + form * 10
|
||||
return ..() + form * 10
|
||||
|
||||
/datum/antagonist/devil/can_be_owned(datum/mind/new_owner)
|
||||
. = ..()
|
||||
|
||||
@@ -4,12 +4,13 @@
|
||||
job_rank = ROLE_NINJA
|
||||
show_name_in_check_antagonists = TRUE
|
||||
antag_moodlet = /datum/mood_event/focused
|
||||
threat = 8
|
||||
var/helping_station = FALSE
|
||||
var/give_objectives = TRUE
|
||||
var/give_equipment = TRUE
|
||||
|
||||
/datum/antagonist/ninja/threat()
|
||||
return helping_station ? -8 : 8
|
||||
return helping_station ? -(..()) : ..()
|
||||
|
||||
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
|
||||
@@ -96,6 +96,13 @@
|
||||
equip(silent)
|
||||
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE)
|
||||
|
||||
/datum/antagonist/traitor/antag_panel_objectives()
|
||||
. = ..()
|
||||
if(contractor_hub?.assigned_targets && length(contractor_hub.assigned_targets))
|
||||
. += "<i><b>Contract Targets</b></i>:<br>"
|
||||
for(var/datum/mind/M in contractor_hub.assigned_targets)
|
||||
. += "<b> - </b>[key_name(M, FALSE, TRUE)]<br>"
|
||||
|
||||
/datum/antagonist/traitor/apply_innate_effects(mob/living/mob_override)
|
||||
. = ..()
|
||||
update_traitor_icons_added()
|
||||
@@ -292,4 +299,4 @@
|
||||
return SSticker.mode.name == "traitor"
|
||||
|
||||
/datum/antagonist/traitor/threat()
|
||||
return threat+traitor_kind.threat
|
||||
return (..())+traitor_kind.threat
|
||||
|
||||
@@ -645,7 +645,7 @@
|
||||
|
||||
/obj/item/spellbook/proc/wrap(content)
|
||||
var/dat = ""
|
||||
dat +="<html><head><title>Spellbook</title></head>"
|
||||
dat +="<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Spellbook</title></head>"
|
||||
dat += {"
|
||||
<head>
|
||||
<style type="text/css">
|
||||
|
||||
@@ -164,17 +164,6 @@
|
||||
/obj/item/shield/riot)
|
||||
crate_name = "riot shields crate"
|
||||
|
||||
/datum/supply_pack/security/armory/riotshotguns
|
||||
name = "Riot Shotgun Crate"
|
||||
desc = "For when the greytide gets really uppity. Contains three riot shotguns, seven rubber shot and beanbag shells. Requires Armory access to open."
|
||||
cost = 6500
|
||||
contains = list(/obj/item/gun/ballistic/shotgun/riot,
|
||||
/obj/item/gun/ballistic/shotgun/riot,
|
||||
/obj/item/gun/ballistic/shotgun/riot,
|
||||
/obj/item/storage/box/rubbershot,
|
||||
/obj/item/storage/box/beanbag)
|
||||
crate_name = "riot shotgun crate"
|
||||
|
||||
/datum/supply_pack/security/armory/russian
|
||||
name = "Russian Surplus Crate"
|
||||
desc = "Hello Comrade, we have the most modern russian military equipment the black market can offer, for the right price of course. Sadly we couldnt remove the lock so it requires Armory access to open."
|
||||
@@ -216,23 +205,6 @@
|
||||
/obj/item/clothing/gloves/combat)
|
||||
crate_name = "swat crate"
|
||||
|
||||
/datum/supply_pack/security/armory/swattasers //Lesser AEG tbh
|
||||
name = "SWAT tactical tasers Crate"
|
||||
desc = "Contains two tactical energy gun, these guns are able to tase, disable and lethal as well as hold a seclight. Requires Armory access to open."
|
||||
cost = 7000
|
||||
contains = list(/obj/item/gun/energy/e_gun/stun,
|
||||
/obj/item/gun/energy/e_gun/stun)
|
||||
crate_name = "swat taser crate"
|
||||
|
||||
/datum/supply_pack/security/armory/woodstock
|
||||
name = "WoodStock Classic Shotguns Crate"
|
||||
desc = "Contains three rustic, pumpaction shotguns. Requires Armory access to open."
|
||||
cost = 3000
|
||||
contains = list(/obj/item/gun/ballistic/shotgun,
|
||||
/obj/item/gun/ballistic/shotgun,
|
||||
/obj/item/gun/ballistic/shotgun)
|
||||
crate_name = "woodstock shotguns crate"
|
||||
|
||||
/datum/supply_pack/security/armory/wt550
|
||||
name = "WT-550 Semi-Auto Rifle Crate"
|
||||
desc = "Contains two high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open."
|
||||
@@ -260,13 +232,3 @@
|
||||
/obj/item/ammo_box/magazine/wt550m9/wtrubber,
|
||||
/obj/item/ammo_box/magazine/wt550m9/wtrubber)
|
||||
crate_name = "auto rifle ammo crate"
|
||||
|
||||
/datum/supply_pack/security/armory/wt550ammo_special
|
||||
name = "WT-550 Semi-Auto SMG Special Ammo Crate"
|
||||
desc = "Contains 2 20-round Armour Piercing and Incendiary magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
|
||||
cost = 3000
|
||||
contains = list(/obj/item/ammo_box/magazine/wt550m9/wtap,
|
||||
/obj/item/ammo_box/magazine/wt550m9/wtap,
|
||||
/obj/item/ammo_box/magazine/wt550m9/wtic,
|
||||
/obj/item/ammo_box/magazine/wt550m9/wtic)
|
||||
crate_name = "auto rifle ammo crate"
|
||||
|
||||
@@ -206,30 +206,6 @@
|
||||
/obj/item/storage/box/mre/menu4/safe)
|
||||
crate_name = "MRE crate (emergency rations)"
|
||||
|
||||
/datum/supply_pack/emergency/syndicate
|
||||
name = "NULL_ENTRY"
|
||||
desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE@&!*() "
|
||||
hidden = TRUE
|
||||
cost = 20000
|
||||
contains = list()
|
||||
crate_name = "emergency crate"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
dangerous = TRUE
|
||||
|
||||
/datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C)
|
||||
var/crate_value = 30
|
||||
var/list/uplink_items = get_uplink_items(SSticker.mode)
|
||||
while(crate_value)
|
||||
var/category = pick(uplink_items)
|
||||
var/item = pick(uplink_items[category])
|
||||
var/datum/uplink_item/I = uplink_items[category][item]
|
||||
if(!I.surplus_nullcrates || prob(100 - I.surplus_nullcrates))
|
||||
continue
|
||||
if(crate_value < I.cost)
|
||||
continue
|
||||
crate_value -= I.cost
|
||||
new I.item(C)
|
||||
|
||||
/datum/supply_pack/emergency/plasma_spacesuit
|
||||
name = "Plasmaman Space Envirosuits"
|
||||
desc = "Contains two space-worthy envirosuits for Plasmamen. Order now and we'll throw in two free helmets! Requires EVA access to open."
|
||||
|
||||
@@ -108,17 +108,6 @@
|
||||
/obj/item/clothing/gloves/color/latex/nitrile)
|
||||
crate_name = "nitrile gloves crate"
|
||||
|
||||
/datum/supply_pack/science/nuke_b_gone
|
||||
name = "Nuke Defusal Kit"
|
||||
desc = "Contains set of tools to defuse a nuke."
|
||||
cost = 7500 //Useful for traitors/nukies that fucked up
|
||||
dangerous = TRUE
|
||||
hidden = TRUE
|
||||
contains = list(/obj/item/nuke_core_container/nt,
|
||||
/obj/item/screwdriver/nuke/nt,
|
||||
/obj/item/paper/guides/nt/nuke_instructions)
|
||||
crate_name = "safe defusal kit storage"
|
||||
|
||||
/datum/supply_pack/science/plasma
|
||||
name = "Plasma Assembly Crate"
|
||||
desc = "Everything you need to burn something to the ground, this contains three plasma assembly sets. Each set contains a plasma tank, igniter, proximity sensor, and timer! Warranty void if exposed to high temperatures. Requires Toxins access to open."
|
||||
@@ -191,17 +180,6 @@
|
||||
crate_name = "slime core crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/science
|
||||
|
||||
/datum/supply_pack/science/supermater
|
||||
name = "Supermatter Extraction Tools Crate"
|
||||
desc = "Contains a set of tools to extract a sliver of supermatter. Consult your CE today!"
|
||||
cost = 7500 //Useful for traitors that fucked up
|
||||
hidden = TRUE
|
||||
contains = list(/obj/item/nuke_core_container/supermatter,
|
||||
/obj/item/scalpel/supermatter,
|
||||
/obj/item/hemostat/supermatter,
|
||||
/obj/item/paper/guides/antag/supermatter_sliver)
|
||||
crate_name = "supermatter extraction kit crate"
|
||||
|
||||
/datum/supply_pack/science/tablets
|
||||
name = "Tablet Crate"
|
||||
desc = "What's a computer? Contains five cargo tablets."
|
||||
@@ -224,10 +202,3 @@
|
||||
crate_type = /obj/structure/closet/crate/secure/science
|
||||
dangerous = TRUE
|
||||
|
||||
/datum/supply_pack/science/tech_slugs
|
||||
name = "Tech Slug Ammo Shells"
|
||||
desc = "A new type of shell that is able to be made into a few different dangerous types. Contains two boxes of tech slugs, 14 shells in all."
|
||||
cost = 1700
|
||||
contains = list(/obj/item/storage/box/techsslug,
|
||||
/obj/item/storage/box/techsslug)
|
||||
crate_name = "tech slug crate"
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
var/jobbancache = null //Used to cache this client's jobbans to save on DB queries
|
||||
var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming.
|
||||
var/last_message_count = 0 //contins a number of how many times a message identical to last_message was sent.
|
||||
///How many messages sent in the last 10 seconds
|
||||
var/total_message_count = 0
|
||||
///Next tick to reset the total message counter
|
||||
var/total_count_reset = 0
|
||||
var/ircreplyamount = 0
|
||||
|
||||
/////////
|
||||
|
||||
@@ -141,7 +141,43 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/*
|
||||
* Call back proc that should be checked in all paths where a client can send messages
|
||||
*
|
||||
* Handles checking for duplicate messages and people sending messages too fast
|
||||
*
|
||||
* The first checks are if you're sending too fast, this is defined as sending
|
||||
* SPAM_TRIGGER_AUTOMUTE messages in
|
||||
* 5 seconds, this will start supressing your messages,
|
||||
* if you send 2* that limit, you also get muted
|
||||
*
|
||||
* The second checks for the same duplicate message too many times and mutes
|
||||
* you for it
|
||||
*/
|
||||
/client/proc/handle_spam_prevention(message, mute_type)
|
||||
|
||||
//Increment message count
|
||||
total_message_count += 1
|
||||
|
||||
//store the total to act on even after a reset
|
||||
var/cache = total_message_count
|
||||
|
||||
if(total_count_reset <= world.time)
|
||||
total_message_count = 0
|
||||
total_count_reset = world.time + (5 SECONDS)
|
||||
|
||||
//If they're really going crazy, mute them
|
||||
if(cache >= SPAM_TRIGGER_AUTOMUTE * 2)
|
||||
total_message_count = 0
|
||||
total_count_reset = 0
|
||||
cmd_admin_mute(src, mute_type, 1)
|
||||
return 1
|
||||
|
||||
//Otherwise just supress the message
|
||||
else if(cache >= SPAM_TRIGGER_AUTOMUTE)
|
||||
return 1
|
||||
|
||||
|
||||
if(CONFIG_GET(flag/automute_on) && !holder && last_message == message)
|
||||
src.last_message_count++
|
||||
if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE)
|
||||
|
||||
@@ -273,7 +273,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
|
||||
return
|
||||
|
||||
var/list/body = list()
|
||||
body += "<html><head><title>Playtime for [key]</title></head><BODY><BR>Playtime:"
|
||||
body += "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Playtime for [key]</title></head><BODY><BR>Playtime:"
|
||||
body += get_exp_report()
|
||||
body += "</BODY></HTML>"
|
||||
usr << browse(body.Join(), "window=playerplaytime[ckey];size=550x615")
|
||||
|
||||
@@ -25,7 +25,15 @@
|
||||
icon_state = "sneakboots"
|
||||
item_state = "sneakboots"
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
clothing_flags = TRAIT_SILENT_STEP
|
||||
|
||||
/obj/item/clothing/shoes/combat/sneakboots/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(slot == SLOT_SHOES)
|
||||
ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT)
|
||||
|
||||
/obj/item/clothing/shoes/combat/sneakboots/dropped(mob/user)
|
||||
. = ..()
|
||||
REMOVE_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT)
|
||||
|
||||
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
|
||||
name = "\improper SWAT boots"
|
||||
|
||||
@@ -87,10 +87,10 @@
|
||||
. = ..()
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
if( !(ishuman(user) || isobserver(user) || hasSiliconAccessInArea(user)) )
|
||||
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(message)]</BODY></HTML>", "window=[name]")
|
||||
user << browse("<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[name]</TITLE></HEAD><BODY>[stars(message)]</BODY></HTML>", "window=[name]")
|
||||
onclose(user, "[name]")
|
||||
else
|
||||
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[message]</BODY></HTML>", "window=[name]")
|
||||
user << browse("<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[name]</TITLE></HEAD><BODY>[message]</BODY></HTML>", "window=[name]")
|
||||
onclose(user, "[name]")
|
||||
else
|
||||
. += "<span class='notice'>It is too far away.</span>"
|
||||
|
||||
@@ -116,3 +116,12 @@
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
|
||||
tastes = list("rice" = 1, "egg" = 1)
|
||||
foodtype = GRAIN | MEAT //EGG = MEAT -NinjaNomNom 2017
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/caesar
|
||||
name = "caesar salad"
|
||||
desc = "You too?"
|
||||
icon_state = "ceasar_salad"
|
||||
trash = /obj/item/kitchen/knife
|
||||
bonus_reagents = list(/datum/reagent/medicine/earthsblood = 1, /datum/reagent/iron = 4)
|
||||
tastes = list("iron" = 1, "conspiracy" = 1)
|
||||
foodtype = VEGETABLES
|
||||
@@ -84,3 +84,13 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/salad/validsalad
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/caesarsalad
|
||||
name = "Caesar salad"
|
||||
reqs = list(
|
||||
/obj/item/kitchen/knife = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/ambrosia/gaia = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/salad/caesar
|
||||
subcategory = CAT_SALAD
|
||||
@@ -98,8 +98,6 @@
|
||||
wine_power = 35
|
||||
tastes = list("thistle" = 2, "artichoke" = 1)
|
||||
|
||||
|
||||
|
||||
// Cabbage
|
||||
/obj/item/seeds/cabbage
|
||||
name = "pack of cabbage seeds"
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
var/total_complexity = return_total_complexity()
|
||||
var/HTML = ""
|
||||
|
||||
HTML += "<html><head><title>[name]</title></head><body>"
|
||||
HTML += "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[name]</title></head><body>"
|
||||
|
||||
HTML += "<a href='?src=[REF(src)]'>\[Refresh\]</a> | <a href='?src=[REF(src)];rename=1'>\[Rename\]</a><br>"
|
||||
HTML += "[total_part_size]/[max_components] ([round((total_part_size / max_components) * 100, 0.1)]%) space taken up in the assembly.<br>"
|
||||
|
||||
@@ -139,7 +139,7 @@ a creative player the means to solve many problems. Circuits are held inside an
|
||||
var/table_middle_width = "40%"
|
||||
|
||||
var/HTML = ""
|
||||
HTML += "<html><head><title>[src.displayed_name]</title></head><body>"
|
||||
HTML += "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[src.displayed_name]</title></head><body>"
|
||||
HTML += "<div align='center'>"
|
||||
HTML += "<table border='1' style='undefined;table-layout: fixed; width: 80%'>"
|
||||
|
||||
|
||||
@@ -95,7 +95,8 @@
|
||||
<!DOCTYPE html>
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<script>
|
||||
function hexify(num) {
|
||||
if(!num) num = 0;
|
||||
|
||||
@@ -580,7 +580,7 @@
|
||||
qdel(src)
|
||||
|
||||
/mob/dead/new_player/proc/ViewManifest()
|
||||
var/dat = "<html><body>"
|
||||
var/dat = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head><body>"
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += GLOB.data_core.get_manifest(OOC = 1)
|
||||
|
||||
|
||||
@@ -288,7 +288,8 @@
|
||||
var/output = {"
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta http-equiv='X-UA-Compatible' content='IE=edge' />
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<script src="jquery.min.js"></script>
|
||||
<script src="jquery-ui.custom-core-widgit-mouse-sortable-min.js"></script>
|
||||
<style>
|
||||
|
||||
@@ -380,6 +380,23 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
transfer_ckey(mind.current, FALSE)
|
||||
return 1
|
||||
|
||||
/mob/dead/observer/verb/stay_dead()
|
||||
set category = "Ghost"
|
||||
set name = "Do Not Resuscitate"
|
||||
if(!client)
|
||||
return
|
||||
if(!can_reenter_corpse)
|
||||
to_chat(usr, "<span class='warning'>You're already stuck out of your body!</span>")
|
||||
return FALSE
|
||||
|
||||
var/response = alert(src, "Are you sure you want to prevent (almost) all means of resuscitation? This cannot be undone. ","Are you sure you want to stay dead?","Yes","No")
|
||||
if(response != "Yes")
|
||||
return
|
||||
|
||||
can_reenter_corpse = FALSE
|
||||
to_chat(src, "You can no longer be brought back into your body.")
|
||||
return TRUE
|
||||
|
||||
/mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source, flashwindow = TRUE)
|
||||
if(flashwindow)
|
||||
window_flash(client)
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
dat = {"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
|
||||
<style type=\"text/css\">
|
||||
body { background-image:url('html/paigrid.png'); }
|
||||
|
||||
@@ -665,4 +666,4 @@
|
||||
var/dat = "<h3>Sound Synthetizer</h3>"
|
||||
dat += "<a href='byond://?src=[REF(src)];software=loudness;sub=1'>Open Synthesizer Interface</a><br>"
|
||||
dat += "<a href='byond://?src=[REF(src)];software=loudness;sub=2'>Choose Instrument Type</a>"
|
||||
return dat
|
||||
return dat
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
return aicamera.selectpicture(user)
|
||||
|
||||
/mob/living/silicon/proc/ai_roster()
|
||||
var/dat = "<html><head><title>Crew Roster</title></head><body><b>Crew Roster:</b><br><br>"
|
||||
var/dat = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Crew Roster</title></head><body><b>Crew Roster:</b><br><br>"
|
||||
|
||||
dat += GLOB.data_core.get_manifest()
|
||||
dat += "</body></html>"
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
/mob/living/simple_animal/pet/bumbles/handle_automated_movement()
|
||||
. = ..()
|
||||
if(!isturf(loc) || !CHECK_MOBILITY(src, MOBILITY_MOVE) || buckled)
|
||||
if(!isturf(loc) || buckled)
|
||||
return
|
||||
if(!resting && prob(1))
|
||||
emote("me", EMOTE_VISIBLE, pick("curls up on the surface below ", "is looking very sleepy.", "buzzes softly ", "looks around for a flower nap "))
|
||||
@@ -57,6 +57,7 @@
|
||||
else if (resting && prob(1))
|
||||
emote("me", EMOTE_VISIBLE, pick("wakes up with a smiling buzz.", "rolls upside down before waking up.", "stops resting."))
|
||||
set_resting(FALSE)
|
||||
|
||||
/mob/living/simple_animal/pet/bumbles/update_mobility()
|
||||
. = ..()
|
||||
if(stat != DEAD)
|
||||
|
||||
@@ -17,9 +17,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
response_disarm = "flails at"
|
||||
response_harm = "punches"
|
||||
icon = 'icons/mob/guardian.dmi'
|
||||
icon_state = "magicOrange"
|
||||
icon_living = "magicOrange"
|
||||
icon_dead = "magicOrange"
|
||||
icon_state = "magicbase"
|
||||
icon_living = "magicbase"
|
||||
icon_dead = "magicbase"
|
||||
speed = 0
|
||||
blood_volume = 0
|
||||
a_intent = INTENT_HARM
|
||||
@@ -42,13 +42,16 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
AIStatus = AI_OFF
|
||||
hud_type = /datum/hud/guardian
|
||||
dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it.
|
||||
var/mutable_appearance/cooloverlay
|
||||
var/guardiancolor = "#ffffff"
|
||||
var/recolorentiresprite
|
||||
var/theme
|
||||
var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS]
|
||||
var/reset = 0 //if the summoner has reset the guardian already
|
||||
var/cooldown = 0
|
||||
var/mob/living/carbon/summoner
|
||||
var/range = 13 //how far from the user the spirit can be
|
||||
var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses
|
||||
var/datum/guardianname/namedatum = new/datum/guardianname()
|
||||
var/playstyle_string = "<span class='holoparasite bold'>You are a standard Guardian. You shouldn't exist!</span>"
|
||||
var/magic_fluff_string = "<span class='holoparasite'>You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!</span>"
|
||||
var/tech_fluff_string = "<span class='holoparasite'>BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!</span>"
|
||||
@@ -56,7 +59,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/Initialize(mapload, theme)
|
||||
GLOB.parasites += src
|
||||
setthemename(theme)
|
||||
updatetheme(theme)
|
||||
|
||||
. = ..()
|
||||
|
||||
@@ -79,42 +82,36 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
GLOB.parasites -= src
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/proc/setthemename(pickedtheme) //set the guardian's theme to something cool!
|
||||
if(!pickedtheme)
|
||||
pickedtheme = pick("magic", "tech", "carp")
|
||||
var/list/possible_names = list()
|
||||
switch(pickedtheme)
|
||||
/mob/living/simple_animal/hostile/guardian/proc/updatetheme(theme) //update the guardian's theme
|
||||
if(!theme)
|
||||
theme = pick("magic", "tech", "carp")
|
||||
switch(theme)//should make it easier to create new stand designs in the future if anyone likes that
|
||||
if("magic")
|
||||
for(var/type in (subtypesof(/datum/guardianname/magic) - namedatum.type))
|
||||
possible_names += new type
|
||||
name = "Guardian Spirit"
|
||||
real_name = "Guardian Spirit"
|
||||
bubble_icon = "guardian"
|
||||
icon_state = "magicbase"
|
||||
icon_living = "magicbase"
|
||||
icon_dead = "magicbase"
|
||||
if("tech")
|
||||
for(var/type in (subtypesof(/datum/guardianname/tech) - namedatum.type))
|
||||
possible_names += new type
|
||||
name = "Holoparasite"
|
||||
real_name = "Holoparasite"
|
||||
bubble_icon = "holo"
|
||||
icon_state = "techbase"
|
||||
icon_living = "techbase"
|
||||
icon_dead = "techbase"
|
||||
if("carp")
|
||||
for(var/type in (subtypesof(/datum/guardianname/carp) - namedatum.type))
|
||||
possible_names += new type
|
||||
namedatum = pick(possible_names)
|
||||
updatetheme(pickedtheme)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/proc/updatetheme(theme) //update the guardian's theme to whatever its datum is; proc for adminfuckery
|
||||
name = "[namedatum.prefixname] [namedatum.suffixcolour]"
|
||||
real_name = "[name]"
|
||||
icon_living = "[namedatum.parasiteicon]"
|
||||
icon_state = "[namedatum.parasiteicon]"
|
||||
icon_dead = "[namedatum.parasiteicon]"
|
||||
bubble_icon = "[namedatum.bubbleicon]"
|
||||
|
||||
if (namedatum.stainself)
|
||||
add_atom_colour(namedatum.colour, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
//Special case holocarp, because #snowflake code
|
||||
if(theme == "carp")
|
||||
speak_emote = list("gnashes")
|
||||
desc = "A mysterious fish that stands by its charge, ever vigilant."
|
||||
|
||||
attacktext = "bites"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
|
||||
name = "Holocarp"
|
||||
real_name = "Holocarp"
|
||||
bubble_icon = "holo"
|
||||
icon_state = "holocarp"
|
||||
icon_living = "holocarp"
|
||||
icon_dead = "holocarp"
|
||||
speak_emote = list("gnashes")
|
||||
desc = "A mysterious fish that stands by its charge, ever vigilant."
|
||||
attacktext = "bites"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
recolorentiresprite = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/Login() //if we have a mind, set its name to ours when it logs in
|
||||
..()
|
||||
@@ -123,10 +120,37 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
if(!summoner)
|
||||
to_chat(src, "<span class='holoparasite bold'>For some reason, somehow, you have no summoner. Please report this bug immediately.</span>")
|
||||
return
|
||||
to_chat(src, "<span class='holoparasite'>You are <font color=\"[namedatum.colour]\"><b>[real_name]</b></font>, bound to serve [summoner.real_name].</span>")
|
||||
to_chat(src, "<span class='holoparasite'>You are a <b>[real_name]</b>, bound to serve [summoner.real_name].</span>")
|
||||
to_chat(src, "<span class='holoparasite'>You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.</span>")
|
||||
to_chat(src, "<span class='holoparasite'>While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.</span>")
|
||||
to_chat(src, playstyle_string)
|
||||
guardiancustomize()
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/proc/guardiancustomize()
|
||||
guardianrecolor()
|
||||
guardianrename()
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/proc/guardianrecolor()
|
||||
guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null
|
||||
if(!guardiancolor) //redo proc until we get a color
|
||||
to_chat(src, "<span class='warning'>Not a valid color, please try again.</span>")
|
||||
guardianrecolor()
|
||||
return
|
||||
if(!recolorentiresprite)
|
||||
cooloverlay.color = guardiancolor
|
||||
cut_overlay(cooloverlay) //we need to get our new color
|
||||
add_overlay(cooloverlay)
|
||||
else
|
||||
add_atom_colour(guardiancolor, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/proc/guardianrename()
|
||||
var/new_name = sanitize_name(reject_bad_text(stripped_input(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN)))
|
||||
if(!new_name) //redo proc until we get a good name
|
||||
to_chat(src, "<span class='warning'>Not a valid name, please try again.</span>")
|
||||
guardianrename()
|
||||
return
|
||||
visible_message("<span class='notice'>Your new name <span class='name'>[new_name]</span> anchors itself in your mind.</span>")
|
||||
fully_replace_character_name(null, new_name)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies
|
||||
. = ..()
|
||||
@@ -366,7 +390,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
return
|
||||
|
||||
var/preliminary_message = "<span class='holoparasite bold'>[input]</span>" //apply basic color/bolding
|
||||
var/my_message = "<font color=\"[namedatum.colour]\"><b><i>[src]:</i></b></font> [preliminary_message]" //add source, color source with the guardian's color
|
||||
var/my_message = "<font color=\"[guardiancolor]\"><b><i>[src]:</i></b></font> [preliminary_message]" //add source, color source with the guardian's color
|
||||
|
||||
to_chat(summoner, my_message)
|
||||
var/list/guardians = summoner.hasparasites()
|
||||
@@ -393,7 +417,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
var/list/guardians = hasparasites()
|
||||
for(var/para in guardians)
|
||||
var/mob/living/simple_animal/hostile/guardian/G = para
|
||||
to_chat(G, "<font color=\"[G.namedatum.colour]\"><b><i>[src]:</i></b></font> [preliminary_message]" )
|
||||
to_chat(G, "<font color=\"[G.guardiancolor]\"><b><i>[src]:</i></b></font> [preliminary_message]" )
|
||||
for(var/M in GLOB.dead_mob_list)
|
||||
var/link = FOLLOW_LINK(M, src)
|
||||
to_chat(M, "[link] [my_message]")
|
||||
@@ -424,27 +448,29 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
if(guardians.len)
|
||||
var/mob/living/simple_animal/hostile/guardian/G = input(src, "Pick the guardian you wish to reset", "Guardian Reset") as null|anything in guardians
|
||||
if(G)
|
||||
to_chat(src, "<span class='holoparasite'>You attempt to reset <font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font>'s personality...</span>")
|
||||
to_chat(src, "<span class='holoparasite'>You attempt to reset <font color=\"[G.guardiancolor]\"><b>[G.real_name]</b></font>'s personality...</span>")
|
||||
var/list/mob/candidates = pollGhostCandidates("Do you want to play as [src.real_name]'s [G.real_name]?", ROLE_PAI, null, FALSE, 100)
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/C = pick(candidates)
|
||||
to_chat(G, "<span class='holoparasite'>Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.</span>")
|
||||
to_chat(src, "<span class='holoparasite bold'>Your <font color=\"[G.namedatum.colour]\">[G.real_name]</font> has been successfully reset.</span>")
|
||||
to_chat(src, "<span class='holoparasite bold'>Your <font color=\"[G.guardiancolor]\">[G.real_name]</font> has been successfully reset.</span>")
|
||||
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(G)])")
|
||||
G.ghostize(FALSE)
|
||||
G.setthemename(G.namedatum.theme) //give it a new color, to show it's a new person
|
||||
G.guardiancustomize() //give it a new color, to show it's a new person
|
||||
C.transfer_ckey(G)
|
||||
G.reset = 1
|
||||
switch(G.namedatum.theme)
|
||||
switch(G.theme)
|
||||
if("tech")
|
||||
to_chat(src, "<span class='holoparasite'><font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font> is now online!</span>")
|
||||
to_chat(src, "<span class='holoparasite'><font color=\"[G.guardiancolor]\"><b>[G.real_name]</b></font> is now online!</span>")
|
||||
if("magic")
|
||||
to_chat(src, "<span class='holoparasite'><font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font> has been summoned!</span>")
|
||||
to_chat(src, "<span class='holoparasite'><font color=\"[G.guardiancolor]\"><b>[G.real_name]</b></font> has been summoned!</span>")
|
||||
if("carp")
|
||||
to_chat(src, "<span class='holoparasite'><font color=\"[G.guardiancolor]\"><b>[G.real_name]</b></font> has been caught!</span>")
|
||||
guardians -= G
|
||||
if(!guardians.len)
|
||||
verbs -= /mob/living/proc/guardian_reset
|
||||
else
|
||||
to_chat(src, "<span class='holoparasite'>There were no ghosts willing to take control of <font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font>. Looks like you're stuck with it for now.</span>")
|
||||
to_chat(src, "<span class='holoparasite'>There were no ghosts willing to take control of <font color=\"[G.guardiancolor]\"><b>[G.real_name]</b></font>. Looks like you're stuck with it for now.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='holoparasite'>You decide not to reset [guardians.len > 1 ? "any of your guardians":"your guardian"].</span>")
|
||||
else
|
||||
@@ -558,6 +584,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
used = FALSE
|
||||
return
|
||||
var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user, theme)
|
||||
G.name = mob_name
|
||||
G.summoner = user
|
||||
G.key = key
|
||||
G.mind.enslave_mind_to_creator(user)
|
||||
@@ -565,13 +592,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
switch(theme)
|
||||
if("tech")
|
||||
to_chat(user, "[G.tech_fluff_string]")
|
||||
to_chat(user, "<span class='holoparasite'><font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font> is now online!</span>")
|
||||
to_chat(user, "<span class='holoparasite'><b>[G.real_name]</b> is now online!</span>")
|
||||
if("magic")
|
||||
to_chat(user, "[G.magic_fluff_string]")
|
||||
to_chat(user, "<span class='holoparasite'><font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font> has been summoned!</span>")
|
||||
to_chat(user, "<span class='holoparasite'><b>[G.real_name]</b> has been summoned!</span>")
|
||||
if("carp")
|
||||
to_chat(user, "[G.carp_fluff_string]")
|
||||
to_chat(user, "<span class='holoparasite'><font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font> has been caught!</span>")
|
||||
to_chat(user, "<span class='holoparasite'><b>[G.real_name]</b> has been caught!</span>")
|
||||
user.verbs += /mob/living/proc/guardian_comm
|
||||
user.verbs += /mob/living/proc/guardian_recall
|
||||
user.verbs += /mob/living/proc/guardian_reset
|
||||
@@ -600,6 +627,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
|
||||
/obj/item/guardiancreator/tech/choose/traitor
|
||||
possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
|
||||
allowling = FALSE
|
||||
|
||||
/obj/item/guardiancreator/tech/choose/traitor/check_uplink_validity()
|
||||
return !used
|
||||
@@ -683,8 +711,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
failure_message = "<span class='holoparasite bold'>You couldn't catch any carp spirits from the seas of Lake Carp. Maybe there are none, maybe you fucked up.</span>"
|
||||
ling_failure = "<span class='holoparasite bold'>Carp'sie is fine with changelings, so you shouldn't be seeing this message.</span>"
|
||||
allowmultiple = TRUE
|
||||
allowling = TRUE
|
||||
random = TRUE
|
||||
|
||||
/obj/item/guardiancreator/carp/choose
|
||||
random = FALSE
|
||||
|
||||
@@ -1,161 +0,0 @@
|
||||
|
||||
/datum/guardianname
|
||||
var/prefixname = "Default" //the prefix the guardian uses for its name
|
||||
var/suffixcolour = "Name" //the suffix the guardian uses for its name
|
||||
var/parasiteicon = "techbase" //the icon of the guardian
|
||||
var/bubbleicon = "holo" //the speechbubble icon of the guardian
|
||||
var/theme = "tech" //what the actual theme of the guardian is
|
||||
var/colour = "#C3C3C3" //what color the guardian's name is in chat and what color is used for effects from the guardian
|
||||
var/stainself = 0 //whether to use the color var to literally dye ourself our chosen colour, for lazy spriting
|
||||
|
||||
/datum/guardianname/carp
|
||||
bubbleicon = "guardian"
|
||||
theme = "carp"
|
||||
parasiteicon = "holocarp"
|
||||
stainself = 1
|
||||
|
||||
/datum/guardianname/carp/New()
|
||||
prefixname = pick(GLOB.carp_names)
|
||||
|
||||
/datum/guardianname/carp/sand
|
||||
suffixcolour = "Sand"
|
||||
colour = "#C2B280"
|
||||
|
||||
/datum/guardianname/carp/seashell
|
||||
suffixcolour = "Seashell"
|
||||
colour = "#FFF5EE"
|
||||
|
||||
/datum/guardianname/carp/coral
|
||||
suffixcolour = "Coral"
|
||||
colour = "#FF7F50"
|
||||
|
||||
/datum/guardianname/carp/salmon
|
||||
suffixcolour = "Salmon"
|
||||
colour = "#FA8072"
|
||||
|
||||
/datum/guardianname/carp/sunset
|
||||
suffixcolour = "Sunset"
|
||||
colour = "#FAD6A5"
|
||||
|
||||
/datum/guardianname/carp/riptide
|
||||
suffixcolour = "Riptide"
|
||||
colour = "#89D9C8"
|
||||
|
||||
/datum/guardianname/carp/seagreen
|
||||
suffixcolour = "Sea Green"
|
||||
colour = "#2E8B57"
|
||||
|
||||
/datum/guardianname/carp/ultramarine
|
||||
suffixcolour = "Ultramarine"
|
||||
colour = "#3F00FF"
|
||||
|
||||
/datum/guardianname/carp/cerulean
|
||||
suffixcolour = "Cerulean"
|
||||
colour = "#007BA7"
|
||||
|
||||
/datum/guardianname/carp/aqua
|
||||
suffixcolour = "Aqua"
|
||||
colour = "#00FFFF"
|
||||
|
||||
/datum/guardianname/carp/paleaqua
|
||||
suffixcolour = "Pale Aqua"
|
||||
colour = "#BCD4E6"
|
||||
|
||||
/datum/guardianname/carp/hookergreen
|
||||
suffixcolour = "Hooker Green"
|
||||
colour = "#49796B"
|
||||
|
||||
/datum/guardianname/magic
|
||||
bubbleicon = "guardian"
|
||||
theme = "magic"
|
||||
|
||||
/datum/guardianname/magic/New()
|
||||
prefixname = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces", "Ophiuchus")
|
||||
|
||||
/datum/guardianname/magic/red
|
||||
suffixcolour = "Red"
|
||||
parasiteicon = "magicRed"
|
||||
colour = "#E32114"
|
||||
|
||||
/datum/guardianname/magic/pink
|
||||
suffixcolour = "Pink"
|
||||
parasiteicon = "magicPink"
|
||||
colour = "#FB5F9B"
|
||||
|
||||
/datum/guardianname/magic/orange
|
||||
suffixcolour = "Orange"
|
||||
parasiteicon = "magicOrange"
|
||||
colour = "#F3CF24"
|
||||
|
||||
/datum/guardianname/magic/green
|
||||
suffixcolour = "Green"
|
||||
parasiteicon = "magicGreen"
|
||||
colour = "#A4E836"
|
||||
|
||||
/datum/guardianname/magic/blue
|
||||
suffixcolour = "Blue"
|
||||
parasiteicon = "magicBlue"
|
||||
colour = "#78C4DB"
|
||||
|
||||
/datum/guardianname/tech/New()
|
||||
prefixname = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium")
|
||||
|
||||
/datum/guardianname/tech/rose
|
||||
suffixcolour = "Rose"
|
||||
parasiteicon = "techRose"
|
||||
colour = "#F62C6B"
|
||||
|
||||
/datum/guardianname/tech/peony
|
||||
suffixcolour = "Peony"
|
||||
parasiteicon = "techPeony"
|
||||
colour = "#E54750"
|
||||
|
||||
/datum/guardianname/tech/lily
|
||||
suffixcolour = "Lily"
|
||||
parasiteicon = "techLily"
|
||||
colour = "#F6562C"
|
||||
|
||||
/datum/guardianname/tech/daisy
|
||||
suffixcolour = "Daisy"
|
||||
parasiteicon = "techDaisy"
|
||||
colour = "#ECCD39"
|
||||
|
||||
/datum/guardianname/tech/zinnia
|
||||
suffixcolour = "Zinnia"
|
||||
parasiteicon = "techZinnia"
|
||||
colour = "#89F62C"
|
||||
|
||||
/datum/guardianname/tech/ivy
|
||||
suffixcolour = "Ivy"
|
||||
parasiteicon = "techIvy"
|
||||
colour = "#5DF62C"
|
||||
|
||||
/datum/guardianname/tech/iris
|
||||
suffixcolour = "Iris"
|
||||
parasiteicon = "techIris"
|
||||
colour = "#2CF6B8"
|
||||
|
||||
/datum/guardianname/tech/petunia
|
||||
suffixcolour = "Petunia"
|
||||
parasiteicon = "techPetunia"
|
||||
colour = "#51A9D4"
|
||||
|
||||
/datum/guardianname/tech/violet
|
||||
suffixcolour = "Violet"
|
||||
parasiteicon = "techViolet"
|
||||
colour = "#8A347C"
|
||||
|
||||
/datum/guardianname/tech/lotus
|
||||
suffixcolour = "Lotus"
|
||||
parasiteicon = "techLotus"
|
||||
colour = "#463546"
|
||||
|
||||
/datum/guardianname/tech/lilac
|
||||
suffixcolour = "Lilac"
|
||||
parasiteicon = "techLilac"
|
||||
colour = "#C7A0F6"
|
||||
|
||||
/datum/guardianname/tech/orchid
|
||||
suffixcolour = "Orchid"
|
||||
parasiteicon = "techOrchid"
|
||||
colour = "#F62CF5"
|
||||
@@ -77,7 +77,7 @@
|
||||
user.ex_act(EXPLODE_HEAVY)
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='holoparasite'>[src] glows with a strange <font color=\"[spawner.namedatum.colour]\">light</font>, and you don't touch it.</span>")
|
||||
to_chat(user, "<span class='holoparasite'>[src] glows with a strange <font color=\"[spawner.guardiancolor]\">light</font>, and you don't touch it.</span>")
|
||||
|
||||
/obj/guardian_bomb/Bump(atom/A)
|
||||
detonate(A)
|
||||
@@ -93,4 +93,4 @@
|
||||
/obj/guardian_bomb/examine(mob/user)
|
||||
. = stored_obj.examine(user)
|
||||
if(get_dist(user,src)<=2)
|
||||
. += "<span class='holoparasite'>It glows with a strange <font color=\"[spawner.namedatum.colour]\">light</font>!</span>"
|
||||
. += "<span class='holoparasite'>It glows with a strange <font color=\"[spawner.guardiancolor]\">light</font>!</span>"
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
. = ..()
|
||||
if(. > 0 && toggle)
|
||||
var/image/I = new('icons/effects/effects.dmi', src, "shield-flash", MOB_LAYER+0.01, dir = pick(GLOB.cardinals))
|
||||
if(namedatum)
|
||||
I.color = namedatum.colour
|
||||
if(guardiancolor)
|
||||
I.color = guardiancolor
|
||||
flick_overlay_view(I, src, 5)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/protector/ToggleMode()
|
||||
@@ -39,8 +39,8 @@
|
||||
toggle = FALSE
|
||||
else
|
||||
var/mutable_appearance/shield_overlay = mutable_appearance('icons/effects/effects.dmi', "shield-grey")
|
||||
if(namedatum)
|
||||
shield_overlay.color = namedatum.colour
|
||||
if(guardiancolor)
|
||||
shield_overlay.color = guardiancolor
|
||||
add_overlay(shield_overlay)
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
@@ -59,7 +59,7 @@
|
||||
visible_message("<span class='danger'>\The [src] jumps back to its user.</span>")
|
||||
Recall(TRUE)
|
||||
else
|
||||
to_chat(summoner, "<span class='holoparasite'>You moved out of range, and were pulled back! You can only move [range] meters from <font color=\"[namedatum.colour]\"><b>[real_name]</b></font>!</span>")
|
||||
to_chat(summoner, "<span class='holoparasite'>You moved out of range, and were pulled back! You can only move [range] meters from <font color=\"[guardiancolor]\"><b>[real_name]</b></font>!</span>")
|
||||
summoner.visible_message("<span class='danger'>\The [summoner] jumps back to [summoner.p_their()] protector.</span>")
|
||||
new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner))
|
||||
summoner.forceMove(get_turf(src))
|
||||
|
||||
@@ -55,8 +55,8 @@
|
||||
. = ..()
|
||||
if(istype(., /obj/item/projectile))
|
||||
var/obj/item/projectile/P = .
|
||||
if(namedatum)
|
||||
P.color = namedatum.colour
|
||||
if(guardiancolor)
|
||||
P.color = guardiancolor
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight()
|
||||
var/msg
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
C.adjustOxyLoss(-5)
|
||||
C.adjustToxLoss(-5, forced = TRUE)
|
||||
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C))
|
||||
if(namedatum)
|
||||
H.color = namedatum.colour
|
||||
if(guardiancolor)
|
||||
H.color = guardiancolor
|
||||
if(C == summoner)
|
||||
update_health_hud()
|
||||
med_hud_set_health()
|
||||
@@ -96,8 +96,8 @@
|
||||
|
||||
/obj/structure/receiving_pad/New(loc, mob/living/simple_animal/hostile/guardian/healer/G)
|
||||
. = ..()
|
||||
if(G.namedatum)
|
||||
add_atom_colour(G.namedatum.colour, FIXED_COLOUR_PRIORITY)
|
||||
if(G.guardiancolor)
|
||||
add_atom_colour(G.guardiancolor, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/structure/receiving_pad/proc/disappear()
|
||||
visible_message("[src] vanishes!")
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
/obj/item/clothing/shoes/space_ninja/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(slot == SLOT_SHOES)
|
||||
ADD_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]")
|
||||
ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT)
|
||||
|
||||
/obj/item/clothing/shoes/space_ninja/dropped(mob/user)
|
||||
. = ..()
|
||||
REMOVE_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]")
|
||||
REMOVE_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT)
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
var/obj/item/P = contents[i]
|
||||
dat += "<tr><td><a href='?src=[REF(src)];retrieve=[REF(P)]'>[P.name]</a></td></tr>"
|
||||
dat += "</table></center>"
|
||||
user << browse("<html><head><title>[name]</title></head><body>[dat]</body></html>", "window=filingcabinet;size=350x300")
|
||||
user << browse("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[name]</title></head><body>[dat]</body></html>", "window=filingcabinet;size=350x300")
|
||||
|
||||
/obj/structure/filingcabinet/attack_tk(mob/user)
|
||||
if(anchored)
|
||||
|
||||
@@ -62,11 +62,11 @@
|
||||
/obj/item/paper/oui_getcontent(mob/target)
|
||||
if(!target.is_literate() || force_stars)
|
||||
force_stars = FALSE
|
||||
return "<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)]<HR>[stamps]</BODY></HTML>"
|
||||
return "<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)]<HR>[stamps]</BODY></HTML>"
|
||||
else if(istype(target.get_active_held_item(), /obj/item/pen) | istype(target.get_active_held_item(), /obj/item/toy/crayon))
|
||||
return "<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[info_links]<HR>[stamps]</BODY><div align='right'style='position:fixed;bottom:0;font-style:bold;'><A href='?src=[REF(src)];help=1'>\[?\]</A></div></HTML>"
|
||||
return "<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[name]</TITLE></HEAD><BODY>[info_links]<HR>[stamps]</BODY><div align='right'style='position:fixed;bottom:0;font-style:bold;'><A href='?src=[REF(src)];help=1'>\[?\]</A></div></HTML>"
|
||||
else
|
||||
return "<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[info]<HR>[stamps]</BODY></HTML>"
|
||||
return "<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>[name]</TITLE></HEAD><BODY>[info]<HR>[stamps]</BODY></HTML>"
|
||||
|
||||
/obj/item/paper/oui_canview(mob/target)
|
||||
if(check_rights_for(target.client, R_FUN)) //Allows admins to view faxes
|
||||
@@ -231,7 +231,7 @@
|
||||
|
||||
|
||||
/obj/item/paper/proc/openhelp(mob/user)
|
||||
user << browse({"<HTML><HEAD><TITLE>Paper Help</TITLE></HEAD>
|
||||
user << browse({"<HTML><HEAD><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><TITLE>Paper Help</TITLE></HEAD>
|
||||
<BODY>
|
||||
You can use backslash (\\) to escape special characters.<br>
|
||||
<br>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
to_chat(user, "<span class='warning'>[src] seems to be blank...</span>")
|
||||
return
|
||||
user << browse_rsc(picture.picture_image, "tmp_photo.png")
|
||||
user << browse("<html><head><title>[name]</title></head>" \
|
||||
user << browse("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>[name]</title></head>" \
|
||||
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
|
||||
+ "<img src='tmp_photo.png' width='480' style='-ms-interpolation-mode:nearest-neighbor' />" \
|
||||
+ "[scribble ? "<br>Written on the back:<br><i>[scribble]</i>" : ""]"\
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
name = "scatter laser shell"
|
||||
desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a scatter laser weapon in a ballistic package."
|
||||
icon_state = "lshell"
|
||||
projectile_type = /obj/item/projectile/beam/weak
|
||||
projectile_type = /obj/item/projectile/beam/scatter
|
||||
pellets = 6
|
||||
variance = 35
|
||||
|
||||
@@ -130,12 +130,16 @@
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/bioterror
|
||||
desc = "A shotgun dart filled with deadly toxins."
|
||||
desc = "A shotgun dart filled with an obscene amount of lethal reagents. God help whoever is shot with this."
|
||||
projectile_type = /obj/item/projectile/bullet/dart/piercing
|
||||
reagent_amount = 50
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent(/datum/reagent/toxin/fentanyl, 6)
|
||||
reagents.add_reagent(/datum/reagent/toxin/spore, 6)
|
||||
reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 6) //;HELP OPS IN MAINT
|
||||
reagents.add_reagent(/datum/reagent/toxin/coniine, 6)
|
||||
reagents.add_reagent(/datum/reagent/toxin/sodium_thiopental, 6)
|
||||
reagents.add_reagent(/datum/reagent/toxin/amanitin, 12) //for a nasty surprise after you get shot and somehow escape and don't think to quickly purge, and even shock those who are loaded up on purging agents
|
||||
reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 6)
|
||||
reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 6) //;HELPIES OPS IN MAINT
|
||||
reagents.add_reagent(/datum/reagent/impedrezene, 6)
|
||||
reagents.add_reagent(/datum/reagent/toxin/acid/fluacid, 5) //this and the acid equal about 25ish burn, not counting the minute toxin damage dealt by their metabolism, this makes each dart about as lethal as a stechkin shot in upfront damage
|
||||
reagents.add_reagent(/datum/reagent/toxin/acid, 5)
|
||||
reagents.add_reagent(/datum/reagent/consumable/frostoil, 10) //tempgun slowdown goes both ways and adds to the burn
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
icon_state = "dshotgun"
|
||||
item_state = "shotgun"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
weapon_weight = WEAPON_MEDIUM
|
||||
force = 10
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
/obj/item/projectile/beam/scatter
|
||||
name = "laser pellet"
|
||||
icon_state = "scatterlaser"
|
||||
damage = 5
|
||||
damage = 12.5
|
||||
|
||||
/obj/item/projectile/beam/xray
|
||||
name = "\improper X-ray beam"
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
reagents.handle_reactions()
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/item/projectile/bullet/dart/piercing
|
||||
piercing = TRUE
|
||||
|
||||
/obj/item/projectile/bullet/dart/metalfoam/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent(/datum/reagent/aluminium, 15)
|
||||
|
||||
@@ -18,13 +18,28 @@
|
||||
/obj/item/projectile/bullet/shotgun_stunslug
|
||||
name = "stunslug"
|
||||
damage = 5
|
||||
stamina = 20
|
||||
knockdown = 100
|
||||
stamina = 30
|
||||
stutter = 5
|
||||
jitter = 20
|
||||
range = 7
|
||||
icon_state = "spark"
|
||||
color = "#FFFF00"
|
||||
var/tase_duration = 50
|
||||
|
||||
/obj/item/projectile/bullet/shotgun_stunslug/on_hit(atom/target, blocked = FALSE)
|
||||
. = ..()
|
||||
if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks!
|
||||
do_sparks(1, TRUE, src)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased)
|
||||
SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK)
|
||||
C.IgniteMob()
|
||||
if(C.dna && C.dna.check_mutation(HULK))
|
||||
C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
|
||||
else if(tase_duration && (C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE) && !HAS_TRAIT(C, TRAIT_TASED_RESISTANCE))
|
||||
C.electrocute_act(15, src, 1, SHOCK_NOSTUN)
|
||||
C.apply_status_effect(STATUS_EFFECT_TASED_WEAK, tase_duration)
|
||||
|
||||
/obj/item/projectile/bullet/shotgun_meteorslug
|
||||
name = "meteorslug"
|
||||
@@ -93,7 +108,6 @@
|
||||
|
||||
/obj/item/projectile/bullet/scattershot
|
||||
damage = 20
|
||||
stamina = 65
|
||||
|
||||
/obj/item/projectile/bullet/seed
|
||||
damage = 4
|
||||
|
||||
@@ -65,7 +65,6 @@
|
||||
var/refund_amount = 0 // specified refund amount in case there needs to be a TC penalty for refunds.
|
||||
var/refundable = FALSE
|
||||
var/surplus = 100 // Chance of being included in the surplus crate.
|
||||
var/surplus_nullcrates //Chance of being included in null crates. null = pull from surplus
|
||||
var/cant_discount = FALSE
|
||||
var/limited_stock = -1 //Setting this above zero limits how many times this item can be bought by the same traitor in a round, -1 is unlimited
|
||||
var/list/include_modes = list() // Game modes to allow this item in.
|
||||
@@ -76,11 +75,6 @@
|
||||
var/restricted = FALSE // Adds restrictions for VR/Events
|
||||
var/illegal_tech = TRUE // Can this item be deconstructed to unlock certain techweb research nodes?
|
||||
|
||||
/datum/uplink_item/New()
|
||||
. = ..()
|
||||
if(isnull(surplus_nullcrates))
|
||||
surplus_nullcrates = surplus
|
||||
|
||||
/datum/uplink_item/proc/get_discount()
|
||||
return pick(4;0.75,2;0.5,1;0.25)
|
||||
|
||||
|
||||
@@ -56,6 +56,13 @@
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun
|
||||
cost = 12
|
||||
|
||||
/datum/uplink_item/ammo/shotgun/bioterror
|
||||
name = "12g Bioterror Dart Drum"
|
||||
desc = "An additional 8-round bioterror dart magazine for use with the Bulldog shotgun. \
|
||||
Pierces armor and injects are horrid cocktail of death into your target. Be careful about friendly fire."
|
||||
cost = 6 //legacy price
|
||||
item = /obj/item/ammo_box/magazine/m12g/bioterror
|
||||
|
||||
/datum/uplink_item/ammo/shotgun/buck
|
||||
name = "12g Buckshot Drum"
|
||||
desc = "An additional 8-round buckshot magazine for use with the Bulldog shotgun. Front towards enemy."
|
||||
@@ -66,20 +73,12 @@
|
||||
desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. \
|
||||
'I'm a fire starter, twisted fire starter!'"
|
||||
item = /obj/item/ammo_box/magazine/m12g/dragon
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/shotgun/meteor
|
||||
name = "12g Meteorslug Shells"
|
||||
desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \
|
||||
Great for blasting airlocks off their frames and knocking down enemies."
|
||||
item = /obj/item/ammo_box/magazine/m12g/meteor
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/shotgun/scatter
|
||||
name = "12g Scatter Laser shot Slugs"
|
||||
desc = "An alternative 8-round Scatter Laser Shot magazine for use in the Bulldog shotgun."
|
||||
item = /obj/item/ammo_box/magazine/m12g/scatter
|
||||
cost = 4 // most armor has less laser protection then bullet
|
||||
|
||||
/datum/uplink_item/ammo/shotgun/slug
|
||||
name = "12g Slug Drum"
|
||||
@@ -93,7 +92,6 @@
|
||||
desc = "An alternative 8-round stun slug magazine for use with the Bulldog shotgun. \
|
||||
Saying that they're completely non-lethal would be lying."
|
||||
item = /obj/item/ammo_box/magazine/m12g/stun
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/revolver
|
||||
name = ".357 Speed Loader"
|
||||
|
||||
Reference in New Issue
Block a user