Merge branch 'master' into tgfusion
This commit is contained in:
@@ -54,12 +54,16 @@
|
||||
only_current_user_can_interact = TRUE
|
||||
|
||||
/obj/machinery/vr_sleeper/hugbox/emag_act(mob/user)
|
||||
return
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
|
||||
/obj/machinery/vr_sleeper/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(you_die_in_the_game_you_die_for_real)
|
||||
return
|
||||
you_die_in_the_game_you_die_for_real = TRUE
|
||||
sparks.start()
|
||||
addtimer(CALLBACK(src, .proc/emagNotify), 150)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/vr_sleeper/update_icon()
|
||||
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
|
||||
|
||||
@@ -423,6 +423,25 @@
|
||||
if(GLOB.master_mode == "secret")
|
||||
dat += "<A href='?src=[REF(src)];[HrefToken()];f_secret=1'>(Force Secret Mode)</A><br>"
|
||||
|
||||
if(GLOB.master_mode == "dynamic")
|
||||
if(SSticker.current_state <= GAME_STATE_PREGAME)
|
||||
dat += "<A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart=1'>(Force Roundstart Rulesets)</A><br>"
|
||||
if (GLOB.dynamic_forced_roundstart_ruleset.len > 0)
|
||||
for(var/datum/dynamic_ruleset/roundstart/rule in GLOB.dynamic_forced_roundstart_ruleset)
|
||||
dat += {"<A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_remove=\ref[rule]'>-> [rule.name] <-</A><br>"}
|
||||
dat += "<A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_clear=1'>(Clear Rulesets)</A><br>"
|
||||
dat += "<A href='?src=[REF(src)];[HrefToken()];f_dynamic_options=1'>(Dynamic mode options)</A><br>"
|
||||
else if (SSticker.IsRoundInProgress())
|
||||
dat += "<A href='?src=[REF(src)];[HrefToken()];f_dynamic_latejoin=1'>(Force Next Latejoin Ruleset)</A><br>"
|
||||
if (SSticker && SSticker.mode && istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
if (mode.forced_latejoin_rule)
|
||||
dat += {"<A href='?src=[REF(src)];[HrefToken()];f_dynamic_latejoin_clear=1'>-> [mode.forced_latejoin_rule.name] <-</A><br>"}
|
||||
dat += "<A href='?src=[REF(src)];[HrefToken()];f_dynamic_midround=1'>(Execute Midround Ruleset!)</A><br>"
|
||||
dat += "<hr/>"
|
||||
if(SSticker.IsRoundInProgress())
|
||||
dat += "<a href='?src=[REF(src)];[HrefToken()];gamemode_panel=1'>(Game Mode Panel)</a><BR>"
|
||||
|
||||
dat += {"
|
||||
<BR>
|
||||
<A href='?src=[REF(src)];[HrefToken()];create_object=1'>Create Object</A><br>
|
||||
@@ -839,6 +858,44 @@
|
||||
browser.set_content(dat.Join())
|
||||
browser.open()
|
||||
|
||||
/datum/admins/proc/dynamic_mode_options(mob/user)
|
||||
var/dat = {"
|
||||
<center><B><h2>Dynamic Mode Options</h2></B></center><hr>
|
||||
<br/>
|
||||
<h3>Common options</h3>
|
||||
<i>All these options can be changed midround.</i> <br/>
|
||||
<br/>
|
||||
<b>Force extended:</b> - Option is <a href='?src=[REF(src)];[HrefToken()];f_dynamic_force_extended=1'> <b>[GLOB.dynamic_forced_extended ? "ON" : "OFF"]</a></b>.
|
||||
<br/>This will force the round to be extended. No rulesets will be drafted. <br/>
|
||||
<br/>
|
||||
<b>No stacking:</b> - Option is <a href='?src=[REF(src)];[HrefToken()];f_dynamic_no_stacking=1'> <b>[GLOB.dynamic_no_stacking ? "ON" : "OFF"]</b></a>.
|
||||
<br/>Unless the threat goes above [GLOB.dynamic_stacking_limit], only one "round-ender" ruleset will be drafted. <br/>
|
||||
<br/>
|
||||
<b>Classic secret mode:</b> - Option is <a href='?src=[REF(src)];[HrefToken()];f_dynamic_classic_secret=1'> <b>[GLOB.dynamic_classic_secret ? "ON" : "OFF"]</b></a>.
|
||||
<br/>Only one roundstart ruleset will be drafted. Only traitors and minor roles will latespawn. <br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<b>Forced threat level:</b> Current value : <a href='?src=[REF(src)];[HrefToken()];f_dynamic_forced_threat=1'><b>[GLOB.dynamic_forced_threat_level]</b></a>.
|
||||
<br/>The value threat is set to if it is higher than -1.<br/>
|
||||
<br/>
|
||||
<b>High population limit:</b> Current value : <a href='?src=[REF(src)];[HrefToken()];f_dynamic_high_pop_limit=1'><b>[GLOB.dynamic_high_pop_limit]</b></a>.
|
||||
<br/>The threshold at which "high population override" will be in effect. <br/>
|
||||
<br/>
|
||||
<b>Stacking threeshold:</b> Current value : <a href='?src=[REF(src)];[HrefToken()];f_dynamic_stacking_limit=1'><b>[GLOB.dynamic_stacking_limit]</b></a>.
|
||||
<br/>The threshold at which "round-ender" rulesets will stack. A value higher than 100 ensure this never happens. <br/>
|
||||
<h3>Advanced parameters</h3>
|
||||
Curve centre: <A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_centre=1'>-> [GLOB.dynamic_curve_centre] <-</A><br>
|
||||
Curve width: <A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_width=1'>-> [GLOB.dynamic_curve_width] <-</A><br>
|
||||
Latejoin injection delay:<br>
|
||||
Minimum: <A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_latejoin_min=1'>-> [GLOB.dynamic_latejoin_delay_min / 60 / 10] <-</A> Minutes<br>
|
||||
Maximum: <A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_latejoin_max=1'>-> [GLOB.dynamic_latejoin_delay_max / 60 / 10] <-</A> Minutes<br>
|
||||
Midround injection delay:<br>
|
||||
Minimum: <A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_midround_min=1'>-> [GLOB.dynamic_midround_delay_min / 60 / 10] <-</A> Minutes<br>
|
||||
Maximum: <A href='?src=[REF(src)];[HrefToken()];f_dynamic_roundstart_midround_max=1'>-> [GLOB.dynamic_midround_delay_max / 60 / 10] <-</A> Minutes<br>
|
||||
"}
|
||||
|
||||
user << browse(dat, "window=dyn_mode_options;size=900x650")
|
||||
|
||||
/datum/admins/proc/create_or_modify_area()
|
||||
set category = "Debug"
|
||||
set name = "Create or modify area"
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
H.real_name = random_unique_name(H.gender)
|
||||
H.name = H.real_name
|
||||
H.underwear = random_underwear(H.gender)
|
||||
H.undie_color = random_color()
|
||||
H.undie_color = random_short_color()
|
||||
H.undershirt = random_undershirt(H.gender)
|
||||
H.shirt_color = random_color()
|
||||
H.shirt_color = random_short_color()
|
||||
H.skin_tone = random_skin_tone()
|
||||
H.hair_style = random_hair_style(H.gender)
|
||||
H.facial_hair_style = random_facial_hair_style(H.gender)
|
||||
@@ -34,7 +34,8 @@
|
||||
H.dna.features["frills"] = pick(GLOB.frills_list)
|
||||
H.dna.features["spines"] = pick(GLOB.spines_list)
|
||||
H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
|
||||
H.dna.features["moth_wings"] = pick(GLOB.moth_wings_list)
|
||||
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
|
||||
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
|
||||
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
|
||||
@@ -422,7 +422,7 @@
|
||||
H.equip_to_slot_or_del(I, SLOT_W_UNIFORM)
|
||||
qdel(olduniform)
|
||||
if(droptype == "Yes")
|
||||
I.item_flags |= NODROP
|
||||
ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT)
|
||||
else
|
||||
to_chat(H, "You're not kawaii enough for this.")
|
||||
|
||||
|
||||
+292
-2
@@ -291,6 +291,11 @@
|
||||
else if(href_list["editrights"])
|
||||
edit_rights_topic(href_list)
|
||||
|
||||
else if(href_list["gamemode_panel"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
SSticker.mode.admin_panel()
|
||||
|
||||
else if(href_list["call_shuttle"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -1342,6 +1347,291 @@
|
||||
|
||||
else if(href_list["f_secret"])
|
||||
return HandleFSecret()
|
||||
|
||||
else if(href_list["f_dynamic_roundstart"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode.", null, null, null, null)
|
||||
var/roundstart_rules = list()
|
||||
for (var/rule in subtypesof(/datum/dynamic_ruleset/roundstart))
|
||||
var/datum/dynamic_ruleset/roundstart/newrule = new rule()
|
||||
roundstart_rules[newrule.name] = newrule
|
||||
var/added_rule = input(usr,"What ruleset do you want to force? This will bypass threat level and population restrictions.", "Rigging Roundstart", null) as null|anything in roundstart_rules
|
||||
if (added_rule)
|
||||
GLOB.dynamic_forced_roundstart_ruleset += roundstart_rules[added_rule]
|
||||
log_admin("[key_name(usr)] set [added_rule] to be a forced roundstart ruleset.")
|
||||
message_admins("[key_name(usr)] set [added_rule] to be a forced roundstart ruleset.", 1)
|
||||
Game()
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_clear"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
GLOB.dynamic_forced_roundstart_ruleset = list()
|
||||
Game()
|
||||
log_admin("[key_name(usr)] cleared the rigged roundstart rulesets. The mode will pick them as normal.")
|
||||
message_admins("[key_name(usr)] cleared the rigged roundstart rulesets. The mode will pick them as normal.", 1)
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_remove"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/datum/dynamic_ruleset/roundstart/rule = locate(href_list["f_dynamic_roundstart_remove"])
|
||||
GLOB.dynamic_forced_roundstart_ruleset -= rule
|
||||
Game()
|
||||
log_admin("[key_name(usr)] removed [rule] from the forced roundstart rulesets.")
|
||||
message_admins("[key_name(usr)] removed [rule] from the forced roundstart rulesets.", 1)
|
||||
|
||||
else if(href_list["f_dynamic_latejoin"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(!SSticker || !SSticker.mode)
|
||||
return alert(usr, "The game must start first.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
var/latejoin_rules = list()
|
||||
for (var/rule in subtypesof(/datum/dynamic_ruleset/latejoin))
|
||||
var/datum/dynamic_ruleset/latejoin/newrule = new rule()
|
||||
latejoin_rules[newrule.name] = newrule
|
||||
var/added_rule = input(usr,"What ruleset do you want to force upon the next latejoiner? This will bypass threat level and population restrictions.", "Rigging Latejoin", null) as null|anything in latejoin_rules
|
||||
if (added_rule)
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
mode.forced_latejoin_rule = latejoin_rules[added_rule]
|
||||
log_admin("[key_name(usr)] set [added_rule] to proc on the next latejoin.")
|
||||
message_admins("[key_name(usr)] set [added_rule] to proc on the next latejoin.", 1)
|
||||
Game()
|
||||
|
||||
else if(href_list["f_dynamic_latejoin_clear"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if (SSticker && SSticker.mode && istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
mode.forced_latejoin_rule = null
|
||||
Game()
|
||||
log_admin("[key_name(usr)] cleared the forced latejoin ruleset.")
|
||||
message_admins("[key_name(usr)] cleared the forced latejoin ruleset.", 1)
|
||||
|
||||
else if(href_list["f_dynamic_midround"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(!SSticker || !SSticker.mode)
|
||||
return alert(usr, "The game must start first.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
var/midround_rules = list()
|
||||
for (var/rule in subtypesof(/datum/dynamic_ruleset/midround))
|
||||
var/datum/dynamic_ruleset/midround/newrule = new rule()
|
||||
midround_rules[newrule.name] = rule
|
||||
var/added_rule = input(usr,"What ruleset do you want to force right now? This will bypass threat level and population restrictions.", "Execute Ruleset", null) as null|anything in midround_rules
|
||||
if (added_rule)
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
log_admin("[key_name(usr)] executed the [added_rule] ruleset.")
|
||||
message_admins("[key_name(usr)] executed the [added_rule] ruleset.", 1)
|
||||
mode.picking_specific_rule(midround_rules[added_rule],1)
|
||||
|
||||
else if (href_list["f_dynamic_options"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_centre"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
var/new_centre = input(usr,"Change the centre of the dynamic mode threat curve. A negative value will give a more peaceful round ; a positive value, a round with higher threat. Any number between -5 and +5 is allowed.", "Change curve centre", null) as num
|
||||
if (new_centre < -5 || new_centre > 5)
|
||||
return alert(usr, "Only values between -5 and +5 are allowed.", null, null, null, null)
|
||||
|
||||
log_admin("[key_name(usr)] changed the distribution curve center to [new_centre].")
|
||||
message_admins("[key_name(usr)] changed the distribution curve center to [new_centre]", 1)
|
||||
GLOB.dynamic_curve_centre = new_centre
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_width"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
var/new_width = input(usr,"Change the width of the dynamic mode threat curve. A higher value will favour extreme rounds ; a lower value, a round closer to the average. Any Number between 0.5 and 4 are allowed.", "Change curve width", null) as num
|
||||
if (new_width < 0.5 || new_width > 4)
|
||||
return alert(usr, "Only values between 0.5 and +2.5 are allowed.", null, null, null, null)
|
||||
|
||||
log_admin("[key_name(usr)] changed the distribution curve width to [new_width].")
|
||||
message_admins("[key_name(usr)] changed the distribution curve width to [new_width]", 1)
|
||||
GLOB.dynamic_curve_width = new_width
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_latejoin_min"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
var/new_min = input(usr,"Change the minimum delay of latejoin injection in minutes.", "Change latejoin injection delay minimum", null) as num
|
||||
if(new_min <= 0)
|
||||
return alert(usr, "The minimum can't be zero or lower.", null, null, null, null)
|
||||
if((new_min MINUTES) > GLOB.dynamic_latejoin_delay_max)
|
||||
return alert(usr, "The minimum must be lower than the maximum.", null, null, null, null)
|
||||
|
||||
log_admin("[key_name(usr)] changed the latejoin injection minimum delay to [new_min] minutes.")
|
||||
message_admins("[key_name(usr)] changed the latejoin injection minimum delay to [new_min] minutes", 1)
|
||||
GLOB.dynamic_latejoin_delay_min = (new_min MINUTES)
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_latejoin_max"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
var/new_max = input(usr,"Change the maximum delay of latejoin injection in minutes.", "Change latejoin injection delay maximum", null) as num
|
||||
if(new_max <= 0)
|
||||
return alert(usr, "The maximum can't be zero or lower.", null, null, null, null)
|
||||
if((new_max MINUTES) < GLOB.dynamic_latejoin_delay_min)
|
||||
return alert(usr, "The maximum must be higher than the minimum.", null, null, null, null)
|
||||
|
||||
log_admin("[key_name(usr)] changed the latejoin injection maximum delay to [new_max] minutes.")
|
||||
message_admins("[key_name(usr)] changed the latejoin injection maximum delay to [new_max] minutes", 1)
|
||||
GLOB.dynamic_latejoin_delay_max = (new_max MINUTES)
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_midround_min"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
var/new_min = input(usr,"Change the minimum delay of midround injection in minutes.", "Change midround injection delay minimum", null) as num
|
||||
if(new_min <= 0)
|
||||
return alert(usr, "The minimum can't be zero or lower.", null, null, null, null)
|
||||
if((new_min MINUTES) > GLOB.dynamic_midround_delay_max)
|
||||
return alert(usr, "The minimum must be lower than the maximum.", null, null, null, null)
|
||||
|
||||
log_admin("[key_name(usr)] changed the midround injection minimum delay to [new_min] minutes.")
|
||||
message_admins("[key_name(usr)] changed the midround injection minimum delay to [new_min] minutes", 1)
|
||||
GLOB.dynamic_midround_delay_min = (new_min MINUTES)
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_roundstart_midround_max"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
var/new_max = input(usr,"Change the maximum delay of midround injection in minutes.", "Change midround injection delay maximum", null) as num
|
||||
if(new_max <= 0)
|
||||
return alert(usr, "The maximum can't be zero or lower.", null, null, null, null)
|
||||
if((new_max MINUTES) > GLOB.dynamic_midround_delay_max)
|
||||
return alert(usr, "The maximum must be higher than the minimum.", null, null, null, null)
|
||||
|
||||
log_admin("[key_name(usr)] changed the midround injection maximum delay to [new_max] minutes.")
|
||||
message_admins("[key_name(usr)] changed the midround injection maximum delay to [new_max] minutes", 1)
|
||||
GLOB.dynamic_midround_delay_max = (new_max MINUTES)
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_force_extended"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
GLOB.dynamic_forced_extended = !GLOB.dynamic_forced_extended
|
||||
log_admin("[key_name(usr)] set 'forced_extended' to [GLOB.dynamic_forced_extended].")
|
||||
message_admins("[key_name(usr)] set 'forced_extended' to [GLOB.dynamic_forced_extended].")
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_no_stacking"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
GLOB.dynamic_no_stacking = !GLOB.dynamic_no_stacking
|
||||
log_admin("[key_name(usr)] set 'no_stacking' to [GLOB.dynamic_no_stacking].")
|
||||
message_admins("[key_name(usr)] set 'no_stacking' to [GLOB.dynamic_no_stacking].")
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_classic_secret"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
GLOB.dynamic_classic_secret = !GLOB.dynamic_classic_secret
|
||||
log_admin("[key_name(usr)] set 'classic_secret' to [GLOB.dynamic_classic_secret].")
|
||||
message_admins("[key_name(usr)] set 'classic_secret' to [GLOB.dynamic_classic_secret].")
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_stacking_limit"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num
|
||||
log_admin("[key_name(usr)] set 'stacking_limit' to [GLOB.dynamic_stacking_limit].")
|
||||
message_admins("[key_name(usr)] set 'stacking_limit' to [GLOB.dynamic_stacking_limit].")
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_high_pop_limit"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
var/new_value = input(usr, "Enter the high-pop override threshold for dynamic mode.", "High pop override") as num
|
||||
if (new_value < 0)
|
||||
return alert(usr, "Only positive values allowed!", null, null, null, null)
|
||||
GLOB.dynamic_high_pop_limit = new_value
|
||||
|
||||
log_admin("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].")
|
||||
message_admins("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].")
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["f_dynamic_forced_threat"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(SSticker && SSticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
|
||||
if(GLOB.master_mode != "dynamic")
|
||||
return alert(usr, "The game mode has to be dynamic mode!", null, null, null, null)
|
||||
|
||||
var/new_value = input(usr, "Enter the forced threat level for dynamic mode.", "Forced threat level") as num
|
||||
if (new_value > 100)
|
||||
return alert(usr, "The value must be be under 100.", null, null, null, null)
|
||||
GLOB.dynamic_forced_threat_level = new_value
|
||||
|
||||
log_admin("[key_name(usr)] set 'forced_threat_level' to [GLOB.dynamic_forced_threat_level].")
|
||||
message_admins("[key_name(usr)] set 'forced_threat_level' to [GLOB.dynamic_forced_threat_level].")
|
||||
dynamic_mode_options(usr)
|
||||
|
||||
else if(href_list["c_mode2"])
|
||||
if(!check_rights(R_ADMIN|R_SERVER))
|
||||
@@ -1882,14 +2172,14 @@
|
||||
return
|
||||
|
||||
var/mob/M = locate(href_list["CentComReply"])
|
||||
usr.client.admin_headset_message(M, "CentCom")
|
||||
usr.client.admin_headset_message(M, RADIO_CHANNEL_CENTCOM)
|
||||
|
||||
else if(href_list["SyndicateReply"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/mob/M = locate(href_list["SyndicateReply"])
|
||||
usr.client.admin_headset_message(M, "Syndicate")
|
||||
usr.client.admin_headset_message(M, RADIO_CHANNEL_SYNDICATE)
|
||||
|
||||
else if(href_list["HeadsetMessage"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
set category = null
|
||||
set name = "Admin PM Mob"
|
||||
if(!holder)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM-Context: Only administrators may use this command.</span>")
|
||||
return
|
||||
if( !ismob(M) || !M.client )
|
||||
return
|
||||
@@ -18,7 +18,7 @@
|
||||
set category = "Admin"
|
||||
set name = "Admin PM"
|
||||
if(!holder)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM-Panel: Only administrators may use this command.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM-Panel: Only administrators may use this command.</span>")
|
||||
return
|
||||
var/list/client/targets[0]
|
||||
for(var/client/T)
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
/client/proc/cmd_ahelp_reply(whom)
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: You are unable to use admin PM-s (muted).</span>")
|
||||
return
|
||||
var/client/C
|
||||
if(istext(whom))
|
||||
@@ -48,7 +48,7 @@
|
||||
C = whom
|
||||
if(!C)
|
||||
if(holder)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: Client not found.</span>")
|
||||
return
|
||||
|
||||
var/datum/admin_help/AH = C.current_ticket
|
||||
@@ -65,12 +65,12 @@
|
||||
//Fetching a message if needed. src is the sender and C is the target client
|
||||
/client/proc/cmd_admin_pm(whom, msg)
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: You are unable to use admin PM-s (muted).</span>")
|
||||
return
|
||||
|
||||
if(!holder && !current_ticket) //no ticket? https://www.youtube.com/watch?v=iHSPf6x1Fdo
|
||||
to_chat(src, "<font color='red'>You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.</font>")
|
||||
to_chat(src, "<font color='blue'>Message: [msg]</font>")
|
||||
to_chat(src, "<span class='danger'>You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.</span>")
|
||||
to_chat(src, "<span class='notice'>Message: [msg]</span>")
|
||||
return
|
||||
|
||||
var/client/recipient
|
||||
@@ -95,14 +95,14 @@
|
||||
if(!msg)
|
||||
return
|
||||
if(holder)
|
||||
to_chat(src, "<font color='red'>Error: Use the admin IRC channel, nerd.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Use the admin IRC channel, nerd.</span>")
|
||||
return
|
||||
|
||||
|
||||
else
|
||||
if(!recipient)
|
||||
if(holder)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: Client not found.</span>")
|
||||
if(msg)
|
||||
to_chat(src, msg)
|
||||
return
|
||||
@@ -118,12 +118,12 @@
|
||||
return
|
||||
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: You are unable to use admin PM-s (muted).</span>")
|
||||
return
|
||||
|
||||
if(!recipient)
|
||||
if(holder)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: Client not found.</span>")
|
||||
else
|
||||
current_ticket.MessageNoRecipient(msg)
|
||||
return
|
||||
@@ -145,15 +145,15 @@
|
||||
var/keywordparsedmsg = keywords_lookup(msg)
|
||||
|
||||
if(irc)
|
||||
to_chat(src, "<font color='blue'>PM to-<b>Admins</b>: <span class='linkify'>[rawmsg]</span></font>")
|
||||
to_chat(src, "<span class='notice'>PM to-<b>Admins</b>: <span class='linkify'>[rawmsg]</span></span>")
|
||||
var/datum/admin_help/AH = admin_ticket_log(src, "<font color='red'>Reply PM from-<b>[key_name(src, TRUE, TRUE)] to <i>IRC</i>: [keywordparsedmsg]</font>")
|
||||
ircreplyamount--
|
||||
send2irc("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg)
|
||||
else
|
||||
if(recipient.holder)
|
||||
if(holder) //both are admins
|
||||
to_chat(recipient, "<font color='red'>Admin PM from-<b>[key_name(src, recipient, 1)]</b>: <span class='linkify'>[keywordparsedmsg]</span></font>")
|
||||
to_chat(src, "<font color='blue'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: <span class='linkify'>[keywordparsedmsg]</span></font>")
|
||||
to_chat(recipient, "<span class='danger'>Admin PM from-<b>[key_name(src, recipient, 1)]</b>: <span class='linkify'>[keywordparsedmsg]</span></span>")
|
||||
to_chat(src, "<span class='notice'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: <span class='linkify'>[keywordparsedmsg]</span></span>")
|
||||
|
||||
//omg this is dumb, just fill in both their tickets
|
||||
var/interaction_message = "<font color='purple'>PM from-<b>[key_name(src, recipient, 1)]</b> to-<b>[key_name(recipient, src, 1)]</b>: [keywordparsedmsg]</font>"
|
||||
@@ -162,10 +162,10 @@
|
||||
admin_ticket_log(recipient, interaction_message)
|
||||
|
||||
else //recipient is an admin but sender is not
|
||||
var/replymsg = "<font color='red'>Reply PM from-<b>[key_name(src, recipient, 1)]</b>: <span class='linkify'>[keywordparsedmsg]</span></font>"
|
||||
admin_ticket_log(src, replymsg)
|
||||
to_chat(recipient, replymsg)
|
||||
to_chat(src, "<font color='blue'>PM to-<b>Admins</b>: <span class='linkify'>[msg]</span></font>")
|
||||
var/replymsg = "Reply PM from-<b>[key_name(src, recipient, 1)]</b>: <span class='linkify'>[keywordparsedmsg]</span>"
|
||||
admin_ticket_log(src, "<font color='red'>[replymsg]</font>")
|
||||
to_chat(recipient, "<span class='danger'>[replymsg]</span>")
|
||||
to_chat(src, "<span class='notice'>PM to-<b>Admins</b>: <span class='linkify'>[msg]</span></span>")
|
||||
|
||||
//play the receiving admin the adminhelp sound (if they have them enabled)
|
||||
if(recipient.prefs.toggles & SOUND_ADMINHELP)
|
||||
@@ -177,11 +177,11 @@
|
||||
new /datum/admin_help(msg, recipient, TRUE)
|
||||
|
||||
to_chat(recipient, "<font color='red' size='4'><b>-- Administrator private message --</b></font>")
|
||||
to_chat(recipient, "<font color='red'>Admin PM from-<b>[key_name(src, recipient, 0)]</b>: <span class='linkify'>[msg]</span></font>")
|
||||
to_chat(recipient, "<font color='red'><i>Click on the administrator's name to reply.</i></font>")
|
||||
to_chat(src, "<font color='blue'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: <span class='linkify'>[msg]</span></font>")
|
||||
to_chat(recipient, "<span class='danger'>Admin PM from-<b>[key_name(src, recipient, 0)]</b>: <span class='linkify'>[msg]</span></span>")
|
||||
to_chat(recipient, "<span class='danger'><i>Click on the administrator's name to reply.</i></span>")
|
||||
to_chat(src, "<span class='notice'>Admin PM to-<b>[key_name(recipient, src, 1)]</b>: <span class='linkify'>[msg]</span></span>")
|
||||
|
||||
admin_ticket_log(recipient, "<font color='blue'>PM From [key_name_admin(src)]: [keywordparsedmsg]</font>")
|
||||
admin_ticket_log(recipient, "<font color='purple'>PM From [key_name_admin(src)]: [keywordparsedmsg]</font>")
|
||||
|
||||
//always play non-admin recipients the adminhelp sound
|
||||
SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg'))
|
||||
@@ -200,20 +200,20 @@
|
||||
return
|
||||
|
||||
else //neither are admins
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>")
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</span>")
|
||||
return
|
||||
|
||||
if(irc)
|
||||
log_admin_private("PM: [key_name(src)]->IRC: [rawmsg]")
|
||||
for(var/client/X in GLOB.admins)
|
||||
to_chat(X, "<font color='blue'><B>PM: [key_name(src, X, 0)]->IRC:</B> [keywordparsedmsg]</font>")
|
||||
to_chat(X, "<span class='notice'><B>PM: [key_name(src, X, 0)]->IRC:</B> [keywordparsedmsg]</span>")
|
||||
else
|
||||
window_flash(recipient, ignorepref = TRUE)
|
||||
log_admin_private("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]")
|
||||
//we don't use message_admins here because the sender/receiver might get it too
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient
|
||||
to_chat(X, "<font color='blue'><B>PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]:</B> [keywordparsedmsg]</font>" )
|
||||
to_chat(X, "<span class='notice'><B>PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]:</B> [keywordparsedmsg]</span>" )
|
||||
|
||||
|
||||
|
||||
@@ -296,10 +296,10 @@
|
||||
msg = emoji_parse(msg)
|
||||
|
||||
to_chat(C, "<font color='red' size='4'><b>-- Administrator private message --</b></font>")
|
||||
to_chat(C, "<font color='red'>Admin PM from-<b><a href='?priv_msg=[stealthkey]'>[adminname]</A></b>: [msg]</font>")
|
||||
to_chat(C, "<font color='red'><i>Click on the administrator's name to reply.</i></font>")
|
||||
to_chat(C, "<span class='adminsay'>Admin PM from-<b><a href='?priv_msg=[stealthkey]'>[adminname]</A></b>: [msg]</span>")
|
||||
to_chat(C, "<span class='adminsay'><i>Click on the administrator's name to reply.</i></span>")
|
||||
|
||||
admin_ticket_log(C, "<font color='blue'>PM From [irc_tagged]: [msg]</font>")
|
||||
admin_ticket_log(C, "<font color='purple'>PM From [irc_tagged]: [msg]</font>")
|
||||
|
||||
window_flash(C, ignorepref = TRUE)
|
||||
//always play non-admin recipients the adminhelp sound
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
.["laws"] = borg.laws ? borg.laws.get_law_list(include_zeroth = TRUE) : list()
|
||||
.["channels"] = list()
|
||||
for (var/k in GLOB.radiochannels)
|
||||
if (k == "Common")
|
||||
if (k == RADIO_CHANNEL_COMMON)
|
||||
continue
|
||||
.["channels"] += list(list("name" = k, "installed" = (k in borg.radio.channels)))
|
||||
.["cell"] = borg.cell ? list("missing" = FALSE, "maxcharge" = borg.cell.maxcharge, "charge" = borg.cell.charge) : list("missing" = TRUE, "maxcharge" = 1, "charge" = 0)
|
||||
@@ -164,15 +164,15 @@
|
||||
if (channel in borg.radio.channels) // We're removing a channel
|
||||
if (!borg.radio.keyslot) // There's no encryption key. This shouldn't happen but we can cope
|
||||
borg.radio.channels -= channel
|
||||
if (channel == "Syndicate")
|
||||
if (channel == RADIO_CHANNEL_SYNDICATE)
|
||||
borg.radio.syndie = FALSE
|
||||
else if (channel == "CentCom")
|
||||
else if (channel == RADIO_CHANNEL_CENTCOM)
|
||||
borg.radio.independent = FALSE
|
||||
else
|
||||
borg.radio.keyslot.channels -= channel
|
||||
if (channel == "Syndicate")
|
||||
if (channel == RADIO_CHANNEL_SYNDICATE)
|
||||
borg.radio.keyslot.syndie = FALSE
|
||||
else if (channel == "CentCom")
|
||||
else if (channel == RADIO_CHANNEL_CENTCOM)
|
||||
borg.radio.keyslot.independent = FALSE
|
||||
message_admins("[key_name_admin(user)] removed the [channel] radio channel from [ADMIN_LOOKUPFLW(borg)].")
|
||||
log_admin("[key_name(user)] removed the [channel] radio channel from [key_name(borg)].")
|
||||
@@ -180,9 +180,9 @@
|
||||
if (!borg.radio.keyslot) // Assert that an encryption key exists
|
||||
borg.radio.keyslot = new (borg.radio)
|
||||
borg.radio.keyslot.channels[channel] = 1
|
||||
if (channel == "Syndicate")
|
||||
if (channel == RADIO_CHANNEL_SYNDICATE)
|
||||
borg.radio.keyslot.syndie = TRUE
|
||||
else if (channel == "CentCom")
|
||||
else if (channel == RADIO_CHANNEL_CENTCOM)
|
||||
borg.radio.keyslot.independent = TRUE
|
||||
message_admins("[key_name_admin(user)] added the [channel] radio channel to [ADMIN_LOOKUPFLW(borg)].")
|
||||
log_admin("[key_name(user)] added the [channel] radio channel to [key_name(borg)].")
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
return
|
||||
|
||||
if (!sender)
|
||||
sender = input("Who is the message from?", "Sender") as null|anything in list("CentCom","Syndicate")
|
||||
sender = input("Who is the message from?", "Sender") as null|anything in list(RADIO_CHANNEL_CENTCOM,RADIO_CHANNEL_SYNDICATE)
|
||||
if(!sender)
|
||||
return
|
||||
|
||||
@@ -298,7 +298,7 @@
|
||||
if(candidates.len)
|
||||
ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates
|
||||
else
|
||||
to_chat(usr, "<font color='red'>Error: create_xeno(): no suitable candidates.</font>")
|
||||
to_chat(usr, "<span class='danger'>Error: create_xeno(): no suitable candidates.</span>")
|
||||
if(!istext(ckey))
|
||||
return 0
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
/datum/antagonist/abductor/greet()
|
||||
to_chat(owner.current, "<span class='notice'>You are the [owner.special_role]!</span>")
|
||||
to_chat(owner.current, "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>")
|
||||
to_chat(owner.current, "<span class='notice'>Try not to disturb the habitat, it could lead to dead specimens.</span>")
|
||||
to_chat(owner.current, "<span class='notice'>[greet_text]</span>")
|
||||
owner.announce_objectives()
|
||||
|
||||
|
||||
@@ -30,9 +30,12 @@
|
||||
var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90)
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
|
||||
item_flags ^= NODROP
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT))
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
|
||||
else
|
||||
ADD_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='notice'>Your vest is now [item_flags & NODROP ? "locked" : "unlocked"].</span>")
|
||||
to_chat(loc, "<span class='notice'>Your vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].</span>")
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
|
||||
switch(mode)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
|
||||
if(V)
|
||||
console.AddVest(V)
|
||||
V.item_flags |= NODROP
|
||||
ADD_TRAIT(V, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
|
||||
|
||||
var/obj/item/storage/backpack/B = locate() in H
|
||||
if(B)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/surgery/organ_extraction
|
||||
name = "experimental dissection"
|
||||
name = "experimental organ replacement"
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert)
|
||||
possible_locs = list(BODY_ZONE_CHEST)
|
||||
ignore_clothes = 1
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
/obj/item/organ/heart/gland/pop/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
randomize_human(owner)
|
||||
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly))
|
||||
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly))
|
||||
owner.set_species(species)
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
dat+="<br>"
|
||||
dat += "<a href='?src=[REF(src)];select_disguise=1'>Select Agent Vest Disguise</a><br>"
|
||||
dat += "<a href='?src=[REF(src)];toggle_vest=1'>[vest.item_flags & NODROP ? "Unlock" : "Lock"] Vest</a><br>"
|
||||
dat += "<a href='?src=[REF(src)];toggle_vest=1'>[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest</a><br>"
|
||||
else
|
||||
dat += "<span class='bad'>NO AGENT VEST DETECTED</span>"
|
||||
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
|
||||
|
||||
@@ -353,7 +353,7 @@
|
||||
/datum/antagonist/changeling/greet()
|
||||
if (you_are_greet)
|
||||
to_chat(owner.current, "<span class='boldannounce'>You are [changelingID], a changeling! You have absorbed and taken the form of a human.</span>")
|
||||
to_chat(owner.current, "<span class='boldannounce'>Use say \":g message\" to communicate with your fellow changelings.</span>")
|
||||
to_chat(owner.current, "<span class='boldannounce'>Use say \"[MODE_TOKEN_CHANGELING] message\" to communicate with your fellow changelings.</span>")
|
||||
to_chat(owner.current, "<b>You must complete the following tasks:</b>")
|
||||
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE)
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//HIVEMIND COMMUNICATION (:g)
|
||||
//HIVEMIND COMMUNICATION //MODE_TOKEN_CHANGELING / :g
|
||||
/obj/effect/proc_holder/changeling/hivemind_comms
|
||||
name = "Hivemind Communication"
|
||||
desc = "We tune our senses to the airwaves to allow us to discreetly communicate and exchange DNA with other changelings."
|
||||
helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives."
|
||||
helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives." //MODE_TOKEN_CHANGELING needs to be manually updated here.
|
||||
dna_cost = 1
|
||||
chemical_cost = -1
|
||||
action_icon = 'icons/mob/actions/actions_xeno.dmi'
|
||||
@@ -20,7 +20,7 @@
|
||||
..()
|
||||
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
changeling.changeling_speak = 1
|
||||
to_chat(user, "<i><font color=#800080>Use say \":g message\" to communicate with the other changelings.</font></i>")
|
||||
to_chat(user, "<i><font color=#800080>Use say \"[MODE_TOKEN_CHANGELING] message\" to communicate with the other changelings.</font></i>")
|
||||
var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new
|
||||
if(!changeling.has_sting(S1))
|
||||
changeling.purchasedpowers+=S1
|
||||
|
||||
@@ -56,8 +56,8 @@
|
||||
if(M.lingcheck() == LINGHIVE_LING)
|
||||
to_chat(M, "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>")
|
||||
target.mind.linglink = 1
|
||||
target.say(":g AAAAARRRRGGGGGHHHHH!!")
|
||||
to_chat(target, "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \":g message\" to communicate!</span>")
|
||||
target.say("[MODE_TOKEN_CHANGELING] AAAAARRRRGGGGGHHHHH!!")
|
||||
to_chat(target, "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \"[MODE_TOKEN_CHANGELING] message\" to communicate!</span>")
|
||||
target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them
|
||||
sleep(1800)
|
||||
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]"))
|
||||
|
||||
@@ -155,20 +155,23 @@
|
||||
item_state = "arm_blade"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 25
|
||||
throwforce = 0 //Just to be on the safe side
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
armour_penetration = 20
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = IS_SHARP
|
||||
var/can_drop = FALSE
|
||||
var/fake = FALSE
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
|
||||
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
if(ismob(loc) && !silent)
|
||||
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
if(synthetic)
|
||||
@@ -242,7 +245,8 @@
|
||||
item_state = "tentacle"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL | NOBLUDGEON
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON
|
||||
slot_flags = NONE
|
||||
flags_1 = NONE
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
ammo_type = /obj/item/ammo_casing/magic/tentacle
|
||||
@@ -256,6 +260,7 @@
|
||||
|
||||
/obj/item/gun/magic/tentacle/Initialize(mapload, silent)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
if(ismob(loc))
|
||||
if(!silent)
|
||||
loc.visible_message("<span class='warning'>[loc.name]\'s arm starts stretching inhumanly!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a tentacle.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
@@ -427,7 +432,7 @@
|
||||
/obj/item/shield/changeling
|
||||
name = "shield-like mass"
|
||||
desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield."
|
||||
item_flags = ABSTRACT | NODROP | DROPDEL
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "ling_shield"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
@@ -438,6 +443,7 @@
|
||||
|
||||
/obj/item/shield/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
if(ismob(loc))
|
||||
loc.visible_message("<span class='warning'>The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!</span>", "<span class='warning'>We inflate our hand into a strong shield.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
|
||||
@@ -479,13 +485,14 @@
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacesuit"
|
||||
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all.
|
||||
|
||||
/obj/item/clothing/suit/space/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
if(ismob(loc))
|
||||
loc.visible_message("<span class='warning'>[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!</span>", "<span class='warning'>We inflate our flesh, creating a spaceproof suit!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
START_PROCESSING(SSobj, src)
|
||||
@@ -499,11 +506,15 @@
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacehelmet"
|
||||
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
clothing_flags = STOPSPRESSUREDAMAGE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
|
||||
/obj/item/clothing/head/helmet/space/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
/***************************************\
|
||||
|*****************ARMOR*****************|
|
||||
\***************************************/
|
||||
@@ -529,7 +540,7 @@
|
||||
name = "chitinous mass"
|
||||
desc = "A tough, hard covering of black chitin."
|
||||
icon_state = "lingarmor"
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
@@ -538,6 +549,7 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
if(ismob(loc))
|
||||
loc.visible_message("<span class='warning'>[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!</span>", "<span class='warning'>We harden our flesh, creating a suit of armor!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
|
||||
@@ -545,6 +557,10 @@
|
||||
name = "chitinous mass"
|
||||
desc = "A tough, hard covering of black chitin with transparent chitin in front."
|
||||
icon_state = "lingarmorhelmet"
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE
|
||||
|
||||
/obj/item/clothing/head/helmet/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
name = "Strained Muscles"
|
||||
desc = "We evolve the ability to reduce the acid buildup in our muscles, allowing us to move much faster."
|
||||
helptext = "The strain will make us tired, and we will rapidly become fatigued. Standard weight restrictions, like hardsuits, still apply. Cannot be used in lesser form."
|
||||
chemical_cost = 0
|
||||
chemical_cost = 15
|
||||
dna_cost = 1
|
||||
req_human = 1
|
||||
var/stacks = 0 //Increments every 5 seconds; damage increases over time
|
||||
@@ -15,13 +15,16 @@
|
||||
action_background_icon_state = "bg_ling"
|
||||
|
||||
/obj/effect/proc_holder/changeling/strained_muscles/sting_action(mob/living/carbon/user)
|
||||
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
active = !active
|
||||
if(active)
|
||||
to_chat(user, "<span class='notice'>Our muscles tense and strengthen.</span>")
|
||||
changeling.chem_recharge_slowdown += 0.5
|
||||
else
|
||||
REMOVE_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles")
|
||||
to_chat(user, "<span class='notice'>Our muscles relax.</span>")
|
||||
if(stacks >= 10)
|
||||
changeling.chem_recharge_slowdown -= 0.5
|
||||
if(stacks >= 20)
|
||||
to_chat(user, "<span class='danger'>We collapse in exhaustion.</span>")
|
||||
user.Knockdown(60)
|
||||
user.emote("gasp")
|
||||
@@ -31,6 +34,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/strained_muscles/proc/muscle_loop(mob/living/carbon/user)
|
||||
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
while(active)
|
||||
ADD_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles")
|
||||
if(user.stat != CONSCIOUS || user.staminaloss >= 90)
|
||||
@@ -38,13 +42,14 @@
|
||||
to_chat(user, "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>")
|
||||
user.Knockdown(40)
|
||||
REMOVE_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles")
|
||||
changeling.chem_recharge_slowdown -= 0.5
|
||||
break
|
||||
|
||||
stacks++
|
||||
//user.take_bodypart_damage(stacks * 0.03, 0)
|
||||
user.staminaloss += stacks * 1.3 //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack
|
||||
user.adjustStaminaLoss(stacks*1.3) //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack
|
||||
|
||||
if(stacks == 11) //Warning message that the stacks are getting too high
|
||||
if(stacks == 10) //Warning message that the stacks are getting too high
|
||||
to_chat(user, "<span class='warning'>Our legs are really starting to hurt...</span>")
|
||||
|
||||
sleep(40)
|
||||
|
||||
@@ -62,13 +62,13 @@
|
||||
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/transformation
|
||||
name = "Transformation Sting"
|
||||
desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
|
||||
helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat."
|
||||
name = "Temporary Transformation Sting"
|
||||
desc = "We silently sting a human, injecting a chemical that forces them to transform into a chosen being for a limited time. Additional stings extend the duration."
|
||||
helptext = "The victim will transform much like a changeling would for a limited time. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat."
|
||||
sting_icon = "sting_transform"
|
||||
chemical_cost = 50
|
||||
dna_cost = 3
|
||||
loudness = 2
|
||||
chemical_cost = 10
|
||||
dna_cost = 2
|
||||
loudness = 1
|
||||
var/datum/changelingprofile/selected_dna = null
|
||||
action_icon = 'icons/mob/actions/actions_changeling.dmi'
|
||||
action_icon_state = "ling_sting_transform"
|
||||
@@ -97,19 +97,19 @@
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(mob/user, mob/target)
|
||||
log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'")
|
||||
var/datum/dna/NewDNA = selected_dna.dna
|
||||
|
||||
if(ismonkey(target))
|
||||
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
|
||||
|
||||
var/mob/living/carbon/C = target
|
||||
. = TRUE
|
||||
if(istype(C))
|
||||
C.real_name = NewDNA.real_name
|
||||
NewDNA.transfer_identity(C)
|
||||
if(ismonkey(C))
|
||||
C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
|
||||
C.updateappearance(mutcolor_update=1)
|
||||
if(C.reagents.has_reagent("changeling_sting_real"))
|
||||
C.reagents.add_reagent("changeling_sting_real",120)
|
||||
log_combat(user, target, "stung", "transformation sting", ", extending the duration.")
|
||||
else
|
||||
C.reagents.add_reagent("changeling_sting_real",120,list("desired_dna" = selected_dna.dna))
|
||||
log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'")
|
||||
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade
|
||||
@@ -230,24 +230,23 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/LSD
|
||||
name = "Hallucination Sting"
|
||||
desc = "Causes terror in the target."
|
||||
helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect begins after a few seconds."
|
||||
desc = "Causes terror in the target and deals a minor amount of toxin damage."
|
||||
helptext = "We evolve the ability to sting a target with a powerful toxic hallucinogenic chemical. The target does not notice they have been stung, and the effect begins instantaneously. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
sting_icon = "sting_lsd"
|
||||
chemical_cost = 10
|
||||
dna_cost = 1
|
||||
loudness = 1
|
||||
action_icon = 'icons/mob/actions/actions_changeling.dmi'
|
||||
action_icon_state = "ling_sting_lsd"
|
||||
action_background_icon_state = "bg_ling"
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/living/carbon/target)
|
||||
/obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/target)
|
||||
log_combat(user, target, "stung", "LSD sting")
|
||||
addtimer(CALLBACK(src, .proc/hallucination_time, target), rand(100,200))
|
||||
if(target.reagents)
|
||||
target.reagents.add_reagent("regenerative_materia", 5)
|
||||
target.reagents.add_reagent("mindbreaker", 5)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/LSD/proc/hallucination_time(mob/living/carbon/target)
|
||||
if(target)
|
||||
target.hallucination = max(90, target.hallucination)
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/cryo
|
||||
name = "Cryogenic Sting"
|
||||
desc = "We silently sting a human with a cocktail of chemicals that freeze them."
|
||||
|
||||
@@ -11,7 +11,11 @@
|
||||
|
||||
/obj/item/clothing/glasses/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/glasses/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
|
||||
@@ -23,7 +27,11 @@
|
||||
|
||||
/obj/item/clothing/under/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/under/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/under/changeling/attack_hand(mob/user)
|
||||
@@ -35,9 +43,13 @@
|
||||
|
||||
/obj/item/clothing/suit/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
/obj/item/clothing/suit/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/suit/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
@@ -48,7 +60,10 @@
|
||||
|
||||
/obj/item/clothing/head/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/head/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/head/changeling/attack_hand(mob/user)
|
||||
@@ -60,7 +75,11 @@
|
||||
|
||||
/obj/item/clothing/shoes/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/shoes/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
|
||||
@@ -72,7 +91,11 @@
|
||||
|
||||
/obj/item/clothing/gloves/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/gloves/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
|
||||
@@ -84,7 +107,11 @@
|
||||
|
||||
/obj/item/clothing/mask/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/mask/changeling/attack_hand(mob/user)
|
||||
@@ -96,10 +123,14 @@
|
||||
|
||||
/obj/item/changeling
|
||||
name = "flesh"
|
||||
item_flags = NODROP
|
||||
slot_flags = ALL
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
/obj/item/changeling/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
|
||||
@@ -133,6 +133,9 @@
|
||||
return FALSE
|
||||
if(!uses)
|
||||
return FALSE
|
||||
if(!do_teleport(A, get_turf(linked_gateway), channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
|
||||
visible_message("<span class='warning'>[A] bounces off [src]!</span>")
|
||||
return FALSE
|
||||
if(isliving(A))
|
||||
var/mob/living/user = A
|
||||
to_chat(user, "<span class='warning'><b>You pass through [src] and appear elsewhere!</b></span>")
|
||||
@@ -141,7 +144,6 @@
|
||||
playsound(linked_gateway, 'sound/effects/empulse.ogg', 50, 1)
|
||||
transform = matrix() * 1.5
|
||||
linked_gateway.transform = matrix() * 1.5
|
||||
A.forceMove(get_turf(linked_gateway))
|
||||
if(!no_cost)
|
||||
uses = max(0, uses - 1)
|
||||
linked_gateway.uses = max(0, linked_gateway.uses - 1)
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
name = "replicant manacles"
|
||||
desc = "Heavy manacles made out of freezing-cold metal. It looks like brass, but feels much more solid."
|
||||
icon_state = "brass_manacles"
|
||||
item_state = "brass_manacles"
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/restraints/handcuffs/clockwork/dropped(mob/user)
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
heat_protection = CHEST|GROIN|LEGS
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/holyoil)
|
||||
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/bottle/holyoil)
|
||||
|
||||
/obj/item/clothing/suit/armor/clockwork/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
to_chat(invoker, "<span class='danger'>Stargazers can't be built off-station.</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
//Integration Cog: Creates an integration cog that can be inserted into APCs to passively siphon power.
|
||||
/datum/clockwork_scripture/create_object/integration_cog
|
||||
@@ -224,12 +224,14 @@
|
||||
. = ..()
|
||||
|
||||
/datum/clockwork_scripture/abscond/scripture_effects()
|
||||
var/take_pulling = invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)
|
||||
var/mob/living/pulled_mob = (invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)) ? invoker.pulling : null
|
||||
var/turf/T
|
||||
if(GLOB.ark_of_the_clockwork_justiciar)
|
||||
T = get_step(GLOB.ark_of_the_clockwork_justiciar, SOUTH)
|
||||
else
|
||||
T = get_turf(pick(GLOB.servant_spawns))
|
||||
if(!do_teleport(invoker, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
|
||||
return
|
||||
invoker.visible_message("<span class='warning'>[invoker] flickers and phases out of existence!</span>", \
|
||||
"<span class='bold sevtug_small'>You feel a dizzying sense of vertigo as you're yanked back to Reebe!</span>")
|
||||
T.visible_message("<span class='warning'>[invoker] flickers and phases into existence!</span>")
|
||||
@@ -237,10 +239,9 @@
|
||||
playsound(T, 'sound/magic/magic_missile.ogg', 50, TRUE)
|
||||
do_sparks(5, TRUE, invoker)
|
||||
do_sparks(5, TRUE, T)
|
||||
if(take_pulling)
|
||||
if(pulled_mob && do_teleport(pulled_mob, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
|
||||
adjust_clockwork_power(-special_power_cost)
|
||||
invoker.pulling.forceMove(T)
|
||||
invoker.forceMove(T)
|
||||
invoker.start_pulling(pulled_mob) //forcemove resets pulls, so we need to re-pull
|
||||
if(invoker.client)
|
||||
animate(invoker.client, color = client_color, time = 25)
|
||||
|
||||
|
||||
+4
-6
@@ -131,12 +131,10 @@
|
||||
if(!M || !M.current)
|
||||
continue
|
||||
if(isliving(M.current) && M.current.stat != DEAD)
|
||||
if(isAI(M.current))
|
||||
M.current.forceMove(get_step(get_step(src, NORTH),NORTH)) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark.
|
||||
else
|
||||
M.current.forceMove(get_turf(src))
|
||||
M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
|
||||
M.current.clear_fullscreen("flash", 5)
|
||||
var/turf/t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark.
|
||||
do_teleport(M.current, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE)
|
||||
M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
|
||||
M.current.clear_fullscreen("flash", 5)
|
||||
playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, FALSE)
|
||||
recalls_remaining--
|
||||
recalling = FALSE
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an <b>empowering rune</b>"
|
||||
var/list/spells = list()
|
||||
var/channeling = FALSE
|
||||
var/holy_dispel = FALSE
|
||||
|
||||
/datum/action/innate/cult/blood_magic/Grant()
|
||||
..()
|
||||
@@ -33,6 +34,9 @@
|
||||
B.button.moved = B.button.screen_loc
|
||||
|
||||
/datum/action/innate/cult/blood_magic/Activate()
|
||||
if(holy_dispel)
|
||||
to_chat(owner, "<span class='cultbold'>Holy water currently scours your body, nullifying the power of the rites!</span>")
|
||||
return
|
||||
var/rune = FALSE
|
||||
var/limit = RUNELESS_MAX_BLOODCHARGE
|
||||
for(var/obj/effect/rune/empower/R in range(1, owner))
|
||||
@@ -64,7 +68,7 @@
|
||||
qdel(nullify_spell)
|
||||
return
|
||||
BS = possible_spells[entered_spell_name]
|
||||
if(QDELETED(src) || owner.incapacitated() || !BS || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit))
|
||||
if(QDELETED(src) || owner.incapacitated() || !BS || holy_dispel || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit))
|
||||
return
|
||||
to_chat(owner,"<span class='warning'>You begin to carve unnatural symbols into your flesh!</span>")
|
||||
SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10))
|
||||
@@ -73,7 +77,7 @@
|
||||
else
|
||||
to_chat(owner, "<span class='cultitalic'>You are already invoking blood magic!")
|
||||
return
|
||||
if(do_after(owner, 100 - rune*60, target = owner))
|
||||
if(do_after(owner, 100 - rune*60, target = owner) && !holy_dispel)
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
H.bleed(40 - rune*32)
|
||||
@@ -339,7 +343,7 @@
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "disintegrate"
|
||||
item_state = null
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL
|
||||
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
throwforce = 0
|
||||
@@ -350,11 +354,13 @@
|
||||
var/health_cost = 0 //The amount of health taken from the user when invoking the spell
|
||||
var/datum/action/innate/cult/blood_spell/source
|
||||
|
||||
/obj/item/melee/blood_magic/New(loc, spell)
|
||||
/obj/item/melee/blood_magic/Initialize(mapload, spell)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
source = spell
|
||||
uses = source.charges
|
||||
health_cost = source.health_cost
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/melee/blood_magic/Destroy()
|
||||
if(!QDELETED(source))
|
||||
@@ -488,11 +494,12 @@
|
||||
to_chat(user, "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>")
|
||||
return
|
||||
uses--
|
||||
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman and find yourself somewhere else!</span>", "<i>You hear a sharp crack.</i>")
|
||||
var/turf/origin = get_turf(user)
|
||||
var/mob/living/L = target
|
||||
L.forceMove(dest)
|
||||
dest.visible_message("<span class='warning'>There is a boom of outrushing air as something appears above the rune!</span>", null, "<i>You hear a boom.</i>")
|
||||
if(do_teleport(L, dest, channel = TELEPORT_CHANNEL_CULT))
|
||||
origin.visible_message("<span class='warning'>Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman and find yourself somewhere else!</span>", "<i>You hear a sharp crack.</i>")
|
||||
dest.visible_message("<span class='warning'>There is a boom of outrushing air as something appears above the rune!</span>", null, "<i>You hear a boom.</i>")
|
||||
..()
|
||||
|
||||
//Shackles
|
||||
@@ -641,6 +648,11 @@
|
||||
desc = "A spell that will absorb blood from anything you touch.<br>Touching cultists and constructs can heal them.<br><b>Clicking the hand will potentially let you focus the spell into something stronger.</b>"
|
||||
color = "#7D1717"
|
||||
|
||||
/obj/item/melee/blood_magic/manipulator/examine(mob/user)
|
||||
. = ..()
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cultitalic'>The [name] currently has <b>[uses]</b> blood charges left.</span>")
|
||||
|
||||
/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity)
|
||||
if(proximity)
|
||||
if(ishuman(target))
|
||||
@@ -652,15 +664,15 @@
|
||||
if(H.stat == DEAD)
|
||||
to_chat(user,"<span class='warning'>Only a revive rune can bring back the dead!</span>")
|
||||
return
|
||||
if(H.blood_volume < BLOOD_VOLUME_SAFE)
|
||||
var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume
|
||||
if(H.blood_volume < (BLOOD_VOLUME_SAFE*H.blood_ratio))
|
||||
var/restore_blood = (BLOOD_VOLUME_SAFE*H.blood_ratio) - H.blood_volume
|
||||
if(uses*2 < restore_blood)
|
||||
H.blood_volume += uses*2
|
||||
to_chat(user,"<span class='danger'>You use the last of your blood rites to restore what blood you could!</span>")
|
||||
uses = 0
|
||||
return ..()
|
||||
else
|
||||
H.blood_volume = BLOOD_VOLUME_SAFE
|
||||
H.blood_volume = (BLOOD_VOLUME_SAFE*H.blood_ratio)
|
||||
uses -= round(restore_blood/2)
|
||||
to_chat(user,"<span class='warning'>Your blood rites have restored [H == user ? "your" : "[H.p_their()]"] blood to safe levels!</span>")
|
||||
var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss()
|
||||
@@ -675,9 +687,9 @@
|
||||
if(ratio>1)
|
||||
ratio = 1
|
||||
uses -= round(overall_damage)
|
||||
H.visible_message("<span class='warning'>[H] is fully healed by [H==user ? "[H.p_their()]":"[H]'s"]'s blood magic!</span>")
|
||||
H.visible_message("<span class='warning'>[H] is fully healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic!</span>")
|
||||
else
|
||||
H.visible_message("<span class='warning'>[H] is partially healed by [H==user ? "[H.p_their()]":"[H]'s"] blood magic.</span>")
|
||||
H.visible_message("<span class='warning'>[H] is partially healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic.</span>")
|
||||
uses = 0
|
||||
ratio *= -1
|
||||
H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0)
|
||||
@@ -695,7 +707,7 @@
|
||||
if(H.cultslurring)
|
||||
to_chat(user,"<span class='danger'>[H.p_their(TRUE)] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!</span>")
|
||||
return
|
||||
if(H.blood_volume > BLOOD_VOLUME_SAFE)
|
||||
if(H.blood_volume > (BLOOD_VOLUME_SAFE*H.blood_ratio))
|
||||
H.blood_volume -= 100
|
||||
uses += 50
|
||||
user.Beam(H,icon_state="drainbeam",time=10)
|
||||
@@ -759,7 +771,7 @@
|
||||
switch(choice)
|
||||
if("Blood Spear (150)")
|
||||
if(uses < 150)
|
||||
to_chat(user, "<span class='cultitalic'>You need 200 charges to perform this rite.</span>")
|
||||
to_chat(user, "<span class='cultitalic'>You need 150 charges to perform this rite.</span>")
|
||||
else
|
||||
uses -= 150
|
||||
var/turf/T = get_turf(user)
|
||||
@@ -775,7 +787,7 @@
|
||||
"<span class='cultitalic'>A [rite.name] materializes at your feet.</span>")
|
||||
if("Blood Bolt Barrage (300)")
|
||||
if(uses < 300)
|
||||
to_chat(user, "<span class='cultitalic'>You need 400 charges to perform this rite.</span>")
|
||||
to_chat(user, "<span class='cultitalic'>You need 300 charges to perform this rite.</span>")
|
||||
else
|
||||
var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood()
|
||||
uses -= 300
|
||||
@@ -787,7 +799,7 @@
|
||||
qdel(rite)
|
||||
if("Blood Beam (500)")
|
||||
if(uses < 500)
|
||||
to_chat(user, "<span class='cultitalic'>You need 600 charges to perform this rite.</span>")
|
||||
to_chat(user, "<span class='cultitalic'>You need 500 charges to perform this rite.</span>")
|
||||
else
|
||||
var/obj/rite = new /obj/item/blood_beam()
|
||||
uses -= 500
|
||||
@@ -796,4 +808,4 @@
|
||||
to_chat(user, "<span class='cultlarge'><b>Your hands glow with POWER OVERWHELMING!!!</b></span>")
|
||||
else
|
||||
to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>")
|
||||
qdel(rite)
|
||||
qdel(rite)
|
||||
|
||||
@@ -64,9 +64,14 @@
|
||||
/obj/item/melee/cultblade/ghost
|
||||
name = "eldritch sword"
|
||||
force = 19 //can't break normal airlocks
|
||||
item_flags = NEEDS_PERMIT | NODROP | DROPDEL
|
||||
item_flags = NEEDS_PERMIT | DROPDEL
|
||||
flags_1 = NONE
|
||||
|
||||
/obj/item/melee/cultblade/ghost/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
|
||||
/obj/item/melee/cultblade/pickup(mob/living/user)
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
@@ -100,7 +105,6 @@
|
||||
inhand_x_dimension = 64
|
||||
inhand_y_dimension = 64
|
||||
actions_types = list()
|
||||
item_flags = SLOWS_WHILE_IN_HAND
|
||||
var/datum/action/innate/dash/cult/jaunt
|
||||
var/datum/action/innate/cult/spin2win/linked_action
|
||||
var/spinning = FALSE
|
||||
@@ -298,7 +302,12 @@
|
||||
item_state = "cult_hoodalt"
|
||||
|
||||
/obj/item/clothing/head/culthood/alt/ghost
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/clothing/head/culthood/alt/ghost/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt
|
||||
name = "cultist robes"
|
||||
@@ -307,7 +316,11 @@
|
||||
item_state = "cultrobesalt"
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
/obj/item/clothing/head/magus
|
||||
name = "magus helm"
|
||||
@@ -554,7 +567,7 @@
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.pulling)
|
||||
var/atom/movable/pulled = C.pulling
|
||||
pulled.forceMove(T)
|
||||
do_teleport(pulled, T, channel = TELEPORT_CHANNEL_CULT)
|
||||
. = pulled
|
||||
|
||||
/obj/item/cult_shift/attack_self(mob/user)
|
||||
@@ -579,13 +592,12 @@
|
||||
new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, C.dir)
|
||||
|
||||
var/atom/movable/pulled = handle_teleport_grab(destination, C)
|
||||
C.forceMove(destination)
|
||||
if(pulled)
|
||||
C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
|
||||
|
||||
new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir)
|
||||
playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(destination, "sparks", 50, 1)
|
||||
if(do_teleport(C, destination, channel = TELEPORT_CHANNEL_CULT))
|
||||
if(pulled)
|
||||
C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
|
||||
new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir)
|
||||
playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(destination, "sparks", 50, 1)
|
||||
|
||||
else
|
||||
to_chat(C, "<span class='danger'>The veil cannot be torn here!</span>")
|
||||
@@ -654,6 +666,7 @@
|
||||
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
|
||||
slot_flags = 0
|
||||
force = 17
|
||||
force_unwielded = 17
|
||||
force_wielded = 24
|
||||
throwforce = 40
|
||||
throw_speed = 2
|
||||
@@ -796,7 +809,7 @@
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "disintegrate"
|
||||
item_state = null
|
||||
item_flags = ABSTRACT | NODROP | DROPDEL
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
throwforce = 0
|
||||
throw_range = 0
|
||||
@@ -805,6 +818,9 @@
|
||||
var/firing = FALSE
|
||||
var/angle
|
||||
|
||||
/obj/item/blood_beam/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
/obj/item/blood_beam/afterattack(atom/A, mob/living/user, flag, params)
|
||||
. = ..()
|
||||
|
||||
@@ -73,6 +73,10 @@
|
||||
animate(src, color = previouscolor, time = 8)
|
||||
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
|
||||
|
||||
/obj/structure/destructible/cult/proc/check_menu(mob/living/user)
|
||||
if(!user || user.incapacitated() || !iscultist(user) || !anchored || cooldowntime > world.time)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/destructible/cult/talisman
|
||||
name = "altar"
|
||||
@@ -80,9 +84,18 @@
|
||||
icon_state = "talismanaltar"
|
||||
break_message = "<span class='warning'>The altar shatters, leaving only the wailing of the damned!</span>"
|
||||
|
||||
/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
|
||||
var/static/image/radial_whetstone = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener")
|
||||
var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult")
|
||||
var/static/image/radial_unholy_water = image(icon = 'icons/obj/chemical.dmi', icon_state = "holyflask")
|
||||
|
||||
/obj/structure/destructible/cult/talisman/Initialize()
|
||||
. = ..()
|
||||
if(.)
|
||||
radial_unholy_water.color = "#333333"
|
||||
|
||||
/obj/structure/destructible/cult/talisman/ui_interact(mob/user)
|
||||
. = ..()
|
||||
|
||||
if(!user.canUseTopic(src, TRUE))
|
||||
return
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>")
|
||||
@@ -91,22 +104,27 @@
|
||||
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with your dagger first.</span>")
|
||||
return
|
||||
if(cooldowntime > world.time)
|
||||
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
|
||||
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
|
||||
return
|
||||
var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
|
||||
var/list/pickedtype = list()
|
||||
|
||||
to_chat(user, "<span class='cultitalic'>You study the schematics etched into the altar...</span>")
|
||||
|
||||
var/list/options = list("Eldritch Whetstone" = radial_whetstone, "Construct Shell" = radial_shell, "Flask of Unholy Water" = radial_unholy_water)
|
||||
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
|
||||
var/reward
|
||||
switch(choice)
|
||||
if("Eldritch Whetstone")
|
||||
pickedtype += /obj/item/sharpener/cult
|
||||
reward = /obj/item/sharpener/cult
|
||||
if("Construct Shell")
|
||||
pickedtype += /obj/structure/constructshell
|
||||
reward = /obj/structure/constructshell
|
||||
if("Flask of Unholy Water")
|
||||
pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
|
||||
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
reward = /obj/item/reagent_containers/glass/beaker/unholywater
|
||||
|
||||
if(!QDELETED(src) && reward && check_menu(user))
|
||||
cooldowntime = world.time + 2400
|
||||
for(var/N in pickedtype)
|
||||
new N(get_turf(src))
|
||||
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with the [choice]!</span>")
|
||||
new reward(get_turf(src))
|
||||
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with the [choice]!</span>")
|
||||
|
||||
/obj/structure/destructible/cult/forge
|
||||
name = "daemon forge"
|
||||
@@ -116,9 +134,14 @@
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
break_message = "<span class='warning'>The force breaks apart into shards with a howling scream!</span>"
|
||||
|
||||
/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
|
||||
var/static/image/radial_flagellant = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cultrobes")
|
||||
var/static/image/radial_shielded = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cult_armor")
|
||||
var/static/image/radial_mirror = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "mirror_shield")
|
||||
|
||||
/obj/structure/destructible/cult/forge/ui_interact(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
|
||||
if(!user.canUseTopic(src, TRUE))
|
||||
return
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='warning'>The heat radiating from [src] pushes you back.</span>")
|
||||
@@ -129,24 +152,26 @@
|
||||
if(cooldowntime > world.time)
|
||||
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
|
||||
return
|
||||
var/choice
|
||||
if(user.mind.has_antag_datum(/datum/antagonist/cult/master))
|
||||
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
|
||||
else
|
||||
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
|
||||
var/list/pickedtype = list()
|
||||
|
||||
to_chat(user, "<span class='cultitalic'>You study the schematics etched into the forge...</span>")
|
||||
|
||||
|
||||
var/list/options = list("Shielded Robe" = radial_shielded, "Flagellant's Robe" = radial_flagellant, "Mirror Shield" = radial_mirror)
|
||||
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
|
||||
var/reward
|
||||
switch(choice)
|
||||
if("Shielded Robe")
|
||||
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/cult_shield
|
||||
reward = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
|
||||
if("Flagellant's Robe")
|
||||
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker
|
||||
reward = /obj/item/clothing/suit/hooded/cultrobes/berserker
|
||||
if("Mirror Shield")
|
||||
pickedtype += /obj/item/shield/mirror
|
||||
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
reward = /obj/item/shield/mirror
|
||||
|
||||
if(!QDELETED(src) && reward && check_menu(user))
|
||||
cooldowntime = world.time + 2400
|
||||
for(var/N in pickedtype)
|
||||
new N(get_turf(src))
|
||||
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating the [choice]!</span>")
|
||||
new reward(get_turf(src))
|
||||
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating the [choice]!</span>")
|
||||
|
||||
|
||||
|
||||
@@ -188,7 +213,7 @@
|
||||
var/mob/living/simple_animal/M = L
|
||||
if(M.health < M.maxHealth)
|
||||
M.adjustHealth(-3)
|
||||
if(ishuman(L) && L.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(ishuman(L) && L.blood_volume < (BLOOD_VOLUME_NORMAL * L.blood_ratio))
|
||||
L.blood_volume += 1.0
|
||||
CHECK_TICK
|
||||
if(last_corrupt <= world.time)
|
||||
@@ -234,9 +259,14 @@
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
|
||||
|
||||
/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
|
||||
var/static/image/radial_blindfold = image(icon = 'icons/obj/clothing/glasses.dmi', icon_state = "blindfold")
|
||||
var/static/image/radial_curse = image(icon = 'icons/obj/cult.dmi', icon_state ="shuttlecurse")
|
||||
var/static/image/radial_veilwalker = image(icon = 'icons/obj/cult.dmi', icon_state ="shifter")
|
||||
|
||||
/obj/structure/destructible/cult/tome/ui_interact(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
|
||||
if(!user.canUseTopic(src, TRUE))
|
||||
return
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='warning'>These books won't open and it hurts to even try and read the covers.</span>")
|
||||
@@ -247,21 +277,27 @@
|
||||
if(cooldowntime > world.time)
|
||||
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
|
||||
return
|
||||
var/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
|
||||
var/list/pickedtype = list()
|
||||
|
||||
to_chat(user, "<span class='cultitalic'>You flip through the black pages of the archives...</span>")
|
||||
|
||||
var/list/options = list("Zealot's Blindfold" = radial_blindfold, "Shuttle Curse" = radial_curse, "Veil Walker Set" = radial_veilwalker)
|
||||
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
|
||||
var/reward
|
||||
switch(choice)
|
||||
if("Zealot's Blindfold")
|
||||
pickedtype += /obj/item/clothing/glasses/hud/health/night/cultblind
|
||||
reward = /obj/item/clothing/glasses/hud/health/night/cultblind
|
||||
if("Shuttle Curse")
|
||||
pickedtype += /obj/item/shuttle_curse
|
||||
reward = /obj/item/shuttle_curse
|
||||
if("Veil Walker Set")
|
||||
pickedtype += /obj/item/cult_shift
|
||||
pickedtype += /obj/item/flashlight/flare/culttorch
|
||||
if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
reward = /obj/effect/spawner/bundle/veil_walker
|
||||
if(!QDELETED(src) && reward && check_menu(user))
|
||||
cooldowntime = world.time + 2400
|
||||
for(var/N in pickedtype)
|
||||
new N(get_turf(src))
|
||||
to_chat(user, "<span class='cultitalic'>You summon the [choice] from the archives!</span>")
|
||||
new reward(get_turf(src))
|
||||
to_chat(user, "<span class='cultitalic'>You summon the [choice] from the archives!</span>")
|
||||
|
||||
/obj/effect/spawner/bundle/veil_walker
|
||||
items = list(/obj/item/cult_shift, /obj/item/flashlight/flare/culttorch)
|
||||
|
||||
/obj/effect/gateway
|
||||
name = "gateway"
|
||||
|
||||
@@ -61,8 +61,8 @@ Runes can either be invoked by one's self or with many different cultists. Each
|
||||
if(do_after(user, 15, target = src))
|
||||
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
|
||||
qdel(src)
|
||||
else if(istype(I, /obj/item/nullrod))
|
||||
user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod")
|
||||
else if(istype(I, /obj/item/storage/book/bible) || istype(I, /obj/item/nullrod))
|
||||
user.say("BEGONE FOUL MAGICKS!!", forced = "bible")
|
||||
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -185,9 +185,6 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
color = RUNE_COLOR_OFFER
|
||||
req_cultists = 1
|
||||
rune_in_use = FALSE
|
||||
var/mob/living/currentconversionman
|
||||
var/conversiontimeout
|
||||
var/conversionresult
|
||||
|
||||
/obj/effect/rune/convert/do_invoke_glow()
|
||||
return
|
||||
@@ -233,36 +230,18 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
|
||||
Cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew
|
||||
rune_in_use = FALSE
|
||||
|
||||
/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
|
||||
if(invokers.len < 2)
|
||||
for(var/M in invokers)
|
||||
to_chat(M, "<span class='danger'>You need at least two invokers to convert [convertee]!</span>")
|
||||
to_chat(M, "<span class='warning'>You need at least two invokers to convert [convertee]!</span>")
|
||||
log_game("Offer rune failed - tried conversion with one invoker")
|
||||
return 0
|
||||
if(convertee.anti_magic_check(TRUE, TRUE))
|
||||
if(convertee.anti_magic_check(TRUE, TRUE, FALSE, 0)) //Not chargecost because it can be spammed
|
||||
for(var/M in invokers)
|
||||
to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
|
||||
log_game("Offer rune failed - convertee had anti-magic")
|
||||
return 0
|
||||
to_chat(convertee, "<span class='cult italic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>")
|
||||
to_chat(convertee, "<span class='cult italic'>Do you wish to embrace the Geometer of Blood? <a href='?src=\ref[src];signmeup=1'>Click here to become a follower of Nar'sie.</a> Or you could choose to continue resisting and suffer a fate worse than death...</span>")
|
||||
currentconversionman = convertee
|
||||
conversiontimeout = world.time + (10 SECONDS)
|
||||
convertee.Stun(100)
|
||||
ADD_TRAIT(convertee, TRAIT_MUTE, "conversionrune")
|
||||
conversionresult = FALSE
|
||||
while(world.time < conversiontimeout && convertee && !conversionresult)
|
||||
stoplag(1)
|
||||
currentconversionman = null
|
||||
if(!convertee)
|
||||
return FALSE
|
||||
REMOVE_TRAIT(convertee, TRAIT_MUTE, "conversionrune")
|
||||
if(get_turf(convertee) != get_turf(src))
|
||||
return FALSE
|
||||
if(!conversionresult)
|
||||
do_sacrifice(convertee, invokers, TRUE)
|
||||
return FALSE
|
||||
var/brutedamage = convertee.getBruteLoss()
|
||||
var/burndamage = convertee.getFireLoss()
|
||||
if(brutedamage || burndamage)
|
||||
@@ -274,6 +253,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
SSticker.mode.add_cultist(convertee.mind, 1)
|
||||
new /obj/item/melee/cultblade/dagger(get_turf(src))
|
||||
convertee.mind.special_role = ROLE_CULTIST
|
||||
to_chat(convertee, "<span class='cult italic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>")
|
||||
to_chat(convertee, "<span class='cult italic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
|
||||
</b></span>")
|
||||
if(ishuman(convertee))
|
||||
@@ -283,7 +264,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
H.cultslurring = 0
|
||||
return 1
|
||||
|
||||
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac)
|
||||
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
|
||||
var/mob/living/first_invoker = invokers[1]
|
||||
if(!first_invoker)
|
||||
return FALSE
|
||||
@@ -293,7 +274,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
|
||||
var/big_sac = FALSE
|
||||
if(!force_a_sac && (((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
|
||||
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
|
||||
for(var/M in invokers)
|
||||
to_chat(M, "<span class='cult italic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
|
||||
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
|
||||
@@ -333,14 +314,6 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
sacrificial.gib()
|
||||
return TRUE
|
||||
|
||||
/obj/effect/rune/convert/Topic(href, href_list)
|
||||
if(href_list["signmeup"])
|
||||
if(currentconversionman == usr)
|
||||
conversionresult = TRUE
|
||||
else
|
||||
to_chat(usr, "<span class='cult italic'><b>Your fate has already been set in stone.</b></span>")
|
||||
|
||||
|
||||
/obj/effect/rune/empower
|
||||
cultist_name = "Empower"
|
||||
cultist_desc = "allows cultists to prepare greater amounts of blood magic at far less of a cost."
|
||||
@@ -414,6 +387,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
return
|
||||
var/movedsomething = FALSE
|
||||
var/moveuserlater = FALSE
|
||||
var/movesuccess = FALSE
|
||||
for(var/atom/movable/A in T)
|
||||
if(ishuman(A))
|
||||
new /obj/effect/temp_visual/dir_setting/cult/phase/out(T, A.dir)
|
||||
@@ -424,20 +398,26 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
continue
|
||||
if(!A.anchored)
|
||||
movedsomething = TRUE
|
||||
A.forceMove(target)
|
||||
if(do_teleport(A, target, forceMove = TRUE, channel = TELEPORT_CHANNEL_CULT))
|
||||
movesuccess = TRUE
|
||||
if(movedsomething)
|
||||
..()
|
||||
visible_message("<span class='warning'>There is a sharp crack of inrushing air, and everything above the rune disappears!</span>", null, "<i>You hear a sharp crack.</i>")
|
||||
to_chat(user, "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>")
|
||||
if(moveuserlater)
|
||||
user.forceMove(target)
|
||||
if(do_teleport(user, target, channel = TELEPORT_CHANNEL_CULT))
|
||||
movesuccess = TRUE
|
||||
if(movesuccess)
|
||||
visible_message("<span class='warning'>There is a sharp crack of inrushing air, and everything above the rune disappears!</span>", null, "<i>You hear a sharp crack.</i>")
|
||||
to_chat(user, "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='cult'>You[moveuserlater ? "r vision blurs briefly, but nothing happens":" try send everything above the rune away, but the teleportation fails"].</span>")
|
||||
if(is_mining_level(z) && !is_mining_level(target.z)) //No effect if you stay on lavaland
|
||||
actual_selected_rune.handle_portal("lava")
|
||||
else
|
||||
var/area/A = get_area(T)
|
||||
if(A.map_name == "Space")
|
||||
actual_selected_rune.handle_portal("space", T)
|
||||
target.visible_message("<span class='warning'>There is a boom of outrushing air as something appears above the rune!</span>", null, "<i>You hear a boom.</i>")
|
||||
if(movesuccess)
|
||||
target.visible_message("<span class='warning'>There is a boom of outrushing air as something appears above the rune!</span>", null, "<i>You hear a boom.</i>")
|
||||
else
|
||||
fail_invoke()
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(cures.len)
|
||||
return
|
||||
var/list/not_used = advance_cures.Copy()
|
||||
cures = list(pick_n_take(not_used), pick_n_take(not_used))
|
||||
cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used)))
|
||||
|
||||
// Get the cure name from the cure_id
|
||||
var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]]
|
||||
|
||||
@@ -36,30 +36,42 @@
|
||||
|
||||
/datum/antagonist/ert/security // kinda handled by the base template but here for completion
|
||||
|
||||
/datum/antagonist/ert/security/red
|
||||
/datum/antagonist/ert/security/amber
|
||||
outfit = /datum/outfit/ert/security/alert
|
||||
|
||||
/datum/antagonist/ert/security/red
|
||||
outfit = /datum/outfit/ert/security/alert/red
|
||||
|
||||
/datum/antagonist/ert/engineer
|
||||
role = "Engineer"
|
||||
outfit = /datum/outfit/ert/engineer
|
||||
|
||||
/datum/antagonist/ert/engineer/red
|
||||
/datum/antagonist/ert/engineer/amber
|
||||
outfit = /datum/outfit/ert/engineer/alert
|
||||
|
||||
/datum/antagonist/ert/engineer/red
|
||||
outfit = /datum/outfit/ert/engineer/alert/red
|
||||
|
||||
/datum/antagonist/ert/medic
|
||||
role = "Medical Officer"
|
||||
outfit = /datum/outfit/ert/medic
|
||||
|
||||
/datum/antagonist/ert/medic/red
|
||||
/datum/antagonist/ert/medic/amber
|
||||
outfit = /datum/outfit/ert/medic/alert
|
||||
|
||||
/datum/antagonist/ert/medic/red
|
||||
outfit = /datum/outfit/ert/medic/alert/red
|
||||
|
||||
/datum/antagonist/ert/commander
|
||||
role = "Commander"
|
||||
outfit = /datum/outfit/ert/commander
|
||||
|
||||
/datum/antagonist/ert/commander/red
|
||||
/datum/antagonist/ert/commander/amber
|
||||
outfit = /datum/outfit/ert/commander/alert
|
||||
|
||||
/datum/antagonist/ert/commander/red
|
||||
outfit = /datum/outfit/ert/commander/alert/red
|
||||
|
||||
/datum/antagonist/ert/deathsquad
|
||||
name = "Deathsquad Trooper"
|
||||
outfit = /datum/outfit/death_commando
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/datum/antagonist/greybois
|
||||
name = "Emergency Assistant"
|
||||
show_name_in_check_antagonists = TRUE
|
||||
show_in_antagpanel = FALSE
|
||||
var/mission = "Assist the station."
|
||||
var/datum/outfit/outfit = /datum/outfit/ert/greybois
|
||||
|
||||
/datum/antagonist/greybois/greygod
|
||||
outfit = /datum/outfit/ert/greybois/greygod
|
||||
|
||||
/datum/antagonist/greybois/greet()
|
||||
to_chat(owner, "<B><font size=3 color=red>You are an Emergency Assistant.</font></B>")
|
||||
to_chat(owner, "Central Command is sending you to [station_name()] with the task: [mission]")
|
||||
|
||||
/datum/antagonist/greybois/on_gain()
|
||||
equipERT()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/greybois/proc/equipERT()
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(!istype(H))
|
||||
return
|
||||
H.equipOutfit(outfit)
|
||||
@@ -60,7 +60,7 @@
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Highlander"
|
||||
W.registered_name = H.real_name
|
||||
W.item_flags |= NODROP
|
||||
ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER)
|
||||
W.update_label(H.real_name)
|
||||
H.equip_to_slot_or_del(W, SLOT_WEAR_ID)
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
|
||||
|
||||
GLOBAL_LIST_EMPTY(jam_on_wardec)
|
||||
GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
|
||||
/obj/item/nuclear_challenge
|
||||
name = "Declaration of War (Challenge Mode)"
|
||||
@@ -61,8 +62,13 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
|
||||
|
||||
for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec)
|
||||
D.jammed = TRUE
|
||||
|
||||
GLOB.war_declared = TRUE
|
||||
var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
|
||||
var/actual_players = GLOB.joined_player_list.len - nukeops.len
|
||||
|
||||
new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * actual_players, 1))
|
||||
|
||||
new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * GLOB.player_list.len, 1))
|
||||
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
|
||||
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
|
||||
|
||||
@@ -72,7 +78,10 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
|
||||
if(declaring_war)
|
||||
to_chat(user, "You are already in the process of declaring war! Make your mind up.")
|
||||
return FALSE
|
||||
if(GLOB.player_list.len < CHALLENGE_MIN_PLAYERS)
|
||||
|
||||
var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
|
||||
var/actual_players = GLOB.joined_player_list.len - nukeops.len
|
||||
if(actual_players < CHALLENGE_MIN_PLAYERS)
|
||||
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
|
||||
return FALSE
|
||||
if(!user.onSyndieBase())
|
||||
|
||||
@@ -373,6 +373,11 @@
|
||||
S.switch_mode_to(TRACK_INFILTRATOR)
|
||||
countdown.start()
|
||||
set_security_level("delta")
|
||||
|
||||
if(GLOB.war_declared)
|
||||
var/area/A = get_area(src)
|
||||
priority_announce("Alert: Unexpected increase in radiation levels near [A.name] ([src.x],[src.y],[src.z]). Please send an authorized radiation specialist to investigate.", "Sensory Nuclear Indexer Telemetry Calculation Helper")
|
||||
|
||||
else
|
||||
detonation_timer = null
|
||||
set_security_level(previous_level)
|
||||
|
||||
@@ -65,9 +65,13 @@
|
||||
/obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative.
|
||||
name = "cyborg syndicate pinpointer"
|
||||
desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives."
|
||||
item_flags = NODROP
|
||||
flags_1 = NONE
|
||||
|
||||
|
||||
/obj/item/pinpointer/syndicate_cyborg/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
|
||||
|
||||
/obj/item/pinpointer/syndicate_cyborg/scan_for_target()
|
||||
target = null
|
||||
var/list/possible_targets = list()
|
||||
|
||||
@@ -488,7 +488,7 @@
|
||||
S.set_up(4,0,get_turf(target))
|
||||
S.start()
|
||||
playsound(src,'sound/effects/sparks4.ogg',50,1)
|
||||
do_teleport(target, F, 0)
|
||||
do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE)
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
|
||||
if(!tesla_shock)
|
||||
|
||||
@@ -244,10 +244,12 @@
|
||||
to_chat(owner.current, "<span class='userdanger'>Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.</span>")
|
||||
to_chat(owner.current, "<B><font size=5 color=red>Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.</font></B>")
|
||||
to_chat(owner.current, "<span class='userdanger'> You have been provided with a standard uplink to accomplish your task. </span>")
|
||||
to_chat(owner.current, "<span class='userdanger'>By no means reveal that you, or any other NT employees, are undercover agents.</span>")
|
||||
else
|
||||
to_chat(owner.current, "<span class='userdanger'>Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.</span>")
|
||||
to_chat(owner.current, "<B><font size=5 color=red>While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.</font></B>")
|
||||
to_chat(owner.current, "<span class='userdanger'>For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.</span>")
|
||||
to_chat(owner.current, "<span class='userdanger'>By no means reveal that you, or any other NT employees, are undercover agents.</span>")
|
||||
|
||||
to_chat(owner.current, "<span class='userdanger'>Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.</span>")
|
||||
owner.announce_objectives()
|
||||
|
||||
@@ -358,8 +358,14 @@
|
||||
return result.Join("<br>")
|
||||
|
||||
/datum/antagonist/traitor/roundend_report_footer()
|
||||
return "<br><b>The code phrases were:</b> <span class='codephrase'>[GLOB.syndicate_code_phrase]</span><br>\
|
||||
<b>The code responses were:</b> <span class='codephrase'>[GLOB.syndicate_code_response]</span><br>"
|
||||
var/phrases = jointext(GLOB.syndicate_code_phrase, ", ")
|
||||
var/responses = jointext(GLOB.syndicate_code_response, ", ")
|
||||
|
||||
var message = "<br><b>The code phrases were:</b> <span class='bluetext'>[phrases]</span><br>\
|
||||
<b>The code responses were:</b> <span class='redtext'>[responses]</span><br>"
|
||||
|
||||
return message
|
||||
|
||||
|
||||
/datum/antagonist/traitor/is_gamemode_hero()
|
||||
return SSticker.mode.name == "traitor"
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
var/mob/living/L = owner
|
||||
L.remove_status_effect(STATUS_EFFECT_INLOVE)
|
||||
|
||||
|
||||
/datum/antagonist/valentine/greet()
|
||||
to_chat(owner, "<span class='warning'><B>You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.</B></span>")
|
||||
|
||||
@@ -42,4 +43,21 @@
|
||||
if(objectives_complete)
|
||||
return "<span class='greentext big'>[owner.name] protected [owner.p_their()] date</span>"
|
||||
else
|
||||
return "<span class='redtext big'>[owner.name] date failed!</span>"
|
||||
return "<span class='redtext big'>[owner.name] date failed!</span>"
|
||||
|
||||
//Just so it's distinct, basically.
|
||||
/datum/antagonist/valentine/chem/greet()
|
||||
to_chat(owner, "<span class='warning'><B>You're in love with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.</B></span>")
|
||||
|
||||
/datum/antagonist/valentine/chem/roundend_report()
|
||||
var/objectives_complete = TRUE
|
||||
if(owner.objectives.len)
|
||||
for(var/datum/objective/objective in owner.objectives)
|
||||
if(!objective.check_completion())
|
||||
objectives_complete = FALSE
|
||||
break
|
||||
|
||||
if(objectives_complete)
|
||||
return "<span class='greentext big'>[owner.name] protected [owner.p_their()] love: [date.name]! <i>What a cutie!</i></span>"
|
||||
else
|
||||
return "<span class='redtext big'>[owner.name] date failed!</span>"
|
||||
|
||||
@@ -385,9 +385,11 @@
|
||||
/obj/item/warpwhistle/attack_self(mob/living/carbon/user)
|
||||
if(!istype(user) || on_cooldown)
|
||||
return
|
||||
var/turf/T = get_turf(user)
|
||||
if(!T)
|
||||
return
|
||||
on_cooldown = TRUE
|
||||
last_user = user
|
||||
var/turf/T = get_turf(user)
|
||||
playsound(T,'sound/magic/warpwhistle.ogg', 200, 1)
|
||||
user.canmove = FALSE
|
||||
new /obj/effect/temp_visual/tornado(T)
|
||||
@@ -402,9 +404,15 @@
|
||||
return
|
||||
var/breakout = 0
|
||||
while(breakout < 50)
|
||||
if(!T)
|
||||
end_effect(user)
|
||||
return
|
||||
var/turf/potential_T = find_safe_turf()
|
||||
if(!potential_T)
|
||||
end_effect(user)
|
||||
return
|
||||
if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout)
|
||||
user.forceMove(potential_T)
|
||||
do_teleport(user, potential_T, channel = TELEPORT_CHANNEL_MAGIC)
|
||||
user.canmove = 0
|
||||
T = potential_T
|
||||
break
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
crit_fail = FALSE //Is the flash burnt out?
|
||||
light_color = LIGHT_COLOR_WHITE
|
||||
light_power = FLASH_LIGHT_POWER
|
||||
var/flashing_overlay = "flash-f"
|
||||
var/times_used = 0 //Number of times it's been used.
|
||||
var/burnout_resistance = 0
|
||||
var/last_used = 0 //last world.time it was used.
|
||||
@@ -36,8 +37,8 @@
|
||||
add_overlay("flashburnt")
|
||||
attached_overlays += "flashburnt"
|
||||
if(flash)
|
||||
add_overlay("flash-f")
|
||||
attached_overlays += "flash-f"
|
||||
add_overlay(flashing_overlay)
|
||||
attached_overlays += flashing_overlay
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 5)
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
@@ -313,3 +314,50 @@
|
||||
/obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
activate()
|
||||
return ..()
|
||||
|
||||
//ported from tg - check to make sure it can't appear where it's not supposed to.
|
||||
/obj/item/assembly/flash/hypnotic
|
||||
desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance."
|
||||
flashing_overlay = "flash-hypno" //I cannot find this icon no matter how hard I look in tg, so I might just make my own.
|
||||
light_color = LIGHT_COLOR_PINK
|
||||
cooldown = 20
|
||||
|
||||
/obj/item/assembly/flash/hypnotic/burn_out()
|
||||
return
|
||||
|
||||
/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(user)
|
||||
log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src)
|
||||
else //caused by emp/remote signal
|
||||
M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]",LOG_ATTACK)
|
||||
if(generic_message && M != user)
|
||||
to_chat(M, "<span class='disarm'>[src] emits a soothing light...</span>")
|
||||
if(targeted)
|
||||
if(M.flash_act(1, 1))
|
||||
var/hypnosis = FALSE
|
||||
if(M.hypnosis_vulnerable())
|
||||
hypnosis = TRUE
|
||||
if(user)
|
||||
user.visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>", "<span class='danger'>You hypno-flash [M]!</span>")
|
||||
|
||||
if(!hypnosis)
|
||||
to_chat(M, "<span class='notice'>The light makes you feel oddly relaxed...</span>")
|
||||
M.confused += min(M.confused + 10, 20)
|
||||
M.dizziness += min(M.dizziness + 10, 20)
|
||||
M.drowsyness += min(M.drowsyness + 10, 20)
|
||||
M.apply_status_effect(STATUS_EFFECT_PACIFY, 100)
|
||||
else
|
||||
M.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
|
||||
|
||||
else if(user)
|
||||
user.visible_message("<span class='disarm'>[user] fails to blind [M] with the flash!</span>", "<span class='warning'>You fail to hypno-flash [M]!</span>")
|
||||
else
|
||||
to_chat(M, "<span class='danger'>[src] fails to blind you!</span>")
|
||||
|
||||
else if(M.flash_act())
|
||||
to_chat(M, "<span class='notice'>Such a pretty light...</span>")
|
||||
M.confused += min(M.confused + 4, 20)
|
||||
M.dizziness += min(M.dizziness + 4, 20)
|
||||
M.drowsyness += min(M.drowsyness + 4, 20)
|
||||
|
||||
@@ -38,8 +38,11 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
|
||||
for(var/id in cached_gases)
|
||||
. += cached_gases[id] * cached_gasheats[id]
|
||||
|
||||
/datum/gas_mixture/turf/heat_capacity()
|
||||
. = ..()
|
||||
/datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
|
||||
var/list/cached_gases = gases
|
||||
var/list/cached_gasheats = GLOB.meta_gas_specific_heats
|
||||
for(var/id in cached_gases)
|
||||
. += cached_gases[id] * cached_gasheats[id]
|
||||
if(!.)
|
||||
. += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
|
||||
|
||||
@@ -331,22 +334,19 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
|
||||
/datum/gas_mixture/react(datum/holder)
|
||||
. = NO_REACTION
|
||||
var/list/cached_gases = gases
|
||||
if(!cached_gases.len)
|
||||
if(!length(cached_gases))
|
||||
return
|
||||
var/possible
|
||||
var/list/reactions = list()
|
||||
for(var/I in cached_gases)
|
||||
if(GLOB.nonreactive_gases[I])
|
||||
continue
|
||||
possible = TRUE
|
||||
break
|
||||
if(!possible)
|
||||
reactions += SSair.gas_reactions[I]
|
||||
if(!length(reactions))
|
||||
return
|
||||
reaction_results = new
|
||||
var/temp = temperature
|
||||
var/ener = THERMAL_ENERGY(src)
|
||||
|
||||
reaction_loop:
|
||||
for(var/r in SSair.gas_reactions)
|
||||
for(var/r in reactions)
|
||||
var/datum/gas_reaction/reaction = r
|
||||
|
||||
var/list/min_reqs = reaction.min_requirements
|
||||
@@ -376,14 +376,11 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
|
||||
continue reaction_loop
|
||||
//at this point, all requirements for the reaction are satisfied. we can now react()
|
||||
*/
|
||||
|
||||
. |= reaction.react(src, holder)
|
||||
if (. & STOP_REACTIONS)
|
||||
break
|
||||
if(.)
|
||||
GAS_GARBAGE_COLLECT(gases)
|
||||
if(temperature < TCMB) //just for safety
|
||||
temperature = TCMB
|
||||
|
||||
//Takes the amount of the gas you want to PP as an argument
|
||||
//So I don't have to do some hacky switches/defines/magic strings
|
||||
|
||||
@@ -78,22 +78,26 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
var/moles_visible = null
|
||||
var/dangerous = FALSE //currently used by canisters
|
||||
var/fusion_power = 0 //How much the gas accelerates a fusion reaction
|
||||
var/rarity = 0 // relative rarity compared to other gases, used when setting up the reactions list.
|
||||
|
||||
/datum/gas/oxygen
|
||||
id = "o2"
|
||||
specific_heat = 20
|
||||
name = "Oxygen"
|
||||
rarity = 900
|
||||
|
||||
/datum/gas/nitrogen
|
||||
id = "n2"
|
||||
specific_heat = 20
|
||||
name = "Nitrogen"
|
||||
rarity = 1000
|
||||
|
||||
/datum/gas/carbon_dioxide //what the fuck is this?
|
||||
id = "co2"
|
||||
specific_heat = 30
|
||||
name = "Carbon Dioxide"
|
||||
fusion_power = 3
|
||||
rarity = 700
|
||||
|
||||
/datum/gas/plasma
|
||||
id = "plasma"
|
||||
@@ -102,6 +106,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
gas_overlay = "plasma"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
dangerous = TRUE
|
||||
rarity = 800
|
||||
|
||||
/datum/gas/water_vapor
|
||||
id = "water_vapor"
|
||||
@@ -110,6 +115,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
gas_overlay = "water_vapor"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
fusion_power = 8
|
||||
rarity = 500
|
||||
|
||||
/datum/gas/hypernoblium
|
||||
id = "nob"
|
||||
@@ -118,6 +124,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
gas_overlay = "freon"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
dangerous = TRUE
|
||||
rarity = 50
|
||||
|
||||
/datum/gas/nitrous_oxide
|
||||
id = "n2o"
|
||||
@@ -126,6 +133,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
gas_overlay = "nitrous_oxide"
|
||||
moles_visible = MOLES_GAS_VISIBLE * 2
|
||||
dangerous = TRUE
|
||||
rarity = 600
|
||||
|
||||
/datum/gas/nitryl
|
||||
id = "no2"
|
||||
@@ -135,6 +143,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
dangerous = TRUE
|
||||
fusion_power = 15
|
||||
rarity = 100
|
||||
|
||||
/datum/gas/tritium
|
||||
id = "tritium"
|
||||
@@ -144,6 +153,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
dangerous = TRUE
|
||||
fusion_power = 1
|
||||
rarity = 300
|
||||
|
||||
/datum/gas/bz
|
||||
id = "bz"
|
||||
@@ -151,18 +161,21 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
name = "BZ"
|
||||
dangerous = TRUE
|
||||
fusion_power = 8
|
||||
rarity = 400
|
||||
|
||||
/datum/gas/stimulum
|
||||
id = "stim"
|
||||
specific_heat = 5
|
||||
name = "Stimulum"
|
||||
fusion_power = 7
|
||||
rarity = 1
|
||||
|
||||
/datum/gas/pluoxium
|
||||
id = "pluox"
|
||||
specific_heat = 80
|
||||
name = "Pluoxium"
|
||||
fusion_power = 10
|
||||
rarity = 200
|
||||
|
||||
/datum/gas/miasma
|
||||
id = "miasma"
|
||||
@@ -171,6 +184,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
name = "Miasma"
|
||||
gas_overlay = "miasma"
|
||||
moles_visible = MOLES_GAS_VISIBLE * 60
|
||||
rarity = 250
|
||||
|
||||
/obj/effect/overlay/gas
|
||||
icon = 'icons/effects/atmospherics.dmi'
|
||||
|
||||
@@ -1,19 +1,36 @@
|
||||
//All defines used in reactions are located in ..\__DEFINES\reactions.dm
|
||||
|
||||
/proc/init_gas_reactions()
|
||||
var/list/reaction_types = list()
|
||||
. = list()
|
||||
for(var/type in subtypesof(/datum/gas))
|
||||
.[type] = list()
|
||||
|
||||
for(var/r in subtypesof(/datum/gas_reaction))
|
||||
var/datum/gas_reaction/reaction = r
|
||||
if(!initial(reaction.exclude))
|
||||
reaction_types += reaction
|
||||
reaction_types = sortList(reaction_types, /proc/cmp_gas_reactions)
|
||||
if(initial(reaction.exclude))
|
||||
continue
|
||||
reaction = new r
|
||||
var/datum/gas/reaction_key
|
||||
for (var/req in reaction.min_requirements)
|
||||
if (ispath(req))
|
||||
var/datum/gas/req_gas = req
|
||||
if (!reaction_key || initial(reaction_key.rarity) > initial(req_gas.rarity))
|
||||
reaction_key = req_gas
|
||||
.[reaction_key] += list(reaction)
|
||||
sortTim(., /proc/cmp_gas_reactions, TRUE)
|
||||
|
||||
. = list()
|
||||
for(var/path in reaction_types)
|
||||
. += new path
|
||||
|
||||
/proc/cmp_gas_reactions(datum/gas_reaction/a, datum/gas_reaction/b) //sorts in descending order of priority
|
||||
return initial(b.priority) - initial(a.priority)
|
||||
/proc/cmp_gas_reactions(list/datum/gas_reaction/a, list/datum/gas_reaction/b) // compares lists of reactions by the maximum priority contained within the list
|
||||
if (!length(a) || !length(b))
|
||||
return length(b) - length(a)
|
||||
var/maxa
|
||||
var/maxb
|
||||
for (var/datum/gas_reaction/R in a)
|
||||
if (R.priority > maxa)
|
||||
maxa = R.priority
|
||||
for (var/datum/gas_reaction/R in b)
|
||||
if (R.priority > maxb)
|
||||
maxb = R.priority
|
||||
return maxb - maxa
|
||||
|
||||
/datum/gas_reaction
|
||||
//regarding the requirements lists: the minimum or maximum requirements must be non-zero.
|
||||
@@ -326,15 +343,10 @@
|
||||
var/list/cached_gases = air.gases
|
||||
var/temperature = air.temperature
|
||||
var/pressure = air.return_pressure()
|
||||
|
||||
var/old_heat_capacity = air.heat_capacity()
|
||||
var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma]/cached_gases[/datum/gas/nitrous_oxide],1))),cached_gases[/datum/gas/nitrous_oxide],cached_gases[/datum/gas/plasma]/2)
|
||||
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
|
||||
if(cached_gases[/datum/gas/miasma] && cached_gases[/datum/gas/miasma] > 0)
|
||||
energy_released /= cached_gases[/datum/gas/miasma]*0.1
|
||||
if(cached_gases[/datum/gas/bz] && cached_gases[/datum/gas/bz] > 0)
|
||||
energy_released *= cached_gases[/datum/gas/bz]*0.1
|
||||
if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing.
|
||||
if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
|
||||
return NO_REACTION
|
||||
cached_gases[/datum/gas/bz] += reaction_efficency
|
||||
if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide])
|
||||
@@ -343,7 +355,7 @@
|
||||
cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
|
||||
cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
|
||||
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, (reaction_efficency**0.5)*BZ_RESEARCH_AMOUNT)
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT)
|
||||
|
||||
if(energy_released > 0)
|
||||
var/new_heat_capacity = air.heat_capacity()
|
||||
@@ -439,4 +451,4 @@
|
||||
|
||||
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
|
||||
air.temperature += cleaned_air * 0.002
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -27,7 +27,7 @@
|
||||
|
||||
var/obj/item/radio/radio
|
||||
var/radio_key = /obj/item/encryptionkey/headset_med
|
||||
var/radio_channel = "Medical"
|
||||
var/radio_channel = RADIO_CHANNEL_MEDICAL
|
||||
|
||||
var/running_anim = FALSE
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
armour_penetration = 1000
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
anchored = TRUE
|
||||
item_flags = SLOWS_WHILE_IN_HAND
|
||||
var/team = WHITE_TEAM
|
||||
var/reset_cooldown = 0
|
||||
var/anyonecanpickup = TRUE
|
||||
@@ -497,14 +496,14 @@
|
||||
W.registered_name = H.real_name
|
||||
W.update_label(W.registered_name, W.assignment)
|
||||
|
||||
// The shielded hardsuit is already NODROP
|
||||
// The shielded hardsuit is already TRAIT_NODROP
|
||||
no_drops += H.get_item_by_slot(SLOT_GLOVES)
|
||||
no_drops += H.get_item_by_slot(SLOT_SHOES)
|
||||
no_drops += H.get_item_by_slot(SLOT_W_UNIFORM)
|
||||
no_drops += H.get_item_by_slot(SLOT_EARS)
|
||||
for(var/i in no_drops)
|
||||
var/obj/item/I = i
|
||||
I.item_flags |= NODROP
|
||||
ADD_TRAIT(I, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT)
|
||||
|
||||
/datum/outfit/ctf/instagib
|
||||
r_hand = /obj/item/gun/energy/laser/instakill
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
return FALSE
|
||||
return T.air_contents.gases[gas_type] >= moles_required
|
||||
|
||||
/datum/bounty/item/engineering/gas/nitryl_tank
|
||||
name = "Full Tank of Nitryl"
|
||||
description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started."
|
||||
gas_type = /datum/gas/nitryl
|
||||
//datum/bounty/item/engineering/gas/nitryl_tank
|
||||
// name = "Full Tank of Nitryl"
|
||||
// description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started."
|
||||
// gas_type = /datum/gas/nitryl
|
||||
|
||||
/datum/bounty/item/engineering/gas/tritium_tank
|
||||
name = "Full Tank of Tritium"
|
||||
@@ -37,6 +37,55 @@
|
||||
required_count = 10 //easy to make
|
||||
wanted_types = list(/obj/machinery/portable_atmospherics/canister)
|
||||
|
||||
/datum/bounty/item/engineering/microwave
|
||||
name = "Microwaves"
|
||||
description = "Due to a shortage of microwaves, our chefs are incapable of keeping up with our sheer volume of orders. We need at least three microwaves to keep up with our crew's dietary habits."
|
||||
reward = 2000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/machinery/microwave)
|
||||
|
||||
/datum/bounty/item/engineering/hydroponicstrays
|
||||
name = "Hydroponics Tray"
|
||||
description = "The garden has become a hot spot of late, they need a few more hydroponics tray to grow more flowers."
|
||||
reward = 2500
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/hydroponics)
|
||||
|
||||
/datum/bounty/item/engineering/rcd
|
||||
name = "Spare RCD"
|
||||
description = "Construction and repairs to are shuttles are going slowly. As it turns out, we're a little short on RCDs, can you send us a few?"
|
||||
reward = 2500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/construction/rcd)
|
||||
|
||||
/datum/bounty/item/engineering/rpd
|
||||
name = "Spare RPD"
|
||||
description = "Our Atmospheric Technicians are still living in the past, relying on stationary pipe dispensers to produce the pipes necessary to accomplish their strenuous tasks. They could use an upgrade. Could you send us some Rapid Pipe Dispensers?"
|
||||
reward = 3000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/pipe_dispenser)
|
||||
|
||||
/datum/bounty/item/engineering/heaters
|
||||
name = "Space Heaters"
|
||||
description = "The kitchen freezer was left open and now the whole place is frozen solid! We need a few space heaters to warm it back up before anyone gets hungry."
|
||||
reward = 3000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/space_heater)
|
||||
|
||||
/datum/bounty/item/engineering/arcadetrail
|
||||
name = "Orion Trail Arcade Games"
|
||||
description = "The staff have nothing to do when off-work. Can you send us some Orion Trail games to play?"
|
||||
reward = 3000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/computer/arcade/orion_trail)
|
||||
|
||||
/datum/bounty/item/engineering/arcadebattle
|
||||
name = "Battle Arcade Games"
|
||||
description = "The staff have nothing to do when off-work. Can you send us some Battle Arcade games to play?"
|
||||
reward = 3000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/computer/arcade/battle)
|
||||
|
||||
/datum/bounty/item/engineering/energy_ball
|
||||
name = "Contained Tesla Ball"
|
||||
description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
|
||||
|
||||
@@ -109,10 +109,9 @@ datum/bounty/reagent/complex_drink/New()
|
||||
/datum/reagent/consumable/ethanol/patron,\
|
||||
/datum/reagent/consumable/ethanol/quadruple_sec,\
|
||||
/datum/reagent/consumable/ethanol/quintuple_sec,\
|
||||
/datum/reagent/consumable/bluecherryshake,\
|
||||
/datum/reagent/consumable/doctor_delight,\
|
||||
/datum/reagent/consumable/ethanol/silencer)
|
||||
|
||||
|
||||
var/reagent_type = pick(possible_reagents)
|
||||
wanted_reagent = new reagent_type
|
||||
name = wanted_reagent.name
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
cat |= EXPORT_EMAG
|
||||
|
||||
/obj/machinery/computer/cargo/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] swipes a suspicious card through [src]!</span>",
|
||||
@@ -48,6 +49,8 @@
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.contraband = TRUE
|
||||
board.obj_flags |= EMAGGED
|
||||
req_access = list()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
|
||||
/datum/export/paperwork_correct
|
||||
cost = 150
|
||||
k_elasticity = 0
|
||||
unit_name = "correct paperwork"
|
||||
export_types = list(/obj/item/folder/paperwork_correct)
|
||||
|
||||
@@ -88,5 +89,6 @@
|
||||
|
||||
/datum/export/paperwork_incorrect
|
||||
cost = -500 // Failed to meet NT standers
|
||||
k_elasticity = 0
|
||||
unit_name = "returned incorrect paperwork"
|
||||
export_types = list(/obj/item/folder/paperwork)
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/cargo/express/emag_act(mob/living/user)
|
||||
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] swipes a suspicious card through [src]!</span>",
|
||||
@@ -63,6 +64,8 @@
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.obj_flags |= EMAGGED
|
||||
packin_up()
|
||||
req_access = list()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
|
||||
meme_pack_data = list() // sorry for what?
|
||||
|
||||
+146
-68
@@ -252,6 +252,17 @@
|
||||
crate_name = "space suit crate"
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
/datum/supply_pack/emergency/spacejets
|
||||
name = "Spare EVA Jetpacks"
|
||||
desc = "Contains three EVA grade jectpaks. Requires EVA access to open."
|
||||
cost = 2000
|
||||
access = ACCESS_EVA
|
||||
contains = list(/obj/item/tank/jetpack/carbondioxide/eva,
|
||||
/obj/item/tank/jetpack/carbondioxide/eva,
|
||||
/obj/item/tank/jetpack/carbondioxide/eva)
|
||||
crate_name = "eva jetpacks crate"
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
/datum/supply_pack/emergency/specialops
|
||||
name = "Special Ops Supplies"
|
||||
desc = "(*!&@#TOO CHEAP FOR THAT NULL_ENTRY, HUH OPERATIVE? WELL, THIS LITTLE ORDER CAN STILL HELP YOU OUT IN A PINCH. CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, AN INCENDIARY GRENADE, AND A \"SLEEPY PEN\" FULL OF NICE TOXINS!#@*$"
|
||||
@@ -339,15 +350,6 @@
|
||||
/obj/item/clothing/head/fedora/det_hat)
|
||||
crate_name = "forensics crate"
|
||||
|
||||
/datum/supply_pack/security/sechardsuit
|
||||
name = "Sec Hardsuit"
|
||||
desc = "One Sec Hardsuit with a small air tank and mask."
|
||||
cost = 3000 // half of SWAT gear for have the armor and half the gear
|
||||
contains = list(/obj/item/clothing/suit/space/hardsuit/security,
|
||||
/obj/item/tank/internals/air,
|
||||
/obj/item/clothing/mask/gas)
|
||||
crate_name = "sec hardsuit crate"
|
||||
|
||||
/datum/supply_pack/security/helmets
|
||||
name = "Helmets Crate"
|
||||
desc = "Contains three standard-issue brain buckets. Requires Security access to open."
|
||||
@@ -366,6 +368,55 @@
|
||||
/obj/item/gun/energy/laser)
|
||||
crate_name = "laser crate"
|
||||
|
||||
/datum/supply_pack/security/russianclothing
|
||||
name = "Russian Surplus Clothing"
|
||||
desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!"
|
||||
contraband = TRUE
|
||||
cost = 5000 // Its basicly sec suits, good boots/gloves
|
||||
contains = list(/obj/item/clothing/suit/security/officer/russian,
|
||||
/obj/item/clothing/suit/security/officer/russian,
|
||||
/obj/item/clothing/shoes/combat,
|
||||
/obj/item/clothing/shoes/combat,
|
||||
/obj/item/clothing/head/ushanka,
|
||||
/obj/item/clothing/head/ushanka,
|
||||
/obj/item/clothing/suit/armor/bulletproof,
|
||||
/obj/item/clothing/suit/armor/bulletproof,
|
||||
/obj/item/clothing/head/helmet/alt,
|
||||
/obj/item/clothing/head/helmet/alt,
|
||||
/obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas)
|
||||
crate_name = "surplus russian clothing"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/security/russianmosin
|
||||
name = "Russian Minutemen Gear"
|
||||
desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip."
|
||||
contraband = TRUE
|
||||
access = FALSE
|
||||
cost = 5000 //
|
||||
contains = list(/obj/item/clothing/suit/security/officer/russian,
|
||||
/obj/item/clothing/shoes/combat,
|
||||
/obj/item/clothing/head/ushanka,
|
||||
/obj/item/clothing/suit/armor/bulletproof,
|
||||
/obj/item/clothing/head/helmet/alt,
|
||||
/obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/gun/ballistic/shotgun/boltaction,
|
||||
/obj/item/ammo_box/a762)
|
||||
crate_name = "surplus russian gear"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/security/sechardsuit
|
||||
name = "Sec Hardsuit"
|
||||
desc = "One Sec Hardsuit with a small air tank and mask."
|
||||
cost = 3000 // half of SWAT gear for have the armor and half the gear
|
||||
contains = list(/obj/item/clothing/suit/space/hardsuit/security,
|
||||
/obj/item/tank/internals/air,
|
||||
/obj/item/clothing/mask/gas)
|
||||
crate_name = "sec hardsuit crate"
|
||||
|
||||
/datum/supply_pack/security/securitybarriers
|
||||
name = "Security Barrier Grenades"
|
||||
desc = "Stem the tide with four Security Barrier grenades. Requires Security access to open."
|
||||
@@ -430,28 +481,6 @@
|
||||
/obj/item/melee/baton/loaded)
|
||||
crate_name = "stun baton crate"
|
||||
|
||||
/datum/supply_pack/security/russianclothing
|
||||
name = "Russian Surplus Clothing"
|
||||
desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!"
|
||||
contraband = TRUE
|
||||
cost = 5000 // Its basicly sec suits, good boots/gloves
|
||||
contains = list(/obj/item/clothing/suit/security/officer/russian,
|
||||
/obj/item/clothing/suit/security/officer/russian,
|
||||
/obj/item/clothing/shoes/combat,
|
||||
/obj/item/clothing/shoes/combat,
|
||||
/obj/item/clothing/head/ushanka,
|
||||
/obj/item/clothing/head/ushanka,
|
||||
/obj/item/clothing/suit/armor/bulletproof,
|
||||
/obj/item/clothing/suit/armor/bulletproof,
|
||||
/obj/item/clothing/head/helmet/alt,
|
||||
/obj/item/clothing/head/helmet/alt,
|
||||
/obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas)
|
||||
crate_name = "surplus russian clothing"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/security/taser
|
||||
name = "Taser Crate"
|
||||
desc = "From the depths of stunbased combat, this order rises above, supreme. Contains three hybrid tasers, capable of firing both electrodes and disabling shots. Requires Security access to open."
|
||||
@@ -665,6 +694,15 @@
|
||||
/obj/item/gun/energy/e_gun/stun)
|
||||
crate_name = "swat taser crate"
|
||||
|
||||
/datum/supply_pack/security/armory/woodstock
|
||||
name = "Classic WoodStock Shotguns Crate"
|
||||
desc = "Contains three rustic, pumpaction shotguns. Requires Armory access to open."
|
||||
cost = 3500
|
||||
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."
|
||||
@@ -1633,7 +1671,7 @@
|
||||
/obj/item/caution,
|
||||
/obj/item/storage/bag/trash,
|
||||
/obj/item/reagent_containers/spray/cleaner,
|
||||
/obj/item/reagent_containers/glass/rag,
|
||||
/obj/item/reagent_containers/rag,
|
||||
/obj/item/grenade/chem_grenade/cleaner,
|
||||
/obj/item/grenade/chem_grenade/cleaner,
|
||||
/obj/item/grenade/chem_grenade/cleaner,
|
||||
@@ -1661,17 +1699,28 @@
|
||||
/datum/supply_pack/service/janitor/janpremium
|
||||
name = "Janitor Premium Supplies"
|
||||
desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia."
|
||||
cost = 3000
|
||||
cost = 1750
|
||||
access = ACCESS_JANITOR
|
||||
contains = list(/obj/item/caution,
|
||||
/obj/item/caution,
|
||||
/obj/item/caution,
|
||||
/obj/item/reagent_containers/glass/rag,
|
||||
/obj/item/reagent_containers/rag,
|
||||
/obj/item/reagent_containers/glass/bottle/ammonia,
|
||||
/obj/item/reagent_containers/glass/bottle/ammonia,
|
||||
/obj/item/reagent_containers/glass/bottle/ammonia,
|
||||
/obj/item/reagent_containers/spray/drying_agent)
|
||||
crate_name = "janitor backpack crate"
|
||||
|
||||
/datum/supply_pack/service/janitor/janpimp
|
||||
name = "Custodial Cruiser"
|
||||
desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!"
|
||||
cost = 3000
|
||||
access = ACCESS_JANITOR
|
||||
contains = list(/obj/vehicle/ridden/janicart,
|
||||
/obj/item/key/janitor)
|
||||
crate_name = "janitor ride crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
|
||||
/datum/supply_pack/service/mule
|
||||
name = "MULEbot Crate"
|
||||
desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!"
|
||||
@@ -1968,7 +2017,8 @@
|
||||
/obj/item/storage/box/mre/menu1/safe,
|
||||
/obj/item/storage/box/mre/menu2/safe,
|
||||
/obj/item/storage/box/mre/menu2/safe,
|
||||
/obj/item/storage/box/mre/menu3)
|
||||
/obj/item/storage/box/mre/menu3,
|
||||
/obj/item/storage/box/mre/menu4/safe)
|
||||
crate_name = "MRE crate (emergency rations)"
|
||||
|
||||
/datum/supply_pack/organic/pizza
|
||||
@@ -2195,6 +2245,12 @@
|
||||
/obj/item/clothing/neck/petcollar)
|
||||
crate_name = "pug crate"
|
||||
|
||||
/datum/supply_pack/organic/critter/kiwi
|
||||
name = "Space kiwi Crate"
|
||||
cost = 2000
|
||||
contains = list( /mob/living/simple_animal/kiwi)
|
||||
crate_name = "space kiwi crate"
|
||||
|
||||
/datum/supply_pack/critter/snake
|
||||
name = "Snake Crate"
|
||||
desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? Then this isn't the crate for you. Contains three poisonous snakes."
|
||||
@@ -2204,6 +2260,17 @@
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake)
|
||||
crate_name = "snake crate"
|
||||
|
||||
/datum/supply_pack/critter/secbat
|
||||
name = "Security Bat Crate"
|
||||
desc = "Contains five security bats, perfect to Bat-up any security officer."
|
||||
cost = 2500
|
||||
contains = list(/mob/living/simple_animal/hostile/retaliate/bat/secbat,
|
||||
/mob/living/simple_animal/hostile/retaliate/bat/secbat,
|
||||
/mob/living/simple_animal/hostile/retaliate/bat/secbat,
|
||||
/mob/living/simple_animal/hostile/retaliate/bat/secbat,
|
||||
/mob/living/simple_animal/hostile/retaliate/bat/secbat)
|
||||
crate_name = "security bat crate"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Costumes & Toys /////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
@@ -2561,6 +2628,13 @@
|
||||
/obj/item/vending_refill/wardrobe/law_wardrobe)
|
||||
crate_name = "security department supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/kinkmate
|
||||
name = "Kinkmate construction kit"
|
||||
cost = 2000
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate)
|
||||
crate_name = "Kinkmate construction kit"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Miscellaneous ///////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
@@ -2674,6 +2748,26 @@
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
crate_name = "festive wrapping paper crate"
|
||||
|
||||
/datum/supply_pack/misc/paper_work
|
||||
name = "Freelance Paper work"
|
||||
desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (10) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up.
|
||||
cost = 700 // Net of 0 credits
|
||||
contains = list(/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain)
|
||||
crate_name = "Paperwork"
|
||||
|
||||
/datum/supply_pack/misc/funeral
|
||||
name = "Funeral Supply crate"
|
||||
@@ -2686,18 +2780,11 @@
|
||||
crate_name = "coffin"
|
||||
crate_type = /obj/structure/closet/crate/coffin
|
||||
|
||||
/datum/supply_pack/misc/religious_supplies
|
||||
name = "Religious Supplies Crate"
|
||||
desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
|
||||
cost = 4000 // it costs so much because the Space Church is ran by Space Jews
|
||||
contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/item/storage/book/bible/booze,
|
||||
/obj/item/storage/book/bible/booze,
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie,
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie
|
||||
)
|
||||
crate_name = "religious supplies crate"
|
||||
/datum/supply_pack/misc/jukebox
|
||||
name = "Jukebox"
|
||||
cost = 35000
|
||||
contains = list(/obj/machinery/jukebox)
|
||||
crate_name = "Jukebox"
|
||||
|
||||
/datum/supply_pack/misc/lewd
|
||||
name = "Lewd Crate" // OwO
|
||||
@@ -2730,26 +2817,18 @@
|
||||
crate_name = "deluxe keg"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/misc/paper_work
|
||||
name = "Freelance Paper work"
|
||||
desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (10) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up.
|
||||
cost = 400 // Net of 0 credits
|
||||
contains = list(/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/folder/paperwork,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/pen/fountain)
|
||||
crate_name = "Paperwork"
|
||||
/datum/supply_pack/misc/religious_supplies
|
||||
name = "Religious Supplies Crate"
|
||||
desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
|
||||
cost = 4000 // it costs so much because the Space Church is ran by Space Jews
|
||||
contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/holywater,
|
||||
/obj/item/storage/book/bible/booze,
|
||||
/obj/item/storage/book/bible/booze,
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie,
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie
|
||||
)
|
||||
crate_name = "religious supplies crate"
|
||||
|
||||
/datum/supply_pack/misc/randomised/promiscuous
|
||||
name = "Promiscuous Organs"
|
||||
@@ -2775,4 +2854,3 @@
|
||||
/obj/item/toner,
|
||||
/obj/item/toner)
|
||||
crate_name = "toner crate"
|
||||
|
||||
|
||||
@@ -75,3 +75,8 @@
|
||||
var/datum/player_details/player_details //these persist between logins/logouts during the same round.
|
||||
|
||||
var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen.
|
||||
|
||||
var/client_keysend_amount = 0
|
||||
var/next_keysend_reset = 0
|
||||
var/next_keysend_trip_reset = 0
|
||||
var/keysend_tripped = FALSE
|
||||
@@ -817,6 +817,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
var/file = GLOB.vox_sounds[name]
|
||||
Export("##action=load_rsc", file)
|
||||
stoplag()
|
||||
for (var/name in GLOB.vox_sounds_male)
|
||||
var/file = GLOB.vox_sounds_male[name]
|
||||
Export("##action=load_rsc", file)
|
||||
stoplag()
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
//Darkmode preference by Kmc2000//
|
||||
|
||||
/*
|
||||
This lets you switch chat themes by using winset and CSS loading, you must relog to see this change (or rebuild your browseroutput datum)
|
||||
Things to note:
|
||||
If you change ANYTHING in interface/skin.dmf you need to change it here:
|
||||
Format:
|
||||
winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value")
|
||||
How this works:
|
||||
I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat)
|
||||
This then swaps the window theme automatically
|
||||
Thanks to spacemaniac and mcdonald for help with the JS side of this.
|
||||
*/
|
||||
|
||||
/client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested.
|
||||
//Main windows
|
||||
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "split", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
//Buttons
|
||||
winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG]")
|
||||
winset(src, "report-issue", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
//Status and verb tabs
|
||||
winset(src, "output", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "statwindow", "text-color = #eaeaea;text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
|
||||
//Etc.
|
||||
winset(src, "say", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "say", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "asset_cache_browser", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
|
||||
/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing
|
||||
//Main windows
|
||||
winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "infowindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "info", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "browseroutput", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "outputwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
//Buttons
|
||||
winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "changelog", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "rules", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "wiki", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "forum", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "github", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG]")
|
||||
winset(src, "report-issue", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
//Status and verb tabs
|
||||
winset(src, "output", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "output", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "statwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "stat", "tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "stat", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "tab-text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "prefix-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "suffix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
|
||||
//Etc.
|
||||
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "say", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "asset_cache_browser", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "tooltip", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
|
||||
|
||||
/datum/asset/simple/goonchat
|
||||
verify = FALSE
|
||||
assets = list(
|
||||
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
|
||||
"errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js',
|
||||
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
|
||||
"fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot',
|
||||
"fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg',
|
||||
"fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf',
|
||||
"fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff',
|
||||
"font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css',
|
||||
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
|
||||
"browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css',
|
||||
)
|
||||
+172
-179
@@ -29,7 +29,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
//game-preferences
|
||||
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
|
||||
var/ooccolor = null
|
||||
var/ooccolor = "#c43b23"
|
||||
var/aooccolor = "#ce254f"
|
||||
var/enable_tips = TRUE
|
||||
var/tip_delay = 500 //tip delay in milliseconds
|
||||
|
||||
@@ -71,18 +72,20 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/gender = MALE //gender of character (well duh)
|
||||
var/age = 30 //age of character
|
||||
var/underwear = "Nude" //underwear type
|
||||
var/undie_color = "#FFFFFF"
|
||||
var/undie_color = "FFF"
|
||||
var/undershirt = "Nude" //undershirt type
|
||||
var/shirt_color = "#FFFFFF"
|
||||
var/shirt_color = "FFF"
|
||||
var/socks = "Nude" //socks type
|
||||
var/socks_color = "#FFFFFF"
|
||||
var/socks_color = "FFF"
|
||||
var/backbag = DBACKPACK //backpack type
|
||||
var/jumpsuit_style = PREF_SUIT //suit/skirt
|
||||
var/hair_style = "Bald" //Hair type
|
||||
var/hair_color = "000" //Hair color
|
||||
var/facial_hair_style = "Shaved" //Face hair type
|
||||
var/facial_hair_color = "000" //Facial hair color
|
||||
var/skin_tone = "caucasian1" //Skin color
|
||||
var/eye_color = "000" //Eye color
|
||||
var/horn_color = "85615a" //Horn color
|
||||
var/datum/species/pref_species = new /datum/species/human() //Mutant race
|
||||
var/list/features = list("mcolor" = "FFF",
|
||||
"tail_lizard" = "Smooth",
|
||||
@@ -94,8 +97,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"frills" = "None",
|
||||
"spines" = "None",
|
||||
"body_markings" = "None",
|
||||
"legs" = "Normal Legs",
|
||||
"moth_wings" = "Plain",
|
||||
"legs" = "Plantigrade",
|
||||
"insect_wings" = "Plain",
|
||||
"insect_fluff" = "None",
|
||||
"mcolor2" = "FFF",
|
||||
"mcolor3" = "FFF",
|
||||
"mam_body_markings" = "Plain",
|
||||
@@ -142,6 +146,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"breasts_size" = "C",
|
||||
"breasts_shape" = "Pair",
|
||||
"breasts_fluid" = "milk",
|
||||
"breasts_producing" = FALSE,
|
||||
"has_vag" = FALSE,
|
||||
"vag_shape" = "Human",
|
||||
"vag_color" = "fff",
|
||||
@@ -154,7 +159,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"womb_fluid" = "femcum",
|
||||
"ipc_screen" = "Sunburst",
|
||||
"ipc_antenna" = "None",
|
||||
"flavor_text" = ""
|
||||
"flavor_text" = "",
|
||||
"meat_type" = "Mammalian"
|
||||
)
|
||||
|
||||
var/list/custom_names = list()
|
||||
@@ -169,18 +175,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/list/all_quirks = list()
|
||||
var/list/character_quirks = list()
|
||||
|
||||
//Jobs, uses bitflags
|
||||
var/job_civilian_high = 0
|
||||
var/job_civilian_med = 0
|
||||
var/job_civilian_low = 0
|
||||
|
||||
var/job_medsci_high = 0
|
||||
var/job_medsci_med = 0
|
||||
var/job_medsci_low = 0
|
||||
|
||||
var/job_engsec_high = 0
|
||||
var/job_engsec_med = 0
|
||||
var/job_engsec_low = 0
|
||||
//Job preferences 2.0 - indexed by job title , no key or value implies never
|
||||
var/list/job_preferences = list()
|
||||
|
||||
// Want randomjob if preferences already filled - Donkie
|
||||
var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants
|
||||
@@ -238,7 +234,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
return
|
||||
|
||||
#define APPEARANCE_CATEGORY_COLUMN "<td valign='top' width='17%'>"
|
||||
#define MAX_MUTANT_ROWS 4
|
||||
#define MAX_MUTANT_ROWS 5
|
||||
|
||||
/datum/preferences/proc/ShowChoices(mob/user)
|
||||
if(!user || !user.client)
|
||||
@@ -348,9 +344,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "[TextPreview(features["flavor_text"])]...<BR>"
|
||||
dat += "<h2>Body</h2>"
|
||||
dat += "<b>Gender:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=gender'>[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]</a><BR>"
|
||||
dat += "<b>Species:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=species;task=input'>[pref_species.id]</a><BR>"
|
||||
dat += "<b>Species:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=species;task=input'>[pref_species.name]</a><BR>"
|
||||
dat += "<b>Custom Species Name:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=custom_species;task=input'>[custom_species ? custom_species : "None"]</a><BR>"
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=all;task=random'>Random Body</A><BR>"
|
||||
dat += "<b>Random Body:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=all;task=random'>Randomize!</A><BR>"
|
||||
dat += "<b>Always Random Body:</b><a href='?_src_=prefs;preference=all'>[be_random_body ? "Yes" : "No"]</A><BR>"
|
||||
dat += "<br><b>Cycle background:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=cycle_bg;task=input'>[bgstate]</a><BR>"
|
||||
|
||||
@@ -445,6 +441,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=tail_human;task=input'>[features["tail_human"]]</a>"
|
||||
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
|
||||
if("meat_type" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
|
||||
dat += "<h3>Meat Type</h3>"
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=meats;task=input'>[features["meat_type"]]</a>"
|
||||
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
@@ -468,6 +477,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<h3>Horns</h3>"
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=horns;task=input'>[features["horns"]]</a>"
|
||||
dat += "<span style='border:1px solid #161616; background-color: #[horn_color];'> </span> <a href='?_src_=prefs;preference=horns_color;task=input'>Change</a><BR>"
|
||||
|
||||
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
@@ -534,6 +545,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
|
||||
if("ears" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
@@ -546,6 +558,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
@@ -570,14 +583,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
if("moth_wings" in pref_species.default_features)
|
||||
if("insect_wings" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
|
||||
dat += "<h3>Moth wings</h3>"
|
||||
dat += "<h3>Insect wings</h3>"
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=moth_wings;task=input'>[features["moth_wings"]]</a>"
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=insect_wings;task=input'>[features["insect_wings"]]</a>"
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
if("insect_fluff" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
|
||||
dat += "<h3>Insect Fluff</h3>"
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=insect_fluffs;task=input'>[features["insect_fluff"]]</a>"
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
@@ -678,14 +701,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<h2>Clothing & Equipment</h2>"
|
||||
dat += "<b>Underwear:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.underwear_list[underwear]))
|
||||
dat += "<b>Underwear Color:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=undie_color;task=input'>[undie_color]</a>"
|
||||
dat += "<b>Underwear Color:</b> <span style='border:1px solid #161616; background-color: #[undie_color];'> </span> <a href='?_src_=prefs;preference=undie_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Undershirt:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.undershirt_list[undershirt]))
|
||||
dat += "<b>Undershirt Color:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=shirt_color;task=input'>[shirt_color]</a>"
|
||||
dat += "<b>Undershirt Color:</b> <span style='border:1px solid #161616; background-color: #[shirt_color];'> </span> <a href='?_src_=prefs;preference=shirt_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Socks:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=socks;task=input'>[socks]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.socks_list[socks]))
|
||||
dat += "<b>Socks Color:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=socks_color;task=input'>[socks_color]</a>"
|
||||
dat += "<b>Socks Color:</b> <span style='border:1px solid #161616; background-color: #[socks_color];'> </span> <a href='?_src_=prefs;preference=socks_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Backpack:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=bag;task=input'>[backbag]</a>"
|
||||
dat += "<b>Jumpsuit:</b><BR><a href ='?_src_=prefs;preference=suit;task=input'>[jumpsuit_style]</a><BR>"
|
||||
dat += "<b>Uplink Location:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=uplink_loc;task=input'>[uplink_spawn_loc]</a>"
|
||||
dat += "</td>"
|
||||
|
||||
@@ -740,6 +764,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'> </span> <a href='?_src_=prefs;preference=breasts_color;task=input'>Change</a><br>"
|
||||
dat += "<b>Cup Size:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_size;task=input'>[features["breasts_size"]]</a>"
|
||||
dat += "<b>Breast Shape:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_shape;task=input'>[features["breasts_shape"]]</a>"
|
||||
dat += "<b>Lactates:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_producing'>[features["breasts_producing"] == TRUE ? "Yes" : "No"]</a>"
|
||||
dat += "</td>"
|
||||
dat += "</td>"
|
||||
dat += "</tr></table>"
|
||||
@@ -774,6 +799,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>BYOND Membership Publicity:</b> <a href='?_src_=prefs;preference=publicity'>[(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]</a><br>"
|
||||
if(unlock_content || check_rights_for(user.client, R_ADMIN))
|
||||
dat += "<b>OOC Color:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : GLOB.normal_ooc_colour];'> </span> <a href='?_src_=prefs;preference=ooccolor;task=input'>Change</a><br>"
|
||||
dat += "<b>Antag OOC Color:</b> <span style='border: 1px solid #161616; background-color: [aooccolor ? aooccolor : GLOB.normal_aooc_colour];'> </span> <a href='?_src_=prefs;preference=aooccolor;task=input'>Change</a><br>"
|
||||
|
||||
dat += "</td>"
|
||||
if(user.client.holder)
|
||||
dat +="<td width='300px' height='300px' valign='top'>"
|
||||
@@ -791,6 +818,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Voracious MediHound sleepers:</b> <a href='?_src_=prefs;preference=hound_sleeper'>[(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Sounds:</b> <a href='?_src_=prefs;preference=toggleeatingnoise'>[(cit_toggles & EATING_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Digestion Sounds:</b> <a href='?_src_=prefs;preference=toggledigestionnoise'>[(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Lewdchem:</b><a href='?_src_=prefs;preference=lewdchem'>[lewdchem == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
dat += "<b>Widescreen:</b> <a href='?_src_=prefs;preference=widescreenpref'>[widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]</a><br>"
|
||||
dat += "<b>Auto stand:</b> <a href='?_src_=prefs;preference=autostand'>[autostand ? "Enabled" : "Disabled"]</a><br>"
|
||||
dat += "<b>Screen Shake:</b> <a href='?_src_=prefs;preference=screenshake'>[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]</a><br>"
|
||||
@@ -911,11 +939,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<td width=80%><font size=2><b>Description</b></font></td></tr>"
|
||||
for(var/j in GLOB.loadout_items[gear_tab])
|
||||
var/datum/gear/gear = GLOB.loadout_items[gear_tab][j]
|
||||
var/donoritem
|
||||
if(gear.ckeywhitelist && gear.ckeywhitelist.len)
|
||||
donoritem = TRUE
|
||||
if(!(user.ckey in gear.ckeywhitelist))
|
||||
continue
|
||||
var/donoritem = gear.donoritem
|
||||
if(donoritem && !gear.donator_ckey_check(user.ckey))
|
||||
continue
|
||||
var/class_link = ""
|
||||
if(gear.type in chosen_gear)
|
||||
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(j)];toggle_gear=0'"
|
||||
@@ -986,9 +1012,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
//The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
|
||||
var/datum/job/lastJob
|
||||
|
||||
var/datum/job/overflow = SSjob.GetJob(SSjob.overflow_role)
|
||||
|
||||
for(var/datum/job/job in SSjob.occupations)
|
||||
for(var/datum/job/job in sortList(SSjob.occupations, /proc/cmp_job_display_asc))
|
||||
|
||||
index += 1
|
||||
if((index >= limit) || (job.title in splitJobs))
|
||||
@@ -1005,7 +1029,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/rank = job.title
|
||||
lastJob = job
|
||||
if(jobban_isbanned(user, rank))
|
||||
HTML += "<font color=red>[rank]</font></td><td><a href='?_src_=prefs;jobbancheck=[rank]'> BANNED</a></td></tr>"
|
||||
HTML += "<font color=red>[rank]</font></td><td><a href='?_src_=prefs;bancheck=[rank]'> BANNED</a></td></tr>"
|
||||
continue
|
||||
var/required_playtime_remaining = job.required_playtime_remaining(user.client)
|
||||
if(required_playtime_remaining)
|
||||
@@ -1015,7 +1039,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/available_in_days = job.available_in_days(user.client)
|
||||
HTML += "<font color=red>[rank]</font></td><td><font color=red> \[IN [(available_in_days)] DAYS\]</font></td></tr>"
|
||||
continue
|
||||
if((job_civilian_low & overflow.flag) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
|
||||
if(!user.client.prefs.pref_species.qualifies_for_rank(rank, user.client.prefs.features))
|
||||
if(user.client.prefs.pref_species.id == "human")
|
||||
HTML += "<font color=red>[rank]</font></td><td><font color=red><b> \[MUTANT\]</b></font></td></tr>"
|
||||
else
|
||||
HTML += "<font color=red>[rank]</font></td><td><font color=red><b> \[NON-HUMAN\]</b></font></td></tr>"
|
||||
continue
|
||||
if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
|
||||
HTML += "<font color=orange>[rank]</font></td><td></td></tr>"
|
||||
continue
|
||||
if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs
|
||||
@@ -1030,32 +1060,32 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/prefUpperLevel = -1 // level to assign on left click
|
||||
var/prefLowerLevel = -1 // level to assign on right click
|
||||
|
||||
if(GetJobDepartment(job, 1) & job.flag)
|
||||
prefLevelLabel = "High"
|
||||
prefLevelColor = "slateblue"
|
||||
prefUpperLevel = 4
|
||||
prefLowerLevel = 2
|
||||
else if(GetJobDepartment(job, 2) & job.flag)
|
||||
prefLevelLabel = "Medium"
|
||||
prefLevelColor = "green"
|
||||
prefUpperLevel = 1
|
||||
prefLowerLevel = 3
|
||||
else if(GetJobDepartment(job, 3) & job.flag)
|
||||
prefLevelLabel = "Low"
|
||||
prefLevelColor = "orange"
|
||||
prefUpperLevel = 2
|
||||
prefLowerLevel = 4
|
||||
else
|
||||
prefLevelLabel = "NEVER"
|
||||
prefLevelColor = "red"
|
||||
prefUpperLevel = 3
|
||||
prefLowerLevel = 1
|
||||
|
||||
switch(job_preferences["[job.title]"])
|
||||
if(JP_HIGH)
|
||||
prefLevelLabel = "High"
|
||||
prefLevelColor = "slateblue"
|
||||
prefUpperLevel = 4
|
||||
prefLowerLevel = 2
|
||||
if(JP_MEDIUM)
|
||||
prefLevelLabel = "Medium"
|
||||
prefLevelColor = "green"
|
||||
prefUpperLevel = 1
|
||||
prefLowerLevel = 3
|
||||
if(JP_LOW)
|
||||
prefLevelLabel = "Low"
|
||||
prefLevelColor = "orange"
|
||||
prefUpperLevel = 2
|
||||
prefLowerLevel = 4
|
||||
else
|
||||
prefLevelLabel = "NEVER"
|
||||
prefLevelColor = "red"
|
||||
prefUpperLevel = 3
|
||||
prefLowerLevel = 1
|
||||
|
||||
HTML += "<a class='white' href='?_src_=prefs;preference=job;task=setJobLevel;level=[prefUpperLevel];text=[rank]' oncontextmenu='javascript:return setJobPrefRedirect([prefLowerLevel], \"[rank]\");'>"
|
||||
|
||||
if(rank == SSjob.overflow_role)//Overflow is special
|
||||
if(job_civilian_low & overflow.flag)
|
||||
if(job_preferences["[SSjob.overflow_role]"] == JP_LOW)
|
||||
HTML += "<font color=green>Yes</font>"
|
||||
else
|
||||
HTML += "<font color=red>No</font>"
|
||||
@@ -1086,61 +1116,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
/datum/preferences/proc/SetJobPreferenceLevel(datum/job/job, level)
|
||||
if (!job)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if (level == 1) // to high
|
||||
// remove any other job(s) set to high
|
||||
job_civilian_med |= job_civilian_high
|
||||
job_engsec_med |= job_engsec_high
|
||||
job_medsci_med |= job_medsci_high
|
||||
job_civilian_high = 0
|
||||
job_engsec_high = 0
|
||||
job_medsci_high = 0
|
||||
if (level == JP_HIGH) // to high
|
||||
//Set all other high to medium
|
||||
for(var/j in job_preferences)
|
||||
if(job_preferences["[j]"] == JP_HIGH)
|
||||
job_preferences["[j]"] = JP_MEDIUM
|
||||
//technically break here
|
||||
|
||||
if (job.department_flag == CIVILIAN)
|
||||
job_civilian_low &= ~job.flag
|
||||
job_civilian_med &= ~job.flag
|
||||
job_civilian_high &= ~job.flag
|
||||
|
||||
switch(level)
|
||||
if (1)
|
||||
job_civilian_high |= job.flag
|
||||
if (2)
|
||||
job_civilian_med |= job.flag
|
||||
if (3)
|
||||
job_civilian_low |= job.flag
|
||||
|
||||
return 1
|
||||
else if (job.department_flag == ENGSEC)
|
||||
job_engsec_low &= ~job.flag
|
||||
job_engsec_med &= ~job.flag
|
||||
job_engsec_high &= ~job.flag
|
||||
|
||||
switch(level)
|
||||
if (1)
|
||||
job_engsec_high |= job.flag
|
||||
if (2)
|
||||
job_engsec_med |= job.flag
|
||||
if (3)
|
||||
job_engsec_low |= job.flag
|
||||
|
||||
return 1
|
||||
else if (job.department_flag == MEDSCI)
|
||||
job_medsci_low &= ~job.flag
|
||||
job_medsci_med &= ~job.flag
|
||||
job_medsci_high &= ~job.flag
|
||||
|
||||
switch(level)
|
||||
if (1)
|
||||
job_medsci_high |= job.flag
|
||||
if (2)
|
||||
job_medsci_med |= job.flag
|
||||
if (3)
|
||||
job_medsci_low |= job.flag
|
||||
|
||||
return 1
|
||||
|
||||
return 0
|
||||
job_preferences["[job.title]"] = level
|
||||
return TRUE
|
||||
|
||||
/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl)
|
||||
if(!SSjob || SSjob.occupations.len <= 0)
|
||||
@@ -1157,64 +1143,29 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
ShowChoices(user)
|
||||
return
|
||||
|
||||
if(role == SSjob.overflow_role)
|
||||
if(job_civilian_low & job.flag)
|
||||
job_civilian_low &= ~job.flag
|
||||
else
|
||||
job_civilian_low |= job.flag
|
||||
SetChoices(user)
|
||||
return 1
|
||||
var/jpval = null
|
||||
switch(desiredLvl)
|
||||
if(3)
|
||||
jpval = JP_LOW
|
||||
if(2)
|
||||
jpval = JP_MEDIUM
|
||||
if(1)
|
||||
jpval = JP_HIGH
|
||||
|
||||
SetJobPreferenceLevel(job, desiredLvl)
|
||||
if(role == SSjob.overflow_role)
|
||||
if(job_preferences["[job.title]"] == JP_LOW)
|
||||
jpval = null
|
||||
else
|
||||
jpval = JP_LOW
|
||||
|
||||
SetJobPreferenceLevel(job, jpval)
|
||||
SetChoices(user)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/preferences/proc/ResetJobs()
|
||||
|
||||
job_civilian_high = 0
|
||||
job_civilian_med = 0
|
||||
job_civilian_low = 0
|
||||
|
||||
job_medsci_high = 0
|
||||
job_medsci_med = 0
|
||||
job_medsci_low = 0
|
||||
|
||||
job_engsec_high = 0
|
||||
job_engsec_med = 0
|
||||
job_engsec_low = 0
|
||||
|
||||
|
||||
/datum/preferences/proc/GetJobDepartment(datum/job/job, level)
|
||||
if(!job || !level)
|
||||
return 0
|
||||
switch(job.department_flag)
|
||||
if(CIVILIAN)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_civilian_high
|
||||
if(2)
|
||||
return job_civilian_med
|
||||
if(3)
|
||||
return job_civilian_low
|
||||
if(MEDSCI)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_medsci_high
|
||||
if(2)
|
||||
return job_medsci_med
|
||||
if(3)
|
||||
return job_medsci_low
|
||||
if(ENGSEC)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_engsec_high
|
||||
if(2)
|
||||
return job_engsec_med
|
||||
if(3)
|
||||
return job_engsec_low
|
||||
return 0
|
||||
job_preferences = list()
|
||||
|
||||
/datum/preferences/proc/SetQuirks(mob/user)
|
||||
if(!SSquirks)
|
||||
@@ -1407,19 +1358,21 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
facial_hair_style = random_facial_hair_style(gender)
|
||||
if("underwear")
|
||||
underwear = random_underwear(gender)
|
||||
undie_color = random_color()
|
||||
undie_color = random_short_color()
|
||||
if("undershirt")
|
||||
undershirt = random_undershirt(gender)
|
||||
shirt_color = random_color()
|
||||
shirt_color = random_short_color()
|
||||
if("socks")
|
||||
socks = random_socks()
|
||||
socks_color = random_color()
|
||||
socks_color = random_short_color()
|
||||
if(BODY_ZONE_PRECISE_EYES)
|
||||
eye_color = random_eye_color()
|
||||
if("s_tone")
|
||||
skin_tone = random_skin_tone()
|
||||
if("bag")
|
||||
backbag = pick(GLOB.backbaglist)
|
||||
if("suit")
|
||||
jumpsuit_style = pick(GLOB.jumpsuitlist)
|
||||
if("all")
|
||||
random_character()
|
||||
|
||||
@@ -1526,7 +1479,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("undie_color")
|
||||
var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", undie_color) as color|null
|
||||
if(n_undie_color)
|
||||
undie_color = n_undie_color
|
||||
undie_color = sanitize_hexcolor(n_undie_color)
|
||||
|
||||
if("undershirt")
|
||||
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_list
|
||||
@@ -1536,7 +1489,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("shirt_color")
|
||||
var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", shirt_color) as color|null
|
||||
if(n_shirt_color)
|
||||
shirt_color = n_shirt_color
|
||||
shirt_color = sanitize_hexcolor(n_shirt_color)
|
||||
|
||||
if("socks")
|
||||
var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in GLOB.socks_list
|
||||
@@ -1546,7 +1499,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("socks_color")
|
||||
var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", socks_color) as color|null
|
||||
if(n_socks_color)
|
||||
socks_color = n_socks_color
|
||||
socks_color = sanitize_hexcolor(n_socks_color)
|
||||
|
||||
if("eyes")
|
||||
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null
|
||||
@@ -1554,9 +1507,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
eye_color = sanitize_hexcolor(new_eyes)
|
||||
|
||||
if("species")
|
||||
var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_races
|
||||
var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_race_names
|
||||
if(result)
|
||||
var/newtype = GLOB.species_list[result]
|
||||
var/newtype = GLOB.species_list[GLOB.roundstart_race_names[result]]
|
||||
pref_species = new newtype()
|
||||
//let's ensure that no weird shit happens on species swapping.
|
||||
custom_species = null
|
||||
@@ -1684,6 +1637,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["tail_human"] = "None"
|
||||
features["tail_lizard"] = "None"
|
||||
|
||||
if("meats")
|
||||
var/new_meat
|
||||
new_meat = input(user, "Choose your character's meat type:", "Character Preference") as null|anything in GLOB.meat_types
|
||||
if(new_meat)
|
||||
features["meat_type"] = new_meat
|
||||
|
||||
if("snout")
|
||||
var/list/snowflake_snouts_list = list()
|
||||
for(var/path in GLOB.snouts_list)
|
||||
@@ -1719,6 +1678,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_horns)
|
||||
features["horns"] = new_horns
|
||||
|
||||
if("horns_color")
|
||||
var/new_horn_color = input(user, "Choose your character's horn colour:", "Character Preference","#"+horn_color) as color|null
|
||||
if(new_horn_color)
|
||||
horn_color = sanitize_hexcolor(new_horn_color)
|
||||
|
||||
if("wings")
|
||||
var/new_wings
|
||||
new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.r_wings_list
|
||||
@@ -1753,11 +1717,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["legs"] = new_legs
|
||||
update_preview_icon()
|
||||
|
||||
if("moth_wings")
|
||||
var/new_moth_wings
|
||||
new_moth_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.moth_wings_list
|
||||
if(new_moth_wings)
|
||||
features["moth_wings"] = new_moth_wings
|
||||
if("insect_wings")
|
||||
var/new_insect_wings
|
||||
new_insect_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_wings_list
|
||||
if(new_insect_wings)
|
||||
features["insect_wings"] = new_insect_wings
|
||||
|
||||
if("insect_fluffs")
|
||||
var/new_insect_fluff
|
||||
new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list
|
||||
if(new_insect_fluff)
|
||||
features["insect_fluff"] = new_insect_fluff
|
||||
|
||||
if("s_tone")
|
||||
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones
|
||||
@@ -1951,11 +1921,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_ooccolor)
|
||||
ooccolor = new_ooccolor
|
||||
|
||||
if("aooccolor")
|
||||
var/new_aooccolor = input(user, "Choose your Antag OOC colour:", "Game Preference",ooccolor) as color|null
|
||||
if(new_aooccolor)
|
||||
aooccolor = new_aooccolor
|
||||
|
||||
if("bag")
|
||||
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in GLOB.backbaglist
|
||||
if(new_backbag)
|
||||
backbag = new_backbag
|
||||
|
||||
if("suit")
|
||||
if(jumpsuit_style == PREF_SUIT)
|
||||
jumpsuit_style = PREF_SKIRT
|
||||
else
|
||||
jumpsuit_style = PREF_SUIT
|
||||
|
||||
|
||||
if("uplink_loc")
|
||||
var/new_loc = input(user, "Choose your character's traitor uplink spawn location:", "Character Preference") as null|anything in GLOB.uplink_spawn_loc_list
|
||||
if(new_loc)
|
||||
@@ -2018,6 +2000,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["genitals_use_skintone"] = !features["genitals_use_skintone"]
|
||||
if("arousable")
|
||||
arousable = !arousable
|
||||
if("lewdchem")
|
||||
lewdchem = !lewdchem
|
||||
if("has_cock")
|
||||
features["has_cock"] = !features["has_cock"]
|
||||
if(features["has_cock"] == FALSE)
|
||||
@@ -2034,6 +2018,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["eggsack_internal"] = !features["eggsack_internal"]
|
||||
if("has_breasts")
|
||||
features["has_breasts"] = !features["has_breasts"]
|
||||
if(features["has_breasts"] == FALSE)
|
||||
features["breasts_producing"] = FALSE
|
||||
if("breasts_producing")
|
||||
features["breasts_producing"] = !features["breasts_producing"]
|
||||
if("has_vag")
|
||||
features["has_vag"] = !features["has_vag"]
|
||||
if(features["has_vag"] == FALSE)
|
||||
@@ -2217,7 +2205,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(!is_loadout_slot_available(G.category))
|
||||
to_chat(user, "<span class='danger'>You cannot take this loadout, as you've already chosen too many of the same category!</span>")
|
||||
return
|
||||
if(G.ckeywhitelist && G.ckeywhitelist.len && !(user.ckey in G.ckeywhitelist))
|
||||
if(G.donoritem && !G.donator_ckey_check(user.ckey))
|
||||
to_chat(user, "<span class='danger'>This is an item intended for donator use only. You are not authorized to use this item.</span>")
|
||||
return
|
||||
if(gear_points >= initial(G.cost))
|
||||
@@ -2259,6 +2247,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
organ_eyes.old_eye_color = eye_color
|
||||
character.hair_color = hair_color
|
||||
character.facial_hair_color = facial_hair_color
|
||||
character.horn_color = horn_color
|
||||
|
||||
character.skin_tone = skin_tone
|
||||
character.hair_style = hair_style
|
||||
@@ -2276,6 +2265,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
|
||||
character.backbag = backbag
|
||||
character.jumpsuit_style = jumpsuit_style
|
||||
|
||||
var/datum/species/chosen_species
|
||||
if(!roundstart_checks || (pref_species.id in GLOB.roundstart_races))
|
||||
@@ -2298,7 +2288,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("xenotail" in pref_species.default_features)
|
||||
character.dna.species.mutant_bodyparts |= "xenotail"
|
||||
|
||||
if(("legs" in character.dna.species.mutant_bodyparts) && character.dna.features["legs"] == "Digitigrade Legs")
|
||||
if("meat_type" in pref_species.default_features)
|
||||
character.type_of_meat = GLOB.meat_types[features["meat_type"]]
|
||||
|
||||
if(("legs" in character.dna.species.mutant_bodyparts) && (character.dna.features["legs"] == "Digitigrade" || character.dna.features["legs"] == "Avian"))
|
||||
pref_species.species_traits |= DIGITIGRADE
|
||||
else
|
||||
pref_species.species_traits -= DIGITIGRADE
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// You do not need to raise this if you are adding new values that have sane defaults.
|
||||
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
||||
// where you would want the updater procs below to run
|
||||
#define SAVEFILE_VERSION_MAX 20
|
||||
#define SAVEFILE_VERSION_MAX 23
|
||||
|
||||
/*
|
||||
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
||||
@@ -49,6 +49,65 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
pda_style = "mono"
|
||||
if(current_version < 20)
|
||||
pda_color = "#808000"
|
||||
if((current_version < 21) && features["meat_type"] && (features["meat_type"] == null))
|
||||
features["meat_type"] = "Mammalian"
|
||||
if(current_version < 22)
|
||||
|
||||
job_preferences = list() //It loaded null from nonexistant savefile field.
|
||||
|
||||
var/job_civilian_high = 0
|
||||
var/job_civilian_med = 0
|
||||
var/job_civilian_low = 0
|
||||
|
||||
var/job_medsci_high = 0
|
||||
var/job_medsci_med = 0
|
||||
var/job_medsci_low = 0
|
||||
|
||||
var/job_engsec_high = 0
|
||||
var/job_engsec_med = 0
|
||||
var/job_engsec_low = 0
|
||||
|
||||
S["job_civilian_high"] >> job_civilian_high
|
||||
S["job_civilian_med"] >> job_civilian_med
|
||||
S["job_civilian_low"] >> job_civilian_low
|
||||
S["job_medsci_high"] >> job_medsci_high
|
||||
S["job_medsci_med"] >> job_medsci_med
|
||||
S["job_medsci_low"] >> job_medsci_low
|
||||
S["job_engsec_high"] >> job_engsec_high
|
||||
S["job_engsec_med"] >> job_engsec_med
|
||||
S["job_engsec_low"] >> job_engsec_low
|
||||
|
||||
//Can't use SSjob here since this happens right away on login
|
||||
for(var/job in subtypesof(/datum/job))
|
||||
var/datum/job/J = job
|
||||
var/new_value
|
||||
var/fval = initial(J.flag)
|
||||
switch(initial(J.department_flag))
|
||||
if(CIVILIAN)
|
||||
if(job_civilian_high & fval)
|
||||
new_value = JP_HIGH
|
||||
else if(job_civilian_med & fval)
|
||||
new_value = JP_MEDIUM
|
||||
else if(job_civilian_low & fval)
|
||||
new_value = JP_LOW
|
||||
if(MEDSCI)
|
||||
if(job_medsci_high & fval)
|
||||
new_value = JP_HIGH
|
||||
else if(job_medsci_med & fval)
|
||||
new_value = JP_MEDIUM
|
||||
else if(job_medsci_low & fval)
|
||||
new_value = JP_LOW
|
||||
if(ENGSEC)
|
||||
if(job_engsec_high & fval)
|
||||
new_value = JP_HIGH
|
||||
else if(job_engsec_med & fval)
|
||||
new_value = JP_MEDIUM
|
||||
else if(job_engsec_low & fval)
|
||||
new_value = JP_LOW
|
||||
if(new_value)
|
||||
job_preferences["[initial(J.title)]"] = new_value
|
||||
else if(current_version < 23) // we are fixing a gamebreaking bug.
|
||||
job_preferences = list() //It loaded null from nonexistant savefile field.
|
||||
|
||||
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
||||
if(!ckey)
|
||||
@@ -117,6 +176,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["widescreenpref"] >> widescreenpref
|
||||
S["autostand"] >> autostand
|
||||
S["cit_toggles"] >> cit_toggles
|
||||
S["lewdchem"] >> lewdchem
|
||||
|
||||
//try to fix any outdated data if necessary
|
||||
if(needs_update >= 0)
|
||||
@@ -211,6 +271,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["widescreenpref"], widescreenpref)
|
||||
WRITE_FILE(S["autostand"], autostand)
|
||||
WRITE_FILE(S["cit_toggles"], cit_toggles)
|
||||
WRITE_FILE(S["lewdchem"], lewdchem)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -244,6 +305,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
var/species_id
|
||||
S["species"] >> species_id
|
||||
if(species_id)
|
||||
if(species_id == "avian" || species_id == "aquatic")
|
||||
species_id = "mammal"
|
||||
else if(species_id == "moth")
|
||||
species_id = "insect"
|
||||
|
||||
var/newtype = GLOB.species_list[species_id]
|
||||
if(newtype)
|
||||
pref_species = new newtype
|
||||
@@ -252,27 +318,29 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["features["mcolor"]"] , "#FFF")
|
||||
|
||||
//Character
|
||||
S["real_name"] >> real_name
|
||||
S["nameless"] >> nameless
|
||||
S["custom_species"] >> custom_species
|
||||
S["name_is_always_random"] >> be_random_name
|
||||
S["body_is_always_random"] >> be_random_body
|
||||
S["gender"] >> gender
|
||||
S["age"] >> age
|
||||
S["hair_color"] >> hair_color
|
||||
S["facial_hair_color"] >> facial_hair_color
|
||||
S["eye_color"] >> eye_color
|
||||
S["skin_tone"] >> skin_tone
|
||||
S["hair_style_name"] >> hair_style
|
||||
S["facial_style_name"] >> facial_hair_style
|
||||
S["underwear"] >> underwear
|
||||
S["undie_color"] >> undie_color
|
||||
S["undershirt"] >> undershirt
|
||||
S["shirt_color"] >> shirt_color
|
||||
S["socks"] >> socks
|
||||
S["socks_color"] >> socks_color
|
||||
S["backbag"] >> backbag
|
||||
S["uplink_loc"] >> uplink_spawn_loc
|
||||
S["real_name"] >> real_name
|
||||
S["nameless"] >> nameless
|
||||
S["custom_species"] >> custom_species
|
||||
S["name_is_always_random"] >> be_random_name
|
||||
S["body_is_always_random"] >> be_random_body
|
||||
S["gender"] >> gender
|
||||
S["age"] >> age
|
||||
S["hair_color"] >> hair_color
|
||||
S["facial_hair_color"] >> facial_hair_color
|
||||
S["eye_color"] >> eye_color
|
||||
S["skin_tone"] >> skin_tone
|
||||
S["hair_style_name"] >> hair_style
|
||||
S["facial_style_name"] >> facial_hair_style
|
||||
S["underwear"] >> underwear
|
||||
S["undie_color"] >> undie_color
|
||||
S["undershirt"] >> undershirt
|
||||
S["shirt_color"] >> shirt_color
|
||||
S["socks"] >> socks
|
||||
S["socks_color"] >> socks_color
|
||||
S["horn_color"] >> horn_color
|
||||
S["backbag"] >> backbag
|
||||
S["jumpsuit_style"] >> jumpsuit_style
|
||||
S["uplink_loc"] >> uplink_spawn_loc
|
||||
S["feature_mcolor"] >> features["mcolor"]
|
||||
S["feature_lizard_tail"] >> features["tail_lizard"]
|
||||
S["feature_lizard_snout"] >> features["snout"]
|
||||
@@ -281,29 +349,23 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_lizard_spines"] >> features["spines"]
|
||||
S["feature_lizard_body_markings"] >> features["body_markings"]
|
||||
S["feature_lizard_legs"] >> features["legs"]
|
||||
S["feature_moth_wings"] >> features["moth_wings"]
|
||||
S["feature_human_tail"] >> features["tail_human"]
|
||||
S["feature_human_ears"] >> features["ears"]
|
||||
S["feature_insect_wings"] >> features["insect_wings"]
|
||||
S["feature_insect_fluff"] >> features["insect_fluff"]
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
|
||||
S[savefile_slot_name] >> custom_names[custom_name_id]
|
||||
|
||||
S["preferred_ai_core_display"] >> preferred_ai_core_display
|
||||
S["prefered_security_department"] >> prefered_security_department
|
||||
S["preferred_ai_core_display"] >> preferred_ai_core_display
|
||||
S["prefered_security_department"] >> prefered_security_department
|
||||
|
||||
//Jobs
|
||||
S["joblessrole"] >> joblessrole
|
||||
S["job_civilian_high"] >> job_civilian_high
|
||||
S["job_civilian_med"] >> job_civilian_med
|
||||
S["job_civilian_low"] >> job_civilian_low
|
||||
S["job_medsci_high"] >> job_medsci_high
|
||||
S["job_medsci_med"] >> job_medsci_med
|
||||
S["job_medsci_low"] >> job_medsci_low
|
||||
S["job_engsec_high"] >> job_engsec_high
|
||||
S["job_engsec_med"] >> job_engsec_med
|
||||
S["job_engsec_low"] >> job_engsec_low
|
||||
//Load prefs
|
||||
S["job_preferences"] >> job_preferences
|
||||
|
||||
//Quirks
|
||||
S["all_quirks"] >> all_quirks
|
||||
@@ -322,6 +384,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
|
||||
S["feature_taur"] >> features["taur"]
|
||||
S["feature_mam_snouts"] >> features["mam_snouts"]
|
||||
S["feature_meat"] >> features["meat_type"]
|
||||
//Xeno features
|
||||
S["feature_xeno_tail"] >> features["xenotail"]
|
||||
S["feature_xeno_dors"] >> features["xenodorsal"]
|
||||
@@ -346,6 +409,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_breasts_shape"] >> features["breasts_shape"]
|
||||
S["feature_breasts_color"] >> features["breasts_color"]
|
||||
S["feature_breasts_fluid"] >> features["breasts_fluid"]
|
||||
S["feature_breasts_producing"] >> features["breasts_producing"]
|
||||
//vagina features
|
||||
S["feature_has_vag"] >> features["has_vag"]
|
||||
S["feature_vag_shape"] >> features["vag_shape"]
|
||||
@@ -370,11 +434,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
|
||||
//Sanitize
|
||||
|
||||
real_name = reject_bad_name(real_name)
|
||||
gender = sanitize_gender(gender, TRUE, TRUE)
|
||||
real_name = reject_bad_name(real_name)
|
||||
gender = sanitize_gender(gender, TRUE, TRUE)
|
||||
if(!real_name)
|
||||
real_name = random_unique_name(gender)
|
||||
custom_species = reject_bad_name(custom_species)
|
||||
real_name = random_unique_name(gender)
|
||||
custom_species = reject_bad_name(custom_species)
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
var/namedata = GLOB.preferences_custom_names[custom_name_id]
|
||||
custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"])
|
||||
@@ -384,56 +448,55 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
if(!features["mcolor"] || features["mcolor"] == "#000")
|
||||
features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
|
||||
|
||||
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
|
||||
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
|
||||
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
||||
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
|
||||
|
||||
if(gender == MALE)
|
||||
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list)
|
||||
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list)
|
||||
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_male_list)
|
||||
else
|
||||
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list)
|
||||
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list)
|
||||
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_female_list)
|
||||
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
|
||||
undie_color = sanitize_hexcolor(undie_color, 6, 1, initial(undie_color))
|
||||
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
|
||||
shirt_color = sanitize_hexcolor(shirt_color, 6, 1, initial(shirt_color))
|
||||
socks = sanitize_inlist(socks, GLOB.socks_list)
|
||||
socks_color = sanitize_hexcolor(socks_color, 6, 1, initial(socks_color))
|
||||
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
|
||||
hair_color = sanitize_hexcolor(hair_color, 3, 0)
|
||||
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
|
||||
eye_color = sanitize_hexcolor(eye_color, 3, 0)
|
||||
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
|
||||
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
|
||||
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
|
||||
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
|
||||
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
|
||||
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
|
||||
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
|
||||
features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
|
||||
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
|
||||
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
|
||||
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
|
||||
undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color))
|
||||
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
|
||||
shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color))
|
||||
socks = sanitize_inlist(socks, GLOB.socks_list)
|
||||
socks_color = sanitize_hexcolor(socks_color, 3, FALSE, initial(socks_color))
|
||||
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
|
||||
hair_color = sanitize_hexcolor(hair_color, 3, 0)
|
||||
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
|
||||
eye_color = sanitize_hexcolor(eye_color, 3, 0)
|
||||
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
|
||||
horn_color = sanitize_hexcolor(horn_color, 3, FALSE)
|
||||
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
|
||||
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
|
||||
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
|
||||
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
|
||||
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
|
||||
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
|
||||
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
|
||||
features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
|
||||
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
|
||||
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
|
||||
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
|
||||
features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list)
|
||||
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
|
||||
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
||||
|
||||
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
||||
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
|
||||
job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
|
||||
job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low))
|
||||
job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high))
|
||||
job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med))
|
||||
job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low))
|
||||
job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high))
|
||||
job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med))
|
||||
job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
|
||||
//Validate job prefs
|
||||
for(var/j in job_preferences)
|
||||
if(job_preferences["[j]"] != JP_LOW && job_preferences["[j]"] != JP_MEDIUM && job_preferences["[j]"] != JP_HIGH)
|
||||
job_preferences -= j
|
||||
|
||||
all_quirks = SANITIZE_LIST(all_quirks)
|
||||
|
||||
positive_quirks = SANITIZE_LIST(positive_quirks)
|
||||
negative_quirks = SANITIZE_LIST(negative_quirks)
|
||||
neutral_quirks = SANITIZE_LIST(neutral_quirks)
|
||||
neutral_quirks = SANITIZE_LIST(neutral_quirks)
|
||||
|
||||
cit_character_pref_load(S)
|
||||
|
||||
@@ -455,30 +518,32 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.)
|
||||
|
||||
//Character
|
||||
WRITE_FILE(S["real_name"] , real_name)
|
||||
WRITE_FILE(S["nameless"] , nameless)
|
||||
WRITE_FILE(S["custom_species"] , custom_species)
|
||||
WRITE_FILE(S["name_is_always_random"] , be_random_name)
|
||||
WRITE_FILE(S["body_is_always_random"] , be_random_body)
|
||||
WRITE_FILE(S["gender"] , gender)
|
||||
WRITE_FILE(S["age"] , age)
|
||||
WRITE_FILE(S["hair_color"] , hair_color)
|
||||
WRITE_FILE(S["facial_hair_color"] , facial_hair_color)
|
||||
WRITE_FILE(S["eye_color"] , eye_color)
|
||||
WRITE_FILE(S["skin_tone"] , skin_tone)
|
||||
WRITE_FILE(S["hair_style_name"] , hair_style)
|
||||
WRITE_FILE(S["facial_style_name"] , facial_hair_style)
|
||||
WRITE_FILE(S["underwear"] , underwear)
|
||||
WRITE_FILE(S["undie_color"] , undie_color)
|
||||
WRITE_FILE(S["undershirt"] , undershirt)
|
||||
WRITE_FILE(S["shirt_color"] , shirt_color)
|
||||
WRITE_FILE(S["socks"] , socks)
|
||||
WRITE_FILE(S["socks_color"] , socks_color)
|
||||
WRITE_FILE(S["backbag"] , backbag)
|
||||
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
|
||||
WRITE_FILE(S["species"] , pref_species.id)
|
||||
WRITE_FILE(S["real_name"] , real_name)
|
||||
WRITE_FILE(S["nameless"] , nameless)
|
||||
WRITE_FILE(S["custom_species"] , custom_species)
|
||||
WRITE_FILE(S["name_is_always_random"] , be_random_name)
|
||||
WRITE_FILE(S["body_is_always_random"] , be_random_body)
|
||||
WRITE_FILE(S["gender"] , gender)
|
||||
WRITE_FILE(S["age"] , age)
|
||||
WRITE_FILE(S["hair_color"] , hair_color)
|
||||
WRITE_FILE(S["facial_hair_color"] , facial_hair_color)
|
||||
WRITE_FILE(S["eye_color"] , eye_color)
|
||||
WRITE_FILE(S["skin_tone"] , skin_tone)
|
||||
WRITE_FILE(S["hair_style_name"] , hair_style)
|
||||
WRITE_FILE(S["facial_style_name"] , facial_hair_style)
|
||||
WRITE_FILE(S["underwear"] , underwear)
|
||||
WRITE_FILE(S["undie_color"] , undie_color)
|
||||
WRITE_FILE(S["undershirt"] , undershirt)
|
||||
WRITE_FILE(S["shirt_color"] , shirt_color)
|
||||
WRITE_FILE(S["socks"] , socks)
|
||||
WRITE_FILE(S["socks_color"] , socks_color)
|
||||
WRITE_FILE(S["horn_color"] , horn_color)
|
||||
WRITE_FILE(S["backbag"] , backbag)
|
||||
WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style)
|
||||
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
|
||||
WRITE_FILE(S["species"] , pref_species.id)
|
||||
WRITE_FILE(S["feature_mcolor"] , features["mcolor"])
|
||||
WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"])
|
||||
WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"])
|
||||
WRITE_FILE(S["feature_human_tail"] , features["tail_human"])
|
||||
WRITE_FILE(S["feature_lizard_snout"] , features["snout"])
|
||||
WRITE_FILE(S["feature_lizard_horns"] , features["horns"])
|
||||
@@ -486,28 +551,23 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["feature_lizard_frills"] , features["frills"])
|
||||
WRITE_FILE(S["feature_lizard_spines"] , features["spines"])
|
||||
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
|
||||
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
|
||||
WRITE_FILE(S["feature_moth_wings"] , features["moth_wings"])
|
||||
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
|
||||
WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"])
|
||||
WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"])
|
||||
WRITE_FILE(S["feature_meat"] , features["meat_type"])
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
|
||||
WRITE_FILE(S[savefile_slot_name],custom_names[custom_name_id])
|
||||
|
||||
WRITE_FILE(S["preferred_ai_core_display"] , preferred_ai_core_display)
|
||||
WRITE_FILE(S["prefered_security_department"] , prefered_security_department)
|
||||
WRITE_FILE(S["preferred_ai_core_display"] , preferred_ai_core_display)
|
||||
WRITE_FILE(S["prefered_security_department"] , prefered_security_department)
|
||||
|
||||
//Jobs
|
||||
WRITE_FILE(S["joblessrole"] , joblessrole)
|
||||
WRITE_FILE(S["job_civilian_high"] , job_civilian_high)
|
||||
WRITE_FILE(S["job_civilian_med"] , job_civilian_med)
|
||||
WRITE_FILE(S["job_civilian_low"] , job_civilian_low)
|
||||
WRITE_FILE(S["job_medsci_high"] , job_medsci_high)
|
||||
WRITE_FILE(S["job_medsci_med"] , job_medsci_med)
|
||||
WRITE_FILE(S["job_medsci_low"] , job_medsci_low)
|
||||
WRITE_FILE(S["job_engsec_high"] , job_engsec_high)
|
||||
WRITE_FILE(S["job_engsec_med"] , job_engsec_med)
|
||||
WRITE_FILE(S["job_engsec_low"] , job_engsec_low)
|
||||
//Write prefs
|
||||
WRITE_FILE(S["job_preferences"] , job_preferences)
|
||||
|
||||
//Quirks
|
||||
WRITE_FILE(S["all_quirks"] , all_quirks)
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
GLOBAL_VAR_INIT(AOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour.
|
||||
GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f")
|
||||
|
||||
/client/verb/aooc(msg as text)
|
||||
set name = "AOOC"
|
||||
set desc = "An OOC channel exclusive to antagonists."
|
||||
@@ -50,7 +53,7 @@
|
||||
var/keyname = key
|
||||
if(prefs.unlock_content)
|
||||
if(prefs.toggles & MEMBER_PUBLIC)
|
||||
keyname = "<font color='[prefs.ooccolor ? prefs.ooccolor : GLOB.antag_ooc_colour]'>[icon2html('icons/member_content.dmi', world, "blag")][keyname]</font>"
|
||||
keyname = "<font color='[prefs.aooccolor ? prefs.aooccolor : GLOB.normal_aooc_colour]'>[icon2html('icons/member_content.dmi', world, "blag")][keyname]</font>"
|
||||
//The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url
|
||||
|
||||
var/antaglisting = list()
|
||||
@@ -74,23 +77,27 @@
|
||||
else
|
||||
to_chat(C, "<span class='adminobserverooc'><span class='prefix'>Antag OOC:</span> <EM>[keyname][holder.fakekey ? "/([holder.fakekey])" : ""]:</EM> <span class='message linkify'>[msg]</span></span>")
|
||||
else
|
||||
to_chat(C, "<font color='[GLOB.antag_ooc_colour]'><span class='ooc'><span class='prefix'>Antag OOC:</span> <EM>[holder.fakekey ? holder.fakekey : key]:</EM> <span class='message linkify'>[msg]</span></span></font>")
|
||||
if(GLOB.AOOC_COLOR)
|
||||
to_chat(C, "<font color='[GLOB.AOOC_COLOR]'><b><span class='prefix'>Antag OOC:</span> <EM>[holder.fakekey ? holder.fakekey : key]:</EM> <span class='message linkify'>[msg]</span></b></font>")
|
||||
else
|
||||
to_chat(C, "<span class='antagooc'><span class='prefix'>Antag OOC:</span> <EM>[holder.fakekey ? holder.fakekey : key]:</EM> <span class='message linkify'>[msg]</span></span>")
|
||||
else if(!(key in C.prefs.ignoring))
|
||||
to_chat(C, "<font color='[GLOB.antag_ooc_colour]'><span class='ooc'><span class='prefix'>Antag OOC:</span> <EM>[keyname]:</EM> <span class='message linkify'>[msg]</span></span></font>")
|
||||
|
||||
GLOBAL_VAR_INIT(antag_ooc_colour, AOOC_COLOR)
|
||||
if(GLOB.AOOC_COLOR)
|
||||
to_chat(C, "<font color='[GLOB.AOOC_COLOR]'><b><span class='prefix'>Antag OOC:</span> <EM>[keyname]:</EM> <span class='message linkify'>[msg]</span></b></font>")
|
||||
else
|
||||
to_chat(C, "<span class='antagooc'><span class='prefix'>Antag OOC:</span> <EM>[keyname]:</EM> <span class='message linkify'>[msg]</span></span>")
|
||||
|
||||
/client/proc/set_aooc(newColor as color)
|
||||
set name = "Set Antag OOC Color"
|
||||
set desc = "Modifies antag OOC Color"
|
||||
set category = "Fun"
|
||||
GLOB.antag_ooc_colour = sanitize_ooccolor(newColor)
|
||||
GLOB.AOOC_COLOR = sanitize_ooccolor(newColor)
|
||||
|
||||
/client/proc/reset_aooc()
|
||||
set name = "Reset Antag OOC Color"
|
||||
set desc = "Returns antag OOC Color to default"
|
||||
set category = "Fun"
|
||||
GLOB.antag_ooc_colour = AOOC_COLOR
|
||||
GLOB.AOOC_COLOR = null
|
||||
|
||||
/proc/toggle_aooc(toggle = null)
|
||||
if(toggle != null) //if we're specifically en/disabling ooc
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
GLOBAL_VAR_INIT(OOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour.
|
||||
GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
|
||||
|
||||
/client/verb/ooc(msg as text)
|
||||
set name = "OOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite
|
||||
set category = "OOC"
|
||||
@@ -66,9 +69,15 @@
|
||||
else
|
||||
to_chat(C, "<span class='adminobserverooc'><span class='prefix'>OOC:</span> <EM>[keyname][holder.fakekey ? "/([holder.fakekey])" : ""]:</EM> <span class='message linkify'>[msg]</span></span>")
|
||||
else
|
||||
to_chat(C, "<font color='[GLOB.normal_ooc_colour]'><span class='ooc'><span class='prefix'>OOC:</span> <EM>[holder.fakekey ? holder.fakekey : key]:</EM> <span class='message linkify'>[msg]</span></span></font>")
|
||||
if(GLOB.OOC_COLOR)
|
||||
to_chat(C, "<font color='[GLOB.OOC_COLOR]'><b><span class='prefix'>OOC:</span> <EM>[holder.fakekey ? holder.fakekey : key]:</EM> <span class='message linkify'>[msg]</span></b></font>")
|
||||
else
|
||||
to_chat(C, "<span class='ooc'><span class='prefix'>OOC:</span> <EM>[holder.fakekey ? holder.fakekey : key]:</EM> <span class='message linkify'>[msg]</span></span>")
|
||||
else if(!(key in C.prefs.ignoring))
|
||||
to_chat(C, "<font color='[GLOB.normal_ooc_colour]'><span class='ooc'><span class='prefix'>OOC:</span> <EM>[keyname]:</EM> <span class='message linkify'>[msg]</span></span></font>")
|
||||
if(GLOB.OOC_COLOR)
|
||||
to_chat(C, "<font color='[GLOB.OOC_COLOR]'><b><span class='prefix'>OOC:</span> <EM>[keyname]:</EM> <span class='message linkify'>[msg]</span></b></font>")
|
||||
else
|
||||
to_chat(C, "<span class='ooc'><span class='prefix'>OOC:</span> <EM>[keyname]:</EM> <span class='message linkify'>[msg]</span></span>")
|
||||
|
||||
/proc/toggle_ooc(toggle = null)
|
||||
if(toggle != null) //if we're specifically en/disabling ooc
|
||||
@@ -99,19 +108,17 @@
|
||||
else
|
||||
GLOB.dooc_allowed = !GLOB.dooc_allowed
|
||||
|
||||
GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR)
|
||||
|
||||
/client/proc/set_ooc(newColor as color)
|
||||
set name = "Set Player OOC Color"
|
||||
set desc = "Modifies player OOC Color"
|
||||
set category = "Fun"
|
||||
GLOB.normal_ooc_colour = sanitize_ooccolor(newColor)
|
||||
GLOB.OOC_COLOR = sanitize_ooccolor(newColor)
|
||||
|
||||
/client/proc/reset_ooc()
|
||||
set name = "Reset Player OOC Color"
|
||||
set desc = "Returns player OOC Color to default"
|
||||
set category = "Fun"
|
||||
GLOB.normal_ooc_colour = OOC_COLOR
|
||||
GLOB.OOC_COLOR = null
|
||||
|
||||
/client/verb/colorooc()
|
||||
set name = "Set Your OOC Color"
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
to_chat(owner, "<span class='warning'>You shouldn't be able to toggle a camogear helmetmask if you're not wearing it</span>")
|
||||
if(new_headgear)
|
||||
// Force drop the item in the headslot, even though
|
||||
// it's NODROP_1
|
||||
// it's TRAIT_NODROP
|
||||
D.dropItemToGround(target, TRUE)
|
||||
qdel(old_headgear)
|
||||
// where is `SLOT_HEAD` defined? WHO KNOWS
|
||||
@@ -418,12 +418,12 @@
|
||||
/obj/item/clothing/head/chameleon/drone
|
||||
// The camohat, I mean, holographic hat projection, is part of the
|
||||
// drone itself.
|
||||
item_flags = NODROP
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
// which means it offers no protection, it's just air and light
|
||||
|
||||
/obj/item/clothing/head/chameleon/drone/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
|
||||
chameleon_action.random_look()
|
||||
var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src)
|
||||
togglehatmask_action.UpdateButtonIcon()
|
||||
@@ -437,7 +437,7 @@
|
||||
item_state = "gas_alt"
|
||||
resistance_flags = NONE
|
||||
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.01
|
||||
@@ -472,13 +472,13 @@
|
||||
|
||||
/obj/item/clothing/mask/chameleon/drone
|
||||
//Same as the drone chameleon hat, undroppable and no protection
|
||||
item_flags = NODROP
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
// Can drones use the voice changer part? Let's not find out.
|
||||
vchange = 0
|
||||
|
||||
/obj/item/clothing/mask/chameleon/drone/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
|
||||
chameleon_action.random_look()
|
||||
var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src)
|
||||
togglehatmask_action.UpdateButtonIcon()
|
||||
@@ -630,3 +630,27 @@
|
||||
/obj/item/stamp/chameleon/broken/Initialize()
|
||||
. = ..()
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
/obj/item/clothing/neck/cloak/chameleon
|
||||
name = "black tie"
|
||||
desc = "A neosilk clip-on tie."
|
||||
icon_state = "blacktie"
|
||||
item_color = "blacktie"
|
||||
resistance_flags = NONE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
|
||||
/obj/item/clothing/neck/cloak/chameleon
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/clothing/neck/cloak/chameleon/Initialize()
|
||||
. = ..()
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/clothing/neck
|
||||
chameleon_action.chameleon_name = "Cloak"
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/clothing/neck/cloak/chameleon/emp_act(severity)
|
||||
. = ..()
|
||||
if(. & EMP_PROTECT_SELF)
|
||||
return
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
@@ -43,6 +43,8 @@
|
||||
|
||||
/obj/item/clothing/Initialize()
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
|
||||
actions_types += /datum/action/item_action/toggle_voice_box
|
||||
if(ispath(pocket_storage_component_path))
|
||||
LoadComponent(pocket_storage_component_path)
|
||||
|
||||
@@ -135,7 +137,7 @@
|
||||
update_clothes_damaged_state(TRUE)
|
||||
if(ismob(loc)) //It's not important enough to warrant a message if nobody's wearing it
|
||||
var/mob/M = loc
|
||||
M.visible_message("<span class='warning'>[M]'s [name] starts to fall apart!", "<span class='warning'>Your [name] starts to fall apart!</span>")
|
||||
to_chat(M, "<span class='warning'>Your [name] starts to fall apart!</span>")
|
||||
|
||||
/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
|
||||
var/index = "[REF(initial(icon))]-[initial(icon_state)]"
|
||||
|
||||
@@ -378,10 +378,13 @@
|
||||
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
darkness_view = 8
|
||||
scan_reagents = TRUE
|
||||
item_flags = NODROP
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/glasses/godeye/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT)
|
||||
|
||||
/obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, src) && W != src && W.loc == user)
|
||||
if(W.icon_state == "godeye")
|
||||
|
||||
@@ -24,11 +24,13 @@
|
||||
desc = "[desc] The display is flickering slightly."
|
||||
|
||||
/obj/item/clothing/glasses/hud/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
|
||||
desc = "[desc] The display is flickering slightly."
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/glasses/hud/health
|
||||
name = "health scanner HUD"
|
||||
|
||||
@@ -6,21 +6,18 @@
|
||||
name = "purple sunglasses"
|
||||
icon_state = "sun_purple"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/star
|
||||
name = "star-shaped sunglasses"
|
||||
desc = "Novelty sunglasses, both lenses are in the shape of a star."
|
||||
icon_state = "sun_star"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/rockstar
|
||||
name = "red star-shaped sunglasses"
|
||||
desc = "Novelty sunglasses with a fancy silver frame and two red-tinted star-shaped lenses. You should probably stomp on them and get a pair of normal ones."
|
||||
icon_state = "sun_star_silver"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
|
||||
|
||||
/obj/item/clothing/glasses/gglasses
|
||||
name = "Green Glasses"
|
||||
@@ -28,7 +25,6 @@
|
||||
icon_state = "gglasses"
|
||||
item_state = "gglasses"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
|
||||
|
||||
/obj/item/clothing/glasses/welding/superior
|
||||
name = "superior welding goggles"
|
||||
@@ -36,7 +32,6 @@
|
||||
icon_state = "rwelding-g"
|
||||
item_state = "rwelding-g"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
flash_protect = 2
|
||||
tint = 1
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
slot_flags = ITEM_SLOT_GLOVES
|
||||
attack_verb = list("challenged")
|
||||
var/transfer_prints = FALSE
|
||||
var/transfer_blood = 0
|
||||
strip_delay = 20
|
||||
equip_delay_other = 40
|
||||
|
||||
|
||||
@@ -65,6 +65,9 @@
|
||||
var/warcry = "AT"
|
||||
|
||||
/obj/item/clothing/gloves/rapid/Touch(mob/living/target,proximity = TRUE)
|
||||
if(!istype(target))
|
||||
return
|
||||
|
||||
var/mob/living/M = loc
|
||||
|
||||
if(M.a_intent == INTENT_HARM)
|
||||
@@ -72,9 +75,33 @@
|
||||
M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click.
|
||||
if(warcry)
|
||||
M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
|
||||
|
||||
.= FALSE
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/rapid/attack_self(mob/user)
|
||||
var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
|
||||
if(input)
|
||||
warcry = input
|
||||
|
||||
/obj/item/clothing/gloves/rapid/hug
|
||||
name = "Hugs of the North Star"
|
||||
desc = "Just looking at these fills you with an urge to hug the shit out of people"
|
||||
warcry = "owo" //Shouldn't ever come into play
|
||||
|
||||
/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE)
|
||||
if(!istype(target))
|
||||
return
|
||||
|
||||
var/mob/living/M = loc
|
||||
|
||||
if(M.a_intent == INTENT_HELP)
|
||||
if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead
|
||||
if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions
|
||||
return
|
||||
else
|
||||
M.changeNext_move(CLICK_CD_RAPID)
|
||||
. = FALSE
|
||||
|
||||
/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user)
|
||||
return FALSE
|
||||
@@ -74,4 +74,13 @@
|
||||
icon_state = "beaniestripedgreen"
|
||||
item_color = "beaniestripedgreen"
|
||||
|
||||
/obj/item/clothing/head/beanie/durathread
|
||||
name = "durathread beanie"
|
||||
desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer."
|
||||
icon_state = "beaniedurathread"
|
||||
item_color = null
|
||||
armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
|
||||
|
||||
|
||||
|
||||
//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
|
||||
@@ -4,4 +4,3 @@
|
||||
icon = 'modular_citadel/icons/obj/clothing/cit_hats.dmi'
|
||||
icon_state = "hunter"
|
||||
item_state = "hunter_worn"
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
@@ -336,3 +336,11 @@
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/durathread
|
||||
name = "makeshift helmet"
|
||||
desc = "A hardhat with strips of leather and durathread for additional blunt protection."
|
||||
icon_state = "durathread"
|
||||
item_state = "durathread"
|
||||
armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
|
||||
|
||||
@@ -121,9 +121,12 @@
|
||||
|
||||
/obj/item/clothing/head/beret/highlander
|
||||
desc = "That was white fabric. <i>Was.</i>"
|
||||
item_flags = NODROP
|
||||
dog_fashion = null //THIS IS FOR SLAUGHTER, NOT PUPPIES
|
||||
|
||||
/obj/item/clothing/head/beret/highlander/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER)
|
||||
|
||||
//Security
|
||||
|
||||
/obj/item/clothing/head/HoS
|
||||
@@ -276,6 +279,13 @@
|
||||
desc = "This headwear shows off your Cargonian leadership"
|
||||
icon_state = "qmberet"
|
||||
|
||||
/obj/item/clothing/head/beret/durathread
|
||||
name = "durathread beret"
|
||||
desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer."
|
||||
icon_state = "beretdurathread"
|
||||
item_color = null
|
||||
armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
|
||||
|
||||
#undef DRILL_DEFAULT
|
||||
#undef DRILL_SHOUTING
|
||||
#undef DRILL_YELLING
|
||||
|
||||
@@ -221,9 +221,12 @@
|
||||
icon_state = "shamebrero"
|
||||
item_state = "shamebrero"
|
||||
desc = "Once it's on, it never comes off."
|
||||
item_flags = NODROP
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/sombrero/shamebrero/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
|
||||
|
||||
/obj/item/clothing/head/cone
|
||||
desc = "This cone is trying to warn you of something!"
|
||||
name = "warning cone"
|
||||
@@ -309,8 +312,8 @@
|
||||
/obj/item/clothing/head/pharaoh
|
||||
name = "pharaoh hat"
|
||||
desc = "Walk like an Egyptian."
|
||||
icon_state = "pharoah_hat"
|
||||
icon_state = "pharoah_hat"
|
||||
icon_state = "pharaoh_hat"
|
||||
icon_state = "pharaoh_hat"
|
||||
|
||||
/obj/item/clothing/head/jester/alt
|
||||
name = "jester hat"
|
||||
|
||||
@@ -129,3 +129,14 @@
|
||||
icon_state = "emtsoft"
|
||||
item_color = "emt"
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/soft/baseball
|
||||
name = "baseball cap"
|
||||
desc = "It's a robust baseball hat, this one belongs to syndicate major league team."
|
||||
icon_state = "baseballsoft"
|
||||
item_color = "baseballsoft"
|
||||
item_state = "baseballsoft"
|
||||
flags_inv = HIDEEYES|HIDEFACE
|
||||
armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90)
|
||||
strip_delay = 90 //You dont take a Major Leage cap
|
||||
dog_fashion = null
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/dredd
|
||||
name = "Judge Helmet"
|
||||
desc = "Judge, Jury, and Executioner."
|
||||
@@ -12,7 +11,6 @@
|
||||
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
|
||||
strip_delay = 80
|
||||
dog_fashion = null
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/helmet/aviatorhelmet
|
||||
name = "Aviator Helmet"
|
||||
@@ -21,15 +19,12 @@
|
||||
item_state = "aviator_helmet"
|
||||
icon_state = "aviator_helmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/helmet/biker
|
||||
name = "Biker's Helmet"
|
||||
desc = "This helmet should protect you from russians and masked vigilantes."
|
||||
armor = list(melee = 25, bullet = 15, laser = 20, energy = 10, bomb = 10, bio = 0, rad = 0)
|
||||
icon_state = "biker_helmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
|
||||
|
||||
/obj/item/clothing/head/helmet/richard
|
||||
@@ -38,7 +33,6 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
icon_state = "richard"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
|
||||
|
||||
/obj/item/clothing/head/helmet/megahelmet
|
||||
@@ -47,7 +41,6 @@
|
||||
icon_state = "megahelmet"
|
||||
item_state = "megahelmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
siemens_coefficient = 1
|
||||
|
||||
/obj/item/clothing/head/helmet/protohelmet
|
||||
@@ -56,7 +49,6 @@
|
||||
icon_state = "protohelmet"
|
||||
item_state = "protohelmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
siemens_coefficient = 1
|
||||
|
||||
/obj/item/clothing/head/helmet/megaxhelmet
|
||||
@@ -65,7 +57,6 @@
|
||||
icon_state = "megaxhelmet"
|
||||
item_state = "megaxhelmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/helmet/joehelmet
|
||||
name = "Sniper Helmet"
|
||||
@@ -74,7 +65,6 @@
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
|
||||
item_state = "joehelmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/helmet/doomguy
|
||||
name = "Doomguy's helmet"
|
||||
@@ -83,7 +73,6 @@
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
|
||||
item_state = "doom"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
armor = list(melee = 50, bullet = 40, laser = 40,energy = 40, bomb = 5, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/helmet/neorussian
|
||||
@@ -92,8 +81,6 @@
|
||||
icon_state = "nr_helmet"
|
||||
item_state = "nr_helmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
|
||||
/obj/item/clothing/head/stalhelm
|
||||
name = "Stalhelm"
|
||||
@@ -101,7 +88,6 @@
|
||||
icon_state = "stalhelm"
|
||||
item_state = "stalhelm"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/panzer
|
||||
name = "Panzer Cap"
|
||||
@@ -109,7 +95,6 @@
|
||||
icon_state = "panzercap"
|
||||
item_state = "panzercap"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/naziofficer
|
||||
name = "Officer Cap"
|
||||
@@ -117,8 +102,6 @@
|
||||
icon_state = "officercap"
|
||||
item_state = "officercap"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
|
||||
/obj/item/clothing/head/russobluecamohat
|
||||
name = "russian blue camo beret"
|
||||
@@ -133,7 +116,6 @@
|
||||
icon_state = "russofurhat"
|
||||
item_state = "russofurhat"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/squatter_hat
|
||||
name = "slav squatter hat"
|
||||
@@ -141,7 +123,6 @@
|
||||
item_state = "squatter_hat"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
desc = "Cyka blyat."
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/snake
|
||||
name = "snake head"
|
||||
@@ -149,8 +130,6 @@
|
||||
icon_state = "snakehead"
|
||||
item_state = "snakehead"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/mummy_rags
|
||||
name = "mummy rags"
|
||||
desc = "Ancient rags taken off from some mummy."
|
||||
@@ -158,7 +137,6 @@
|
||||
item_state = "mummy"
|
||||
item_color = "mummy"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
|
||||
/obj/item/clothing/head/clownpiece
|
||||
@@ -167,7 +145,6 @@
|
||||
icon_state = "clownpiece"
|
||||
item_state = "clownpiece"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/mitre
|
||||
name = "mitre"
|
||||
@@ -175,7 +152,6 @@
|
||||
icon_state = "mitre"
|
||||
item_state = "mitre"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
/obj/item/clothing/head/tinfoil
|
||||
name = "tinfoil hat"
|
||||
@@ -183,7 +159,6 @@
|
||||
icon_state = "foilhat"
|
||||
item_state = "paper"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
siemens_coefficient = 2
|
||||
|
||||
/obj/item/clothing/head/celtic
|
||||
@@ -192,4 +167,3 @@
|
||||
icon_state = "celtic_crown"
|
||||
item_state = "celtic_crown"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
icon_state = "breath"
|
||||
item_state = "m_mask"
|
||||
body_parts_covered = 0
|
||||
clothing_flags = MASKINTERNALS
|
||||
visor_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
visor_flags = ALLOWINTERNALS
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
gas_transfer_coefficient = 0.1
|
||||
permeability_coefficient = 0.5
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "gas mask"
|
||||
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
|
||||
icon_state = "gas_alt"
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
item_state = "gas_alt"
|
||||
@@ -59,7 +59,7 @@
|
||||
/obj/item/clothing/mask/gas/clown_hat
|
||||
name = "clown wig and mask"
|
||||
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
|
||||
clothing_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
icon_state = "clown"
|
||||
item_state = "clown_hat"
|
||||
flags_cover = MASKCOVERSEYES
|
||||
@@ -91,7 +91,7 @@
|
||||
/obj/item/clothing/mask/gas/sexyclown
|
||||
name = "sexy-clown wig and mask"
|
||||
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
|
||||
clothing_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
icon_state = "sexyclown"
|
||||
item_state = "sexyclown"
|
||||
flags_cover = MASKCOVERSEYES
|
||||
@@ -100,7 +100,7 @@
|
||||
/obj/item/clothing/mask/gas/mime
|
||||
name = "mime mask"
|
||||
desc = "The traditional mime's mask. It has an eerie facial posture."
|
||||
clothing_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
icon_state = "mime"
|
||||
item_state = "mime"
|
||||
flags_cover = MASKCOVERSEYES
|
||||
@@ -132,7 +132,7 @@
|
||||
/obj/item/clothing/mask/gas/monkeymask
|
||||
name = "monkey mask"
|
||||
desc = "A mask used when acting as a monkey."
|
||||
clothing_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
icon_state = "monkeymask"
|
||||
item_state = "monkeymask"
|
||||
flags_cover = MASKCOVERSEYES
|
||||
@@ -141,7 +141,7 @@
|
||||
/obj/item/clothing/mask/gas/sexymime
|
||||
name = "sexy mime mask"
|
||||
desc = "A traditional female mime's mask."
|
||||
clothing_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
icon_state = "sexymime"
|
||||
item_state = "sexymime"
|
||||
flags_cover = MASKCOVERSEYES
|
||||
@@ -162,7 +162,7 @@
|
||||
name = "owl mask"
|
||||
desc = "Twoooo!"
|
||||
icon_state = "owl"
|
||||
clothing_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
flags_cover = MASKCOVERSEYES
|
||||
resistance_flags = FLAMMABLE
|
||||
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust)
|
||||
icon_state = "sechailer"
|
||||
item_state = "sechailer"
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
|
||||
flags_inv = HIDEFACIALHAIR|HIDEFACE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
|
||||
visor_flags_inv = HIDEFACE
|
||||
flags_cover = MASKCOVERSMOUTH
|
||||
visor_flags_cover = MASKCOVERSMOUTH
|
||||
@@ -69,12 +69,14 @@
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/attack_self()
|
||||
halt()
|
||||
/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user as mob)
|
||||
if(safety)
|
||||
safety = FALSE
|
||||
to_chat(user, "<span class='warning'>You silently fry [src]'s vocal circuit with the cryptographic sequencer.</span>")
|
||||
else
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(!safety)
|
||||
return
|
||||
safety = FALSE
|
||||
to_chat(user, "<span class='warning'>You silently fry [src]'s vocal circuit with the cryptographic sequencer.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/verb/halt()
|
||||
set category = "Object"
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
/obj/item/clothing/mask/pig
|
||||
name = "pig mask"
|
||||
desc = "A rubber pig mask."
|
||||
desc = "A rubber pig mask with a builtin voice modulator."
|
||||
icon_state = "pig"
|
||||
item_state = "pig"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
@@ -92,7 +92,11 @@
|
||||
desc = "It looks like a mask, but closer inspection reveals it's melded onto this persons face!" //It's only ever going to be attached to your face.
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
clothing_flags = NONE
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/pig/cursed/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
|
||||
playsound(get_turf(src), 'sound/magic/pighead_curse.ogg', 50, 1)
|
||||
|
||||
///frog mask - reeee!!
|
||||
/obj/item/clothing/mask/frog
|
||||
@@ -114,16 +118,19 @@
|
||||
|
||||
/obj/item/clothing/mask/frog/cursed
|
||||
clothing_flags = NONE
|
||||
item_flags = NODROP //reee!!
|
||||
|
||||
/obj/item/clothing/mask/frog/cursed/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
|
||||
|
||||
/obj/item/clothing/mask/frog/cursed/equipped(mob/user, slot)
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.wear_mask == src)
|
||||
to_chat(user, "<span class='warning'><B>[src] was cursed! Ree!!</B></span>")
|
||||
if(C.wear_mask == src && HAS_TRAIT_FROM(src, TRAIT_NODROP, CURSED_ITEM_TRAIT))
|
||||
to_chat(user, "<span class='userdanger'><B>[src] was cursed! Ree!!</B></span>")
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/mask/cowmask
|
||||
name = "Cow mask"
|
||||
name = "Cow mask with a builtin voice modulator."
|
||||
desc = "A rubber cow mask,"
|
||||
icon = 'icons/mob/mask.dmi'
|
||||
icon_state = "cowmask"
|
||||
@@ -137,12 +144,17 @@
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!")
|
||||
|
||||
|
||||
/obj/item/clothing/mask/cowmask/cursed
|
||||
name = "cow face"
|
||||
desc = "It looks like a cow mask, but closer inspection reveals it's melded onto this persons face!"
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
clothing_flags = NONE
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/cowmask/cursed/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
|
||||
playsound(get_turf(src), 'sound/magic/cowhead_curse.ogg', 50, 1)
|
||||
|
||||
/obj/item/clothing/mask/horsehead
|
||||
name = "horse head mask"
|
||||
@@ -157,12 +169,17 @@
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
|
||||
|
||||
/obj/item/clothing/mask/horsehead/cursed
|
||||
name = "horse face"
|
||||
desc = "It initially looks like a mask, but it's melded into the poor person's face."
|
||||
clothing_flags = NONE
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/horsehead/cursed/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
|
||||
playsound(get_turf(src), 'sound/magic/horsehead_curse.ogg', 50, 1)
|
||||
|
||||
/obj/item/clothing/mask/rat
|
||||
name = "rat mask"
|
||||
@@ -296,3 +313,9 @@
|
||||
message = replacetextEx(message,regex(capitalize(key),"g"), "[capitalize(value)]")
|
||||
message = replacetextEx(message,regex(key,"g"), "[value]")
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
/obj/item/clothing/mask/bandana/durathread
|
||||
name = "durathread bandana"
|
||||
desc = "A bandana made from durathread, you wish it would provide some protection to its wearer, but it's far too thin..."
|
||||
icon_state = "banddurathread"
|
||||
|
||||
|
||||
@@ -3,18 +3,15 @@
|
||||
desc = "Some pranksters are truly magical."
|
||||
icon_state = "wizzclown"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
|
||||
|
||||
/obj/item/clothing/mask/chapmask
|
||||
name = "venetian mask"
|
||||
desc = "A plain porcelain mask that covers the entire face. Standard attire for particularly unspeakable religions. The eyes are wide shut."
|
||||
icon_state = "chapmask"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
|
||||
|
||||
/obj/item/clothing/mask/neorussian
|
||||
name = "neo-Russian mask"
|
||||
desc = "Somehow, it makes you act and look way more polite than usual."
|
||||
icon_state = "nr_mask"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
|
||||
|
||||
@@ -45,16 +45,23 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/commander/alert
|
||||
name = "ERT Commander - High Alert"
|
||||
name = "ERT Commander - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/pulse/pistol/loyalpin=1)
|
||||
/obj/item/gun/energy/e_gun=1)
|
||||
l_pocket = /obj/item/melee/transforming/energy/sword/saber
|
||||
|
||||
/datum/outfit/ert/commander/alert/red
|
||||
name = "ERT Commander - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/pulse/pistol/loyalpin=1)
|
||||
|
||||
/datum/outfit/ert/security
|
||||
name = "ERT Security"
|
||||
|
||||
@@ -80,15 +87,22 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/security/alert
|
||||
name = "ERT Security - High Alert"
|
||||
name = "ERT Security - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/storage/box/handcuffs=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/gun/energy/pulse/carbine/loyalpin=1)
|
||||
/obj/item/gun/energy/e_gun/stun=1)
|
||||
|
||||
/datum/outfit/ert/security/alert/red
|
||||
name = "ERT Security - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/storage/box/handcuffs=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/gun/energy/pulse/carbine/loyalpin=1)
|
||||
|
||||
/datum/outfit/ert/medic
|
||||
name = "ERT Medic"
|
||||
@@ -117,9 +131,18 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/medic/alert
|
||||
name = "ERT Medic - High Alert"
|
||||
name = "ERT Medic - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/med
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/e_gun=1,\
|
||||
/obj/item/reagent_containers/hypospray/combat/nanites=1,\
|
||||
/obj/item/gun/medbeam=1)
|
||||
|
||||
/datum/outfit/ert/medic/alert/red
|
||||
name = "ERT Medic - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
@@ -154,15 +177,51 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/engineer/alert
|
||||
name = "ERT Engineer - High Alert"
|
||||
name = "ERT Engineer - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/engi
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/e_gun=1,\
|
||||
/obj/item/construction/rcd/combat=1)
|
||||
|
||||
/datum/outfit/ert/engineer/alert/red
|
||||
name = "ERT Engineer - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/pulse/pistol/loyalpin=1,\
|
||||
/obj/item/construction/rcd/combat=1)
|
||||
|
||||
/datum/outfit/ert/greybois
|
||||
name = "Emergency Assistant"
|
||||
|
||||
uniform = /obj/item/clothing/under/color/grey/glorf
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
gloves = /obj/item/clothing/gloves/color/fyellow
|
||||
ears = /obj/item/radio/headset
|
||||
head = /obj/item/clothing/head/soft/grey
|
||||
belt = /obj/item/storage/belt/utility/full
|
||||
back = /obj/item/storage/backpack
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
l_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
l_hand = /obj/item/storage/toolbox/emergency/old
|
||||
id = /obj/item/card/id
|
||||
|
||||
/datum/outfit/ert/greybois/greygod
|
||||
suit = /obj/item/clothing/suit/hazardvest
|
||||
l_hand = /obj/item/storage/toolbox/plastitanium
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
|
||||
/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
return
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
W.registered_name = H.real_name
|
||||
W.assignment = "Assistant"
|
||||
W.access = list(ACCESS_MAINT_TUNNELS,ACCESS_CENT_GENERAL)
|
||||
W.update_label(W.registered_name, W.assignment)
|
||||
|
||||
/datum/outfit/centcom_official
|
||||
name = "CentCom Official"
|
||||
|
||||
@@ -62,6 +62,16 @@
|
||||
desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them."
|
||||
icon_state = "galoshes_dry"
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/noslip
|
||||
desc = "A pair of black shoes, they have the soles of galoshes making them unable to be slipped on a wet surface."
|
||||
name = "black shoes"
|
||||
icon_state = "black"
|
||||
permeability_coefficient = 0.30
|
||||
clothing_flags = NOSLIP
|
||||
strip_delay = 50
|
||||
equip_delay_other = 50
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/shoes/galoshes/dry/step_action()
|
||||
var/turf/open/t_loc = get_turf(src)
|
||||
SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY)
|
||||
@@ -69,10 +79,8 @@
|
||||
/obj/item/clothing/shoes/clown_shoes
|
||||
desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!"
|
||||
name = "clown shoes"
|
||||
icon_state = "clown"
|
||||
item_state = "clown_shoes"
|
||||
icon_state = "clown_shoes"
|
||||
slowdown = SHOES_SLOWDOWN+1
|
||||
item_color = "clown"
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/Initialize()
|
||||
@@ -98,7 +106,6 @@
|
||||
name = "jackboots"
|
||||
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
|
||||
icon_state = "jackboots"
|
||||
item_state = "jackboots"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
item_color = "hosred"
|
||||
@@ -115,7 +122,6 @@
|
||||
name = "winter boots"
|
||||
desc = "Boots lined with 'synthetic' animal fur."
|
||||
icon_state = "winterboots"
|
||||
item_state = "winterboots"
|
||||
permeability_coefficient = 0.15
|
||||
cold_protection = FEET|LEGS
|
||||
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
|
||||
@@ -127,7 +133,6 @@
|
||||
name = "work boots"
|
||||
desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar."
|
||||
icon_state = "workboots"
|
||||
item_state = "jackboots"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
permeability_coefficient = 0.15
|
||||
@@ -145,7 +150,6 @@
|
||||
name = "\improper Nar'Sien invoker boots"
|
||||
desc = "A pair of boots worn by the followers of Nar'Sie."
|
||||
icon_state = "cult"
|
||||
item_state = "cult"
|
||||
item_color = "cult"
|
||||
cold_protection = FEET
|
||||
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
|
||||
@@ -157,7 +161,11 @@
|
||||
icon_state = "cultalt"
|
||||
|
||||
/obj/item/clothing/shoes/cult/alt/ghost
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/clothing/shoes/cult/alt/ghost/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
/obj/item/clothing/shoes/cyborg
|
||||
name = "cyborg boots"
|
||||
@@ -174,7 +182,6 @@
|
||||
name = "roman sandals"
|
||||
desc = "Sandals with buckled leather straps on it."
|
||||
icon_state = "roman"
|
||||
item_state = "roman"
|
||||
strip_delay = 100
|
||||
equip_delay_other = 100
|
||||
permeability_coefficient = 0.9
|
||||
@@ -183,14 +190,12 @@
|
||||
name = "griffon boots"
|
||||
desc = "A pair of costume boots fashioned after bird talons."
|
||||
icon_state = "griffinboots"
|
||||
item_state = "griffinboots"
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
/obj/item/clothing/shoes/bhop
|
||||
name = "jump boots"
|
||||
desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement."
|
||||
icon_state = "jetboots"
|
||||
item_state = "jetboots"
|
||||
item_color = "hosred"
|
||||
resistance_flags = FIRE_PROOF
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
@@ -215,17 +220,13 @@
|
||||
|
||||
var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction
|
||||
|
||||
if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, .proc/hop_end)))
|
||||
jumping = TRUE
|
||||
if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE))
|
||||
playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1)
|
||||
recharging_time = world.time + recharging_rate
|
||||
user.visible_message("<span class='warning'>[usr] dashes forward into the air!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Something prevents you from dashing forward!</span>")
|
||||
|
||||
/obj/item/clothing/shoes/bhop/proc/hop_end()
|
||||
jumping = FALSE
|
||||
recharging_time = world.time + recharging_rate
|
||||
|
||||
/obj/item/clothing/shoes/singery
|
||||
name = "yellow performer's boots"
|
||||
desc = "These boots were made for dancing."
|
||||
@@ -252,7 +253,6 @@
|
||||
name = "Wheely-Heels"
|
||||
desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel
|
||||
icon_state = "wheelys"
|
||||
item_state = "wheelys"
|
||||
actions_types = list(/datum/action/item_action/wheelys)
|
||||
var/wheelToggle = FALSE //False means wheels are not popped out
|
||||
var/obj/vehicle/ridden/scooter/wheelys/W
|
||||
@@ -291,7 +291,6 @@
|
||||
name = "Kindle Kicks"
|
||||
desc = "They'll sure kindle something in you, and it's not childhood nostalgia..."
|
||||
icon_state = "kindleKicks"
|
||||
item_state = "kindleKicks"
|
||||
actions_types = list(/datum/action/item_action/kindleKicks)
|
||||
var/lightCycle = 0
|
||||
var/active = FALSE
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
icon_state = "leather"
|
||||
item_color = "leather"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/magboots/deathsquad
|
||||
@@ -14,7 +13,6 @@
|
||||
icon_state = "DS-magboots0"
|
||||
magboot_state = "DS-magboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
@@ -23,7 +21,6 @@
|
||||
name = "atmospherics magboots"
|
||||
icon_state = "atmosmagboots0"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
magboot_state = "atmosmagboots"
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
@@ -33,7 +30,6 @@
|
||||
desc = "Simon's Shoes."
|
||||
icon_state = "simonshoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/kneesocks
|
||||
@@ -41,7 +37,6 @@
|
||||
desc = "A pair of girly knee-high socks."
|
||||
icon_state = "kneesock"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/jestershoes
|
||||
@@ -49,7 +44,6 @@
|
||||
desc = "As worn by the clowns of old."
|
||||
icon_state = "jestershoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/aviatorboots
|
||||
@@ -57,7 +51,6 @@
|
||||
desc = "Boots suitable for just about any occasion."
|
||||
icon_state = "aviator_boots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/libertyshoes
|
||||
@@ -65,7 +58,6 @@
|
||||
desc = "Freedom isn't free, neither were these shoes."
|
||||
icon_state = "libertyshoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/megaboots
|
||||
@@ -73,7 +65,6 @@
|
||||
desc = "Large armored boots, very weak to large spikes."
|
||||
icon_state = "megaboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/protoboots
|
||||
@@ -81,7 +72,6 @@
|
||||
desc = "Functionally identical to the DRN-001 model's boots, but in red."
|
||||
icon_state = "protoboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/megaxboots
|
||||
@@ -89,7 +79,6 @@
|
||||
desc = "Regardless of how much stronger these boots are than the DRN-001 model's, they're still extremely easy to pierce with a large spike."
|
||||
icon_state = "megaxboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/joeboots
|
||||
@@ -97,7 +86,6 @@
|
||||
desc = "Nearly identical to the Prototype's boots, except in black."
|
||||
icon_state = "joeboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/doomguy
|
||||
@@ -105,7 +93,6 @@
|
||||
desc = "If you look closely, you might see skull fragments still buried in these boots."
|
||||
icon_state = "doom"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/rottenshoes
|
||||
@@ -113,7 +100,6 @@
|
||||
desc = "These shoes seem perfect for sneaking around."
|
||||
icon_state = "rottenshoes"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/sandal/slippers
|
||||
@@ -121,7 +107,6 @@
|
||||
icon_state = "slippers"
|
||||
desc = "For the wizard that puts comfort first. Who's going to laugh?"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/slippers_worn
|
||||
@@ -129,7 +114,6 @@
|
||||
desc = "Fluffy..."
|
||||
icon_state = "slippers_worn"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/neorussian
|
||||
@@ -137,5 +121,4 @@
|
||||
desc = "Tovarish, no one will realize you stepped on a pile of shit if your pair already looks like shit."
|
||||
icon_state = "nr_boots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
@@ -4,7 +4,7 @@
|
||||
name = "space helmet"
|
||||
icon_state = "spaceold"
|
||||
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
|
||||
item_state = "spaceold"
|
||||
permeability_coefficient = 0.01
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun)
|
||||
var/list/hands_nodrop = list()
|
||||
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
|
||||
var/obj/effect/chronos_cam/camera = null
|
||||
var/datum/action/innate/chrono_teleport/teleport_now = new
|
||||
@@ -97,8 +96,7 @@
|
||||
user.anchored = FALSE
|
||||
teleporting = 0
|
||||
for(var/obj/item/I in user.held_items)
|
||||
if(I in hands_nodrop)
|
||||
I.item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
|
||||
if(camera)
|
||||
camera.remove_target_ui()
|
||||
camera.forceMove(user)
|
||||
@@ -131,11 +129,8 @@
|
||||
|
||||
user.ExtinguishMob()
|
||||
|
||||
hands_nodrop = list()
|
||||
for(var/obj/item/I in user.held_items)
|
||||
if(!(I.item_flags & NODROP))
|
||||
hands_nodrop += I
|
||||
I.item_flags |= NODROP
|
||||
ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
|
||||
user.animate_movement = NO_STEPS
|
||||
user.changeNext_move(8 + phase_in_ds)
|
||||
user.notransform = 1
|
||||
@@ -194,9 +189,9 @@
|
||||
if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos))
|
||||
to_chat(user, "\[ <span style='color: #00ff00;'>ok</span> \] Mounting /dev/helm")
|
||||
helmet = user.head
|
||||
helmet.item_flags |= NODROP
|
||||
ADD_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT)
|
||||
helmet.suit = src
|
||||
src.item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT)
|
||||
to_chat(user, "\[ <span style='color: #00ff00;'>ok</span> \] Starting brainwave scanner")
|
||||
to_chat(user, "\[ <span style='color: #00ff00;'>ok</span> \] Starting ui display driver")
|
||||
to_chat(user, "\[ <span style='color: #00ff00;'>ok</span> \] Initializing chronowalk4-view")
|
||||
@@ -215,7 +210,7 @@
|
||||
activating = 1
|
||||
var/mob/living/carbon/human/user = src.loc
|
||||
var/hard_landing = teleporting && force
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT)
|
||||
cooldown = world.time + cooldowntime * 1.5
|
||||
activated = 0
|
||||
activating = 0
|
||||
@@ -236,7 +231,7 @@
|
||||
to_chat(user, "\[ <span style='color: #ff5500;'>ok</span> \] Unmounting /dev/helmet")
|
||||
to_chat(user, "logout")
|
||||
if(helmet)
|
||||
helmet.item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT)
|
||||
helmet.suit = null
|
||||
helmet = null
|
||||
if(camera)
|
||||
|
||||
@@ -897,7 +897,7 @@
|
||||
usermessage("You're already wearing something on your back!", "boldwarning")
|
||||
return FALSE
|
||||
user.equip_to_slot_if_possible(pack,SLOT_BACK,0,0,1)
|
||||
pack.item_flags |= NODROP
|
||||
ADD_TRAIT(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
|
||||
resync()
|
||||
user.visible_message("<span class='notice'>A [pack.name] extends from [user]'s [name] and clamps to [user.p_their()] back!</span>")
|
||||
user.update_inv_wear_suit()
|
||||
@@ -911,7 +911,7 @@
|
||||
return FALSE
|
||||
if(pack.flight && forced)
|
||||
pack.disable_flight(1)
|
||||
pack.item_flags &= ~NODROP
|
||||
REMOVE_TRAIT_FROM(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
|
||||
resync()
|
||||
if(user)
|
||||
user.transferItemToLoc(pack, src, TRUE)
|
||||
@@ -935,14 +935,14 @@
|
||||
usermessage("You're already wearing something on your feet!", "boldwarning")
|
||||
return FALSE
|
||||
user.equip_to_slot_if_possible(shoes,SLOT_SHOES,0,0,1)
|
||||
shoes.item_flags |= NODROP
|
||||
ADD_TRAIT(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
|
||||
user.visible_message("<span class='notice'>[user]'s [name] extends a pair of [shoes.name] over [user.p_their()] feet!</span>")
|
||||
user.update_inv_wear_suit()
|
||||
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
deployedshoes = TRUE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightshoes(forced = FALSE)
|
||||
shoes.item_flags &= ~NODROP
|
||||
REMOVE_TRAIT_FROM(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT)
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
if(user)
|
||||
user.transferItemToLoc(shoes, src, TRUE)
|
||||
|
||||
@@ -624,19 +624,19 @@
|
||||
desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storge bags on to the suit."
|
||||
icon_state = "hardsuit-ancient"
|
||||
item_state = "anc_hardsuit"
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
|
||||
armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
slowdown = 6 //Slow
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
|
||||
name = "M.A.S.O.N RIG helmet"
|
||||
desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection."
|
||||
icon_state = "hardsuit0-ancient"
|
||||
item_state = "anc_helm"
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
|
||||
armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
item_color = "ancient"
|
||||
brightness_on = 16
|
||||
scan_reagents = TRUE
|
||||
@@ -644,7 +644,7 @@
|
||||
tint = 1
|
||||
var/obj/machinery/doppler_array/integrated/bomb_radar
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize()
|
||||
. = ..()
|
||||
@@ -766,12 +766,15 @@
|
||||
icon_state = "ert_medical"
|
||||
item_state = "ert_medical"
|
||||
item_color = "ert_medical"
|
||||
item_flags = NODROP //Dont want people changing into the other teams gear
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf
|
||||
armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95)
|
||||
slowdown = 0
|
||||
max_charges = 5
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/ctf/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/ctf/red
|
||||
name = "red shielded hardsuit"
|
||||
icon_state = "ert_security"
|
||||
|
||||
@@ -171,10 +171,13 @@ Contains:
|
||||
item_color = "ert_commander"
|
||||
armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
|
||||
strip_delay = 130
|
||||
item_flags = NODROP
|
||||
brightness_on = 7
|
||||
resistance_flags = ACID_PROOF
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert
|
||||
name = "emergency response team suit"
|
||||
desc = "Standard issue command suit for the ERT."
|
||||
@@ -237,8 +240,6 @@ Contains:
|
||||
item_state = "hardsuit0-ert_commander-alert"
|
||||
item_color = "ert_commander-alert"
|
||||
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
item_flags = NODROP
|
||||
brightness_on = 8
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
@@ -248,11 +249,8 @@ Contains:
|
||||
icon_state = "ert_command-alert"
|
||||
item_state = "ert_command-alert"
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
//ERT Security
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/sec
|
||||
@@ -342,9 +340,13 @@ Contains:
|
||||
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 75) //As whimpy as a space carp
|
||||
brightness_on = 0 //luminosity when on
|
||||
actions_types = list()
|
||||
item_flags = NODROP
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/carp/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/carp
|
||||
name = "carp space suit"
|
||||
desc = "A slimming piece of dubious space carp technology, you suspect it won't stand up to hand-to-hand blows."
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
slot_flags = ITEM_SLOT_OCLOTHING
|
||||
body_parts_covered = CHEST
|
||||
var/blood_overlay_type = "suit"
|
||||
var/togglename = null
|
||||
var/suittoggled = FALSE
|
||||
@@ -28,7 +29,6 @@
|
||||
H.update_inv_wear_suit()
|
||||
else if(adjusted == ALT_STYLE)
|
||||
adjusted = NORMAL_STYLE
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
|
||||
if(H.dna.features["taur"] in list("Naga", "Tentacle"))
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/obj/item/clothing/suit/armor
|
||||
allowed = null
|
||||
body_parts_covered = CHEST
|
||||
cold_protection = CHEST|GROIN
|
||||
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN
|
||||
@@ -238,3 +237,14 @@
|
||||
/obj/item/clothing/suit/armor/riot/knight/red
|
||||
icon_state = "knight_red"
|
||||
item_state = "knight_red"
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/durathread
|
||||
name = "makeshift vest"
|
||||
desc = "A vest made of durathread with strips of leather acting as trauma plates."
|
||||
icon_state = "durathread"
|
||||
item_state = "durathread"
|
||||
strip_delay = 60
|
||||
equip_delay_other = 40
|
||||
max_integrity = 200
|
||||
resistance_flags = FLAMMABLE
|
||||
armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
icon_state = "qmcloak"
|
||||
item_state = "qmcloak"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
body_parts_covered = CHEST|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/head/cloakhood
|
||||
name = "cloak hood"
|
||||
@@ -15,7 +15,6 @@
|
||||
icon_state = "golhood"
|
||||
desc = "A hood for a cloak."
|
||||
body_parts_covered = HEAD
|
||||
item_flags = NODROP
|
||||
flags_inv = HIDEHAIR|HIDEEARS
|
||||
|
||||
/obj/item/clothing/neck/cloak/suicide_act(mob/user)
|
||||
@@ -63,7 +62,7 @@
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
|
||||
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
|
||||
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
body_parts_covered = CHEST|ARMS|LEGS
|
||||
|
||||
/obj/item/clothing/head/hooded/cloakhood/goliath
|
||||
name = "goliath cloak hood"
|
||||
|
||||
@@ -23,30 +23,48 @@
|
||||
allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/assembly/flash/handheld, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
|
||||
//Chaplain
|
||||
/obj/item/clothing/suit/nun
|
||||
/obj/item/clothing/suit/chaplain
|
||||
name = "chaplain suit"
|
||||
desc = "A piece of clothing adorned by the gods of Coding. Should never exist in this mortal realm."
|
||||
allowed = list(/obj/item/storage/book/bible, HOLY_WEAPONS, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
|
||||
/obj/item/clothing/suit/chaplain/nun
|
||||
name = "nun robe"
|
||||
desc = "Maximum piety in this star system."
|
||||
icon_state = "nun"
|
||||
item_state = "nun"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
flags_inv = HIDESHOES|HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
|
||||
/obj/item/clothing/suit/studentuni
|
||||
/obj/item/clothing/suit/chaplain/studentuni
|
||||
name = "student robe"
|
||||
desc = "The uniform of a bygone institute of learning."
|
||||
icon_state = "studentuni"
|
||||
item_state = "studentuni"
|
||||
body_parts_covered = ARMS|CHEST
|
||||
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
|
||||
/obj/item/clothing/suit/witchhunter
|
||||
/obj/item/clothing/suit/chaplain/witchhunter
|
||||
name = "witchunter garb"
|
||||
desc = "This worn outfit saw much use back in the day."
|
||||
icon_state = "witchhunter"
|
||||
item_state = "witchhunter"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
|
||||
/obj/item/clothing/suit/chaplain/pharaoh
|
||||
name = "pharaoh tunic"
|
||||
desc = "Lavish space tomb not included."
|
||||
icon_state = "pharaoh"
|
||||
icon_state = "pharaoh"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/suit/chaplain/holidaypriest
|
||||
name = "holiday priest"
|
||||
desc = "This is a nice holiday, my son."
|
||||
icon_state = "holidaypriest"
|
||||
item_state = "w_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
|
||||
|
||||
//Chef
|
||||
/obj/item/clothing/suit/toggle/chef
|
||||
@@ -135,6 +153,7 @@
|
||||
icon = 'icons/obj/clothing/belts.dmi'
|
||||
icon_state = "suspenders"
|
||||
blood_overlay_type = "armor" //it's the less thing that I can put here
|
||||
body_parts_covered = NONE
|
||||
|
||||
//Security
|
||||
/obj/item/clothing/suit/security/officer
|
||||
@@ -177,3 +196,24 @@
|
||||
armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
|
||||
cold_protection = CHEST|ARMS
|
||||
heat_protection = CHEST|ARMS
|
||||
|
||||
|
||||
//Robotocist
|
||||
|
||||
/obj/item/clothing/suit/hooded/techpriest
|
||||
name = "techpriest robes"
|
||||
desc = "For those who REALLY love their toasters."
|
||||
icon_state = "techpriest"
|
||||
item_state = "techpriest"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
hoodtype = /obj/item/clothing/head/hooded/techpriest
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/head/hooded/techpriest
|
||||
name = "techpriest's hood"
|
||||
desc = "A hood for those who REALLY love their toasters."
|
||||
icon_state = "techpriesthood"
|
||||
item_state = "techpriesthood"
|
||||
body_parts_covered = HEAD
|
||||
flags_inv = HIDEHAIR|HIDEEARS
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
item_state = "death"
|
||||
flags_1 = CONDUCT_1
|
||||
fire_resist = T0C+5200
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
|
||||
@@ -75,6 +76,7 @@
|
||||
desc = "this pretty much looks ridiculous" //Needs no fixing
|
||||
icon_state = "justice"
|
||||
item_state = "justice"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
|
||||
@@ -100,14 +102,14 @@
|
||||
desc = "A fancy purple apron for a stylish person."
|
||||
icon_state = "purplebartenderapron"
|
||||
item_state = "purplebartenderapron"
|
||||
body_parts_covered = CHEST|GROIN|LEGS
|
||||
body_parts_covered = CHEST
|
||||
|
||||
/obj/item/clothing/suit/syndicatefake
|
||||
name = "black and red space suit replica"
|
||||
icon_state = "syndicate-black-red"
|
||||
item_state = "syndicate-black-red"
|
||||
desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
body_parts_covered = CHEST|ARMS|GROIN|LEGS|FEET|HANDS
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
resistance_flags = NONE
|
||||
@@ -154,7 +156,7 @@
|
||||
icon_state = "owl_wings"
|
||||
item_state = "owl_wings"
|
||||
togglename = "wings"
|
||||
body_parts_covered = ARMS|CHEST
|
||||
body_parts_covered = ARMS
|
||||
actions_types = list(/datum/action/item_action/toggle_wings)
|
||||
|
||||
/obj/item/clothing/suit/toggle/owlwings/Initialize()
|
||||
@@ -167,16 +169,6 @@
|
||||
icon_state = "griffin_wings"
|
||||
item_state = "griffin_wings"
|
||||
|
||||
|
||||
/obj/item/clothing/suit/holidaypriest
|
||||
name = "holiday priest"
|
||||
desc = "This is a nice holiday, my son."
|
||||
icon_state = "holidaypriest"
|
||||
item_state = "w_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
|
||||
/obj/item/clothing/suit/cardborg
|
||||
name = "cardborg suit"
|
||||
desc = "An ordinary cardboard box with holes cut in the sides."
|
||||
@@ -219,6 +211,7 @@
|
||||
desc = "Your classic, non-racist poncho."
|
||||
icon_state = "classicponcho"
|
||||
item_state = "classicponcho"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/suit/poncho/green
|
||||
name = "green poncho"
|
||||
@@ -237,7 +230,10 @@
|
||||
desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseparable. Literally."
|
||||
icon_state = "ponchoshame"
|
||||
item_state = "ponchoshame"
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/suit/poncho/ponchoshame/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
|
||||
|
||||
/obj/item/clothing/suit/whitedress
|
||||
name = "white dress"
|
||||
@@ -252,7 +248,7 @@
|
||||
desc = "A costume made from 'synthetic' carp scales, it smells."
|
||||
icon_state = "carp_casual"
|
||||
item_state = "labcoat"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
|
||||
cold_protection = CHEST|GROIN|ARMS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too
|
||||
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun)
|
||||
@@ -272,9 +268,7 @@
|
||||
desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
|
||||
icon_state = "ian"
|
||||
item_state = "labcoat"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
//cold_protection = CHEST|GROIN|ARMS
|
||||
//min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
|
||||
allowed = list()
|
||||
hoodtype = /obj/item/clothing/head/hooded/ian_hood
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
@@ -284,8 +278,6 @@
|
||||
desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits."
|
||||
icon_state = "ian"
|
||||
body_parts_covered = HEAD
|
||||
//cold_protection = HEAD
|
||||
//min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
flags_inv = HIDEHAIR|HIDEEARS
|
||||
|
||||
/obj/item/clothing/suit/hooded/bee_costume // It's Hip!
|
||||
@@ -311,7 +303,7 @@
|
||||
desc = "A horribly bloated suit made from human skins."
|
||||
icon_state = "lingspacesuit"
|
||||
item_state = "labcoat"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET|HANDS
|
||||
allowed = list()
|
||||
actions_types = list(/datum/action/item_action/toggle_human_head)
|
||||
hoodtype = /obj/item/clothing/head/hooded/human_head
|
||||
@@ -352,18 +344,21 @@
|
||||
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it, but it's pretty close. Good for sleeping in."
|
||||
icon_state = "ianshirt"
|
||||
item_state = "ianshirt"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/suit/nerdshirt
|
||||
name = "gamer shirt"
|
||||
desc = "A baggy shirt with vintage game character Phanic the Weasel. Why would anyone wear this?"
|
||||
icon_state = "nerdshirt"
|
||||
item_state = "nerdshirt"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
|
||||
name = "Vape Naysh shirt"
|
||||
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
|
||||
icon_state = "vapeshirt"
|
||||
item_state = "vapeshirt"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/suit/jacket
|
||||
name = "bomber jacket"
|
||||
@@ -371,7 +366,7 @@
|
||||
icon_state = "bomberjacket"
|
||||
item_state = "brownjsuit"
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/radio)
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
body_parts_covered = CHEST|ARMS
|
||||
cold_protection = CHEST|GROIN|ARMS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
|
||||
@@ -396,6 +391,7 @@
|
||||
desc = "A thick jacket with a rubbery, water-resistant shell."
|
||||
icon_state = "pufferjacket"
|
||||
item_state = "hostrench"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/suit/jacket/puffer/vest
|
||||
@@ -443,18 +439,21 @@
|
||||
desc = "Looks like this belongs in a very old movie set."
|
||||
icon_state = "draculacoat"
|
||||
item_state = "draculacoat"
|
||||
body_parts_covered = CHEST|ARMS
|
||||
|
||||
/obj/item/clothing/suit/drfreeze_coat
|
||||
name = "doctor freeze's labcoat"
|
||||
desc = "A labcoat imbued with the power of features and freezes."
|
||||
icon_state = "drfreeze_coat"
|
||||
item_state = "drfreeze_coat"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/suit/gothcoat
|
||||
name = "gothic coat"
|
||||
desc = "Perfect for those who want stalk in a corner of a bar."
|
||||
icon_state = "gothcoat"
|
||||
item_state = "gothcoat"
|
||||
body_parts_covered = CHEST|ARMS|HAND_LEFT //peculiar
|
||||
|
||||
/obj/item/clothing/suit/xenos
|
||||
name = "xenos suit"
|
||||
@@ -465,13 +464,6 @@
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/clothing/mask/facehugger/toy)
|
||||
|
||||
/obj/item/clothing/suit/nemes
|
||||
name = "pharoah tunic"
|
||||
desc = "Lavish space tomb not included."
|
||||
icon_state = "pharoah"
|
||||
icon_state = "pharoah"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
|
||||
|
||||
// WINTER COATS
|
||||
@@ -600,6 +592,7 @@
|
||||
name = "spooky ghost"
|
||||
desc = "This is obviously just a bedsheet, but maybe try it on?"
|
||||
icon_state = "bedsheet"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
|
||||
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
|
||||
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
|
||||
|
||||
@@ -608,6 +601,7 @@
|
||||
desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice."
|
||||
icon = 'icons/obj/clothing/clockwork_garb.dmi'
|
||||
icon_state = "clockwork_cuirass_old"
|
||||
body_parts_covered = CHEST|GROIN|LEGS
|
||||
armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
|
||||
|
||||
/obj/item/clothing/suit/ghost_sheet
|
||||
@@ -620,4 +614,5 @@
|
||||
throw_range = 2
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
|
||||
alternate_worn_layer = UNDER_HEAD_LAYER
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals and armbands, this accessory system is being kept as-is
|
||||
/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals, pokadots, and armbands, this accessory system is being kept as-is
|
||||
name = "Accessory"
|
||||
desc = "Something has gone wrong!"
|
||||
icon = 'icons/obj/clothing/accessories.dmi'
|
||||
@@ -354,3 +354,60 @@
|
||||
item_color = "skull"
|
||||
above_suit = TRUE
|
||||
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25)
|
||||
|
||||
/////////////////////
|
||||
//Synda Accessories//
|
||||
/////////////////////
|
||||
|
||||
/obj/item/clothing/accessory/padding
|
||||
name = "soft padding"
|
||||
desc = "Some long sheets of padding to help soften the blows of a physical attacks."
|
||||
icon_state = "padding"
|
||||
item_color = "nothing"
|
||||
armor = list("melee" = 15, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -20, "acid" = 45)
|
||||
|
||||
/obj/item/clothing/accessory/kevlar
|
||||
name = "kevlar sheets"
|
||||
desc = "Long thin sheets of kevlar to help resist bullets and some physical attacks."
|
||||
icon_state = "padding"
|
||||
item_color = "nothing"
|
||||
armor = list("melee" = 10, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 25)
|
||||
|
||||
/obj/item/clothing/accessory/plastics
|
||||
name = "underling plastic sheet"
|
||||
desc = "A full body sheet of white plastic to help defuse lasers and energy based weapons."
|
||||
icon_state = "plastics"
|
||||
item_color = "nothing"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = -40)
|
||||
|
||||
/////////////////////
|
||||
//Pokadots On Pants//
|
||||
/////////////////////
|
||||
|
||||
/obj/item/clothing/accessory/attrocious_pokadots
|
||||
name = "atrocious pokadots"
|
||||
desc = "They look like something out of a thrift store. Attaches to clothing not to be worn by itself."
|
||||
icon_state = "attrocious_pokadots"
|
||||
item_color = "attrocious_pokadots"
|
||||
attack_verb = list("horrifed", "eye bleeded")
|
||||
|
||||
/obj/item/clothing/accessory/black_white_pokadots
|
||||
name = "checkered pokadots"
|
||||
desc = "You can play a game of chess on these! Attaches to clothing not to be worn by itself."
|
||||
icon_state = "black_white_pokadots"
|
||||
item_color = "black_white_pokadots"
|
||||
attack_verb = list("check", "mate")
|
||||
|
||||
/obj/item/clothing/accessory/nt_pokadots
|
||||
name = "blue and white pokadots"
|
||||
desc = "To show your pride in your workplace, in the most annoying possable way. Attaches to clothing not to be worn by itself."
|
||||
icon_state = "nt_pokadots"
|
||||
item_color = "nt_pokadots"
|
||||
attack_verb = list("eye bleeded", "annoyed")
|
||||
|
||||
/obj/item/clothing/accessory/syndi_pokadots
|
||||
name = "black and red pokadots"
|
||||
desc = "King me. Attaches to clothing not to be worn by itself." //checkers!
|
||||
icon_state = "syndi_pokadots"
|
||||
item_color = "syndi_pokadots"
|
||||
attack_verb = list("jumped", "taken")
|
||||
@@ -1,12 +1,18 @@
|
||||
/obj/item/clothing/under/color
|
||||
desc = "A standard issue colored jumpsuit. Variety is the spice of life!"
|
||||
|
||||
/obj/item/clothing/under/skirt/color
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/color/random
|
||||
icon_state = "random_jumpsuit"
|
||||
|
||||
/obj/item/clothing/under/color/random/Initialize()
|
||||
..()
|
||||
var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost)
|
||||
var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost)
|
||||
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) //or else you end up with naked assistants running around everywhere...
|
||||
@@ -14,6 +20,20 @@
|
||||
new C(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/clothing/under/skirt/color/random
|
||||
icon_state = "random_jumpsuit" //Skirt variant needed
|
||||
|
||||
/obj/item/clothing/under/skirt/color/random/Initialize()
|
||||
..()
|
||||
var/obj/item/clothing/under/skirt/color/C = pick(subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/skirt/color/random)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM)
|
||||
else
|
||||
new C(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
|
||||
/obj/item/clothing/under/color/black
|
||||
name = "black jumpsuit"
|
||||
icon_state = "black"
|
||||
@@ -21,9 +41,22 @@
|
||||
item_color = "black"
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/color/black/ghost
|
||||
item_flags = NODROP | DROPDEL
|
||||
/obj/item/clothing/under/skirt/color/black
|
||||
name = "black jumpskirt"
|
||||
icon_state = "black_skirt"
|
||||
item_state = "bl_suit"
|
||||
item_color = "black_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/black/ghost
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/clothing/under/color/black/ghost/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
/obj/item/clothing/under/color/black/ghost/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, DROPDEL)
|
||||
/obj/item/clothing/under/color/grey
|
||||
name = "grey jumpsuit"
|
||||
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
|
||||
@@ -31,6 +64,13 @@
|
||||
item_state = "gy_suit"
|
||||
item_color = "grey"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/grey
|
||||
name = "grey jumpskirt"
|
||||
desc = "A tasteful grey jumpskirt that reminds you of the good old days."
|
||||
icon_state = "grey_skirt"
|
||||
item_state = "gy_suit"
|
||||
item_color = "grey_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/grey/glorf
|
||||
name = "ancient jumpsuit"
|
||||
desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade."
|
||||
@@ -45,12 +85,24 @@
|
||||
item_state = "b_suit"
|
||||
item_color = "blue"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/blue
|
||||
name = "blue jumpskirt"
|
||||
icon_state = "blue_skirt"
|
||||
item_state = "b_suit"
|
||||
item_color = "blue_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/green
|
||||
name = "green jumpsuit"
|
||||
icon_state = "green"
|
||||
item_state = "g_suit"
|
||||
item_color = "green"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/green
|
||||
name = "green jumpskirt"
|
||||
icon_state = "green_skirt"
|
||||
item_state = "g_suit"
|
||||
item_color = "green_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/orange
|
||||
name = "orange jumpsuit"
|
||||
desc = "Don't wear this near paranoid security officers."
|
||||
@@ -58,6 +110,12 @@
|
||||
item_state = "o_suit"
|
||||
item_color = "orange"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/orange
|
||||
name = "orange jumpskirt"
|
||||
icon_state = "orange_skirt"
|
||||
item_state = "o_suit"
|
||||
item_color = "orange_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/pink
|
||||
name = "pink jumpsuit"
|
||||
icon_state = "pink"
|
||||
@@ -65,66 +123,133 @@
|
||||
item_state = "p_suit"
|
||||
item_color = "pink"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/pink
|
||||
name = "pink jumpskirt"
|
||||
icon_state = "pink_skirt"
|
||||
item_state = "p_suit"
|
||||
item_color = "pink_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/red
|
||||
name = "red jumpsuit"
|
||||
icon_state = "red"
|
||||
item_state = "r_suit"
|
||||
item_color = "red"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/red
|
||||
name = "red jumpskirt"
|
||||
icon_state = "red_skirt"
|
||||
item_state = "r_suit"
|
||||
item_color = "red_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/white
|
||||
name = "white jumpsuit"
|
||||
icon_state = "white"
|
||||
item_state = "w_suit"
|
||||
item_color = "white"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/white
|
||||
name = "white jumpskirt"
|
||||
icon_state = "white_skirt"
|
||||
item_state = "w_suit"
|
||||
item_color = "white_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/yellow
|
||||
name = "yellow jumpsuit"
|
||||
icon_state = "yellow"
|
||||
item_state = "y_suit"
|
||||
item_color = "yellow"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/yellow
|
||||
name = "yellow jumpskirt"
|
||||
icon_state = "yellow_skirt"
|
||||
item_state = "y_suit"
|
||||
item_color = "yellow_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/darkblue
|
||||
name = "darkblue jumpsuit"
|
||||
icon_state = "darkblue"
|
||||
item_state = "b_suit"
|
||||
item_color = "darkblue"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/darkblue
|
||||
name = "darkblue jumpskirt"
|
||||
icon_state = "darkblue_skirt"
|
||||
item_state = "b_suit"
|
||||
item_color = "darkblue_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/teal
|
||||
name = "teal jumpsuit"
|
||||
icon_state = "teal"
|
||||
item_state = "b_suit"
|
||||
item_color = "teal"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/teal
|
||||
name = "teal jumpskirt"
|
||||
icon_state = "teal_skirt"
|
||||
item_state = "b_suit"
|
||||
item_color = "teal_skirt"
|
||||
|
||||
|
||||
/obj/item/clothing/under/color/lightpurple
|
||||
name = "purple jumpsuit"
|
||||
icon_state = "lightpurple"
|
||||
item_state = "p_suit"
|
||||
item_color = "lightpurple"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/lightpurple
|
||||
name = "lightpurple jumpskirt"
|
||||
icon_state = "lightpurple_skirt"
|
||||
item_state = "p_suit"
|
||||
item_color = "lightpurple_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/darkgreen
|
||||
name = "darkgreen jumpsuit"
|
||||
icon_state = "darkgreen"
|
||||
item_state = "g_suit"
|
||||
item_color = "darkgreen"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/darkgreen
|
||||
name = "darkgreen jumpskirt"
|
||||
icon_state = "darkgreen_skirt"
|
||||
item_state = "g_suit"
|
||||
item_color = "darkgreen_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/lightbrown
|
||||
name = "lightbrown jumpsuit"
|
||||
icon_state = "lightbrown"
|
||||
item_state = "lb_suit"
|
||||
item_color = "lightbrown"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/lightbrown
|
||||
name = "lightbrown jumpskirt"
|
||||
icon_state = "lightbrown_skirt"
|
||||
item_state = "lb_suit"
|
||||
item_color = "lightbrown_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/brown
|
||||
name = "brown jumpsuit"
|
||||
icon_state = "brown"
|
||||
item_state = "lb_suit"
|
||||
item_color = "brown"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/brown
|
||||
name = "brown jumpskirt"
|
||||
icon_state = "brown_skirt"
|
||||
item_state = "lb_suit"
|
||||
item_color = "brown_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/maroon
|
||||
name = "maroon jumpsuit"
|
||||
icon_state = "maroon"
|
||||
item_state = "r_suit"
|
||||
item_color = "maroon"
|
||||
|
||||
/obj/item/clothing/under/skirt/color/maroon
|
||||
name = "maroon jumpskirt"
|
||||
icon_state = "maroon_skirt"
|
||||
item_state = "r_suit"
|
||||
item_color = "maroon_skirt"
|
||||
|
||||
/obj/item/clothing/under/color/rainbow
|
||||
name = "rainbow jumpsuit"
|
||||
desc = "A multi-colored jumpsuit!"
|
||||
@@ -132,3 +257,11 @@
|
||||
item_state = "rainbow"
|
||||
item_color = "rainbow"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/skirt/color/rainbow
|
||||
name = "rainbow jumpskirt"
|
||||
desc = "A multi-colored jumpskirt!"
|
||||
icon_state = "rainbow_skirt"
|
||||
item_state = "rainbow"
|
||||
item_color = "rainbow_skirt"
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -16,6 +16,16 @@
|
||||
item_color = "purplebartender"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/bartender/skirt
|
||||
name = "bartender's skirt"
|
||||
desc = "It looks like it could use some more flair."
|
||||
icon_state = "barman_skirt"
|
||||
item_state = "bar_suit"
|
||||
item_color = "barman_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
|
||||
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"."
|
||||
name = "captain's jumpsuit"
|
||||
@@ -25,6 +35,16 @@
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/captain/skirt
|
||||
name = "captain's jumpskirt"
|
||||
desc = "It's a blue jumpskirt with some gold markings denoting the rank of \"Captain\"."
|
||||
icon_state = "captain_skirt"
|
||||
item_state = "b_suit"
|
||||
item_color = "captain_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/cargo
|
||||
name = "quartermaster's jumpsuit"
|
||||
desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
|
||||
@@ -32,6 +52,16 @@
|
||||
item_state = "lb_suit"
|
||||
item_color = "qm"
|
||||
|
||||
/obj/item/clothing/under/rank/cargo/skirt
|
||||
name = "quartermaster's jumpskirt"
|
||||
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
|
||||
icon_state = "qm_skirt"
|
||||
item_state = "lb_suit"
|
||||
item_color = "qm_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/cargotech
|
||||
name = "cargo technician's jumpsuit"
|
||||
desc = "Shooooorts! They're comfy and easy to wear!"
|
||||
@@ -42,6 +72,15 @@
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/cargotech/skirt
|
||||
name = "cargo technician's jumpskirt"
|
||||
desc = "Skiiiiirts! They're comfy and easy to wear"
|
||||
icon_state = "cargo_skirt"
|
||||
item_state = "lb_suit"
|
||||
item_color = "cargo_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/chaplain
|
||||
desc = "It's a black jumpsuit, often worn by religious folk."
|
||||
@@ -51,6 +90,16 @@
|
||||
item_color = "chapblack"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/chaplain/skirt
|
||||
name = "chaplain's jumpskirt"
|
||||
desc = "It's a black jumpskirt, often worn by religious folk."
|
||||
icon_state = "chapblack_skirt"
|
||||
item_state = "bl_suit"
|
||||
item_color = "chapblack_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/chef
|
||||
name = "cook's suit"
|
||||
desc = "A suit which is given only to the most <b>hardcore</b> cooks in space."
|
||||
@@ -58,6 +107,15 @@
|
||||
item_color = "chef"
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/chef/skirt
|
||||
name = "cook's skirt"
|
||||
desc = "A skirt which is given only to the most <b>hardcore</b> cooks in space."
|
||||
icon_state = "chef_skirt"
|
||||
item_color = "chef_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/clown
|
||||
name = "clown suit"
|
||||
desc = "<i>'HONK!'</i>"
|
||||
@@ -66,7 +124,6 @@
|
||||
item_color = "clown"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/blueclown
|
||||
name = "blue clown suit"
|
||||
desc = "<i>'BLUE HONK!'</i>"
|
||||
@@ -130,7 +187,6 @@
|
||||
/obj/item/clothing/under/rank/clown/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50)
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_personnel
|
||||
desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
|
||||
name = "head of personnel's jumpsuit"
|
||||
@@ -139,6 +195,16 @@
|
||||
item_color = "hop"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_personnel/skirt
|
||||
name = "head of personnel's jumpskirt"
|
||||
desc = "It's a jumpskirt worn by someone who works in the position of \"Head of Personnel\"."
|
||||
icon_state = "hop_skirt"
|
||||
item_state = "b_suit"
|
||||
item_color = "hop_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/hydroponics
|
||||
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
|
||||
name = "botanist's jumpsuit"
|
||||
@@ -147,6 +213,16 @@
|
||||
item_color = "hydroponics"
|
||||
permeability_coefficient = 0.5
|
||||
|
||||
/obj/item/clothing/under/rank/hydroponics/skirt
|
||||
name = "botanist's jumpskirt"
|
||||
desc = "It's a jumpskirt designed to protect against minor plant-related hazards."
|
||||
icon_state = "hydroponics_skirt"
|
||||
item_state = "g_suit"
|
||||
item_color = "hydroponics_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/janitor
|
||||
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
|
||||
name = "janitor's jumpsuit"
|
||||
@@ -154,49 +230,108 @@
|
||||
item_color = "janitor"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/janitor/skirt
|
||||
name = "janitor's jumpskirt"
|
||||
desc = "It's the official skirt of the station's janitor. It has minor protection from biohazards."
|
||||
icon_state = "janitor_skirt"
|
||||
item_color = "janitor_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/lawyer
|
||||
desc = "Slick threads."
|
||||
name = "Lawyer suit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/lawyer/black
|
||||
name = "lawyer black suit"
|
||||
icon_state = "lawyer_black"
|
||||
item_state = "lawyer_black"
|
||||
item_color = "lawyer_black"
|
||||
|
||||
/obj/item/clothing/under/lawyer/black/skirt
|
||||
name = "lawyer black suitskirt"
|
||||
icon_state = "lawyer_black_skirt"
|
||||
item_state = "lawyer_black"
|
||||
item_color = "lawyer_black_skirt"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/lawyer/female
|
||||
name = "female black suit"
|
||||
icon_state = "black_suit_fem"
|
||||
item_state = "black_suit_fem"
|
||||
item_state = "bl_suit"
|
||||
item_color = "black_suit_fem"
|
||||
|
||||
/obj/item/clothing/under/lawyer/red
|
||||
name = "lawyer red suit"
|
||||
icon_state = "lawyer_red"
|
||||
item_state = "lawyer_red"
|
||||
item_color = "lawyer_red"
|
||||
|
||||
/obj/item/clothing/under/lawyer/female/skirt
|
||||
name = "female black suitskirt"
|
||||
icon_state = "black_suit_fem_skirt"
|
||||
item_state = "bl_suit"
|
||||
item_color = "black_suit_fem_skirt"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/lawyer/red/skirt
|
||||
name = "lawyer red suitskirt"
|
||||
icon_state = "lawyer_red_skirt"
|
||||
item_state = "lawyer_red"
|
||||
item_color = "lawyer_red_skirt"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/lawyer/blue
|
||||
name = "lawyer blue suit"
|
||||
icon_state = "lawyer_blue"
|
||||
item_state = "lawyer_blue"
|
||||
item_color = "lawyer_blue"
|
||||
|
||||
/obj/item/clothing/under/lawyer/blue/skirt
|
||||
name = "lawyer blue suitskirt"
|
||||
icon_state = "lawyer_blue_skirt"
|
||||
item_state = "lawyer_blue"
|
||||
item_color = "lawyer_blue_skirt"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/lawyer/bluesuit
|
||||
name = "blue suit"
|
||||
desc = "A classy suit and tie."
|
||||
icon_state = "bluesuit"
|
||||
item_state = "bluesuit"
|
||||
item_state = "b_suit"
|
||||
item_color = "bluesuit"
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/lawyer/bluesuit/skirt
|
||||
name = "blue suitskirt"
|
||||
desc = "A classy suitskirt and tie."
|
||||
icon_state = "bluesuit_skirt"
|
||||
item_state = "b_suit"
|
||||
item_color = "bluesuit_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/lawyer/purpsuit
|
||||
name = "purple suit"
|
||||
icon_state = "lawyer_purp"
|
||||
item_state = "lawyer_purp"
|
||||
item_state = "p_suit"
|
||||
item_color = "lawyer_purp"
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/lawyer/purpsuit/skirt
|
||||
name = "purple suitskirt"
|
||||
icon_state = "lawyer_purp_skirt"
|
||||
item_state = "p_suit"
|
||||
item_color = "lawyer_purp_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/lawyer/blacksuit
|
||||
name = "black suit"
|
||||
desc = "A professional black suit. Nanotrasen Investigation Bureau approved!"
|
||||
@@ -206,6 +341,16 @@
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/lawyer/blacksuit/skirt
|
||||
name = "black suitskirt"
|
||||
desc = "A professional black suit. Nanotrasen Investigation Bureau approved!"
|
||||
icon_state = "blacksuit_skirt"
|
||||
item_state = "bar_suit"
|
||||
item_color = "blacksuit_skirt"
|
||||
can_adjust = FALSE
|
||||
alt_covers_chest = TRUE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/curator
|
||||
name = "sensible suit"
|
||||
desc = "It's very... sensible."
|
||||
@@ -214,6 +359,33 @@
|
||||
item_color = "red_suit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/lawyer/really_black
|
||||
name = "executive suit"
|
||||
desc = "A formal black suit and red tie, intended for the station's finest."
|
||||
icon_state = "really_black_suit"
|
||||
item_state = "bl_suit"
|
||||
item_color = "really_black_suit"
|
||||
|
||||
/obj/item/clothing/under/lawyer/really_black/skirt
|
||||
name = "executive suitskirt"
|
||||
desc = "A formal black suitskirt and red tie, intended for the station's finest."
|
||||
icon_state = "really_black_suit_skirt"
|
||||
item_state = "bl_suit"
|
||||
item_color = "really_black_suit_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/curator/skirt
|
||||
name = "sensible suitskirt"
|
||||
desc = "It's very... sensible."
|
||||
icon_state = "red_suit_skirt"
|
||||
item_state = "red_suit"
|
||||
item_color = "red_suit_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/curator/treasure_hunter
|
||||
name = "treasure hunter uniform"
|
||||
desc = "A rugged uniform suitable for treasure hunting."
|
||||
@@ -228,13 +400,22 @@
|
||||
item_state = "mime"
|
||||
item_color = "mime"
|
||||
|
||||
/obj/item/clothing/under/rank/mime/skirt
|
||||
name = "mime's skirt"
|
||||
desc = "It's not very colourful."
|
||||
icon_state = "mime_skirt"
|
||||
item_state = "mime"
|
||||
item_color = "mime_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/miner
|
||||
desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty."
|
||||
name = "shaft miner's jumpsuit"
|
||||
icon_state = "miner"
|
||||
item_state = "miner"
|
||||
item_color = "miner"
|
||||
|
||||
/obj/item/clothing/under/rank/miner/lavaland
|
||||
desc = "A green uniform for operating in hazardous environments."
|
||||
name = "shaft miner's jumpsuit"
|
||||
|
||||
@@ -8,6 +8,16 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 80, "acid" = 40)
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/rank/chief_engineer/skirt
|
||||
name = "chief engineer's jumpskirt"
|
||||
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief Engineer\". It has minor radiation shielding."
|
||||
icon_state = "chief_skirt"
|
||||
item_state = "gy_suit"
|
||||
item_color = "chief_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/atmospheric_technician
|
||||
desc = "It's a jumpsuit worn by atmospheric technicians."
|
||||
name = "atmospheric technician's jumpsuit"
|
||||
@@ -16,6 +26,16 @@
|
||||
item_color = "atmos"
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/rank/atmospheric_technician/skirt
|
||||
name = "atmospheric technician's jumpskirt"
|
||||
desc = "It's a jumpskirt worn by atmospheric technicians."
|
||||
icon_state = "atmos_skirt"
|
||||
item_state = "atmos_suit"
|
||||
item_color = "atmos_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/engineer
|
||||
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
|
||||
name = "engineer's jumpsuit"
|
||||
@@ -24,6 +44,23 @@
|
||||
item_color = "engine"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20)
|
||||
resistance_flags = NONE
|
||||
/obj/item/clothing/under/rank/engineer/hazard
|
||||
name = "engineer's hazard jumpsuit"
|
||||
desc = "A high visibility jumpsuit made from heat and radiation resistant materials."
|
||||
icon_state = "hazard"
|
||||
item_state = "suit-orange"
|
||||
item_color = "hazard"
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/engineer/skirt
|
||||
name = "engineer's jumpskirt"
|
||||
desc = "It's an orange high visibility jumpskirt worn by engineers."
|
||||
icon_state = "engine_skirt"
|
||||
item_state = "engi_suit"
|
||||
item_color = "engine_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/roboticist
|
||||
desc = "It's a slimming black with reinforced seams; great for industrial work."
|
||||
@@ -31,4 +68,14 @@
|
||||
icon_state = "robotics"
|
||||
item_state = "robotics"
|
||||
item_color = "robotics"
|
||||
resistance_flags = NONE
|
||||
resistance_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/rank/roboticist/skirt
|
||||
name = "roboticist's jumpskirt"
|
||||
desc = "It's a slimming black with reinforced seams; great for industrial work."
|
||||
icon_state = "robotics_skirt"
|
||||
item_state = "robotics"
|
||||
item_color = "robotics_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35)
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/research_director/skirt
|
||||
name = "research director's vest suitskirt"
|
||||
desc = "It's a suitskirt worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants."
|
||||
icon_state = "director_skirt"
|
||||
item_state = "lb_suit"
|
||||
item_color = "director_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/research_director/alt
|
||||
desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
|
||||
name = "research director's tan suit"
|
||||
@@ -20,6 +30,16 @@
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/research_director/alt/skirt
|
||||
name = "research director's tan suitskirt"
|
||||
desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
|
||||
icon_state = "rdwhimsy_skirt"
|
||||
item_state = "rdwhimsy"
|
||||
item_color = "rdwhimsy_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/research_director/turtleneck
|
||||
desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style."
|
||||
name = "research director's turtleneck"
|
||||
@@ -30,6 +50,16 @@
|
||||
can_adjust = TRUE
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/research_director/turtleneck/skirt
|
||||
name = "research director's turtleneck skirt"
|
||||
desc = "A dark purple turtleneck and tan khaki skirt, for a director with a superior sense of style."
|
||||
icon_state = "rdturtle_skirt"
|
||||
item_state = "p_suit"
|
||||
item_color = "rdturtle_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/scientist
|
||||
desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist."
|
||||
name = "scientist's jumpsuit"
|
||||
@@ -39,6 +69,15 @@
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/scientist/skirt
|
||||
name = "scientist's jumpskirt"
|
||||
desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist."
|
||||
icon_state = "toxinswhite_skirt"
|
||||
item_state = "w_suit"
|
||||
item_color = "toxinswhite_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/chemist
|
||||
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
|
||||
@@ -49,6 +88,16 @@
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 65)
|
||||
|
||||
/obj/item/clothing/under/rank/chemist/skirt
|
||||
name = "chemist's jumpskirt"
|
||||
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
|
||||
icon_state = "chemistrywhite_skirt"
|
||||
item_state = "w_suit"
|
||||
item_color = "chemistrywhite_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/*
|
||||
* Medical
|
||||
*/
|
||||
@@ -61,6 +110,16 @@
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/chief_medical_officer/skirt
|
||||
name = "chief medical officer's jumpskirt"
|
||||
desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
|
||||
icon_state = "cmo_skirt"
|
||||
item_state = "w_suit"
|
||||
item_color = "cmo_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/geneticist
|
||||
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
|
||||
name = "geneticist's jumpsuit"
|
||||
@@ -70,6 +129,16 @@
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/geneticist/skirt
|
||||
name = "geneticist's jumpskirt"
|
||||
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
|
||||
icon_state = "geneticswhite_skirt"
|
||||
item_state = "w_suit"
|
||||
item_color = "geneticswhite_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/virologist
|
||||
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
|
||||
name = "virologist's jumpsuit"
|
||||
@@ -79,6 +148,16 @@
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/virologist/skirt
|
||||
name = "virologist's jumpskirt"
|
||||
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
|
||||
icon_state = "virologywhite_skirt"
|
||||
item_state = "w_suit"
|
||||
item_color = "virologywhite_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/nursesuit
|
||||
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
|
||||
name = "nurse's suit"
|
||||
@@ -90,7 +169,6 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/medical
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
|
||||
name = "medical doctor's jumpsuit"
|
||||
@@ -99,24 +177,31 @@
|
||||
item_color = "medical"
|
||||
permeability_coefficient = 0.5
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical/blue
|
||||
name = "medical scrubs"
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
|
||||
icon_state = "scrubsblue"
|
||||
item_color = "scrubsblue"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/medical/green
|
||||
name = "medical scrubs"
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green."
|
||||
icon_state = "scrubsgreen"
|
||||
item_color = "scrubsgreen"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/medical/purple
|
||||
name = "medical scrubs"
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
|
||||
icon_state = "scrubspurple"
|
||||
item_color = "scrubspurple"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/medical/skirt
|
||||
name = "medical doctor's jumpskirt"
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
|
||||
icon_state = "medical_skirt"
|
||||
item_state = "w_suit"
|
||||
item_color = "medical_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
@@ -4,11 +4,9 @@
|
||||
* Detective
|
||||
* Navy uniforms
|
||||
*/
|
||||
|
||||
/*
|
||||
* Security
|
||||
*/
|
||||
|
||||
/obj/item/clothing/under/rank/security
|
||||
name = "security jumpsuit"
|
||||
desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle."
|
||||
@@ -20,14 +18,12 @@
|
||||
alt_covers_chest = TRUE
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/security/grey
|
||||
name = "grey security jumpsuit"
|
||||
desc = "A tactical relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood."
|
||||
icon_state = "security"
|
||||
item_state = "gy_suit"
|
||||
item_color = "security"
|
||||
|
||||
/obj/item/clothing/under/rank/security/skirt
|
||||
name = "security jumpskirt"
|
||||
desc = "A \"tactical\" security jumpsuit with the legs replaced by a skirt."
|
||||
@@ -36,6 +32,7 @@
|
||||
item_color = "secskirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE //you know now that i think of it if you adjust the skirt and the sprite disappears isn't that just like flashing everyone
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/warden
|
||||
@@ -49,7 +46,6 @@
|
||||
alt_covers_chest = TRUE
|
||||
sensor_mode = 3
|
||||
random_sensor = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/warden/grey
|
||||
name = "grey security suit"
|
||||
desc = "A formal relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood."
|
||||
@@ -57,6 +53,16 @@
|
||||
item_state = "gy_suit"
|
||||
item_color = "warden"
|
||||
|
||||
/obj/item/clothing/under/rank/warden/skirt
|
||||
name = "warden's suitskirt"
|
||||
desc = "A formal security suitskirt for officers complete with Nanotrasen belt buckle."
|
||||
icon_state = "rwarden_skirt"
|
||||
item_state = "r_suit"
|
||||
item_color = "rwarden_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/*
|
||||
* Detective
|
||||
*/
|
||||
@@ -72,6 +78,16 @@
|
||||
sensor_mode = 3
|
||||
random_sensor = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/det/skirt
|
||||
name = "detective's suitskirt"
|
||||
desc = "Someone who wears this means business."
|
||||
icon_state = "detective_skirt"
|
||||
item_state = "det"
|
||||
item_color = "detective_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/det/grey
|
||||
name = "noir suit"
|
||||
desc = "A hard-boiled private investigator's grey suit, complete with tie clip."
|
||||
@@ -80,6 +96,16 @@
|
||||
item_color = "greydet"
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/det/grey/skirt
|
||||
name = "noir suitskirt"
|
||||
desc = "A hard-boiled private investigator's grey suitskirt, complete with tie clip."
|
||||
icon_state = "greydet_skirt"
|
||||
item_state = "greydet"
|
||||
item_color = "greydet_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/*
|
||||
* Head of Security
|
||||
*/
|
||||
@@ -95,13 +121,22 @@
|
||||
sensor_mode = 3
|
||||
random_sensor = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_security/skirt
|
||||
name = "head of security's jumpskirt"
|
||||
desc = "A security jumpskirt decorated for those few with the dedication to achieve the position of Head of Security."
|
||||
icon_state = "rhos_skirt"
|
||||
item_state = "r_suit"
|
||||
item_color = "rhos_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_security/grey
|
||||
name = "head of security's grey jumpsuit"
|
||||
desc = "There are old men, and there are bold men, but there are very few old, bold men."
|
||||
icon_state = "hos"
|
||||
item_state = "gy_suit"
|
||||
item_color = "hos"
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_security/alt
|
||||
name = "head of security's turtleneck"
|
||||
desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants."
|
||||
@@ -109,10 +144,19 @@
|
||||
item_state = "bl_suit"
|
||||
item_color = "hosalt"
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_security/alt/skirt
|
||||
name = "head of security's turtleneck skirt"
|
||||
desc = "A stylish alternative to the normal head of security jumpsuit, complete with a tactical skirt."
|
||||
icon_state = "hosalt_skirt"
|
||||
item_state = "bl_suit"
|
||||
item_color = "hosalt_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/*
|
||||
* Navy uniforms
|
||||
*/
|
||||
|
||||
/obj/item/clothing/under/rank/security/navyblue
|
||||
name = "security officer's formal uniform"
|
||||
desc = "The latest in fashionable security outfits."
|
||||
@@ -120,7 +164,6 @@
|
||||
item_state = "officerblueclothes"
|
||||
item_color = "officerblueclothes"
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_security/navyblue
|
||||
desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security."
|
||||
name = "head of security's formal uniform"
|
||||
@@ -128,7 +171,6 @@
|
||||
item_state = "hosblueclothes"
|
||||
item_color = "hosblueclothes"
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/obj/item/clothing/under/rank/warden/navyblue
|
||||
desc = "The insignia on this uniform tells you that this uniform belongs to the Warden."
|
||||
name = "warden's formal uniform"
|
||||
@@ -136,11 +178,9 @@
|
||||
item_state = "wardenblueclothes"
|
||||
item_color = "wardenblueclothes"
|
||||
alt_covers_chest = TRUE
|
||||
|
||||
/*
|
||||
*Blueshirt
|
||||
*/
|
||||
|
||||
/obj/item/clothing/under/rank/security/blueshirt
|
||||
name = "blue shirt and tie"
|
||||
desc = "I'm a little busy right now, Calhoun."
|
||||
@@ -148,3 +188,13 @@
|
||||
item_state = "blueshift"
|
||||
item_color = "blueshift"
|
||||
can_adjust = FALSE
|
||||
/*
|
||||
*Spacepol
|
||||
*/
|
||||
/obj/item/clothing/under/rank/security/spacepol
|
||||
name = "police uniform"
|
||||
desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol."
|
||||
icon_state = "spacepol"
|
||||
item_state = "spacepol"
|
||||
item_color = "spacepol"
|
||||
can_adjust = FALSE
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user