Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into gen-poppers
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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -161,11 +161,13 @@
|
||||
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)
|
||||
. = ..()
|
||||
|
||||
@@ -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")
|
||||
@@ -42,9 +45,9 @@
|
||||
|
||||
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)
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
. = ..()
|
||||
|
||||
/datum/clockwork_scripture/abscond/scripture_effects()
|
||||
var/mob/living/pulled_mob = 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)
|
||||
|
||||
+4
-6
@@ -131,12 +131,10 @@
|
||||
if(!M || !M.current)
|
||||
continue
|
||||
if(isliving(M.current) && M.current.stat != DEAD)
|
||||
var/turf/t_turf
|
||||
if(isAI(M.current))
|
||||
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, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE)
|
||||
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
|
||||
|
||||
@@ -655,15 +655,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()
|
||||
@@ -698,7 +698,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)
|
||||
@@ -799,4 +799,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)
|
||||
|
||||
@@ -105,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
|
||||
|
||||
@@ -188,7 +188,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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -286,14 +286,14 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
/obj/effect/rune/convert/proc/optinalert(mob/living/convertee)
|
||||
var/alert = alert(convertee, "Will you embrace the Geometer of Blood or perish in futile resistance?", "Choose your own fate", "Join the Blood Cult", "Suffer a horrible demise")
|
||||
if(alert == "Join the Blood Cult")
|
||||
if(src && alert == "Join the Blood Cult")
|
||||
signmeup(convertee)
|
||||
|
||||
/obj/effect/rune/convert/proc/signmeup(mob/living/convertee)
|
||||
if(currentconversionman == usr)
|
||||
if(currentconversionman == convertee)
|
||||
conversionresult = TRUE
|
||||
else
|
||||
to_chat(usr, "<span class='cult italic'>Your fate has already been set in stone.</span>")
|
||||
to_chat(convertee, "<span class='cult italic'>Your fate has already been set in stone.</span>")
|
||||
|
||||
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac)
|
||||
var/mob/living/first_invoker = invokers[1]
|
||||
@@ -433,12 +433,12 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
continue
|
||||
if(!A.anchored)
|
||||
movedsomething = TRUE
|
||||
if(do_teleport(A, T, forceMove = TRUE, channel = TELEPORT_CHANNEL_CULT))
|
||||
if(do_teleport(A, target, forceMove = TRUE, channel = TELEPORT_CHANNEL_CULT))
|
||||
movesuccess = TRUE
|
||||
if(movedsomething)
|
||||
..()
|
||||
if(moveuserlater)
|
||||
if(do_teleport(user, T, channel = TELEPORT_CHANNEL_CULT))
|
||||
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>")
|
||||
|
||||
@@ -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)
|
||||
@@ -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,11 +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))
|
||||
|
||||
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
|
||||
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -405,8 +405,12 @@
|
||||
var/breakout = 0
|
||||
while(breakout < 50)
|
||||
if(!T)
|
||||
break
|
||||
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)
|
||||
do_teleport(user, potential_T, channel = TELEPORT_CHANNEL_MAGIC)
|
||||
user.canmove = 0
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -364,15 +364,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])
|
||||
@@ -381,7 +376,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()
|
||||
@@ -477,4 +472,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
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -1699,7 +1699,7 @@
|
||||
/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,
|
||||
@@ -1707,9 +1707,20 @@
|
||||
/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!"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -72,11 +72,11 @@ 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
|
||||
@@ -144,6 +144,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",
|
||||
@@ -680,13 +681,13 @@ 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>"
|
||||
@@ -743,6 +744,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>"
|
||||
@@ -796,6 +798,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>"
|
||||
@@ -916,11 +919,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'"
|
||||
@@ -1533,7 +1534,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 = sanitize_hexcolor(n_undie_color, include_crunch= TRUE)
|
||||
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
|
||||
@@ -1543,7 +1544,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 = sanitize_hexcolor(n_shirt_color, include_crunch= TRUE)
|
||||
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
|
||||
@@ -1553,7 +1554,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 = sanitize_hexcolor(n_socks_color, include_crunch= TRUE)
|
||||
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
|
||||
@@ -2037,6 +2038,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)
|
||||
@@ -2053,6 +2056,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)
|
||||
@@ -2236,7 +2243,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))
|
||||
|
||||
@@ -117,6 +117,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 +212,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
|
||||
|
||||
@@ -347,6 +349,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"]
|
||||
@@ -396,11 +399,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
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))
|
||||
undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color))
|
||||
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
|
||||
shirt_color = sanitize_hexcolor(shirt_color, 6, 1, initial(shirt_color))
|
||||
shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color))
|
||||
socks = sanitize_inlist(socks, GLOB.socks_list)
|
||||
socks_color = sanitize_hexcolor(socks_color, 6, 1, initial(socks_color))
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -279,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
|
||||
|
||||
@@ -312,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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -313,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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -219,17 +219,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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -238,3 +238,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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -167,16 +167,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."
|
||||
@@ -468,13 +458,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
|
||||
|
||||
@@ -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")
|
||||
@@ -703,14 +703,6 @@
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = FALSE
|
||||
resistance_flags = NONE
|
||||
/obj/item/clothing/under/durathread
|
||||
name = "durathread jumpsuit"
|
||||
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
|
||||
icon_state = "durathread"
|
||||
item_state = "durathread"
|
||||
item_color = "durathread"
|
||||
can_adjust = FALSE
|
||||
armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
|
||||
|
||||
/obj/item/clothing/under/gear_harness
|
||||
name = "gear harness"
|
||||
@@ -718,3 +710,22 @@
|
||||
icon_state = "gear_harness"
|
||||
item_state = "gear_harness" //We dont use golem do to being a item, item without faces making it default to error suit sprites.
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/under/durathread
|
||||
name = "durathread jumpsuit"
|
||||
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
|
||||
icon_state = "durathread"
|
||||
item_state = "durathread"
|
||||
item_color = "durathread"
|
||||
can_adjust = TRUE
|
||||
armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
|
||||
|
||||
/obj/item/clothing/under/duraskirt
|
||||
name = "durathread jumpskirt"
|
||||
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer. Being a short skirt, it naturally doesn't protect the legs."
|
||||
icon_state = "duraskirt"
|
||||
item_state = "duraskirt"
|
||||
item_color = "durathread"
|
||||
can_adjust = FALSE
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
|
||||
@@ -359,6 +359,7 @@
|
||||
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
|
||||
/obj/item/shard = 1,
|
||||
/obj/item/stack/rods = 1)
|
||||
parts = list(/obj/item/shard = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
@@ -675,12 +676,12 @@
|
||||
/datum/crafting_recipe/femur_breaker
|
||||
name = "Femur Breaker"
|
||||
result = /obj/structure/femur_breaker
|
||||
time = 150
|
||||
time = 150
|
||||
reqs = list(/obj/item/stack/sheet/metal = 20,
|
||||
/obj/item/stack/cable_coil = 30)
|
||||
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
|
||||
category = CAT_MISC
|
||||
|
||||
|
||||
/datum/crafting_recipe/lizardhat
|
||||
name = "Lizard Cloche Hat"
|
||||
result = /obj/item/clothing/head/lizard
|
||||
@@ -895,3 +896,44 @@
|
||||
time = 150 //It's a gun
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/durathread_duffelbag
|
||||
name = "Durathread Dufflebag"
|
||||
result = /obj/item/storage/backpack/duffelbag/durathread
|
||||
reqs = list(/obj/item/stack/sheet/durathread = 7,
|
||||
/obj/item/stack/sheet/leather = 3)
|
||||
time = 70
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/durathread_toolbelt
|
||||
name = "Durathread Toolbelt"
|
||||
result = /obj/item/storage/belt/durathread
|
||||
reqs = list(/obj/item/stack/sheet/durathread = 5,
|
||||
/obj/item/stack/sheet/leather = 1)
|
||||
time = 30
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/durathread_bandolier
|
||||
name = "Durathread Bandolier"
|
||||
result = /obj/item/storage/belt/bandolier/durathread
|
||||
reqs = list(/obj/item/stack/sheet/durathread = 6,
|
||||
/obj/item/stack/sheet/leather = 2)
|
||||
time = 50
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/durathread_helmet
|
||||
name = "Makeshift Durathread Helmet"
|
||||
result = /obj/item/clothing/head/helmet/durathread
|
||||
reqs = list(/obj/item/stack/sheet/durathread = 4,
|
||||
/obj/item/stack/sheet/leather = 2)
|
||||
time = 30
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/durathread_vest
|
||||
name = "Makeshift Durathread Armour"
|
||||
result = /obj/item/clothing/suit/armor/vest/durathread
|
||||
reqs = list(/obj/item/stack/sheet/durathread = 6,
|
||||
/obj/item/stack/sheet/leather = 3)
|
||||
time = 50
|
||||
category = CAT_CLOTHING
|
||||
|
||||
|
||||
@@ -41,11 +41,16 @@
|
||||
else
|
||||
L.mind.add_antag_datum(/datum/antagonist/heartbreaker)
|
||||
|
||||
/proc/forge_valentines_objective(mob/living/lover,mob/living/date)
|
||||
/proc/forge_valentines_objective(mob/living/lover,mob/living/date,var/chemLove = FALSE)
|
||||
lover.mind.special_role = "valentine"
|
||||
var/datum/antagonist/valentine/V = new
|
||||
V.date = date.mind
|
||||
lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now
|
||||
if (chemLove == TRUE)
|
||||
var/datum/antagonist/valentine/chem/V = new //Changes text and EOG check basically.
|
||||
V.date = date.mind
|
||||
lover.mind.add_antag_datum(V)
|
||||
else
|
||||
var/datum/antagonist/valentine/V = new
|
||||
V.date = date.mind
|
||||
lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now
|
||||
|
||||
/datum/round_event/valentines/announce(fake)
|
||||
priority_announce("It's Valentine's Day! Give a valentine to that special someone!")
|
||||
|
||||
@@ -15,6 +15,12 @@
|
||||
var/list/wave_type
|
||||
var/wave_name = "normal"
|
||||
|
||||
/datum/round_event/meteor_wave/setup()
|
||||
announceWhen = 1
|
||||
startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
|
||||
endWhen = startWhen + 60
|
||||
|
||||
|
||||
/datum/round_event/meteor_wave/New()
|
||||
..()
|
||||
if(!wave_type)
|
||||
@@ -46,7 +52,7 @@
|
||||
kill()
|
||||
|
||||
/datum/round_event/meteor_wave/announce(fake)
|
||||
priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg')
|
||||
priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg')
|
||||
|
||||
/datum/round_event/meteor_wave/tick()
|
||||
if(ISMULTIPLE(activeFor, 3))
|
||||
|
||||
@@ -573,4 +573,14 @@
|
||||
name = "Maintenance Peaches"
|
||||
desc = "I have a mouth and I must eat."
|
||||
icon_state = "peachcanmaint"
|
||||
tastes = list("peaches" = 1, "tin" = 7)
|
||||
tastes = list("peaches" = 1, "tin" = 7)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chocolatestrawberry
|
||||
name = "Chocolate dipped strawberries"
|
||||
desc = "A strawberry dipped in a bit of chocolate."
|
||||
icon_state = "chocolatestrawberry"
|
||||
list_reagents = list("sugar" = 5, "nutriment" = 2)
|
||||
filling_color = "#ffdf26"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
tastes = list("strawberries" = 5, "chocolate" = 3)
|
||||
foodtype = FRUIT | SUGAR
|
||||
@@ -308,7 +308,6 @@
|
||||
tastes = list("bread" = 1, "egg" = 1, "cheese" = 1)
|
||||
foodtype = GRAIN | MEAT | DAIRY
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sugarcookie
|
||||
name = "sugar cookie"
|
||||
desc = "Just like your little sister used to make."
|
||||
@@ -369,6 +368,16 @@
|
||||
tastes = list("cake" = 3, "blue cherry" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/strawberrycupcake
|
||||
name = "Strawberry cupcake"
|
||||
desc = "Strawberry inside a delicious cupcake."
|
||||
icon_state = "strawberrycupcake"
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
|
||||
list_reagents = list("nutriment" = 5, "vitamin" = 1)
|
||||
filling_color = "#F0E68C"
|
||||
tastes = list("cake" = 2, "strawberry" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/honeybun
|
||||
name = "honey bun"
|
||||
desc = "A sticky pastry bun glazed with honey."
|
||||
|
||||
@@ -315,4 +315,12 @@
|
||||
filling_color = "#1E90FF"
|
||||
list_reagents = list("nutriment" = 2, "vitamin" = 4)
|
||||
tastes = list("nuts" = 1, "pie" = 1)
|
||||
foodtype = GRAIN
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pie/strawberrypie
|
||||
name = "strawberry pie"
|
||||
desc = "A strawberry.pie."
|
||||
icon_state = "strawberrypie"
|
||||
bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
|
||||
tastes = list("strawberry" = 1, "pie" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
desc = "Nougat love it or hate it."
|
||||
icon_state = "candy"
|
||||
trash = /obj/item/trash/candy
|
||||
list_reagents = list("nutriment" = 1, "sugar" = 3)
|
||||
list_reagents = list("nutriment" = 1, "sugar" = 3, "cocoa" = 3)
|
||||
junkiness = 25
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("candy" = 1)
|
||||
|
||||
@@ -794,4 +794,11 @@
|
||||
name = "Red Queen"
|
||||
id = "red_queen"
|
||||
results = list("red_queen" = 10)
|
||||
required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1)
|
||||
required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1)
|
||||
|
||||
/datum/chemical_reaction/commander_and_chief
|
||||
name = "Commander and Chief"
|
||||
id = "commander_and_chief"
|
||||
results = list("commander_and_chief" = 50)
|
||||
required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctorsdelight" = 10, "quintuple_sec" = 10, "screwdrivercocktail" = 10)
|
||||
mix_message = "When your powers combine, I am Captain Pl-..."
|
||||
|
||||
@@ -332,3 +332,12 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/riceball
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/chocolatestrawberry
|
||||
name = "Chocolate Strawberry"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebar = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/chocolatestrawberry
|
||||
subcategory = CAT_MISCFOOD
|
||||
@@ -23,7 +23,7 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/donut
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/donut
|
||||
/datum/crafting_recipe/food/donut/semen
|
||||
time = 15
|
||||
name = "Semen donut"
|
||||
reqs = list(
|
||||
@@ -325,6 +325,15 @@ datum/crafting_recipe/food/donut/meat
|
||||
result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/strawberrycupcake
|
||||
name = "Strawberry cherry cupcake"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/strawberrycupcake
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/honeybun
|
||||
name = "Honey bun"
|
||||
reqs = list(
|
||||
|
||||
@@ -160,6 +160,15 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/pie/frostypie
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/strawberrypie
|
||||
name = "Strawberry pie"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/pie/strawberrypie
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/baklava
|
||||
name = "Baklava pie"
|
||||
reqs = list(
|
||||
|
||||
@@ -404,6 +404,31 @@ h1.alert, h2.alert {color: #99aab5;}
|
||||
.redtext {color: #c51e1e; font-size: 24px;}
|
||||
.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
|
||||
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
|
||||
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
|
||||
@keyframes velvet {
|
||||
0% { color: #400020; }
|
||||
40% { color: #FF0000; }
|
||||
50% { color: #FF8888; }
|
||||
60% { color: #FF0000; }
|
||||
100% { color: #400020; }
|
||||
}
|
||||
|
||||
.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;}
|
||||
@keyframes hypnocolor {
|
||||
0% { color: #202020; }
|
||||
25% { color: #4b02ac; }
|
||||
50% { color: #9f41f1; }
|
||||
75% { color: #541c9c; }
|
||||
100% { color: #7adbf3; }
|
||||
}
|
||||
|
||||
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
|
||||
@keyframes phobia {
|
||||
0% { color: #f75a5a; }
|
||||
50% { color: #dd0000; }
|
||||
100% { color: #f75a5a; }
|
||||
}
|
||||
|
||||
|
||||
.icon {height: 1em; width: auto;}
|
||||
|
||||
|
||||
@@ -149,6 +149,7 @@
|
||||
active_power_usage = 50 + spawned.len * 3 + effects.len * 5
|
||||
|
||||
/obj/machinery/computer/holodeck/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(!LAZYLEN(emag_programs))
|
||||
@@ -160,6 +161,7 @@
|
||||
to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.")
|
||||
log_game("[key_name(user)] emagged the Holodeck Control Console")
|
||||
nerf(!(obj_flags & EMAGGED))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/holodeck/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -78,6 +78,12 @@
|
||||
// these vars are not really standardized but all would theoretically create stuff on death
|
||||
for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & mob.vars)
|
||||
mob.vars[v] = null
|
||||
ENABLE_BITFIELD(mob.flags_1, HOLOGRAM_1)
|
||||
if(isliving(mob))
|
||||
var/mob/living/L = mob
|
||||
L.feeding = FALSE
|
||||
L.devourable = FALSE
|
||||
L.digestable = FALSE
|
||||
return mob
|
||||
|
||||
/obj/effect/holodeck_effect/mobspawner/deactivate(var/obj/machinery/computer/holodeck/HC)
|
||||
@@ -100,7 +106,7 @@
|
||||
|
||||
/obj/effect/holodeck_effect/mobspawner/penguin
|
||||
mobtype = /mob/living/simple_animal/pet/penguin/emperor
|
||||
|
||||
|
||||
/obj/effect/holodeck_effect/mobspawner/penguin/Initialize()
|
||||
if(prob(1))
|
||||
mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero
|
||||
|
||||
@@ -69,6 +69,8 @@
|
||||
if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I))
|
||||
update_icon()
|
||||
return
|
||||
else if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
if(default_deconstruction_crowbar(I))
|
||||
return
|
||||
if(iscyborg(user))
|
||||
|
||||
@@ -215,3 +215,26 @@
|
||||
filling_color = "#7FFF00"
|
||||
tastes = list("green grape" = 1)
|
||||
distill_reagent = "cognac"
|
||||
|
||||
// Strawberry
|
||||
/obj/item/seeds/strawberry
|
||||
name = "pack of strawberry seeds"
|
||||
desc = "These seeds grow into strawberry vines."
|
||||
icon_state = "seed-strawberry"
|
||||
species = "strawberry"
|
||||
plantname = "Strawberry Vine"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/strawberry
|
||||
growthstages = 6
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "strawberry-grow"
|
||||
icon_dead = "berry-dead"
|
||||
reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.2)
|
||||
mutatelist = list()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry
|
||||
seed = /obj/item/seeds/strawberry
|
||||
name = "strawberry"
|
||||
icon_state = "strawberry"
|
||||
filling_color = "#7FFF00"
|
||||
tastes = list("strawberries" = 1)
|
||||
wine_power = 20
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/obj/item/seeds/cotton
|
||||
name = "pack of cotton seeds"
|
||||
desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
|
||||
icon_state = "seed-cotton"
|
||||
species = "cotton"
|
||||
plantname = "Cotton"
|
||||
icon_harvest = "cotton-harvest"
|
||||
product = /obj/item/grown/cotton
|
||||
lifespan = 35
|
||||
endurance = 25
|
||||
maturation = 15
|
||||
production = 1
|
||||
yield = 2
|
||||
potency = 50
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing.dmi'
|
||||
icon_dead = "cotton-dead"
|
||||
mutatelist = list(/obj/item/seeds/cotton/durathread)
|
||||
|
||||
/obj/item/grown/cotton
|
||||
seed = /obj/item/seeds/cotton
|
||||
name = "cotton bundle"
|
||||
desc = "A fluffy bundle of cotton."
|
||||
icon_state = "cotton"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
attack_verb = list("pomfed")
|
||||
var/cotton_type = /obj/item/stack/sheet/cotton
|
||||
var/cotton_name = "raw cotton"
|
||||
|
||||
/obj/item/grown/cotton/attack_self(mob/user)
|
||||
user.show_message("<span class='notice'>You pull some [cotton_name] out of the [name]!</span>", 1)
|
||||
var/seed_modifier = 0
|
||||
if(seed)
|
||||
seed_modifier = round(seed.potency / 25)
|
||||
var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
|
||||
var/old_cotton_amount = cotton.amount
|
||||
for(var/obj/item/stack/ST in user.loc)
|
||||
if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
|
||||
ST.attackby(cotton, user)
|
||||
if(cotton.amount > old_cotton_amount)
|
||||
to_chat(user, "<span class='notice'>You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].</span>")
|
||||
qdel(src)
|
||||
|
||||
//reinforced mutated variant
|
||||
/obj/item/seeds/cotton/durathread
|
||||
name = "pack of durathread seeds"
|
||||
desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly."
|
||||
icon_state = "seed-durathread"
|
||||
species = "durathread"
|
||||
plantname = "Durathread"
|
||||
icon_harvest = "durathread-harvest"
|
||||
product = /obj/item/grown/cotton/durathread
|
||||
lifespan = 80
|
||||
endurance = 50
|
||||
maturation = 15
|
||||
production = 1
|
||||
yield = 2
|
||||
potency = 50
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing.dmi'
|
||||
icon_dead = "cotton-dead"
|
||||
|
||||
/obj/item/grown/cotton/durathread
|
||||
seed = /obj/item/seeds/cotton/durathread
|
||||
name = "durathread bundle"
|
||||
desc = "A tough bundle of durathread, good luck unraveling this."
|
||||
icon_state = "durathread"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
|
||||
cotton_type = /obj/item/stack/sheet/cotton/durathread
|
||||
cotton_name = "raw durathread"
|
||||
@@ -25,6 +25,7 @@
|
||||
slot_flags = ITEM_SLOT_HEAD
|
||||
filling_color = "#FF6347"
|
||||
bitesize_mod = 3
|
||||
tastes = list("sesame seeds" = 1)
|
||||
foodtype = VEGETABLES | GROSS
|
||||
distill_reagent = "vermouth"
|
||||
|
||||
@@ -43,6 +44,7 @@
|
||||
name = "lily"
|
||||
desc = "A beautiful orange flower."
|
||||
icon_state = "lily"
|
||||
tastes = list("pelts " = 1)
|
||||
filling_color = "#FFA500"
|
||||
|
||||
// Geranium
|
||||
@@ -61,6 +63,7 @@
|
||||
desc = "A beautiful blue flower."
|
||||
icon_state = "geranium"
|
||||
filling_color = "#008B8B"
|
||||
tastes = list("pelts " = 1)
|
||||
|
||||
// Harebell
|
||||
/obj/item/seeds/harebell
|
||||
@@ -86,6 +89,7 @@
|
||||
name = "harebell"
|
||||
desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten'd not thy breath.\""
|
||||
icon_state = "harebell"
|
||||
tastes = list("salt" = 1)
|
||||
slot_flags = ITEM_SLOT_HEAD
|
||||
filling_color = "#E6E6FA"
|
||||
bitesize_mod = 3
|
||||
@@ -123,6 +127,7 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
tastes = list("seeds" = 1)
|
||||
|
||||
/obj/item/grown/sunflower/attack(mob/M, mob/user)
|
||||
to_chat(M, "<font color='green'><b> [user] smacks you with a sunflower!</font><font color='yellow'><b>FLOWER POWER<b></font>")
|
||||
@@ -153,6 +158,7 @@
|
||||
filling_color = "#E6E6FA"
|
||||
bitesize_mod = 2
|
||||
distill_reagent = "absinthe" //It's made from flowers.
|
||||
tastes = list("glowbugs" = 1)
|
||||
|
||||
// Novaflower
|
||||
/obj/item/seeds/sunflower/novaflower
|
||||
@@ -184,6 +190,7 @@
|
||||
throw_range = 3
|
||||
attack_verb = list("roasted", "scorched", "burned")
|
||||
grind_results = list("capsaicin" = 0, "condensedcapsaicin" = 0)
|
||||
tastes = list("cooked sunflower" = 1)
|
||||
|
||||
/obj/item/grown/novaflower/add_juice()
|
||||
..()
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
// Peach
|
||||
/obj/item/seeds/peach
|
||||
name = "pack of peach seeds"
|
||||
desc = "These seeds grow into peach trees."
|
||||
icon_state = "seed-peach"
|
||||
species = "peach"
|
||||
plantname = "Peach Tree"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/peach
|
||||
lifespan = 65
|
||||
endurance = 40
|
||||
yield = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "peach-grow"
|
||||
icon_dead = "peach-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach
|
||||
seed = /obj/item/seeds/peach
|
||||
name = "peach"
|
||||
desc = "It's fuzzy!"
|
||||
icon_state = "peach"
|
||||
filling_color = "#FF4500"
|
||||
bitesize = 25
|
||||
foodtype = FRUIT
|
||||
juice_results = list("peachjuice" = 0)
|
||||
tastes = list("peach" = 1)
|
||||
@@ -14,6 +14,7 @@
|
||||
icon_dead = "tea-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
mutatelist = list(/obj/item/seeds/tea/astra)
|
||||
reagents_add = list("teapowder" = 0.1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/tea
|
||||
seed = /obj/item/seeds/tea
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
icon = 'icons/obj/hydroponics/harvest.dmi'
|
||||
resistance_flags = FLAMMABLE
|
||||
var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
|
||||
var/tastes = list("indescribable" = 1) //Stops runtimes. Grown are un-eatable anyways so if you do then its a bug
|
||||
|
||||
/obj/item/grown/Initialize(newloc, obj/item/seeds/new_seed)
|
||||
. = ..()
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
else if(ispath(build_type, /obj/item/integrated_circuit))
|
||||
var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type]
|
||||
cost = IC.materials[MAT_METAL]
|
||||
else if(!build_type in SScircuit.circuit_fabricator_recipe_list["Tools"])
|
||||
else if(!(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"]))
|
||||
return
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
|
||||
@@ -1,111 +1,116 @@
|
||||
/*
|
||||
Captain
|
||||
*/
|
||||
/datum/job/captain
|
||||
title = "Captain"
|
||||
flag = CAPTAIN
|
||||
department_head = list("CentCom")
|
||||
department_flag = ENGSEC
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "Nanotrasen officials and Space law"
|
||||
selection_color = "#ccccff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/captain
|
||||
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
|
||||
/datum/job/captain/get_access()
|
||||
return get_all_accesses()
|
||||
|
||||
/datum/job/captain/announce(mob/living/carbon/human/H)
|
||||
..()
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "Captain [H.nameless ? "" : "[H.real_name] "]on deck!"))
|
||||
|
||||
/datum/outfit/job/captain
|
||||
name = "Captain"
|
||||
jobtype = /datum/job/captain
|
||||
|
||||
id = /obj/item/card/id/gold
|
||||
belt = /obj/item/pda/captain
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
ears = /obj/item/radio/headset/heads/captain/alt
|
||||
gloves = /obj/item/clothing/gloves/color/captain
|
||||
uniform = /obj/item/clothing/under/rank/captain
|
||||
suit = /obj/item/clothing/suit/armor/vest/capcarapace
|
||||
shoes = /obj/item/clothing/shoes/sneakers/brown
|
||||
head = /obj/item/clothing/head/caphat
|
||||
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1)
|
||||
|
||||
backpack = /obj/item/storage/backpack/captain
|
||||
satchel = /obj/item/storage/backpack/satchel/cap
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/captain
|
||||
|
||||
implants = list(/obj/item/implant/mindshield)
|
||||
accessory = /obj/item/clothing/accessory/medal/gold/captain
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain)
|
||||
|
||||
/datum/outfit/job/captain/hardsuit
|
||||
name = "Captain (Hardsuit)"
|
||||
|
||||
mask = /obj/item/clothing/mask/gas/sechailer
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/captain
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
|
||||
/*
|
||||
Head of Personnel
|
||||
*/
|
||||
/datum/job/hop
|
||||
title = "Head of Personnel"
|
||||
flag = HOP
|
||||
department_head = list("Captain")
|
||||
department_flag = CIVILIAN
|
||||
head_announce = list(RADIO_CHANNEL_SERVICE)
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ddddff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_SUPPLY
|
||||
|
||||
outfit = /datum/outfit/job/hop
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
||||
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
||||
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
|
||||
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER,
|
||||
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
|
||||
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
||||
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
||||
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
|
||||
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER,
|
||||
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
|
||||
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
|
||||
/datum/outfit/job/hop
|
||||
name = "Head of Personnel"
|
||||
jobtype = /datum/job/hop
|
||||
|
||||
id = /obj/item/card/id/silver
|
||||
belt = /obj/item/pda/heads/hop
|
||||
ears = /obj/item/radio/headset/heads/hop
|
||||
uniform = /obj/item/clothing/under/rank/head_of_personnel
|
||||
shoes = /obj/item/clothing/shoes/sneakers/brown
|
||||
head = /obj/item/clothing/head/hopcap
|
||||
backpack_contents = list(/obj/item/storage/box/ids=1,\
|
||||
/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/hop)
|
||||
/*
|
||||
Captain
|
||||
*/
|
||||
/datum/job/captain
|
||||
title = "Captain"
|
||||
flag = CAPTAIN
|
||||
department_head = list("CentCom")
|
||||
department_flag = ENGSEC
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "Nanotrasen officials and Space law"
|
||||
selection_color = "#ccccff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/captain
|
||||
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
|
||||
mind_traits = list(TRAIT_CAPTAIN_METABOLISM)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
/datum/job/captain/get_access()
|
||||
return get_all_accesses()
|
||||
|
||||
/datum/job/captain/announce(mob/living/carbon/human/H)
|
||||
..()
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "Captain [H.nameless ? "" : "[H.real_name] "]on deck!"))
|
||||
|
||||
/datum/outfit/job/captain
|
||||
name = "Captain"
|
||||
jobtype = /datum/job/captain
|
||||
|
||||
id = /obj/item/card/id/gold
|
||||
belt = /obj/item/pda/captain
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
ears = /obj/item/radio/headset/heads/captain/alt
|
||||
gloves = /obj/item/clothing/gloves/color/captain
|
||||
uniform = /obj/item/clothing/under/rank/captain
|
||||
suit = /obj/item/clothing/suit/armor/vest/capcarapace
|
||||
shoes = /obj/item/clothing/shoes/sneakers/brown
|
||||
head = /obj/item/clothing/head/caphat
|
||||
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1)
|
||||
|
||||
backpack = /obj/item/storage/backpack/captain
|
||||
satchel = /obj/item/storage/backpack/satchel/cap
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/captain
|
||||
|
||||
implants = list(/obj/item/implant/mindshield)
|
||||
accessory = /obj/item/clothing/accessory/medal/gold/captain
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain)
|
||||
|
||||
/datum/outfit/job/captain/hardsuit
|
||||
name = "Captain (Hardsuit)"
|
||||
|
||||
mask = /obj/item/clothing/mask/gas/sechailer
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/captain
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
|
||||
/*
|
||||
Head of Personnel
|
||||
*/
|
||||
/datum/job/hop
|
||||
title = "Head of Personnel"
|
||||
flag = HOP
|
||||
department_head = list("Captain")
|
||||
department_flag = CIVILIAN
|
||||
head_announce = list(RADIO_CHANNEL_SERVICE)
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ddddff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_SUPPLY
|
||||
|
||||
outfit = /datum/outfit/job/hop
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
||||
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
||||
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
|
||||
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER,
|
||||
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
|
||||
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
||||
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
||||
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
|
||||
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER,
|
||||
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
|
||||
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity)
|
||||
|
||||
/datum/outfit/job/hop
|
||||
name = "Head of Personnel"
|
||||
jobtype = /datum/job/hop
|
||||
|
||||
id = /obj/item/card/id/silver
|
||||
belt = /obj/item/pda/heads/hop
|
||||
ears = /obj/item/radio/headset/heads/hop
|
||||
uniform = /obj/item/clothing/under/rank/head_of_personnel
|
||||
shoes = /obj/item/clothing/shoes/sneakers/brown
|
||||
head = /obj/item/clothing/head/hopcap
|
||||
backpack_contents = list(/obj/item/storage/box/ids=1,\
|
||||
/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/hop)
|
||||
|
||||
@@ -18,6 +18,8 @@ Quartermaster
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
|
||||
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
/datum/outfit/job/quartermaster
|
||||
name = "Quartermaster"
|
||||
jobtype = /datum/job/qm
|
||||
|
||||
@@ -29,6 +29,8 @@ Chief Engineer
|
||||
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
|
||||
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity)
|
||||
|
||||
/datum/outfit/job/ce
|
||||
name = "Chief Engineer"
|
||||
jobtype = /datum/job/chief_engineer
|
||||
|
||||
@@ -56,6 +56,8 @@
|
||||
|
||||
var/list/mind_traits // Traits added to the mind of the mob assigned this job
|
||||
|
||||
var/list/blacklisted_quirks //list of quirk typepaths blacklisted.
|
||||
|
||||
//Only override this proc
|
||||
//H is usually a human unless an /equip override transformed it
|
||||
/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE)
|
||||
|
||||
@@ -27,6 +27,8 @@ Chief Medical Officer
|
||||
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
|
||||
ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
/datum/outfit/job/cmo
|
||||
name = "Chief Medical Officer"
|
||||
jobtype = /datum/job/cmo
|
||||
@@ -127,6 +129,7 @@ Chemist
|
||||
backpack = /obj/item/storage/backpack/chemistry
|
||||
satchel = /obj/item/storage/backpack/satchel/chem
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/med
|
||||
l_hand = /obj/item/fermichem/pHbooklet
|
||||
|
||||
chameleon_extras = /obj/item/gun/syringe
|
||||
|
||||
|
||||
@@ -31,6 +31,8 @@ Research Director
|
||||
ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM,
|
||||
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
|
||||
/datum/outfit/job/rd
|
||||
name = "Research Director"
|
||||
jobtype = /datum/job/rd
|
||||
|
||||
@@ -37,6 +37,8 @@ Head of Security
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity)
|
||||
|
||||
/datum/outfit/job/hos
|
||||
name = "Head of Security"
|
||||
jobtype = /datum/job/hos
|
||||
@@ -95,6 +97,7 @@ Warden
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS()
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
|
||||
|
||||
/datum/job/warden/get_access()
|
||||
var/list/L = list()
|
||||
@@ -150,6 +153,7 @@ Detective
|
||||
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
|
||||
|
||||
/datum/outfit/job/detective
|
||||
name = "Detective"
|
||||
@@ -205,6 +209,7 @@ Security Officer
|
||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
|
||||
|
||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
|
||||
|
||||
/datum/job/officer/get_access()
|
||||
var/list/L = list()
|
||||
|
||||
@@ -4,7 +4,42 @@
|
||||
set instant = TRUE
|
||||
set hidden = TRUE
|
||||
|
||||
client_keysend_amount += 1
|
||||
|
||||
var/cache = client_keysend_amount
|
||||
|
||||
if(keysend_tripped && next_keysend_trip_reset <= world.time)
|
||||
keysend_tripped = FALSE
|
||||
|
||||
if(next_keysend_reset <= world.time)
|
||||
client_keysend_amount = 0
|
||||
next_keysend_reset = world.time + (1 SECONDS)
|
||||
|
||||
//The "tripped" system is to confirm that flooding is still happening after one spike
|
||||
//not entirely sure how byond commands interact in relation to lag
|
||||
//don't want to kick people if a lag spike results in a huge flood of commands being sent
|
||||
if(cache >= MAX_KEYPRESS_AUTOKICK)
|
||||
if(!keysend_tripped)
|
||||
keysend_tripped = TRUE
|
||||
next_keysend_trip_reset = world.time + (2 SECONDS)
|
||||
else
|
||||
log_admin("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
|
||||
message_admins("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
|
||||
QDEL_IN(src, 1)
|
||||
return
|
||||
|
||||
///Check if the key is short enough to even be a real key
|
||||
if(LAZYLEN(_key) > MAX_KEYPRESS_COMMANDLENGTH)
|
||||
to_chat(src, "<span class='userdanger'>Invalid KeyDown detected! You have been disconnected from the server automatically.</span>")
|
||||
log_admin("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
|
||||
message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
|
||||
QDEL_IN(src, 1)
|
||||
return
|
||||
//offset by 1 because the buffer address is 0 indexed because the math was simpler
|
||||
keys_held[current_key_address + 1] = _key
|
||||
//the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking
|
||||
keys_held[_key] = world.time
|
||||
current_key_address = ((current_key_address + 1) % HELD_KEY_BUFFER_LENGTH)
|
||||
var/movement = SSinput.movement_keys[_key]
|
||||
if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"])
|
||||
next_move_dir_add |= movement
|
||||
@@ -35,7 +70,11 @@
|
||||
set instant = TRUE
|
||||
set hidden = TRUE
|
||||
|
||||
keys_held -= _key
|
||||
//Can't just do a remove because it would alter the length of the rolling buffer, instead search for the key then null it out if it exists
|
||||
for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
|
||||
if(keys_held[i] == _key)
|
||||
keys_held[i] = null
|
||||
break
|
||||
var/movement = SSinput.movement_keys[_key]
|
||||
if(!(next_move_dir_add & movement))
|
||||
next_move_dir_sub |= movement
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
/client
|
||||
var/list/keys_held = list() // A list of any keys held currently
|
||||
// These next two vars are to apply movement for keypresses and releases made while move delayed.
|
||||
// Because discarding that input makes the game less responsive.
|
||||
var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done
|
||||
var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done
|
||||
/// A rolling buffer of any keys held currently
|
||||
var/list/keys_held = list()
|
||||
///used to keep track of the current rolling buffer position
|
||||
var/current_key_address = 0
|
||||
/// These next two vars are to apply movement for keypresses and releases made while move delayed.
|
||||
/// Because discarding that input makes the game less responsive.
|
||||
/// On next move, add this dir to the move that would otherwise be done
|
||||
var/next_move_dir_add
|
||||
/// On next move, subtract this dir from the move that would otherwise be done
|
||||
var/next_move_dir_sub
|
||||
|
||||
// Set a client's focus to an object and override these procs on that object to let it handle keypresses
|
||||
|
||||
@@ -31,6 +36,11 @@
|
||||
/client/proc/set_macros()
|
||||
set waitfor = FALSE
|
||||
|
||||
//Reset and populate the rolling buffer
|
||||
keys_held.Cut()
|
||||
for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
|
||||
keys_held += null
|
||||
|
||||
erase_all_macros()
|
||||
|
||||
var/list/macro_sets = SSinput.macro_sets
|
||||
|
||||
@@ -343,8 +343,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user)
|
||||
if(density && !(obj_flags & EMAGGED))
|
||||
obj_flags |= EMAGGED
|
||||
. = ..()
|
||||
if(!density || obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -214,8 +214,11 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/emag_act(mob/user)
|
||||
if(locked)
|
||||
boom(user)
|
||||
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
if(!locked)
|
||||
return
|
||||
boom(user)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/togglelock(mob/user)
|
||||
if(locked)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
name = "explorer gas mask"
|
||||
desc = "A military-grade gas mask that can be connected to an air supply."
|
||||
icon_state = "gas_mining"
|
||||
visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
|
||||
visor_flags_inv = HIDEFACIALHAIR
|
||||
visor_flags_cover = MASKCOVERSMOUTH
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
|
||||
@@ -10,12 +10,10 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
density = FALSE
|
||||
var/obj/machinery/mineral/stacking_machine/laborstacker/stacking_machine = null
|
||||
var/machinedir = SOUTH
|
||||
var/obj/item/card/id/prisoner/inserted_id
|
||||
var/obj/machinery/door/airlock/release_door
|
||||
var/door_tag = "prisonshuttle"
|
||||
var/obj/item/radio/Radio //needed to send messages to sec radio
|
||||
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/Initialize()
|
||||
. = ..()
|
||||
Radio = new/obj/item/radio(src)
|
||||
@@ -34,18 +32,6 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
/proc/cmp_sheet_list(list/a, list/b)
|
||||
return a["value"] - b["value"]
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/card/id/prisoner))
|
||||
if(!inserted_id)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
inserted_id = I
|
||||
to_chat(user, "<span class='notice'>You insert [I].</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's an ID inserted already.</span>")
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/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)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
@@ -58,14 +44,20 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
var/can_go_home = FALSE
|
||||
|
||||
data["emagged"] = (obj_flags & EMAGGED) ? 1 : 0
|
||||
if(inserted_id)
|
||||
data["id"] = inserted_id
|
||||
data["id_name"] = inserted_id.registered_name
|
||||
data["points"] = inserted_id.points
|
||||
data["goal"] = inserted_id.goal
|
||||
if(check_auth())
|
||||
if(obj_flags & EMAGGED)
|
||||
can_go_home = TRUE
|
||||
|
||||
data["status_info"] = "No Prisoner ID detected."
|
||||
var/obj/item/card/id/I = user.get_idcard(TRUE)
|
||||
if(istype(I, /obj/item/card/id/prisoner))
|
||||
var/obj/item/card/id/prisoner/P = I
|
||||
data["id_points"] = P.points
|
||||
if(P.points >= P.goal)
|
||||
can_go_home = TRUE
|
||||
data["status_info"] = "Goal met!"
|
||||
else
|
||||
data["status_info"] = "You are [(P.goal - P.points)] points away."
|
||||
|
||||
if(stacking_machine)
|
||||
data["unclaimed_points"] = stacking_machine.points
|
||||
|
||||
@@ -78,29 +70,19 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("handle_id")
|
||||
if(inserted_id)
|
||||
if(!usr.get_active_held_item())
|
||||
usr.put_in_hands(inserted_id)
|
||||
inserted_id = null
|
||||
else
|
||||
inserted_id.forceMove(get_turf(src))
|
||||
inserted_id = null
|
||||
else
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(istype(I, /obj/item/card/id/prisoner))
|
||||
if(!usr.transferItemToLoc(I, src))
|
||||
return
|
||||
inserted_id = I
|
||||
if("claim_points")
|
||||
inserted_id.points += stacking_machine.points
|
||||
stacking_machine.points = 0
|
||||
to_chat(usr, "Points transferred.")
|
||||
var/mob/M = usr
|
||||
var/obj/item/card/id/I = M.get_idcard(TRUE)
|
||||
if(istype(I, /obj/item/card/id/prisoner))
|
||||
var/obj/item/card/id/prisoner/P = I
|
||||
P.points += stacking_machine.points
|
||||
stacking_machine.points = 0
|
||||
to_chat(usr, "<span class='notice'>Points transferred.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>No valid id for point transfer detected.</span>")
|
||||
if("move_shuttle")
|
||||
if(!alone_in_area(get_area(src), usr))
|
||||
to_chat(usr, "<span class='warning'>Prisoners are only allowed to be released while alone.</span>")
|
||||
else if(!check_auth())
|
||||
to_chat(usr, "<span class='warning'>Prisoners are only allowed to be released when they reach their point goal.</span>")
|
||||
else
|
||||
switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE))
|
||||
if(1)
|
||||
@@ -112,14 +94,9 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
else
|
||||
if(!(obj_flags & EMAGGED))
|
||||
Radio.set_frequency(FREQ_SECURITY)
|
||||
Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY)
|
||||
Radio.talk_into(src, "A prisoner has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY)
|
||||
to_chat(usr, "<span class='notice'>Shuttle received message and will be sent shortly.</span>")
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/proc/check_auth()
|
||||
if(obj_flags & EMAGGED)
|
||||
return 1 //Shuttle is emagged, let any ol' person through
|
||||
return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota.
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine()
|
||||
stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir))
|
||||
if(stacking_machine)
|
||||
@@ -128,14 +105,15 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
|
||||
if(!(obj_flags & EMAGGED))
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
|
||||
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
|
||||
return TRUE
|
||||
|
||||
/**********************Prisoner Collection Unit**************************/
|
||||
|
||||
|
||||
/obj/machinery/mineral/stacking_machine/laborstacker
|
||||
force_connect = TRUE
|
||||
var/points = 0 //The unclaimed value of ore stacked.
|
||||
@@ -151,6 +129,7 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
return ..()
|
||||
|
||||
/**********************Point Lookup Console**************************/
|
||||
|
||||
/obj/machinery/mineral/labor_points_checker
|
||||
name = "points checking console"
|
||||
desc = "A console used by prisoners to check the progress on their quotas. Simply swipe a prisoner ID."
|
||||
|
||||
@@ -641,6 +641,8 @@
|
||||
nemesis_factions = list("mining", "boss")
|
||||
var/transform_cooldown
|
||||
var/swiping = FALSE
|
||||
total_mass = 2.75
|
||||
total_mass_on = 5
|
||||
|
||||
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
|
||||
..()
|
||||
@@ -785,30 +787,30 @@
|
||||
/obj/item/melee/ghost_sword/process()
|
||||
ghost_check()
|
||||
|
||||
/obj/item/melee/ghost_sword/proc/ghost_check()
|
||||
var/ghost_counter = 0
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/contents = T.GetAllContents()
|
||||
var/mob/dead/observer/current_spirits = list()
|
||||
for(var/thing in contents)
|
||||
var/atom/A = thing
|
||||
A.transfer_observers_to(src)
|
||||
|
||||
for(var/i in orbiters?.orbiters)
|
||||
if(!isobserver(i))
|
||||
/obj/item/melee/ghost_sword/proc/recursive_orbit_collect(atom/A, list/L)
|
||||
for(var/i in A.orbiters?.orbiters)
|
||||
if(!isobserver(i) || (i in L))
|
||||
continue
|
||||
L |= i
|
||||
recursive_orbit_collect(i, L)
|
||||
|
||||
/obj/item/melee/ghost_sword/proc/ghost_check()
|
||||
var/list/mob/dead/observer/current_spirits = list()
|
||||
|
||||
recursive_orbit_collect(src, current_spirits)
|
||||
recursive_orbit_collect(loc, current_spirits) //anything holding us
|
||||
|
||||
for(var/i in spirits - current_spirits)
|
||||
var/mob/dead/observer/G = i
|
||||
ghost_counter++
|
||||
G.invisibility = 0
|
||||
current_spirits |= G
|
||||
|
||||
for(var/mob/dead/observer/G in spirits - current_spirits)
|
||||
G.invisibility = GLOB.observer_default_invisibility
|
||||
|
||||
|
||||
for(var/i in current_spirits)
|
||||
var/mob/dead/observer/G = i
|
||||
G.invisibility = 0
|
||||
|
||||
spirits = current_spirits
|
||||
|
||||
return ghost_counter
|
||||
|
||||
return length(spirits)
|
||||
|
||||
/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
force = 0
|
||||
var/ghost_counter = ghost_check()
|
||||
@@ -1333,4 +1335,4 @@
|
||||
if(2)
|
||||
new /obj/item/wisp_lantern(src)
|
||||
if(3)
|
||||
new /obj/item/prisoncube(src)
|
||||
new /obj/item/prisoncube(src)
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
speed_process = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/ore_redemption
|
||||
layer = BELOW_OBJ_LAYER
|
||||
var/obj/item/card/id/inserted_id
|
||||
var/points = 0
|
||||
var/ore_pickup_rate = 15
|
||||
var/sheet_per_ore = 1
|
||||
@@ -48,18 +47,23 @@
|
||||
point_upgrade = point_upgrade_temp
|
||||
sheet_per_ore = sheet_per_ore_temp
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/examine(mob/user)
|
||||
. = ..()
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Smelting <b>[sheet_per_ore]</b> sheet(s) per piece of ore.<br>Ore pickup speed at <b>[ore_pickup_rate]</b>.</span>"
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O)
|
||||
var/datum/component/material_container/mat_container = materials.mat_container
|
||||
if (!mat_container)
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/stack/ore/bluespace_crystal/refined))
|
||||
if(O.refined_type == null)
|
||||
return
|
||||
|
||||
ore_buffer -= O
|
||||
|
||||
if(O && O.refined_type)
|
||||
points += O.points * point_upgrade * O.amount
|
||||
points += O.points * O.amount
|
||||
|
||||
var/material_amount = mat_container.get_item_material_amount(O)
|
||||
|
||||
@@ -72,11 +76,8 @@
|
||||
else
|
||||
var/mats = O.materials & mat_container.materials
|
||||
var/amount = O.amount
|
||||
var/id = inserted_id && inserted_id.registered_name
|
||||
if (id)
|
||||
id = " (ID: [id])"
|
||||
mat_container.insert_item(O, sheet_per_ore) //insert it
|
||||
materials.silo_log(src, "smelted", amount, "ores[id]", mats)
|
||||
materials.silo_log(src, "smelted", amount, "ores", mats)
|
||||
qdel(O)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
|
||||
@@ -168,15 +169,7 @@
|
||||
return
|
||||
|
||||
if(!powered())
|
||||
return
|
||||
if(istype(W, /obj/item/card/id))
|
||||
var/obj/item/card/id/I = user.get_active_held_item()
|
||||
if(istype(I) && !istype(inserted_id))
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
inserted_id = I
|
||||
interact(user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
if(istype(W, /obj/item/disk/design_disk))
|
||||
if(user.transferItemToLoc(W, src))
|
||||
@@ -205,9 +198,6 @@
|
||||
/obj/machinery/mineral/ore_redemption/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["unclaimedPoints"] = points
|
||||
if(inserted_id)
|
||||
data["hasID"] = TRUE
|
||||
data["claimedPoints"] = inserted_id.mining_points
|
||||
|
||||
data["materials"] = list()
|
||||
var/datum/component/material_container/mat_container = materials.mat_container
|
||||
@@ -245,32 +235,24 @@
|
||||
return
|
||||
var/datum/component/material_container/mat_container = materials.mat_container
|
||||
switch(action)
|
||||
if("Eject")
|
||||
if(!inserted_id)
|
||||
return
|
||||
usr.put_in_hands(inserted_id)
|
||||
inserted_id = null
|
||||
return TRUE
|
||||
if("Insert")
|
||||
var/obj/item/card/id/I = usr.get_active_held_item()
|
||||
if(istype(I))
|
||||
if(!usr.transferItemToLoc(I,src))
|
||||
return
|
||||
inserted_id = I
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Not a valid ID!</span>")
|
||||
return TRUE
|
||||
if("Claim")
|
||||
if(inserted_id)
|
||||
inserted_id.mining_points += points
|
||||
points = 0
|
||||
var/mob/M = usr
|
||||
var/obj/item/card/id/I = M.get_idcard(TRUE)
|
||||
if(points)
|
||||
if(I)
|
||||
I.mining_points += points
|
||||
points = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No ID detected.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No points to claim.</span>")
|
||||
return TRUE
|
||||
if("Release")
|
||||
if(!mat_container)
|
||||
return
|
||||
if(materials.on_hold())
|
||||
to_chat(usr, "<span class='warning'>Mineral access is on hold, please contact the quartermaster.</span>")
|
||||
else if(!check_access(inserted_id) && !allowed(usr)) //Check the ID inside, otherwise check the user
|
||||
else if(!allowed(usr)) //Check the ID inside, otherwise check the user
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
else
|
||||
var/mat_id = params["id"]
|
||||
@@ -293,6 +275,7 @@
|
||||
var/list/mats = list()
|
||||
mats[mat_id] = MINERAL_MATERIAL_AMOUNT
|
||||
materials.silo_log(src, "released", -count, "sheets", mats)
|
||||
//Logging deleted for quick coding
|
||||
return TRUE
|
||||
if("diskInsert")
|
||||
var/obj/item/disk/design_disk/disk = usr.get_active_held_item()
|
||||
@@ -321,7 +304,7 @@
|
||||
return
|
||||
var/alloy_id = params["id"]
|
||||
var/datum/design/alloy = stored_research.isDesignResearchedID(alloy_id)
|
||||
if((check_access(inserted_id) || allowed(usr)) && alloy)
|
||||
if((check_access(inserted_scan_id) || allowed(usr)) && alloy)
|
||||
var/smelt_amount = can_smelt_alloy(alloy)
|
||||
var/desired = 0
|
||||
if (params["sheets"])
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
|
||||
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
|
||||
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
|
||||
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
|
||||
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
|
||||
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
|
||||
new /datum/data/mining_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 450),
|
||||
@@ -28,11 +29,10 @@
|
||||
new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500),
|
||||
new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500),
|
||||
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
|
||||
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
|
||||
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 750),
|
||||
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
|
||||
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750),
|
||||
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
|
||||
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
|
||||
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 800),
|
||||
new /datum/data/mining_equipment("Burn First-Aid Kit", /obj/item/storage/firstaid/fire, 800),
|
||||
new /datum/data/mining_equipment("First-Aid Kit", /obj/item/storage/firstaid/regular, 800),
|
||||
@@ -54,7 +54,6 @@
|
||||
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
|
||||
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
|
||||
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
|
||||
new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000),
|
||||
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
|
||||
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
|
||||
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
|
||||
@@ -69,8 +68,8 @@
|
||||
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
|
||||
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
|
||||
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
|
||||
new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000),
|
||||
new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000)
|
||||
|
||||
)
|
||||
|
||||
/datum/data/mining_equipment
|
||||
@@ -95,60 +94,42 @@
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/ui_interact(mob/user)
|
||||
. = ..()
|
||||
var/dat
|
||||
dat +="<div class='statusDisplay'>"
|
||||
if(istype(inserted_id))
|
||||
dat += "You have [inserted_id.mining_points] mining points collected. <A href='?src=[REF(src)];choice=eject'>Eject ID.</A><br>"
|
||||
else
|
||||
dat += "No ID inserted. <A href='?src=[REF(src)];choice=insert'>Insert ID.</A><br>"
|
||||
dat += "</div>"
|
||||
var/list/dat = list()
|
||||
dat += "<br><b>Equipment point cost list:</b><BR><table border='0' width='300'>"
|
||||
for(var/datum/data/mining_equipment/prize in prize_list)
|
||||
dat += "<tr><td>[prize.equipment_name]</td><td>[prize.cost]</td><td><A href='?src=[REF(src)];purchase=[REF(prize)]'>Purchase</A></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350)
|
||||
popup.set_content(dat)
|
||||
popup.set_content(dat.Join())
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if(href_list["choice"])
|
||||
if(istype(inserted_id))
|
||||
if(href_list["choice"] == "eject")
|
||||
to_chat(usr, "<span class='notice'>You eject the ID from [src]'s card slot.</span>")
|
||||
inserted_id.forceMove(loc)
|
||||
inserted_id.verb_pickup()
|
||||
inserted_id = null
|
||||
else if(href_list["choice"] == "insert")
|
||||
var/obj/item/card/id/I = usr.get_active_held_item()
|
||||
if(istype(I))
|
||||
if(!usr.transferItemToLoc(I, src))
|
||||
return
|
||||
inserted_id = I
|
||||
to_chat(usr, "<span class='notice'>You insert the ID into [src]'s card slot.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Error: No valid ID!</span>")
|
||||
flick(icon_deny, src)
|
||||
if(href_list["purchase"])
|
||||
if(istype(inserted_id))
|
||||
var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
|
||||
var/mob/M = usr
|
||||
var/obj/item/card/id/I = M.get_idcard(TRUE)
|
||||
if(istype(I))
|
||||
var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) in prize_list
|
||||
if (!prize || !(prize in prize_list))
|
||||
to_chat(usr, "<span class='warning'>Error: Invalid choice!</span>")
|
||||
flick(icon_deny, src)
|
||||
return
|
||||
if(prize.cost > inserted_id.mining_points)
|
||||
to_chat(usr, "<span class='warning'>Error: Insufficient points for [prize.equipment_name]!</span>")
|
||||
if(prize.cost > I.mining_points)
|
||||
to_chat(usr, "<span class='warning'>Error: Insufficient credits for [prize.equipment_name] on [I]!</span>")
|
||||
flick(icon_deny, src)
|
||||
else
|
||||
inserted_id.mining_points -= prize.cost
|
||||
to_chat(usr, "<span class='notice'>[src] clanks to life briefly before vending [prize.equipment_name]!</span>")
|
||||
new prize.equipment_path(src.loc)
|
||||
SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]"))
|
||||
if (I.mining_points -= prize.cost)
|
||||
to_chat(usr, "<span class='notice'>[src] clanks to life briefly before vending [prize.equipment_name]!</span>")
|
||||
new prize.equipment_path(src.loc)
|
||||
SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]"))
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Error: Transaction failure, please try again later!</span>")
|
||||
flick(icon_deny, src)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Error: Please insert a valid ID!</span>")
|
||||
to_chat(usr, "<span class='warning'>Error: An ID with a registered account is required!</span>")
|
||||
flick(icon_deny, src)
|
||||
updateUsrDialog()
|
||||
return
|
||||
@@ -160,15 +141,6 @@
|
||||
if(istype(I, /obj/item/suit_voucher))
|
||||
RedeemSVoucher(I, user)
|
||||
return
|
||||
if(istype(I, /obj/item/card/id))
|
||||
var/obj/item/card/id/C = usr.get_active_held_item()
|
||||
if(istype(C) && !istype(inserted_id))
|
||||
if(!usr.transferItemToLoc(C, src))
|
||||
return
|
||||
inserted_id = C
|
||||
to_chat(usr, "<span class='notice'>You insert the ID into [src]'s card slot.</span>")
|
||||
interact(user)
|
||||
return
|
||||
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
|
||||
updateUsrDialog()
|
||||
return
|
||||
@@ -212,7 +184,6 @@
|
||||
if(prob(50 / severity) && severity < 3)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/****************Golem Point Vendor**************************/
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/golem
|
||||
@@ -228,7 +199,6 @@
|
||||
new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 300),
|
||||
new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350),
|
||||
new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
|
||||
new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/reagent_containers/glass/beaker/sulphuric, 500),
|
||||
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
|
||||
new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700),
|
||||
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
|
||||
@@ -323,8 +293,11 @@
|
||||
new /obj/item/encryptionkey/headset_cargo(src)
|
||||
new /obj/item/clothing/mask/gas/explorer(src)
|
||||
new /obj/item/card/mining_access_card(src)
|
||||
new /obj/item/gun/energy/kinetic_accelerator(src)
|
||||
new /obj/item/kitchen/knife/combat/survival(src)
|
||||
new /obj/item/flashlight/seclite(src)
|
||||
|
||||
//CITADEL ADDITIONS BELOW
|
||||
//CITADEL ADDITIONS BELOW
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/mining_cloned
|
||||
name = "mining replacement kit"
|
||||
@@ -336,6 +309,7 @@
|
||||
new /obj/item/clothing/shoes/workboots/mining(src)
|
||||
new /obj/item/clothing/gloves/color/black(src)
|
||||
new /obj/item/implanter/tracking/gps(src)
|
||||
new /obj/item/gun/energy/kinetic_accelerator(src)
|
||||
new /obj/item/kitchen/knife/combat/survival(src)
|
||||
new /obj/item/storage/firstaid/regular(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen/survival(src)
|
||||
|
||||
@@ -416,7 +416,7 @@
|
||||
SSticker.mode.make_antag_chance(humanc)
|
||||
|
||||
if(humanc && CONFIG_GET(flag/roundstart_traits))
|
||||
SSquirks.AssignQuirks(humanc, humanc.client, TRUE)
|
||||
SSquirks.AssignQuirks(humanc, humanc.client, TRUE, FALSE, job, FALSE)
|
||||
|
||||
log_manifest(character.mind.key,character.mind,character,latejoin = TRUE)
|
||||
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
/mob/living/carbon/monkey/handle_blood()
|
||||
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio))
|
||||
blood_volume += 0.1 // regenerate blood VERY slowly
|
||||
if(blood_volume < BLOOD_VOLUME_OKAY)
|
||||
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
|
||||
if(blood_volume < (BLOOD_VOLUME_OKAY * blood_ratio))
|
||||
adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/handle_blood()
|
||||
@@ -33,7 +33,7 @@
|
||||
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
var/nutrition_ratio = 0
|
||||
switch(nutrition)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
@@ -46,20 +46,22 @@
|
||||
nutrition_ratio = 0.8
|
||||
else
|
||||
nutrition_ratio = 1
|
||||
if(HAS_TRAIT(src, TRAIT_HIGH_BLOOD))
|
||||
nutrition_ratio *= 1.2
|
||||
if(satiety > 80)
|
||||
nutrition_ratio *= 1.25
|
||||
nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR)
|
||||
blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio)
|
||||
blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio)
|
||||
|
||||
//Effects of bloodloss
|
||||
var/word = pick("dizzy","woozy","faint")
|
||||
switch(blood_volume)
|
||||
switch(blood_volume * INVERSE(blood_ratio))
|
||||
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
|
||||
if(prob(5))
|
||||
to_chat(src, "<span class='warning'>You feel [word].</span>")
|
||||
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
|
||||
adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1))
|
||||
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
|
||||
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
|
||||
adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
|
||||
if(prob(5))
|
||||
blur_eyes(6)
|
||||
to_chat(src, "<span class='warning'>You feel very [word].</span>")
|
||||
@@ -111,7 +113,7 @@
|
||||
blood_volume = initial(blood_volume)
|
||||
|
||||
/mob/living/carbon/human/restore_blood()
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
|
||||
bleed_rate = 0
|
||||
|
||||
/****************************************************
|
||||
@@ -122,7 +124,7 @@
|
||||
/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced)
|
||||
if(!blood_volume || !AM.reagents)
|
||||
return 0
|
||||
if(blood_volume < BLOOD_VOLUME_BAD && !forced)
|
||||
if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced)
|
||||
return 0
|
||||
|
||||
if(blood_volume < amount)
|
||||
@@ -161,7 +163,7 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/get_blood_data(blood_id)
|
||||
if(blood_id == "blood") //actual blood reagent
|
||||
if(blood_id == "blood") //actual blood reagent
|
||||
var/blood_data = list()
|
||||
//set the blood data
|
||||
blood_data["donor"] = src
|
||||
@@ -204,6 +206,21 @@
|
||||
if(istype(ling))
|
||||
blood_data["changeling_loudness"] = ling.loudfactor
|
||||
return blood_data
|
||||
if(blood_id == "slimejelly") //Just so MKUltra works. Takes the minimum required data. Sishen is testing if this breaks stuff.
|
||||
var/blood_data = list()
|
||||
if(mind)
|
||||
blood_data["mind"] = mind
|
||||
else if(last_mind)
|
||||
blood_data["mind"] = last_mind
|
||||
if(ckey)
|
||||
blood_data["ckey"] = ckey
|
||||
else if(last_mind)
|
||||
blood_data["ckey"] = ckey(last_mind.key)
|
||||
blood_data["gender"] = gender
|
||||
blood_data["real_name"] = real_name
|
||||
return blood_data
|
||||
|
||||
|
||||
|
||||
//get the id of the substance this mob use as blood.
|
||||
/mob/proc/get_blood_id()
|
||||
@@ -300,3 +317,24 @@
|
||||
var/obj/effect/decal/cleanable/oil/B = locate() in T.contents
|
||||
if(!B)
|
||||
B = new(T)
|
||||
|
||||
//This is a terrible way of handling it.
|
||||
/mob/living/proc/ResetBloodVol()
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if (HAS_TRAIT(src, TRAIT_HIGH_BLOOD))
|
||||
blood_ratio = 1.2
|
||||
H.handle_blood()
|
||||
return
|
||||
blood_ratio = 1
|
||||
H.handle_blood()
|
||||
return
|
||||
blood_ratio = 1
|
||||
|
||||
/mob/living/proc/AdjustBloodVol(var/value)
|
||||
if(blood_ratio == value)
|
||||
return
|
||||
blood_ratio = value
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
H.handle_blood()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
icon_state = "facehugger"
|
||||
item_state = "facehugger"
|
||||
w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4
|
||||
clothing_flags = MASKINTERNALS
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
throw_range = 5
|
||||
tint = 3
|
||||
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
|
||||
@@ -33,16 +33,18 @@
|
||||
|
||||
/obj/item/clothing/mask/facehugger/lamarr
|
||||
name = "Lamarr"
|
||||
sterile = 1
|
||||
sterile = TRUE
|
||||
|
||||
/obj/item/clothing/mask/facehugger/dead
|
||||
icon_state = "facehugger_dead"
|
||||
item_state = "facehugger_inactive"
|
||||
sterile = TRUE
|
||||
stat = DEAD
|
||||
|
||||
/obj/item/clothing/mask/facehugger/impregnated
|
||||
icon_state = "facehugger_impregnated"
|
||||
item_state = "facehugger_impregnated"
|
||||
sterile = TRUE
|
||||
stat = DEAD
|
||||
|
||||
/obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
create_reagents(1000)
|
||||
update_body_parts() //to update the carbon's new bodyparts appearance
|
||||
GLOB.carbon_list += src
|
||||
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
|
||||
|
||||
/mob/living/carbon/Destroy()
|
||||
//This must be done first, so the mob ghosts correctly before DNA etc is nulled
|
||||
@@ -238,7 +239,7 @@
|
||||
if(href_list["internal"])
|
||||
var/slot = text2num(href_list["internal"])
|
||||
var/obj/item/ITEM = get_item_by_slot(slot)
|
||||
if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & MASKINTERNALS))
|
||||
if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS))
|
||||
visible_message("<span class='danger'>[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].</span>", \
|
||||
"<span class='userdanger'>[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].</span>")
|
||||
if(do_mob(usr, src, POCKET_STRIP_DELAY))
|
||||
@@ -246,7 +247,7 @@
|
||||
internal = null
|
||||
update_internals_hud_icon(0)
|
||||
else if(ITEM && istype(ITEM, /obj/item/tank))
|
||||
if((wear_mask && (wear_mask.clothing_flags & MASKINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE))
|
||||
if((wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE))
|
||||
internal = ITEM
|
||||
update_internals_hud_icon(1)
|
||||
|
||||
@@ -477,11 +478,13 @@
|
||||
if(message)
|
||||
visible_message("<span class='danger'>[src] throws up all over [p_them()]self!</span>", \
|
||||
"<span class='userdanger'>You throw up all over yourself!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomitself)
|
||||
distance = 0
|
||||
else
|
||||
if(message)
|
||||
visible_message("<span class='danger'>[src] throws up!</span>", "<span class='userdanger'>You throw up!</span>")
|
||||
|
||||
if(!isflyperson(src))
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomit)
|
||||
if(stun)
|
||||
Stun(80)
|
||||
|
||||
@@ -699,7 +702,7 @@
|
||||
clear_fullscreen("critvision")
|
||||
|
||||
//Oxygen damage overlay
|
||||
var/windedup = getOxyLoss() + getStaminaLoss() * 0.2 + stamdamageoverlaytemp
|
||||
var/windedup = getOxyLoss() + getStaminaLoss() * 0.2
|
||||
if(windedup)
|
||||
var/severity = 0
|
||||
switch(windedup)
|
||||
@@ -929,3 +932,17 @@
|
||||
|
||||
/mob/living/carbon/can_resist()
|
||||
return bodyparts.len > 2 && ..()
|
||||
|
||||
/mob/living/carbon/proc/hypnosis_vulnerable()//unused atm, but added in case
|
||||
if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
|
||||
return FALSE
|
||||
if(hallucinating())
|
||||
return TRUE
|
||||
if(IsSleeping())
|
||||
return TRUE
|
||||
if(HAS_TRAIT(src, TRAIT_DUMB))
|
||||
return TRUE
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
|
||||
if(mood)
|
||||
if(mood.sanity < SANITY_UNSTABLE)
|
||||
return TRUE
|
||||
|
||||
@@ -61,6 +61,5 @@
|
||||
var/next_hallucination = 0
|
||||
var/cpr_time = 1 //CPR cooldown.
|
||||
var/damageoverlaytemp = 0
|
||||
var/stamdamageoverlaytemp = 0
|
||||
|
||||
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
if(DISGUST_LEVEL_DISGUSTED to INFINITY)
|
||||
msg += "[t_He] look[p_s()] extremely disgusted.\n"
|
||||
|
||||
if(blood_volume < BLOOD_VOLUME_SAFE)
|
||||
if(blood_volume < (BLOOD_VOLUME_SAFE*blood_ratio))
|
||||
msg += "[t_He] [t_has] pale skin.\n"
|
||||
|
||||
if(bleedsuppress)
|
||||
@@ -281,6 +281,13 @@
|
||||
if(91.01 to INFINITY)
|
||||
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
|
||||
|
||||
if(reagents.has_reagent("astral"))
|
||||
msg += "[t_He] have wild, spacey eyes"
|
||||
if(mind)
|
||||
msg += " and have a strange, abnormal look to them.\n"
|
||||
else
|
||||
msg += " and don't look like they're all there.\n"
|
||||
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(src != user && HAS_TRAIT(L, TRAIT_EMPATH) && !appears_dead)
|
||||
@@ -304,6 +311,13 @@
|
||||
|
||||
msg += "</span>"
|
||||
|
||||
var/obj/item/organ/vocal_cords/Vc = user.getorganslot(ORGAN_SLOT_VOICE)
|
||||
if(Vc)
|
||||
if(istype(Vc, /obj/item/organ/vocal_cords/velvet))
|
||||
if(client?.prefs.lewdchem)
|
||||
msg += "<span class='velvet'><i>You feel your chords resonate looking at them.</i></span>\n"
|
||||
|
||||
|
||||
if(!appears_dead)
|
||||
if(stat == UNCONSCIOUS)
|
||||
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
|
||||
|
||||
@@ -812,6 +812,8 @@
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
if(HM.quality != POSITIVE)
|
||||
dna.remove_mutation(HM.name)
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL*blood_ratio))
|
||||
blood_volume = (BLOOD_VOLUME_NORMAL*blood_ratio)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker)
|
||||
|
||||
@@ -25,11 +25,11 @@
|
||||
var/age = 30 //Player's age
|
||||
|
||||
var/underwear = "Nude" //Which underwear the player wants
|
||||
var/undie_color = "#FFFFFF"
|
||||
var/undie_color = "FFFFFF"
|
||||
var/undershirt = "Nude" //Which undershirt the player wants
|
||||
var/shirt_color = "#FFFFFF"
|
||||
var/shirt_color = "FFFFFF"
|
||||
var/socks = "Nude" //Which socks the player wants
|
||||
var/socks_color = "#FFFFFF"
|
||||
var/socks_color = "FFFFFF"
|
||||
var/backbag = DBACKPACK //Which backpack type the player has chosen.
|
||||
var/jumpsuit_style = PREF_SUIT //suit/skirt
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
|
||||
|
||||
var/name_override //For temporary visible name changes
|
||||
var/genital_override = FALSE //Force genitals on things incase of chems
|
||||
|
||||
var/nameless = FALSE //For drones of both the insectoid and robotic kind. And other types of nameless critters.
|
||||
|
||||
|
||||
@@ -500,7 +500,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(B)
|
||||
var/mutable_appearance/MA = mutable_appearance(B.icon, B.icon_state, -BODY_LAYER)
|
||||
if(UNDIE_COLORABLE(B))
|
||||
MA.color = H.undie_color
|
||||
MA.color = "#[H.undie_color]"
|
||||
standing += MA
|
||||
|
||||
if(H.undershirt)
|
||||
@@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
else
|
||||
MA = mutable_appearance(T.icon, T.icon_state, -BODY_LAYER)
|
||||
if(UNDIE_COLORABLE(T))
|
||||
MA.color = H.shirt_color
|
||||
MA.color = "#[H.shirt_color]"
|
||||
standing += MA
|
||||
|
||||
if(H.socks && H.get_num_legs(FALSE) >= 2)
|
||||
@@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : ""
|
||||
var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER)
|
||||
if(UNDIE_COLORABLE(S))
|
||||
MA.color = H.socks_color
|
||||
MA.color = "#[H.socks_color]"
|
||||
standing += MA
|
||||
|
||||
if(standing.len)
|
||||
@@ -1696,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
if(H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma.
|
||||
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
|
||||
var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang/)
|
||||
var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang && !/datum/antagonist/gang/boss)
|
||||
if(rev)
|
||||
rev.remove_revolutionary(FALSE, user)
|
||||
if(gang)
|
||||
@@ -1781,7 +1781,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(CLONE)
|
||||
H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
|
||||
if(STAMINA)
|
||||
H.stamdamageoverlaytemp = 20
|
||||
if(BP)
|
||||
if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
|
||||
H.update_stamina()
|
||||
|
||||
@@ -48,14 +48,14 @@
|
||||
H.adjustBruteLoss(5)
|
||||
to_chat(H, "<span class='danger'>You feel empty!</span>")
|
||||
|
||||
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
if(H.blood_volume < (BLOOD_VOLUME_NORMAL * H.blood_ratio))
|
||||
if(H.nutrition >= NUTRITION_LEVEL_STARVING)
|
||||
H.blood_volume += 3
|
||||
H.nutrition -= 2.5
|
||||
if(H.blood_volume < BLOOD_VOLUME_OKAY)
|
||||
if(H.blood_volume < (BLOOD_VOLUME_OKAY*H.blood_ratio))
|
||||
if(prob(5))
|
||||
to_chat(H, "<span class='danger'>You feel drained!</span>")
|
||||
if(H.blood_volume < BLOOD_VOLUME_BAD)
|
||||
if(H.blood_volume < (BLOOD_VOLUME_BAD*H.blood_ratio))
|
||||
Cannibalize_Body(H)
|
||||
if(regenerate_limbs)
|
||||
regenerate_limbs.UpdateButtonIcon()
|
||||
@@ -87,7 +87,7 @@
|
||||
var/list/limbs_to_heal = H.get_missing_limbs()
|
||||
if(limbs_to_heal.len < 1)
|
||||
return 0
|
||||
if(H.blood_volume >= BLOOD_VOLUME_OKAY+40)
|
||||
if(H.blood_volume >= (BLOOD_VOLUME_OKAY*H.blood_ratio)+40)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -98,13 +98,13 @@
|
||||
to_chat(H, "<span class='notice'>You feel intact enough as it is.</span>")
|
||||
return
|
||||
to_chat(H, "<span class='notice'>You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...</span>")
|
||||
if(H.blood_volume >= 40*limbs_to_heal.len+BLOOD_VOLUME_OKAY)
|
||||
if(H.blood_volume >= 40*limbs_to_heal.len+(BLOOD_VOLUME_OKAY*H.blood_ratio))
|
||||
H.regenerate_limbs()
|
||||
H.blood_volume -= 40*limbs_to_heal.len
|
||||
to_chat(H, "<span class='notice'>...and after a moment you finish reforming!</span>")
|
||||
return
|
||||
else if(H.blood_volume >= 40)//We can partially heal some limbs
|
||||
while(H.blood_volume >= BLOOD_VOLUME_OKAY+40)
|
||||
while(H.blood_volume >= (BLOOD_VOLUME_OKAY*H.blood_ratio)+40)
|
||||
var/healed_limb = pick(limbs_to_heal)
|
||||
H.regenerate_limb(healed_limb)
|
||||
limbs_to_heal -= healed_limb
|
||||
@@ -138,7 +138,7 @@
|
||||
bodies -= C // This means that the other bodies maintain a link
|
||||
// so if someone mindswapped into them, they'd still be shared.
|
||||
bodies = null
|
||||
C.blood_volume = min(C.blood_volume, BLOOD_VOLUME_NORMAL)
|
||||
C.blood_volume = min(C.blood_volume, (BLOOD_VOLUME_NORMAL*C.blood_ratio))
|
||||
..()
|
||||
|
||||
/datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
@@ -729,4 +729,4 @@
|
||||
to_chat(H, "<span class='notice'>You connect [target]'s mind to your slime link!</span>")
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You can't seem to link [target]'s mind...</span>")
|
||||
to_chat(target, "<span class='warning'>The foreign presence leaves your mind.</span>")
|
||||
to_chat(target, "<span class='warning'>The foreign presence leaves your mind.</span>")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user