Merge branch 'master' into Cargo_rebalance

This commit is contained in:
Trilbyspaceclone
2019-10-08 18:49:38 -04:00
committed by GitHub
1427 changed files with 20986 additions and 10987 deletions
+57
View File
@@ -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"
+1
View File
@@ -169,6 +169,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
/client/proc/cmd_display_overlay_log,
/client/proc/reload_configuration,
/datum/admins/proc/create_or_modify_area,
/client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG
)
GLOBAL_PROTECT(admin_verbs_possess)
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
+2 -1
View File
@@ -34,7 +34,8 @@
H.dna.features["frills"] = pick(GLOB.frills_list)
H.dna.features["spines"] = pick(GLOB.spines_list)
H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
H.dna.features["moth_wings"] = pick(GLOB.moth_wings_list)
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
H.update_body()
H.update_hair()
+1 -1
View File
@@ -458,7 +458,7 @@
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage"))
for(var/mob/living/carbon/human/H in GLOB.player_list)
to_chat(H, "<span class='boldannounce'>You suddenly feel stupid.</span>")
H.adjustBrainLoss(60, 80)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80)
message_admins("[key_name_admin(usr)] made everybody retarded")
if("eagles")//SCRAW
+291 -1
View File
@@ -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))
@@ -1752,7 +2042,7 @@
if(DEAD)
status = "<font color='red'><b>Dead</b></font>"
health_description = "Status = [status]"
health_description += "<BR>Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()] - Stamina: [L.getStaminaLoss()]"
health_description += "<BR>Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getOrganLoss(ORGAN_SLOT_BRAIN)] - Stamina: [L.getStaminaLoss()]"
else
health_description = "This mob type has no health to speak of."
+1 -1
View File
@@ -1264,7 +1264,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
target.electrocution_animation(40)
to_chat(target, "<span class='userdanger'>The gods have punished you for your sins!</span>")
if(ADMIN_PUNISHMENT_BRAINDAMAGE)
target.adjustBrainLoss(199, 199)
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199)
if(ADMIN_PUNISHMENT_GIB)
target.gib(FALSE)
if(ADMIN_PUNISHMENT_BSA)
@@ -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()
@@ -1,5 +1,5 @@
/datum/surgery/organ_extraction
name = "experimental dissection"
name = "experimental organ replacement"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert)
possible_locs = list(BODY_ZONE_CHEST)
ignore_clothes = 1
@@ -151,7 +151,7 @@
if(2)
to_chat(H, "<span class='warning'>You hear an annoying buzz in your head.</span>")
H.confused += 15
H.adjustBrainLoss(10, 160)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160)
if(3)
H.hallucination += 60
@@ -167,7 +167,7 @@
/obj/item/organ/heart/gland/pop/activate()
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
randomize_human(owner)
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly))
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly))
owner.set_species(species)
/obj/item/organ/heart/gland/ventcrawling
@@ -83,7 +83,7 @@
if(istype(C))
var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
if(B && (B.decoy_override != initial(B.decoy_override)))
B.vital = TRUE
B.organ_flags |= ORGAN_VITAL
B.decoy_override = FALSE
remove_changeling_powers()
. = ..()
@@ -340,7 +340,7 @@
if(istype(C))
var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
if(B)
B.vital = FALSE
B.organ_flags &= ~ORGAN_VITAL
B.decoy_override = TRUE
update_changeling_icons_added()
return
@@ -35,7 +35,7 @@
B = new C.dna.species.mutant_brain()
else
B = new()
B.vital = FALSE
B.organ_flags &= ~ORGAN_VITAL
B.decoy_override = TRUE
B.Insert(C)
if(ishuman(user))
@@ -34,6 +34,7 @@
return TRUE
/obj/effect/proc_holder/changeling/strained_muscles/proc/muscle_loop(mob/living/carbon/user)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
while(active)
ADD_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles")
if(user.stat != CONSCIOUS || user.staminaloss >= 90)
@@ -41,6 +42,7 @@
to_chat(user, "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>")
user.Knockdown(40)
REMOVE_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles")
changeling.chem_recharge_slowdown -= 0.5
break
stacks++
@@ -50,7 +50,7 @@
to_chat(user, "<span class='userdanger'>The helmet tries to drive a spike through your head as you scramble to remove it!</span>")
user.emote("scream")
user.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
user.adjustBrainLoss(30)
user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30)
addtimer(CALLBACK(user, /mob/living.proc/dropItemToGround, src, TRUE), 1) //equipped happens before putting stuff on(but not before picking items up), 1). thus, we need to wait for it to be on before forcing it off.
/obj/item/clothing/head/helmet/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
@@ -132,9 +132,9 @@
continue
if(isliving(M.current) && M.current.stat != DEAD)
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, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE)
M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
M.current.clear_fullscreen("flash", 5)
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
+16 -7
View File
@@ -4,6 +4,7 @@
desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an <b>empowering rune</b>"
var/list/spells = list()
var/channeling = FALSE
var/holy_dispel = FALSE
/datum/action/innate/cult/blood_magic/Grant()
..()
@@ -33,6 +34,9 @@
B.button.moved = B.button.screen_loc
/datum/action/innate/cult/blood_magic/Activate()
if(holy_dispel)
to_chat(owner, "<span class='cultbold'>Holy water currently scours your body, nullifying the power of the rites!</span>")
return
var/rune = FALSE
var/limit = RUNELESS_MAX_BLOODCHARGE
for(var/obj/effect/rune/empower/R in range(1, owner))
@@ -64,7 +68,7 @@
qdel(nullify_spell)
return
BS = possible_spells[entered_spell_name]
if(QDELETED(src) || owner.incapacitated() || !BS || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit))
if(QDELETED(src) || owner.incapacitated() || !BS || holy_dispel || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit))
return
to_chat(owner,"<span class='warning'>You begin to carve unnatural symbols into your flesh!</span>")
SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10))
@@ -73,7 +77,7 @@
else
to_chat(owner, "<span class='cultitalic'>You are already invoking blood magic!")
return
if(do_after(owner, 100 - rune*60, target = owner))
if(do_after(owner, 100 - rune*60, target = owner) && !holy_dispel)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.bleed(40 - rune*32)
@@ -644,6 +648,11 @@
desc = "A spell that will absorb blood from anything you touch.<br>Touching cultists and constructs can heal them.<br><b>Clicking the hand will potentially let you focus the spell into something stronger.</b>"
color = "#7D1717"
/obj/item/melee/blood_magic/manipulator/examine(mob/user)
. = ..()
if(iscultist(user))
to_chat(user, "<span class='cultitalic'>The [name] currently has <b>[uses]</b> blood charges left.</span>")
/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity)
if(proximity)
if(ishuman(target))
@@ -678,9 +687,9 @@
if(ratio>1)
ratio = 1
uses -= round(overall_damage)
H.visible_message("<span class='warning'>[H] is fully healed by [H==user ? "[H.p_their()]":"[H]'s"]'s blood magic!</span>")
H.visible_message("<span class='warning'>[H] is fully healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic!</span>")
else
H.visible_message("<span class='warning'>[H] is partially healed by [H==user ? "[H.p_their()]":"[H]'s"] blood magic.</span>")
H.visible_message("<span class='warning'>[H] is partially healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic.</span>")
uses = 0
ratio *= -1
H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0)
@@ -762,7 +771,7 @@
switch(choice)
if("Blood Spear (150)")
if(uses < 150)
to_chat(user, "<span class='cultitalic'>You need 200 charges to perform this rite.</span>")
to_chat(user, "<span class='cultitalic'>You need 150 charges to perform this rite.</span>")
else
uses -= 150
var/turf/T = get_turf(user)
@@ -778,7 +787,7 @@
"<span class='cultitalic'>A [rite.name] materializes at your feet.</span>")
if("Blood Bolt Barrage (300)")
if(uses < 300)
to_chat(user, "<span class='cultitalic'>You need 400 charges to perform this rite.</span>")
to_chat(user, "<span class='cultitalic'>You need 300 charges to perform this rite.</span>")
else
var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood()
uses -= 300
@@ -790,7 +799,7 @@
qdel(rite)
if("Blood Beam (500)")
if(uses < 500)
to_chat(user, "<span class='cultitalic'>You need 600 charges to perform this rite.</span>")
to_chat(user, "<span class='cultitalic'>You need 500 charges to perform this rite.</span>")
else
var/obj/rite = new /obj/item/blood_beam()
uses -= 500
@@ -666,6 +666,7 @@
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
slot_flags = 0
force = 17
force_unwielded = 17
force_wielded = 24
throwforce = 40
throw_speed = 2
@@ -73,6 +73,10 @@
animate(src, color = previouscolor, time = 8)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
/obj/structure/destructible/cult/proc/check_menu(mob/living/user)
if(!user || user.incapacitated() || !iscultist(user) || !anchored || cooldowntime > world.time)
return FALSE
return TRUE
/obj/structure/destructible/cult/talisman
name = "altar"
@@ -80,9 +84,18 @@
icon_state = "talismanaltar"
break_message = "<span class='warning'>The altar shatters, leaving only the wailing of the damned!</span>"
/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
var/static/image/radial_whetstone = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener")
var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult")
var/static/image/radial_unholy_water = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask")
/obj/structure/destructible/cult/talisman/Initialize()
. = ..()
if(.)
radial_unholy_water.color = "#333333"
/obj/structure/destructible/cult/talisman/ui_interact(mob/user)
. = ..()
if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>")
@@ -91,22 +104,27 @@
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with your dagger first.</span>")
return
if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
var/list/pickedtype = list()
to_chat(user, "<span class='cultitalic'>You study the schematics etched into the altar...</span>")
var/list/options = list("Eldritch Whetstone" = radial_whetstone, "Construct Shell" = radial_shell, "Flask of Unholy Water" = radial_unholy_water)
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/reward
switch(choice)
if("Eldritch Whetstone")
pickedtype += /obj/item/sharpener/cult
reward = /obj/item/sharpener/cult
if("Construct Shell")
pickedtype += /obj/structure/constructshell
reward = /obj/structure/constructshell
if("Flask of Unholy Water")
pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
reward = /obj/item/reagent_containers/glass/beaker/unholywater
if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
for(var/N in pickedtype)
new N(get_turf(src))
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with the [choice]!</span>")
new reward(get_turf(src))
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with the [choice]!</span>")
/obj/structure/destructible/cult/forge
name = "daemon forge"
@@ -116,9 +134,14 @@
light_color = LIGHT_COLOR_LAVA
break_message = "<span class='warning'>The force breaks apart into shards with a howling scream!</span>"
/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
var/static/image/radial_flagellant = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cultrobes")
var/static/image/radial_shielded = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cult_armor")
var/static/image/radial_mirror = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "mirror_shield")
/obj/structure/destructible/cult/forge/ui_interact(mob/user)
. = ..()
if(.)
if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>The heat radiating from [src] pushes you back.</span>")
@@ -129,24 +152,26 @@
if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice
if(user.mind.has_antag_datum(/datum/antagonist/cult/master))
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
else
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
var/list/pickedtype = list()
to_chat(user, "<span class='cultitalic'>You study the schematics etched into the forge...</span>")
var/list/options = list("Shielded Robe" = radial_shielded, "Flagellant's Robe" = radial_flagellant, "Mirror Shield" = radial_mirror)
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/reward
switch(choice)
if("Shielded Robe")
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/cult_shield
reward = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
if("Flagellant's Robe")
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker
reward = /obj/item/clothing/suit/hooded/cultrobes/berserker
if("Mirror Shield")
pickedtype += /obj/item/shield/mirror
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
reward = /obj/item/shield/mirror
if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
for(var/N in pickedtype)
new N(get_turf(src))
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating the [choice]!</span>")
new reward(get_turf(src))
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating the [choice]!</span>")
@@ -234,9 +259,14 @@
light_color = LIGHT_COLOR_FIRE
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
var/static/image/radial_blindfold = image(icon = 'icons/obj/clothing/glasses.dmi', icon_state = "blindfold")
var/static/image/radial_curse = image(icon = 'icons/obj/cult.dmi', icon_state ="shuttlecurse")
var/static/image/radial_veilwalker = image(icon = 'icons/obj/cult.dmi', icon_state ="shifter")
/obj/structure/destructible/cult/tome/ui_interact(mob/user)
. = ..()
if(.)
if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>These books won't open and it hurts to even try and read the covers.</span>")
@@ -247,21 +277,27 @@
if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
var/list/pickedtype = list()
to_chat(user, "<span class='cultitalic'>You flip through the black pages of the archives...</span>")
var/list/options = list("Zealot's Blindfold" = radial_blindfold, "Shuttle Curse" = radial_curse, "Veil Walker Set" = radial_veilwalker)
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/reward
switch(choice)
if("Zealot's Blindfold")
pickedtype += /obj/item/clothing/glasses/hud/health/night/cultblind
reward = /obj/item/clothing/glasses/hud/health/night/cultblind
if("Shuttle Curse")
pickedtype += /obj/item/shuttle_curse
reward = /obj/item/shuttle_curse
if("Veil Walker Set")
pickedtype += /obj/item/cult_shift
pickedtype += /obj/item/flashlight/flare/culttorch
if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
reward = /obj/effect/spawner/bundle/veil_walker
if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
for(var/N in pickedtype)
new N(get_turf(src))
to_chat(user, "<span class='cultitalic'>You summon the [choice] from the archives!</span>")
new reward(get_turf(src))
to_chat(user, "<span class='cultitalic'>You summon the [choice] from the archives!</span>")
/obj/effect/spawner/bundle/veil_walker
items = list(/obj/item/cult_shift, /obj/item/flashlight/flare/culttorch)
/obj/effect/gateway
name = "gateway"
+9 -44
View File
@@ -61,8 +61,8 @@ Runes can either be invoked by one's self or with many different cultists. Each
if(do_after(user, 15, target = src))
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
qdel(src)
else if(istype(I, /obj/item/nullrod))
user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod")
else if(istype(I, /obj/item/storage/book/bible) || istype(I, /obj/item/nullrod))
user.say("BEGONE FOUL MAGICKS!!", forced = "bible")
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
qdel(src)
@@ -185,9 +185,6 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_OFFER
req_cultists = 1
rune_in_use = FALSE
var/mob/living/currentconversionman
var/conversiontimeout
var/conversionresult
/obj/effect/rune/convert/do_invoke_glow()
return
@@ -233,37 +230,18 @@ structure_check() searches for nearby cultist structures required for the invoca
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
Cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew
rune_in_use = FALSE
/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
if(invokers.len < 2)
for(var/M in invokers)
to_chat(M, "<span class='danger'>You need at least two invokers to convert [convertee]!</span>")
to_chat(M, "<span class='warning'>You need at least two invokers to convert [convertee]!</span>")
log_game("Offer rune failed - tried conversion with one invoker")
return 0
if(convertee.anti_magic_check(TRUE, TRUE))
if(convertee.anti_magic_check(TRUE, TRUE, FALSE, 0)) //Not chargecost because it can be spammed
for(var/M in invokers)
to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
log_game("Offer rune failed - convertee had anti-magic")
return 0
to_chat(convertee, "<span class='cult italic'><b>The world goes red. All at once you are aware of an evil, eldritch truth taking roots into your mind.\n\
<a href='?src=\ref[src];signmeup=1'>Click here to become a follower of Nar'sie</a></b>, or suffer a fate worse than death.</span>")
INVOKE_ASYNC(src, .proc/optinalert, convertee)
currentconversionman = convertee
conversiontimeout = world.time + (14 SECONDS)
convertee.Stun(140)
ADD_TRAIT(convertee, TRAIT_MUTE, "conversionrune")
flash_color(convertee, list("#960000", "#960000", "#960000", rgb(0,0,0)), 50)
conversionresult = FALSE
while(world.time < conversiontimeout && convertee && !conversionresult)
stoplag(1)
currentconversionman = null
if(!convertee)
return FALSE
REMOVE_TRAIT(convertee, TRAIT_MUTE, "conversionrune")
if(get_turf(convertee) != get_turf(src))
return FALSE
if(!conversionresult)
do_sacrifice(convertee, invokers, TRUE)
return FALSE
var/brutedamage = convertee.getBruteLoss()
var/burndamage = convertee.getFireLoss()
if(brutedamage || burndamage)
@@ -275,6 +253,8 @@ structure_check() searches for nearby cultist structures required for the invoca
SSticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/melee/cultblade/dagger(get_turf(src))
convertee.mind.special_role = ROLE_CULTIST
to_chat(convertee, "<span class='cult italic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>")
to_chat(convertee, "<span class='cult italic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
</b></span>")
if(ishuman(convertee))
@@ -284,18 +264,7 @@ structure_check() searches for nearby cultist structures required for the invoca
H.cultslurring = 0
return 1
/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(src && alert == "Join the Blood Cult")
signmeup(convertee)
/obj/effect/rune/convert/proc/signmeup(mob/living/convertee)
if(currentconversionman == convertee)
conversionresult = TRUE
else
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)
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
var/mob/living/first_invoker = invokers[1]
if(!first_invoker)
return FALSE
@@ -305,7 +274,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/big_sac = FALSE
if(!force_a_sac && (((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
for(var/M in invokers)
to_chat(M, "<span class='cult italic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
@@ -345,10 +314,6 @@ structure_check() searches for nearby cultist structures required for the invoca
sacrificial.gib()
return TRUE
/obj/effect/rune/convert/Topic(href, href_list)
if(href_list["signmeup"])
signmeup(usr)
/obj/effect/rune/empower
cultist_name = "Empower"
cultist_desc = "allows cultists to prepare greater amounts of blood magic at far less of a cost."
@@ -5,25 +5,48 @@ is currently following.
*/
GLOBAL_LIST_INIT(disease_ability_singletons, list(
new /datum/disease_ability/action/cough(),
new /datum/disease_ability/action/sneeze(),
new /datum/disease_ability/action/infect(),
new /datum/disease_ability/symptom/cough(),
new /datum/disease_ability/symptom/sneeze(),\
new /datum/disease_ability/symptom/hallucigen(),
new /datum/disease_ability/symptom/choking(),
new /datum/disease_ability/symptom/confusion(),
new /datum/disease_ability/symptom/youth(),
new /datum/disease_ability/symptom/vomit(),
new /datum/disease_ability/symptom/voice_change(),
new /datum/disease_ability/symptom/visionloss(),
new /datum/disease_ability/symptom/viraladaptation(),
new /datum/disease_ability/symptom/vitiligo(),
new /datum/disease_ability/symptom/sensory_restoration(),
new /datum/disease_ability/symptom/itching(),
new /datum/disease_ability/symptom/weight_loss(),
new /datum/disease_ability/symptom/metabolism_heal(),
new /datum/disease_ability/symptom/coma_heal()
new /datum/disease_ability/action/cough,
new /datum/disease_ability/action/sneeze,
new /datum/disease_ability/action/infect,
new /datum/disease_ability/symptom/mild/cough,
new /datum/disease_ability/symptom/mild/sneeze,
new /datum/disease_ability/symptom/medium/shedding,
new /datum/disease_ability/symptom/medium/beard,
new /datum/disease_ability/symptom/medium/hallucigen,
new /datum/disease_ability/symptom/medium/choking,
new /datum/disease_ability/symptom/medium/confusion,
new /datum/disease_ability/symptom/medium/vomit,
new /datum/disease_ability/symptom/medium/voice_change,
new /datum/disease_ability/symptom/medium/visionloss,
new /datum/disease_ability/symptom/medium/deafness,
new /datum/disease_ability/symptom/powerful/narcolepsy,
new /datum/disease_ability/symptom/medium/fever,
new /datum/disease_ability/symptom/medium/shivering,
new /datum/disease_ability/symptom/medium/headache,
new /datum/disease_ability/symptom/medium/nano_boost,
new /datum/disease_ability/symptom/medium/nano_destroy,
new /datum/disease_ability/symptom/medium/viraladaptation,
new /datum/disease_ability/symptom/medium/viralevolution,
new /datum/disease_ability/symptom/medium/vitiligo,
new /datum/disease_ability/symptom/medium/revitiligo,
new /datum/disease_ability/symptom/medium/itching,
new /datum/disease_ability/symptom/medium/heal/weight_loss,
new /datum/disease_ability/symptom/medium/heal/sensory_restoration,
new /datum/disease_ability/symptom/medium/heal/mind_restoration,
new /datum/disease_ability/symptom/powerful/fire,
new /datum/disease_ability/symptom/powerful/flesh_eating,
// new /datum/disease_ability/symptom/powerful/genetic_mutation,
new /datum/disease_ability/symptom/powerful/inorganic_adaptation,
new /datum/disease_ability/symptom/powerful/heal/starlight,
new /datum/disease_ability/symptom/powerful/heal/oxygen,
new /datum/disease_ability/symptom/powerful/heal/chem,
new /datum/disease_ability/symptom/powerful/heal/metabolism,
new /datum/disease_ability/symptom/powerful/heal/dark,
new /datum/disease_ability/symptom/powerful/heal/water,
new /datum/disease_ability/symptom/powerful/heal/plasma,
new /datum/disease_ability/symptom/powerful/heal/radiation,
new /datum/disease_ability/symptom/powerful/heal/coma,
new /datum/disease_ability/symptom/powerful/youth
))
/datum/disease_ability
@@ -54,7 +77,13 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
stage_speed += initial(S.stage_speed)
transmittable += initial(S.transmittable)
threshold_block += "<br><br>[initial(S.threshold_desc)]"
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
if(symptoms.len == 1) //lazy boy's dream
name = initial(S.name)
if(short_desc == "")
short_desc = initial(S.desc)
if(long_desc == "")
long_desc = initial(S.desc)
/datum/disease_ability/proc/CanBuy(mob/camera/disease/D)
if(world.time < D.next_adaptation_time)
@@ -77,8 +106,10 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
for(var/T in symptoms)
var/datum/symptom/S = new T()
SD.symptoms += S
S.OnAdd(SD)
if(SD.processing)
S.Start(SD)
if(S.Start(SD))
S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10)
SD.Refresh()
for(var/T in actions)
var/datum/action/A = new T()
@@ -105,6 +136,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
var/datum/symptom/S = locate(T) in SD.symptoms
if(S)
SD.symptoms -= S
S.OnRemove(SD)
if(SD.processing)
S.End(SD)
qdel(S)
@@ -152,8 +184,9 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "<span class='notice'>You force [L.real_name] to cough.</span>")
L.emote("cough")
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
SD.spread(2)
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
SD.spread(2)
StartCooldown()
return TRUE
@@ -185,11 +218,12 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "<span class='notice'>You force [L.real_name] to sneeze.</span>")
L.emote("sneeze")
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
for(var/mob/living/M in oview(4, SD.affected_mob))
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
M.AirborneContractDisease(SD, TRUE)
for(var/mob/living/M in oview(4, SD.affected_mob))
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
M.AirborneContractDisease(SD, TRUE)
StartCooldown()
return TRUE
@@ -235,154 +269,192 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
StartCooldown()
return TRUE
//passive symptom abilities
/*******************BASE SYMPTOM TYPES*******************/
// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype...
//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!)
/datum/disease_ability/symptom/cough
name = "Involuntary Coughing"
symptoms = list(/datum/symptom/cough)
/datum/disease_ability/symptom/mild
cost = 2
required_total_points = 4
category = "Symptom (Weak)"
/datum/disease_ability/symptom/medium
cost = 4
required_total_points = 8
category = "Symptom"
/datum/disease_ability/symptom/medium/heal
cost = 5
category = "Symptom (+)"
/datum/disease_ability/symptom/powerful
cost = 4
required_total_points = 16
category = "Symptom (Strong)"
/datum/disease_ability/symptom/powerful/heal
cost = 8
category = "Symptom (Strong+)"
/******MILD******/
/datum/disease_ability/symptom/mild/cough
name = "Involuntary Coughing"
symptoms = list(/datum/symptom/cough)
short_desc = "Cause victims to cough intermittently."
long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high."
/datum/disease_ability/symptom/sneeze
/datum/disease_ability/symptom/mild/sneeze
name = "Involuntary Sneezing"
symptoms = list(/datum/symptom/sneeze)
cost = 2
required_total_points = 4
short_desc = "Cause victims to sneeze intermittently."
long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth."
/datum/disease_ability/symptom/beard
//I don't think I need to justify the fact that this is the best symptom
name = "Beard Growth"
symptoms = list(/datum/symptom/beard)
cost = 1
required_total_points = 8
short_desc = "Cause all victims to grow a luscious beard."
long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus."
/******MEDIUM******/
/datum/disease_ability/symptom/hallucigen
name = "Hallucinations"
/datum/disease_ability/symptom/medium/shedding
symptoms = list(/datum/symptom/shedding)
/datum/disease_ability/symptom/medium/beard
symptoms = list(/datum/symptom/beard)
short_desc = "Cause all victims to grow a luscious beard."
long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus."
/datum/disease_ability/symptom/medium/hallucigen
symptoms = list(/datum/symptom/hallucigen)
cost = 4
required_total_points = 8
short_desc = "Cause victims to hallucinate."
long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance."
/datum/disease_ability/symptom/choking
name = "Choking"
/datum/disease_ability/symptom/medium/choking
symptoms = list(/datum/symptom/choking)
cost = 4
required_total_points = 8
short_desc = "Cause victims to choke."
long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility."
/datum/disease_ability/symptom/confusion
name = "Confusion"
/datum/disease_ability/symptom/medium/confusion
symptoms = list(/datum/symptom/confusion)
cost = 4
required_total_points = 8
short_desc = "Cause victims to become confused."
long_desc = "Cause victims to become confused intermittently."
/datum/disease_ability/symptom/youth
name = "Eternal Youth"
symptoms = list(/datum/symptom/youth)
cost = 4
required_total_points = 8
short_desc = "Cause victims to become eternally young."
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
/datum/disease_ability/symptom/vomit
name = "Vomiting"
/datum/disease_ability/symptom/medium/vomit
symptoms = list(/datum/symptom/vomit)
cost = 4
required_total_points = 8
short_desc = "Cause victims to vomit."
long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
/datum/disease_ability/symptom/voice_change
name = "Voice Changing"
/datum/disease_ability/symptom/medium/voice_change
symptoms = list(/datum/symptom/voice_change)
cost = 4
required_total_points = 8
short_desc = "Change the voice of victims."
long_desc = "Change the voice of victims, causing confusion in communications."
/datum/disease_ability/symptom/visionloss
name = "Vision Loss"
/datum/disease_ability/symptom/medium/visionloss
symptoms = list(/datum/symptom/visionloss)
cost = 4
required_total_points = 8
short_desc = "Damage the eyes of victims, eventually causing blindness."
long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats."
/datum/disease_ability/symptom/medium/deafness
symptoms = list(/datum/symptom/deafness)
/datum/disease_ability/symptom/viraladaptation
name = "Self-Adaptation"
/datum/disease_ability/symptom/medium/fever
symptoms = list(/datum/symptom/fever)
/datum/disease_ability/symptom/medium/shivering
symptoms = list(/datum/symptom/shivering)
/datum/disease_ability/symptom/medium/headache
symptoms = list(/datum/symptom/headache)
/datum/disease_ability/symptom/medium/nano_boost
symptoms = list(/datum/symptom/nano_boost)
/datum/disease_ability/symptom/medium/nano_destroy
symptoms = list(/datum/symptom/nano_destroy)
/datum/disease_ability/symptom/medium/viraladaptation
symptoms = list(/datum/symptom/viraladaptation)
cost = 4
required_total_points = 8
short_desc = "Cause your infection to become more resistant to detection and eradication."
long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed."
/datum/disease_ability/symptom/medium/viralevolution
symptoms = list(/datum/symptom/viralevolution)
/datum/disease_ability/symptom/vitiligo
name = "Skin Paleness"
/datum/disease_ability/symptom/medium/vitiligo
symptoms = list(/datum/symptom/vitiligo)
cost = 1
required_total_points = 8
short_desc = "Cause victims to become pale."
long_desc = "Cause victims to become pale. Decreases all stats."
/datum/disease_ability/symptom/medium/revitiligo
symptoms = list(/datum/symptom/revitiligo)
/datum/disease_ability/symptom/sensory_restoration
name = "Sensory Restoration"
symptoms = list(/datum/symptom/sensory_restoration)
cost = 4
required_total_points = 8
short_desc = "Regenerate eye and ear damage of victims."
long_desc = "Regenerate eye and ear damage of victims."
/datum/disease_ability/symptom/itching
name = "Itching"
/datum/disease_ability/symptom/medium/itching
symptoms = list(/datum/symptom/itching)
cost = 4
required_total_points = 8
short_desc = "Cause victims to itch."
long_desc = "Cause victims to itch, increasing all stats except stealth."
/datum/disease_ability/symptom/weight_loss
name = "Weight Loss"
/datum/disease_ability/symptom/medium/heal/weight_loss
symptoms = list(/datum/symptom/weight_loss)
cost = 4
required_total_points = 8
short_desc = "Cause victims to lose weight."
long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
/datum/disease_ability/symptom/medium/heal/sensory_restoration
symptoms = list(/datum/symptom/sensory_restoration)
short_desc = "Regenerate eye and ear damage of victims."
long_desc = "Regenerate eye and ear damage of victims."
/datum/disease_ability/symptom/metabolism_heal
name = "Metabolic Boost"
/datum/disease_ability/symptom/medium/heal/mind_restoration
symptoms = list(/datum/symptom/mind_restoration)
/******POWERFUL******/
/datum/disease_ability/symptom/powerful/fire
symptoms = list(/datum/symptom/fire)
/datum/disease_ability/symptom/powerful/flesh_eating
symptoms = list(/datum/symptom/flesh_eating)
/*
/datum/disease_ability/symptom/powerful/genetic_mutation
symptoms = list(/datum/symptom/genetic_mutation)
cost = 8
*/
/datum/disease_ability/symptom/powerful/inorganic_adaptation
symptoms = list(/datum/symptom/inorganic_adaptation)
/datum/disease_ability/symptom/powerful/narcolepsy
symptoms = list(/datum/symptom/narcolepsy)
/datum/disease_ability/symptom/powerful/youth
symptoms = list(/datum/symptom/youth)
short_desc = "Cause victims to become eternally young."
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
/****HEALING SUBTYPE****/
/datum/disease_ability/symptom/powerful/heal/starlight
symptoms = list(/datum/symptom/heal/starlight)
/datum/disease_ability/symptom/powerful/heal/oxygen
symptoms = list(/datum/symptom/oxygen)
/datum/disease_ability/symptom/powerful/heal/chem
symptoms = list(/datum/symptom/heal/chem)
/datum/disease_ability/symptom/powerful/heal/metabolism
symptoms = list(/datum/symptom/heal/metabolism)
cost = 4
required_total_points = 16
short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster."
long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly."
/datum/disease_ability/symptom/powerful/heal/dark
symptoms = list(/datum/symptom/heal/darkness)
/datum/disease_ability/symptom/coma_heal
name = "Regenerative Coma"
/datum/disease_ability/symptom/powerful/heal/water
symptoms = list(/datum/symptom/heal/water)
/datum/disease_ability/symptom/powerful/heal/plasma
symptoms = list(/datum/symptom/heal/plasma)
/datum/disease_ability/symptom/powerful/heal/radiation
symptoms = list(/datum/symptom/heal/radiation)
/datum/disease_ability/symptom/powerful/heal/coma
symptoms = list(/datum/symptom/heal/coma)
cost = 8
required_total_points = 16
short_desc = "Cause victims to fall into a healing coma when hurt."
long_desc = "Cause victims to fall into a healing coma when hurt."
@@ -51,6 +51,7 @@
if(cures.len)
return
var/list/not_used = advance_cures.Copy()
not_used.Cut(1, 6) // Removes the first five tiers of cures.
cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used)))
// Get the cure name from the cure_id
@@ -18,7 +18,7 @@ the new instance inside the host to be updated to the template's stats.
layer = BELOW_MOB_LAYER
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
sight = SEE_SELF|SEE_THRU
initial_language_holder = /datum/language_holder/empty
initial_language_holder = /datum/language_holder/universal
var/freemove = TRUE
var/freemove_end = 0
@@ -43,7 +43,7 @@ the new instance inside the host to be updated to the template's stats.
var/move_delay = 1
var/next_adaptation_time = 0
var/adaptation_cooldown = 1200
var/adaptation_cooldown = 600
var/list/purchased_abilities
var/list/unpurchased_abilities
@@ -118,10 +118,28 @@ the new instance inside the host to be updated to the template's stats.
follow_next(Dir & NORTHWEST)
last_move_tick = world.time
/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
. = ..()
var/atom/movable/to_follow = speaker
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
to_follow = V.source
var/link
if(to_follow in hosts)
link = FOLLOW_LINK(src, to_follow)
else
link = ""
// Recompose the message, because it's scrambled by default
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
to_chat(src, "[link] [message]")
/mob/camera/disease/mind_initialize()
. = ..()
if(!mind.has_antag_datum(/datum/antagonist/disease))
mind.add_antag_datum(/datum/antagonist/disease)
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
/mob/camera/disease/proc/pick_name()
var/static/list/taken_names
@@ -247,9 +265,12 @@ the new instance inside the host to be updated to the template's stats.
if(!move_listener)
move_listener = L.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/follow_mob)))
else
L.TakeComponent(move_listener)
if(QDELING(move_listener))
move_listener = null
if(L)
L.TakeComponent(move_listener)
if(QDELING(move_listener))
move_listener = null
else
QDEL_NULL(move_listener)
follow_mob()
/mob/camera/disease/proc/follow_next(reverse = FALSE)
+16 -4
View File
@@ -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
@@ -80,6 +80,7 @@
desc = "Still it beats furiously, emanating an aura of utter hate."
icon = 'icons/obj/surgery.dmi'
icon_state = "demon_heart-on"
decay_factor = 0
/obj/item/organ/heart/demon/update_icon()
return //always beating visually
@@ -198,7 +198,7 @@
to_chat(user, "<span class='warning'>This artifact can only affect three undead at a time!</span>")
return
M.set_species(/datum/species/skeleton, icon_update=0)
M.set_species(/datum/species/skeleton/space, icon_update=0)
M.revive(full_heal = 1, admin_revive = 1)
spooky_scaries |= M
to_chat(M, "<span class='userdanger'>You have been revived by </span><B>[user.real_name]!</B>")
@@ -394,6 +394,21 @@
. = TRUE
update_icon()
/obj/machinery/atmospherics/components/unary/cryo_cell/CtrlClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) && !state_open)
on = !on
update_icon()
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/AltClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
if(state_open)
close_machine()
else
open_machine()
update_icon()
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user)
return // we don't see the pipe network while inside cryo.
-1
View File
@@ -109,7 +109,6 @@ datum/bounty/reagent/complex_drink/New()
/datum/reagent/consumable/ethanol/patron,\
/datum/reagent/consumable/ethanol/quadruple_sec,\
/datum/reagent/consumable/ethanol/quintuple_sec,\
/datum/reagent/consumable/bluecherryshake,\
/datum/reagent/consumable/doctor_delight,\
/datum/reagent/consumable/ethanol/silencer)
+2
View File
@@ -571,6 +571,8 @@ GLOBAL_LIST_EMPTY(asset_datums)
"fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff',
"font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css',
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
"browserOutput_dark.css" = 'code/modules/goonchat/browserassets/css/browserOutput_dark.css',
"browserOutput_light.css" = 'code/modules/goonchat/browserassets/css/browserOutput_light.css'
)
/datum/asset/spritesheet/goonchat
+5
View File
@@ -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
+4
View File
@@ -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
+41 -93
View File
@@ -5,7 +5,7 @@ This lets you switch chat themes by using winset and CSS loading, you must relog
Things to note:
If you change ANYTHING in interface/skin.dmf you need to change it here:
Format:
winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value")
winset(src, "window as appears in skin.dmf after elem", "var to change = desired value")
How this works:
I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat)
This then swaps the window theme automatically
@@ -14,104 +14,52 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this.
/client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested.
//Main windows
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND]")
//Buttons
winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG]")
winset(src, "report-issue", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];text-color = [COLOR_WHITEMODE_TEXT]")
//Status and verb tabs
winset(src, "output", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "statwindow", "text-color = #eaeaea;text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "output", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];\
text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT];\
prefix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
//Etc.
winset(src, "say", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "say", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "asset_cache_browser", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing
//Main windows
winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "infowindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "info", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "browseroutput", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "outputwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_DARKMODE_BACKGROUND]")
//Buttons
winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "changelog", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "rules", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "wiki", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "forum", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "github", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG]")
winset(src, "report-issue", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];text-color = [COLOR_DARKMODE_TEXT]")
//Status and verb tabs
winset(src, "output", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "output", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "statwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "stat", "tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "stat", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "tab-text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "prefix-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "suffix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
winset(src, "output", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND];\
text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT];\
prefix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
//Etc.
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "say", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "asset_cache_browser", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "tooltip", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
/datum/asset/simple/goonchat
verify = FALSE
assets = list(
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
"errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js',
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
"fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot',
"fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg',
"fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf',
"fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff',
"font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css',
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
"browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css',
)
winset(src, "say", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
+133 -169
View File
@@ -85,6 +85,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/facial_hair_color = "000" //Facial hair color
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/horn_color = "85615a" //Horn color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/list/features = list("mcolor" = "FFF",
"tail_lizard" = "Smooth",
@@ -96,8 +97,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"frills" = "None",
"spines" = "None",
"body_markings" = "None",
"legs" = "Normal Legs",
"moth_wings" = "Plain",
"legs" = "Plantigrade",
"insect_wings" = "Plain",
"insect_fluff" = "None",
"mcolor2" = "FFF",
"mcolor3" = "FFF",
"mam_body_markings" = "Plain",
@@ -157,7 +159,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"womb_fluid" = "femcum",
"ipc_screen" = "Sunburst",
"ipc_antenna" = "None",
"flavor_text" = ""
"flavor_text" = "",
"meat_type" = "Mammalian"
)
var/list/custom_names = list()
@@ -172,18 +175,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/list/all_quirks = list()
var/list/character_quirks = list()
//Jobs, uses bitflags
var/job_civilian_high = 0
var/job_civilian_med = 0
var/job_civilian_low = 0
var/job_medsci_high = 0
var/job_medsci_med = 0
var/job_medsci_low = 0
var/job_engsec_high = 0
var/job_engsec_med = 0
var/job_engsec_low = 0
//Job preferences 2.0 - indexed by job title , no key or value implies never
var/list/job_preferences = list()
// Want randomjob if preferences already filled - Donkie
var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants
@@ -241,7 +234,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return
#define APPEARANCE_CATEGORY_COLUMN "<td valign='top' width='17%'>"
#define MAX_MUTANT_ROWS 4
#define MAX_MUTANT_ROWS 5
/datum/preferences/proc/ShowChoices(mob/user)
if(!user || !user.client)
@@ -351,9 +344,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[TextPreview(features["flavor_text"])]...<BR>"
dat += "<h2>Body</h2>"
dat += "<b>Gender:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=gender'>[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]</a><BR>"
dat += "<b>Species:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=species;task=input'>[pref_species.id]</a><BR>"
dat += "<b>Species:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=species;task=input'>[pref_species.name]</a><BR>"
dat += "<b>Custom Species Name:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=custom_species;task=input'>[custom_species ? custom_species : "None"]</a><BR>"
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=all;task=random'>Random Body</A><BR>"
dat += "<b>Random Body:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=all;task=random'>Randomize!</A><BR>"
dat += "<b>Always Random Body:</b><a href='?_src_=prefs;preference=all'>[be_random_body ? "Yes" : "No"]</A><BR>"
dat += "<br><b>Cycle background:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=cycle_bg;task=input'>[bgstate]</a><BR>"
@@ -448,6 +441,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=tail_human;task=input'>[features["tail_human"]]</a>"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
mutant_category = 0
if("meat_type" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
dat += "<h3>Meat Type</h3>"
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=meats;task=input'>[features["meat_type"]]</a>"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
@@ -471,6 +477,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<h3>Horns</h3>"
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=horns;task=input'>[features["horns"]]</a>"
dat += "<span style='border:1px solid #161616; background-color: #[horn_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=horns_color;task=input'>Change</a><BR>"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
@@ -537,6 +545,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
mutant_category = 0
if("ears" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -549,6 +558,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
mutant_category = 0
if("mam_snouts" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -573,14 +583,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
mutant_category = 0
if("moth_wings" in pref_species.default_features)
if("insect_wings" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
dat += "<h3>Moth wings</h3>"
dat += "<h3>Insect wings</h3>"
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=moth_wings;task=input'>[features["moth_wings"]]</a>"
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=insect_wings;task=input'>[features["insect_wings"]]</a>"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
mutant_category = 0
if("insect_fluff" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
dat += "<h3>Insect Fluff</h3>"
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=insect_fluffs;task=input'>[features["insect_fluff"]]</a>"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
@@ -681,13 +701,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];'>&nbsp;&nbsp;&nbsp;</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];'>&nbsp;&nbsp;&nbsp;</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];'>&nbsp;&nbsp;&nbsp;</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>"
@@ -919,11 +939,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<td width=80%><font size=2><b>Description</b></font></td></tr>"
for(var/j in GLOB.loadout_items[gear_tab])
var/datum/gear/gear = GLOB.loadout_items[gear_tab][j]
var/donoritem
if(gear.ckeywhitelist && gear.ckeywhitelist.len)
donoritem = TRUE
if(!(user.ckey in gear.ckeywhitelist))
continue
var/donoritem = gear.donoritem
if(donoritem && !gear.donator_ckey_check(user.ckey))
continue
var/class_link = ""
if(gear.type in chosen_gear)
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(j)];toggle_gear=0'"
@@ -994,9 +1012,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
var/datum/job/lastJob
var/datum/job/overflow = SSjob.GetJob(SSjob.overflow_role)
for(var/datum/job/job in SSjob.occupations)
for(var/datum/job/job in sortList(SSjob.occupations, /proc/cmp_job_display_asc))
index += 1
if((index >= limit) || (job.title in splitJobs))
@@ -1013,7 +1029,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/rank = job.title
lastJob = job
if(jobban_isbanned(user, rank))
HTML += "<font color=red>[rank]</font></td><td><a href='?_src_=prefs;jobbancheck=[rank]'> BANNED</a></td></tr>"
HTML += "<font color=red>[rank]</font></td><td><a href='?_src_=prefs;bancheck=[rank]'> BANNED</a></td></tr>"
continue
var/required_playtime_remaining = job.required_playtime_remaining(user.client)
if(required_playtime_remaining)
@@ -1023,7 +1039,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/available_in_days = job.available_in_days(user.client)
HTML += "<font color=red>[rank]</font></td><td><font color=red> \[IN [(available_in_days)] DAYS\]</font></td></tr>"
continue
if((job_civilian_low & overflow.flag) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
if(!user.client.prefs.pref_species.qualifies_for_rank(rank, user.client.prefs.features))
if(user.client.prefs.pref_species.id == "human")
HTML += "<font color=red>[rank]</font></td><td><font color=red><b> \[MUTANT\]</b></font></td></tr>"
else
HTML += "<font color=red>[rank]</font></td><td><font color=red><b> \[NON-HUMAN\]</b></font></td></tr>"
continue
if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
HTML += "<font color=orange>[rank]</font></td><td></td></tr>"
continue
if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs
@@ -1038,32 +1060,32 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/prefUpperLevel = -1 // level to assign on left click
var/prefLowerLevel = -1 // level to assign on right click
if(GetJobDepartment(job, 1) & job.flag)
prefLevelLabel = "High"
prefLevelColor = "slateblue"
prefUpperLevel = 4
prefLowerLevel = 2
else if(GetJobDepartment(job, 2) & job.flag)
prefLevelLabel = "Medium"
prefLevelColor = "green"
prefUpperLevel = 1
prefLowerLevel = 3
else if(GetJobDepartment(job, 3) & job.flag)
prefLevelLabel = "Low"
prefLevelColor = "orange"
prefUpperLevel = 2
prefLowerLevel = 4
else
prefLevelLabel = "NEVER"
prefLevelColor = "red"
prefUpperLevel = 3
prefLowerLevel = 1
switch(job_preferences["[job.title]"])
if(JP_HIGH)
prefLevelLabel = "High"
prefLevelColor = "slateblue"
prefUpperLevel = 4
prefLowerLevel = 2
if(JP_MEDIUM)
prefLevelLabel = "Medium"
prefLevelColor = "green"
prefUpperLevel = 1
prefLowerLevel = 3
if(JP_LOW)
prefLevelLabel = "Low"
prefLevelColor = "orange"
prefUpperLevel = 2
prefLowerLevel = 4
else
prefLevelLabel = "NEVER"
prefLevelColor = "red"
prefUpperLevel = 3
prefLowerLevel = 1
HTML += "<a class='white' href='?_src_=prefs;preference=job;task=setJobLevel;level=[prefUpperLevel];text=[rank]' oncontextmenu='javascript:return setJobPrefRedirect([prefLowerLevel], \"[rank]\");'>"
if(rank == SSjob.overflow_role)//Overflow is special
if(job_civilian_low & overflow.flag)
if(job_preferences["[SSjob.overflow_role]"] == JP_LOW)
HTML += "<font color=green>Yes</font>"
else
HTML += "<font color=red>No</font>"
@@ -1094,61 +1116,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/datum/preferences/proc/SetJobPreferenceLevel(datum/job/job, level)
if (!job)
return 0
return FALSE
if (level == 1) // to high
// remove any other job(s) set to high
job_civilian_med |= job_civilian_high
job_engsec_med |= job_engsec_high
job_medsci_med |= job_medsci_high
job_civilian_high = 0
job_engsec_high = 0
job_medsci_high = 0
if (level == JP_HIGH) // to high
//Set all other high to medium
for(var/j in job_preferences)
if(job_preferences["[j]"] == JP_HIGH)
job_preferences["[j]"] = JP_MEDIUM
//technically break here
if (job.department_flag == CIVILIAN)
job_civilian_low &= ~job.flag
job_civilian_med &= ~job.flag
job_civilian_high &= ~job.flag
switch(level)
if (1)
job_civilian_high |= job.flag
if (2)
job_civilian_med |= job.flag
if (3)
job_civilian_low |= job.flag
return 1
else if (job.department_flag == ENGSEC)
job_engsec_low &= ~job.flag
job_engsec_med &= ~job.flag
job_engsec_high &= ~job.flag
switch(level)
if (1)
job_engsec_high |= job.flag
if (2)
job_engsec_med |= job.flag
if (3)
job_engsec_low |= job.flag
return 1
else if (job.department_flag == MEDSCI)
job_medsci_low &= ~job.flag
job_medsci_med &= ~job.flag
job_medsci_high &= ~job.flag
switch(level)
if (1)
job_medsci_high |= job.flag
if (2)
job_medsci_med |= job.flag
if (3)
job_medsci_low |= job.flag
return 1
return 0
job_preferences["[job.title]"] = level
return TRUE
/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl)
if(!SSjob || SSjob.occupations.len <= 0)
@@ -1165,64 +1143,29 @@ GLOBAL_LIST_EMPTY(preferences_datums)
ShowChoices(user)
return
if(role == SSjob.overflow_role)
if(job_civilian_low & job.flag)
job_civilian_low &= ~job.flag
else
job_civilian_low |= job.flag
SetChoices(user)
return 1
var/jpval = null
switch(desiredLvl)
if(3)
jpval = JP_LOW
if(2)
jpval = JP_MEDIUM
if(1)
jpval = JP_HIGH
SetJobPreferenceLevel(job, desiredLvl)
if(role == SSjob.overflow_role)
if(job_preferences["[job.title]"] == JP_LOW)
jpval = null
else
jpval = JP_LOW
SetJobPreferenceLevel(job, jpval)
SetChoices(user)
return 1
/datum/preferences/proc/ResetJobs()
job_civilian_high = 0
job_civilian_med = 0
job_civilian_low = 0
job_medsci_high = 0
job_medsci_med = 0
job_medsci_low = 0
job_engsec_high = 0
job_engsec_med = 0
job_engsec_low = 0
/datum/preferences/proc/GetJobDepartment(datum/job/job, level)
if(!job || !level)
return 0
switch(job.department_flag)
if(CIVILIAN)
switch(level)
if(1)
return job_civilian_high
if(2)
return job_civilian_med
if(3)
return job_civilian_low
if(MEDSCI)
switch(level)
if(1)
return job_medsci_high
if(2)
return job_medsci_med
if(3)
return job_medsci_low
if(ENGSEC)
switch(level)
if(1)
return job_engsec_high
if(2)
return job_engsec_med
if(3)
return job_engsec_low
return 0
job_preferences = list()
/datum/preferences/proc/SetQuirks(mob/user)
if(!SSquirks)
@@ -1564,9 +1507,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
eye_color = sanitize_hexcolor(new_eyes)
if("species")
var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_races
var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_race_names
if(result)
var/newtype = GLOB.species_list[result]
var/newtype = GLOB.species_list[GLOB.roundstart_race_names[result]]
pref_species = new newtype()
//let's ensure that no weird shit happens on species swapping.
custom_species = null
@@ -1694,6 +1637,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["tail_human"] = "None"
features["tail_lizard"] = "None"
if("meats")
var/new_meat
new_meat = input(user, "Choose your character's meat type:", "Character Preference") as null|anything in GLOB.meat_types
if(new_meat)
features["meat_type"] = new_meat
if("snout")
var/list/snowflake_snouts_list = list()
for(var/path in GLOB.snouts_list)
@@ -1729,6 +1678,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_horns)
features["horns"] = new_horns
if("horns_color")
var/new_horn_color = input(user, "Choose your character's horn colour:", "Character Preference","#"+horn_color) as color|null
if(new_horn_color)
horn_color = sanitize_hexcolor(new_horn_color)
if("wings")
var/new_wings
new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.r_wings_list
@@ -1763,11 +1717,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["legs"] = new_legs
update_preview_icon()
if("moth_wings")
var/new_moth_wings
new_moth_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.moth_wings_list
if(new_moth_wings)
features["moth_wings"] = new_moth_wings
if("insect_wings")
var/new_insect_wings
new_insect_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_wings_list
if(new_insect_wings)
features["insect_wings"] = new_insect_wings
if("insect_fluffs")
var/new_insect_fluff
new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list
if(new_insect_fluff)
features["insect_fluff"] = new_insect_fluff
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones
@@ -2245,7 +2205,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!is_loadout_slot_available(G.category))
to_chat(user, "<span class='danger'>You cannot take this loadout, as you've already chosen too many of the same category!</span>")
return
if(G.ckeywhitelist && G.ckeywhitelist.len && !(user.ckey in G.ckeywhitelist))
if(G.donoritem && !G.donator_ckey_check(user.ckey))
to_chat(user, "<span class='danger'>This is an item intended for donator use only. You are not authorized to use this item.</span>")
return
if(gear_points >= initial(G.cost))
@@ -2287,6 +2247,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
organ_eyes.old_eye_color = eye_color
character.hair_color = hair_color
character.facial_hair_color = facial_hair_color
character.horn_color = horn_color
character.skin_tone = skin_tone
character.hair_style = hair_style
@@ -2327,7 +2288,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("xenotail" in pref_species.default_features)
character.dna.species.mutant_bodyparts |= "xenotail"
if(("legs" in character.dna.species.mutant_bodyparts) && character.dna.features["legs"] == "Digitigrade Legs")
if("meat_type" in pref_species.default_features)
character.type_of_meat = GLOB.meat_types[features["meat_type"]]
if(("legs" in character.dna.species.mutant_bodyparts) && (character.dna.features["legs"] == "Digitigrade" || character.dna.features["legs"] == "Avian"))
pref_species.species_traits |= DIGITIGRADE
else
pref_species.species_traits -= DIGITIGRADE
+167 -113
View File
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
#define SAVEFILE_VERSION_MAX 20
#define SAVEFILE_VERSION_MAX 23
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -49,6 +49,65 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
pda_style = "mono"
if(current_version < 20)
pda_color = "#808000"
if((current_version < 21) && features["meat_type"] && (features["meat_type"] == null))
features["meat_type"] = "Mammalian"
if(current_version < 22)
job_preferences = list() //It loaded null from nonexistant savefile field.
var/job_civilian_high = 0
var/job_civilian_med = 0
var/job_civilian_low = 0
var/job_medsci_high = 0
var/job_medsci_med = 0
var/job_medsci_low = 0
var/job_engsec_high = 0
var/job_engsec_med = 0
var/job_engsec_low = 0
S["job_civilian_high"] >> job_civilian_high
S["job_civilian_med"] >> job_civilian_med
S["job_civilian_low"] >> job_civilian_low
S["job_medsci_high"] >> job_medsci_high
S["job_medsci_med"] >> job_medsci_med
S["job_medsci_low"] >> job_medsci_low
S["job_engsec_high"] >> job_engsec_high
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
//Can't use SSjob here since this happens right away on login
for(var/job in subtypesof(/datum/job))
var/datum/job/J = job
var/new_value
var/fval = initial(J.flag)
switch(initial(J.department_flag))
if(CIVILIAN)
if(job_civilian_high & fval)
new_value = JP_HIGH
else if(job_civilian_med & fval)
new_value = JP_MEDIUM
else if(job_civilian_low & fval)
new_value = JP_LOW
if(MEDSCI)
if(job_medsci_high & fval)
new_value = JP_HIGH
else if(job_medsci_med & fval)
new_value = JP_MEDIUM
else if(job_medsci_low & fval)
new_value = JP_LOW
if(ENGSEC)
if(job_engsec_high & fval)
new_value = JP_HIGH
else if(job_engsec_med & fval)
new_value = JP_MEDIUM
else if(job_engsec_low & fval)
new_value = JP_LOW
if(new_value)
job_preferences["[initial(J.title)]"] = new_value
else if(current_version < 23) // we are fixing a gamebreaking bug.
job_preferences = list() //It loaded null from nonexistant savefile field.
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
@@ -246,6 +305,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
var/species_id
S["species"] >> species_id
if(species_id)
if(species_id == "avian" || species_id == "aquatic")
species_id = "mammal"
else if(species_id == "moth")
species_id = "insect"
var/newtype = GLOB.species_list[species_id]
if(newtype)
pref_species = new newtype
@@ -254,28 +318,29 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["features["mcolor"]"] , "#FFF")
//Character
S["real_name"] >> real_name
S["nameless"] >> nameless
S["custom_species"] >> custom_species
S["name_is_always_random"] >> be_random_name
S["body_is_always_random"] >> be_random_body
S["gender"] >> gender
S["age"] >> age
S["hair_color"] >> hair_color
S["facial_hair_color"] >> facial_hair_color
S["eye_color"] >> eye_color
S["skin_tone"] >> skin_tone
S["hair_style_name"] >> hair_style
S["facial_style_name"] >> facial_hair_style
S["underwear"] >> underwear
S["undie_color"] >> undie_color
S["undershirt"] >> undershirt
S["shirt_color"] >> shirt_color
S["socks"] >> socks
S["socks_color"] >> socks_color
S["backbag"] >> backbag
S["jumpsuit_style"] >> jumpsuit_style
S["uplink_loc"] >> uplink_spawn_loc
S["real_name"] >> real_name
S["nameless"] >> nameless
S["custom_species"] >> custom_species
S["name_is_always_random"] >> be_random_name
S["body_is_always_random"] >> be_random_body
S["gender"] >> gender
S["age"] >> age
S["hair_color"] >> hair_color
S["facial_hair_color"] >> facial_hair_color
S["eye_color"] >> eye_color
S["skin_tone"] >> skin_tone
S["hair_style_name"] >> hair_style
S["facial_style_name"] >> facial_hair_style
S["underwear"] >> underwear
S["undie_color"] >> undie_color
S["undershirt"] >> undershirt
S["shirt_color"] >> shirt_color
S["socks"] >> socks
S["socks_color"] >> socks_color
S["horn_color"] >> horn_color
S["backbag"] >> backbag
S["jumpsuit_style"] >> jumpsuit_style
S["uplink_loc"] >> uplink_spawn_loc
S["feature_mcolor"] >> features["mcolor"]
S["feature_lizard_tail"] >> features["tail_lizard"]
S["feature_lizard_snout"] >> features["snout"]
@@ -284,29 +349,23 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_lizard_spines"] >> features["spines"]
S["feature_lizard_body_markings"] >> features["body_markings"]
S["feature_lizard_legs"] >> features["legs"]
S["feature_moth_wings"] >> features["moth_wings"]
S["feature_human_tail"] >> features["tail_human"]
S["feature_human_ears"] >> features["ears"]
S["feature_insect_wings"] >> features["insect_wings"]
S["feature_insect_fluff"] >> features["insect_fluff"]
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
S[savefile_slot_name] >> custom_names[custom_name_id]
S["preferred_ai_core_display"] >> preferred_ai_core_display
S["prefered_security_department"] >> prefered_security_department
S["preferred_ai_core_display"] >> preferred_ai_core_display
S["prefered_security_department"] >> prefered_security_department
//Jobs
S["joblessrole"] >> joblessrole
S["job_civilian_high"] >> job_civilian_high
S["job_civilian_med"] >> job_civilian_med
S["job_civilian_low"] >> job_civilian_low
S["job_medsci_high"] >> job_medsci_high
S["job_medsci_med"] >> job_medsci_med
S["job_medsci_low"] >> job_medsci_low
S["job_engsec_high"] >> job_engsec_high
S["job_engsec_med"] >> job_engsec_med
S["job_engsec_low"] >> job_engsec_low
//Load prefs
S["job_preferences"] >> job_preferences
//Quirks
S["all_quirks"] >> all_quirks
@@ -325,6 +384,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
S["feature_taur"] >> features["taur"]
S["feature_mam_snouts"] >> features["mam_snouts"]
S["feature_meat"] >> features["meat_type"]
//Xeno features
S["feature_xeno_tail"] >> features["xenotail"]
S["feature_xeno_dors"] >> features["xenodorsal"]
@@ -374,11 +434,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Sanitize
real_name = reject_bad_name(real_name)
gender = sanitize_gender(gender, TRUE, TRUE)
real_name = reject_bad_name(real_name)
gender = sanitize_gender(gender, TRUE, TRUE)
if(!real_name)
real_name = random_unique_name(gender)
custom_species = reject_bad_name(custom_species)
real_name = random_unique_name(gender)
custom_species = reject_bad_name(custom_species)
for(var/custom_name_id in GLOB.preferences_custom_names)
var/namedata = GLOB.preferences_custom_names[custom_name_id]
custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"])
@@ -388,57 +448,55 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(!features["mcolor"] || features["mcolor"] == "#000")
features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
if(gender == MALE)
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list)
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list)
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_male_list)
else
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list)
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list)
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_female_list)
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
undie_color = sanitize_hexcolor(undie_color, 6, 1, initial(undie_color))
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
shirt_color = sanitize_hexcolor(shirt_color, 6, 1, initial(shirt_color))
socks = sanitize_inlist(socks, GLOB.socks_list)
socks_color = sanitize_hexcolor(socks_color, 6, 1, initial(socks_color))
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
hair_color = sanitize_hexcolor(hair_color, 3, 0)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color))
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color))
socks = sanitize_inlist(socks, GLOB.socks_list)
socks_color = sanitize_hexcolor(socks_color, 3, FALSE, initial(socks_color))
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
hair_color = sanitize_hexcolor(hair_color, 3, 0)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
horn_color = sanitize_hexcolor(horn_color, 3, FALSE)
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list)
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low))
job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high))
job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med))
job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low))
job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high))
job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med))
job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low))
//Validate job prefs
for(var/j in job_preferences)
if(job_preferences["[j]"] != JP_LOW && job_preferences["[j]"] != JP_MEDIUM && job_preferences["[j]"] != JP_HIGH)
job_preferences -= j
all_quirks = SANITIZE_LIST(all_quirks)
positive_quirks = SANITIZE_LIST(positive_quirks)
negative_quirks = SANITIZE_LIST(negative_quirks)
neutral_quirks = SANITIZE_LIST(neutral_quirks)
neutral_quirks = SANITIZE_LIST(neutral_quirks)
cit_character_pref_load(S)
@@ -460,31 +518,32 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.)
//Character
WRITE_FILE(S["real_name"] , real_name)
WRITE_FILE(S["nameless"] , nameless)
WRITE_FILE(S["custom_species"] , custom_species)
WRITE_FILE(S["name_is_always_random"] , be_random_name)
WRITE_FILE(S["body_is_always_random"] , be_random_body)
WRITE_FILE(S["gender"] , gender)
WRITE_FILE(S["age"] , age)
WRITE_FILE(S["hair_color"] , hair_color)
WRITE_FILE(S["facial_hair_color"] , facial_hair_color)
WRITE_FILE(S["eye_color"] , eye_color)
WRITE_FILE(S["skin_tone"] , skin_tone)
WRITE_FILE(S["hair_style_name"] , hair_style)
WRITE_FILE(S["facial_style_name"] , facial_hair_style)
WRITE_FILE(S["underwear"] , underwear)
WRITE_FILE(S["undie_color"] , undie_color)
WRITE_FILE(S["undershirt"] , undershirt)
WRITE_FILE(S["shirt_color"] , shirt_color)
WRITE_FILE(S["socks"] , socks)
WRITE_FILE(S["socks_color"] , socks_color)
WRITE_FILE(S["backbag"] , backbag)
WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style)
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
WRITE_FILE(S["species"] , pref_species.id)
WRITE_FILE(S["real_name"] , real_name)
WRITE_FILE(S["nameless"] , nameless)
WRITE_FILE(S["custom_species"] , custom_species)
WRITE_FILE(S["name_is_always_random"] , be_random_name)
WRITE_FILE(S["body_is_always_random"] , be_random_body)
WRITE_FILE(S["gender"] , gender)
WRITE_FILE(S["age"] , age)
WRITE_FILE(S["hair_color"] , hair_color)
WRITE_FILE(S["facial_hair_color"] , facial_hair_color)
WRITE_FILE(S["eye_color"] , eye_color)
WRITE_FILE(S["skin_tone"] , skin_tone)
WRITE_FILE(S["hair_style_name"] , hair_style)
WRITE_FILE(S["facial_style_name"] , facial_hair_style)
WRITE_FILE(S["underwear"] , underwear)
WRITE_FILE(S["undie_color"] , undie_color)
WRITE_FILE(S["undershirt"] , undershirt)
WRITE_FILE(S["shirt_color"] , shirt_color)
WRITE_FILE(S["socks"] , socks)
WRITE_FILE(S["socks_color"] , socks_color)
WRITE_FILE(S["horn_color"] , horn_color)
WRITE_FILE(S["backbag"] , backbag)
WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style)
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
WRITE_FILE(S["species"] , pref_species.id)
WRITE_FILE(S["feature_mcolor"] , features["mcolor"])
WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"])
WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"])
WRITE_FILE(S["feature_human_tail"] , features["tail_human"])
WRITE_FILE(S["feature_lizard_snout"] , features["snout"])
WRITE_FILE(S["feature_lizard_horns"] , features["horns"])
@@ -492,28 +551,23 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_lizard_frills"] , features["frills"])
WRITE_FILE(S["feature_lizard_spines"] , features["spines"])
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
WRITE_FILE(S["feature_moth_wings"] , features["moth_wings"])
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"])
WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"])
WRITE_FILE(S["feature_meat"] , features["meat_type"])
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
WRITE_FILE(S[savefile_slot_name],custom_names[custom_name_id])
WRITE_FILE(S["preferred_ai_core_display"] , preferred_ai_core_display)
WRITE_FILE(S["prefered_security_department"] , prefered_security_department)
WRITE_FILE(S["preferred_ai_core_display"] , preferred_ai_core_display)
WRITE_FILE(S["prefered_security_department"] , prefered_security_department)
//Jobs
WRITE_FILE(S["joblessrole"] , joblessrole)
WRITE_FILE(S["job_civilian_high"] , job_civilian_high)
WRITE_FILE(S["job_civilian_med"] , job_civilian_med)
WRITE_FILE(S["job_civilian_low"] , job_civilian_low)
WRITE_FILE(S["job_medsci_high"] , job_medsci_high)
WRITE_FILE(S["job_medsci_med"] , job_medsci_med)
WRITE_FILE(S["job_medsci_low"] , job_medsci_low)
WRITE_FILE(S["job_engsec_high"] , job_engsec_high)
WRITE_FILE(S["job_engsec_med"] , job_engsec_med)
WRITE_FILE(S["job_engsec_low"] , job_engsec_low)
//Write prefs
WRITE_FILE(S["job_preferences"] , job_preferences)
//Quirks
WRITE_FILE(S["all_quirks"] , all_quirks)
+11 -21
View File
@@ -1,3 +1,6 @@
GLOBAL_VAR_INIT(LOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour.
GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC")
/client/verb/looc(msg as text)
set name = "LOOC"
set desc = "Local OOC, seen only by those in view."
@@ -59,30 +62,17 @@
continue //Also handled later.
if(C.prefs.toggles & CHAT_OOC)
// var/display_name = src.key
// if(holder)
// if(holder.fakekey)
// if(C.holder)
// display_name = "[holder.fakekey]/([src.key])"
// else
// display_name = holder.fakekey
to_chat(C,"<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")
if(GLOB.LOOC_COLOR)
to_chat(C, "<font color='[GLOB.LOOC_COLOR]'><b><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></b></font>")
else
to_chat(C, "<span class='looc'><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></span>")
for(var/client/C in GLOB.admins)
if(C.prefs.toggles & CHAT_OOC)
var/prefix = "(R)LOOC"
if (C.mob in heard)
prefix = "LOOC"
to_chat(C,"<font color='#6699CC'><span class='ooc'>[ADMIN_FLW(usr)]<span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")
/*for(var/mob/dead/observer/G in world)
if(!G.client)
continue
var/client/C = G.client
if (C in GLOB.admins)
continue //handled earlier.
if(C.prefs.toggles & CHAT_OOC)
var/prefix = "(G)LOOC"
if (C.mob in heard)
prefix = "LOOC"
to_chat(C,"<font color='#6699CC'><span class='ooc'><span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")*/
if(GLOB.LOOC_COLOR)
to_chat(C, "<font color='[GLOB.LOOC_COLOR]'><b>[ADMIN_FLW(usr)] <span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></b></font>")
else
to_chat(C, "<span class='looc'>[ADMIN_FLW(usr)] <span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span>")
@@ -6,21 +6,18 @@
name = "purple sunglasses"
icon_state = "sun_purple"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/sunglasses/star
name = "star-shaped sunglasses"
desc = "Novelty sunglasses, both lenses are in the shape of a star."
icon_state = "sun_star"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/sunglasses/rockstar
name = "red star-shaped sunglasses"
desc = "Novelty sunglasses with a fancy silver frame and two red-tinted star-shaped lenses. You should probably stomp on them and get a pair of normal ones."
icon_state = "sun_star_silver"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/gglasses
name = "Green Glasses"
@@ -28,7 +25,6 @@
icon_state = "gglasses"
item_state = "gglasses"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/welding/superior
name = "superior welding goggles"
@@ -36,7 +32,6 @@
icon_state = "rwelding-g"
item_state = "rwelding-g"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
actions_types = list(/datum/action/item_action/toggle)
flash_protect = 2
tint = 1
-1
View File
@@ -4,4 +4,3 @@
icon = 'modular_citadel/icons/obj/clothing/cit_hats.dmi'
icon_state = "hunter"
item_state = "hunter_worn"
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
+11
View File
@@ -129,3 +129,14 @@
icon_state = "emtsoft"
item_color = "emt"
dog_fashion = null
/obj/item/clothing/head/soft/baseball
name = "baseball cap"
desc = "It's a robust baseball hat, this one belongs to syndicate major league team."
icon_state = "baseballsoft"
item_color = "baseballsoft"
item_state = "baseballsoft"
flags_inv = HIDEEYES|HIDEFACE
armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90)
strip_delay = 90 //You dont take a Major Leage cap
dog_fashion = null
-26
View File
@@ -1,4 +1,3 @@
/obj/item/clothing/head/helmet/dredd
name = "Judge Helmet"
desc = "Judge, Jury, and Executioner."
@@ -12,7 +11,6 @@
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
strip_delay = 80
dog_fashion = null
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/aviatorhelmet
name = "Aviator Helmet"
@@ -21,15 +19,12 @@
item_state = "aviator_helmet"
icon_state = "aviator_helmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/biker
name = "Biker's Helmet"
desc = "This helmet should protect you from russians and masked vigilantes."
armor = list(melee = 25, bullet = 15, laser = 20, energy = 10, bomb = 10, bio = 0, rad = 0)
icon_state = "biker_helmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
/obj/item/clothing/head/helmet/richard
@@ -38,7 +33,6 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
icon_state = "richard"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
/obj/item/clothing/head/helmet/megahelmet
@@ -47,7 +41,6 @@
icon_state = "megahelmet"
item_state = "megahelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
siemens_coefficient = 1
/obj/item/clothing/head/helmet/protohelmet
@@ -56,7 +49,6 @@
icon_state = "protohelmet"
item_state = "protohelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
siemens_coefficient = 1
/obj/item/clothing/head/helmet/megaxhelmet
@@ -65,7 +57,6 @@
icon_state = "megaxhelmet"
item_state = "megaxhelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/joehelmet
name = "Sniper Helmet"
@@ -74,7 +65,6 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
item_state = "joehelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/doomguy
name = "Doomguy's helmet"
@@ -83,7 +73,6 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
item_state = "doom"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
armor = list(melee = 50, bullet = 40, laser = 40,energy = 40, bomb = 5, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/neorussian
@@ -92,8 +81,6 @@
icon_state = "nr_helmet"
item_state = "nr_helmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/stalhelm
name = "Stalhelm"
@@ -101,7 +88,6 @@
icon_state = "stalhelm"
item_state = "stalhelm"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/panzer
name = "Panzer Cap"
@@ -109,7 +95,6 @@
icon_state = "panzercap"
item_state = "panzercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/naziofficer
name = "Officer Cap"
@@ -117,8 +102,6 @@
icon_state = "officercap"
item_state = "officercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/russobluecamohat
name = "russian blue camo beret"
@@ -133,7 +116,6 @@
icon_state = "russofurhat"
item_state = "russofurhat"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/squatter_hat
name = "slav squatter hat"
@@ -141,7 +123,6 @@
item_state = "squatter_hat"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
desc = "Cyka blyat."
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/snake
name = "snake head"
@@ -149,8 +130,6 @@
icon_state = "snakehead"
item_state = "snakehead"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/mummy_rags
name = "mummy rags"
desc = "Ancient rags taken off from some mummy."
@@ -158,7 +137,6 @@
item_state = "mummy"
item_color = "mummy"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
/obj/item/clothing/head/clownpiece
@@ -167,7 +145,6 @@
icon_state = "clownpiece"
item_state = "clownpiece"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/mitre
name = "mitre"
@@ -175,7 +152,6 @@
icon_state = "mitre"
item_state = "mitre"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/tinfoil
name = "tinfoil hat"
@@ -183,7 +159,6 @@
icon_state = "foilhat"
item_state = "paper"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
siemens_coefficient = 2
/obj/item/clothing/head/celtic
@@ -192,4 +167,3 @@
icon_state = "celtic_crown"
item_state = "celtic_crown"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
-3
View File
@@ -3,18 +3,15 @@
desc = "Some pranksters are truly magical."
icon_state = "wizzclown"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
/obj/item/clothing/mask/chapmask
name = "venetian mask"
desc = "A plain porcelain mask that covers the entire face. Standard attire for particularly unspeakable religions. The eyes are wide shut."
icon_state = "chapmask"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
/obj/item/clothing/mask/neorussian
name = "neo-Russian mask"
desc = "Somehow, it makes you act and look way more polite than usual."
icon_state = "nr_mask"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
+37 -6
View File
@@ -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,9 +177,17 @@
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,\
+164
View File
@@ -0,0 +1,164 @@
/datum/outfit/plasmaman/bar
name = "Bartender Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/enviroslacks
/datum/outfit/plasmaman/chef
name = "Chef Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/chef
/datum/outfit/plasmaman/botany
name = "Botany Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/botany
uniform = /obj/item/clothing/under/plasmaman/botany
/datum/outfit/plasmaman/curator
name = "Curator Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/curator
uniform = /obj/item/clothing/under/plasmaman/curator
/datum/outfit/plasmaman/chaplain
name = "Chaplain Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain
uniform = /obj/item/clothing/under/plasmaman/chaplain
/datum/outfit/plasmaman/janitor
name = "Janitor Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/janitor
uniform = /obj/item/clothing/under/plasmaman/janitor
/datum/outfit/plasmaman/hop
name = "Head of Personell Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/hop
uniform = /obj/item/clothing/under/plasmaman/hop
/datum/outfit/plasmaman/captain
name = "Captain Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/captain
uniform = /obj/item/clothing/under/plasmaman/captain
/datum/outfit/plasmaman/security
name = "Security Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security
uniform = /obj/item/clothing/under/plasmaman/security
ears = /obj/item/radio/headset/headset_sec
/datum/outfit/plasmaman/detective
name = "Detective Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/enviroslacks
/datum/outfit/plasmaman/warden
name = "Warden Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden
uniform = /obj/item/clothing/under/plasmaman/security/warden
/datum/outfit/plasmaman/hos
name = "Head of Security Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos
uniform = /obj/item/clothing/under/plasmaman/security/hos
/datum/outfit/plasmaman/cargo
name = "Cargo Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/cargo
uniform = /obj/item/clothing/under/plasmaman/cargo
/datum/outfit/plasmaman/mining
name = "Mining Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/mining
uniform = /obj/item/clothing/under/plasmaman/mining
/datum/outfit/plasmaman/medical
name = "Medical Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/medical
uniform = /obj/item/clothing/under/plasmaman/medical
/datum/outfit/plasmaman/cmo
name = "Chief Medical Officer Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/cmo
uniform = /obj/item/clothing/under/plasmaman/cmo
/datum/outfit/plasmaman/viro
name = "Virology Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/viro
uniform = /obj/item/clothing/under/plasmaman/viro
/datum/outfit/plasmaman/chemist
name = "Chemist Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/chemist
uniform = /obj/item/clothing/under/plasmaman/chemist
/datum/outfit/plasmaman/genetics
name = "Genetics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/genetics
uniform = /obj/item/clothing/under/plasmaman/genetics
/datum/outfit/plasmaman/science
name = "Science Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/science
uniform = /obj/item/clothing/under/plasmaman/science
/datum/outfit/plasmaman/rd
name = "Research Director Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/rd
uniform = /obj/item/clothing/under/plasmaman/rd
/datum/outfit/plasmaman/robotics
name = "Robotics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/robotics
uniform = /obj/item/clothing/under/plasmaman/robotics
/datum/outfit/plasmaman/engineering
name = "Engineering Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/engineering
uniform = /obj/item/clothing/under/plasmaman/engineering
/datum/outfit/plasmaman/ce
name = "Chief Engineer Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
uniform = /obj/item/clothing/under/plasmaman/engineering/ce
/datum/outfit/plasmaman/atmospherics
name = "Atmospherics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics
uniform = /obj/item/clothing/under/plasmaman/atmospherics
/datum/outfit/plasmaman/mime
name = "Plasmamime"
head = /obj/item/clothing/head/helmet/space/plasmaman/mime
uniform = /obj/item/clothing/under/plasmaman/mime
mask = /obj/item/clothing/mask/gas/mime
/datum/outfit/plasmaman/clown
name = "Plasmaclown"
head = /obj/item/clothing/head/helmet/space/plasmaman/clown
uniform = /obj/item/clothing/under/plasmaman/clown
mask = /obj/item/clothing/mask/gas/clown_hat
+11 -12
View File
@@ -62,6 +62,16 @@
desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them."
icon_state = "galoshes_dry"
/obj/item/clothing/shoes/sneakers/noslip
desc = "A pair of black shoes, they have the soles of galoshes making them unable to be slipped on a wet surface."
name = "black shoes"
icon_state = "black"
permeability_coefficient = 0.30
clothing_flags = NOSLIP
strip_delay = 50
equip_delay_other = 50
resistance_flags = NONE
/obj/item/clothing/shoes/galoshes/dry/step_action()
var/turf/open/t_loc = get_turf(src)
SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY)
@@ -69,10 +79,8 @@
/obj/item/clothing/shoes/clown_shoes
desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!"
name = "clown shoes"
icon_state = "clown"
item_state = "clown_shoes"
icon_state = "clown_shoes"
slowdown = SHOES_SLOWDOWN+1
item_color = "clown"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
/obj/item/clothing/shoes/clown_shoes/Initialize()
@@ -98,7 +106,6 @@
name = "jackboots"
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
icon_state = "jackboots"
item_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
item_color = "hosred"
@@ -115,7 +122,6 @@
name = "winter boots"
desc = "Boots lined with 'synthetic' animal fur."
icon_state = "winterboots"
item_state = "winterboots"
permeability_coefficient = 0.15
cold_protection = FEET|LEGS
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
@@ -127,7 +133,6 @@
name = "work boots"
desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar."
icon_state = "workboots"
item_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
permeability_coefficient = 0.15
@@ -145,7 +150,6 @@
name = "\improper Nar'Sien invoker boots"
desc = "A pair of boots worn by the followers of Nar'Sie."
icon_state = "cult"
item_state = "cult"
item_color = "cult"
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
@@ -178,7 +182,6 @@
name = "roman sandals"
desc = "Sandals with buckled leather straps on it."
icon_state = "roman"
item_state = "roman"
strip_delay = 100
equip_delay_other = 100
permeability_coefficient = 0.9
@@ -187,14 +190,12 @@
name = "griffon boots"
desc = "A pair of costume boots fashioned after bird talons."
icon_state = "griffinboots"
item_state = "griffinboots"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
/obj/item/clothing/shoes/bhop
name = "jump boots"
desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement."
icon_state = "jetboots"
item_state = "jetboots"
item_color = "hosred"
resistance_flags = FIRE_PROOF
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
@@ -252,7 +253,6 @@
name = "Wheely-Heels"
desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel
icon_state = "wheelys"
item_state = "wheelys"
actions_types = list(/datum/action/item_action/wheelys)
var/wheelToggle = FALSE //False means wheels are not popped out
var/obj/vehicle/ridden/scooter/wheelys/W
@@ -291,7 +291,6 @@
name = "Kindle Kicks"
desc = "They'll sure kindle something in you, and it's not childhood nostalgia..."
icon_state = "kindleKicks"
item_state = "kindleKicks"
actions_types = list(/datum/action/item_action/kindleKicks)
var/lightCycle = 0
var/active = FALSE
-17
View File
@@ -5,7 +5,6 @@
icon_state = "leather"
item_color = "leather"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/magboots/deathsquad
@@ -14,7 +13,6 @@
icon_state = "DS-magboots0"
magboot_state = "DS-magboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -23,7 +21,6 @@
name = "atmospherics magboots"
icon_state = "atmosmagboots0"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
magboot_state = "atmosmagboots"
resistance_flags = FIRE_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -33,7 +30,6 @@
desc = "Simon's Shoes."
icon_state = "simonshoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/kneesocks
@@ -41,7 +37,6 @@
desc = "A pair of girly knee-high socks."
icon_state = "kneesock"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/jestershoes
@@ -49,7 +44,6 @@
desc = "As worn by the clowns of old."
icon_state = "jestershoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/aviatorboots
@@ -57,7 +51,6 @@
desc = "Boots suitable for just about any occasion."
icon_state = "aviator_boots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/libertyshoes
@@ -65,7 +58,6 @@
desc = "Freedom isn't free, neither were these shoes."
icon_state = "libertyshoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/megaboots
@@ -73,7 +65,6 @@
desc = "Large armored boots, very weak to large spikes."
icon_state = "megaboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/protoboots
@@ -81,7 +72,6 @@
desc = "Functionally identical to the DRN-001 model's boots, but in red."
icon_state = "protoboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/megaxboots
@@ -89,7 +79,6 @@
desc = "Regardless of how much stronger these boots are than the DRN-001 model's, they're still extremely easy to pierce with a large spike."
icon_state = "megaxboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/joeboots
@@ -97,7 +86,6 @@
desc = "Nearly identical to the Prototype's boots, except in black."
icon_state = "joeboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/doomguy
@@ -105,7 +93,6 @@
desc = "If you look closely, you might see skull fragments still buried in these boots."
icon_state = "doom"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/rottenshoes
@@ -113,7 +100,6 @@
desc = "These shoes seem perfect for sneaking around."
icon_state = "rottenshoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/sandal/slippers
@@ -121,7 +107,6 @@
icon_state = "slippers"
desc = "For the wizard that puts comfort first. Who's going to laugh?"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/slippers_worn
@@ -129,7 +114,6 @@
desc = "Fluffy..."
icon_state = "slippers_worn"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/jackboots/neorussian
@@ -137,5 +121,4 @@
desc = "Tovarish, no one will realize you stepped on a pile of shit if your pair already looks like shit."
icon_state = "nr_boots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -22,6 +22,7 @@
resistance_flags = NONE
dog_fashion = null
mutantrace_variation = MUTANTRACE_VARIATION
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
/obj/item/clothing/suit/space
name = "space suit"
@@ -44,4 +45,5 @@
strip_delay = 80
equip_delay_other = 80
resistance_flags = NONE
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //rated for cosmic radation :honk:
tauric = TRUE //Citadel Add for tauric hardsuits
+4 -4
View File
@@ -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()
. = ..()
+172 -3
View File
@@ -12,7 +12,7 @@
var/next_extinguish = 0
var/extinguish_cooldown = 100
var/extinguishes_left = 10
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..()
@@ -45,12 +45,18 @@
resistance_flags = FIRE_PROOF
var/brightness_on = 4 //luminosity when the light is on
var/on = FALSE
var/light_overlay = "envirohelm-light"
actions_types = list(/datum/action/item_action/toggle_helmet_light)
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user)
if(!light_overlay)
return
on = !on
icon_state = "[initial(icon_state)][on ? "-light":""]"
item_state = icon_state
if(!on)
cut_overlay(light_overlay)
else
add_overlay(light_overlay)
user.update_inv_head() //So the mob overlay updates
if(on)
@@ -61,3 +67,166 @@
for(var/X in actions)
var/datum/action/A=X
A.UpdateButtonIcon()
/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file)
. = ..()
if(!isinhands && on)
. += mutable_appearance(icon_file, light_overlay)
/obj/item/clothing/head/helmet/space/plasmaman/security
name = "security plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables."
icon_state = "security_envirohelm"
item_state = "security_envirohelm"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
/obj/item/clothing/head/helmet/space/plasmaman/security/warden
name = "warden's plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security."
icon_state = "warden_envirohelm"
item_state = "warden_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/security/hos
name = "head of security's plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for the head of security, manacing black with red stripes, to differenciate them from other members of security."
icon_state = "hos_envirohelm"
item_state = "hos_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/medical
name = "medical's plasma envirosuit helmet"
desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much."
icon_state = "doctor_envirohelm"
item_state = "doctor_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/cmo
name = "chief medical officer's plasma envirosuit helmet"
desc = "A blue and white envriohelmet designed for the chief medical officer."
icon_state = "cmo_envirohelm"
item_state = "cmo_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/genetics
name = "geneticist's plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for geneticists."
icon_state = "geneticist_envirohelm"
item_state = "geneticist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/viro
name = "virology plasma envirosuit helmet"
desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create."
icon_state = "virologist_envirohelm"
item_state = "virologist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/chemist
name = "chemistry plasma envirosuit helmet"
desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face."
icon_state = "chemist_envirohelm"
item_state = "chemist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/science
name = "science plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for scientists."
icon_state = "scientist_envirohelm"
item_state = "scientist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/rd
name = "research director's plasma envirosuit helmet"
desc = "A sturdier plasmaman envirohelmet designed for research directors."
icon_state = "rd_envirohelm"
item_state = "rd_envirohelm"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
/obj/item/clothing/head/helmet/space/plasmaman/robotics
name = "robotics plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for roboticists."
icon_state = "roboticist_envirohelm"
item_state = "roboticist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/engineering
name = "engineering plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
icon_state = "engineer_envirohelm"
item_state = "engineer_envirohelm"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75)
/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
name = "chief engineer's plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for the chief engineer, white with gold stripes designed for high visibility."
icon_state = "ce_envirohelm"
item_state = "ce_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/atmospherics
name = "atmospherics plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue."
icon_state = "atmos_envirohelm"
item_state = "atmos_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/cargo
name = "cargo plasma envirosuit helmet"
desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters."
icon_state = "cargo_envirohelm"
item_state = "cargo_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/mining
name = "mining plasma envirosuit helmet"
desc = "A khaki helmet given to plasmamen miners operating on lavaland."
icon_state = "explorer_envirohelm"
item_state = "explorer_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/chaplain
name = "chaplain's plasma envirosuit helmet"
desc = "An envirohelmet specially designed for only the most pious of plasmamen."
icon_state = "chap_envirohelm"
item_state = "chap_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/white
name = "white plasma envirosuit helmet"
desc = "A generic white envirohelm."
icon_state = "white_envirohelm"
item_state = "white_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/hop
name = "head of personell's plasma envirosuit helmet"
desc = "A finely tailored azure envirohelm designed for head of personell."
icon_state = "hop_envirohelm"
item_state = "hop_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/captain
name = "captain's plasma envirosuit helmet"
desc = "A blue and gold envirohelm designed for the station's captain, nonetheless. Made of superior materials to protect them from the station hazards and more."
icon_state = "captain_envirohelm"
item_state = "captain_envirohelm"
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 85)
/obj/item/clothing/head/helmet/space/plasmaman/curator
name = "curator's plasma envirosuit helmet"
desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike."
icon_state = "prototype_envirohelm"
item_state = "prototype_envirohelm"
light_overlay = null
actions_types = list()
/obj/item/clothing/head/helmet/space/plasmaman/botany
name = "botany plasma envirosuit helmet"
desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries."
icon_state = "botany_envirohelm"
item_state = "botany_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/janitor
name = "janitor's plasma envirosuit helmet"
desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor."
icon_state = "janitor_envirohelm"
item_state = "janitor_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/mime
name = "mime envirosuit helmet"
desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful."
icon_state = "mime_envirohelm"
item_state = "mime_envirohelm"
light_overlay = "mime_envirohelm-light"
/obj/item/clothing/head/helmet/space/plasmaman/clown
name = "clown envirosuit helmet"
desc = "The make-up is painted on, it's a miracle it doesn't chip. <i>'HONK!'</i>"
icon_state = "clown_envirohelm"
item_state = "clown_envirohelm"
light_overlay = "clown_envirohelm-light"
+1
View File
@@ -5,6 +5,7 @@
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
slot_flags = ITEM_SLOT_OCLOTHING
body_parts_covered = CHEST
var/blood_overlay_type = "suit"
var/togglename = null
var/suittoggled = FALSE
-1
View File
@@ -1,6 +1,5 @@
/obj/item/clothing/suit/armor
allowed = null
body_parts_covered = CHEST
cold_protection = CHEST|GROIN
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN
+2 -2
View File
@@ -7,7 +7,7 @@
icon_state = "qmcloak"
item_state = "qmcloak"
w_class = WEIGHT_CLASS_SMALL
body_parts_covered = CHEST|GROIN|LEGS|ARMS
body_parts_covered = CHEST|LEGS|ARMS
/obj/item/clothing/head/cloakhood
name = "cloak hood"
@@ -62,7 +62,7 @@
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
body_parts_covered = CHEST|GROIN|ARMS
body_parts_covered = CHEST|ARMS|LEGS
/obj/item/clothing/head/hooded/cloakhood/goliath
name = "goliath cloak hood"
+26 -6
View File
@@ -23,30 +23,48 @@
allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/assembly/flash/handheld, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
//Chaplain
/obj/item/clothing/suit/nun
/obj/item/clothing/suit/chaplain
name = "chaplain suit"
desc = "A piece of clothing adorned by the gods of Coding. Should never exist in this mortal realm."
allowed = list(/obj/item/storage/book/bible, HOLY_WEAPONS, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/suit/chaplain/nun
name = "nun robe"
desc = "Maximum piety in this star system."
icon_state = "nun"
item_state = "nun"
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
flags_inv = HIDESHOES|HIDEJUMPSUIT
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/suit/studentuni
/obj/item/clothing/suit/chaplain/studentuni
name = "student robe"
desc = "The uniform of a bygone institute of learning."
icon_state = "studentuni"
item_state = "studentuni"
body_parts_covered = ARMS|CHEST
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/suit/witchhunter
/obj/item/clothing/suit/chaplain/witchhunter
name = "witchunter garb"
desc = "This worn outfit saw much use back in the day."
icon_state = "witchhunter"
item_state = "witchhunter"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/suit/chaplain/pharaoh
name = "pharaoh tunic"
desc = "Lavish space tomb not included."
icon_state = "pharaoh"
icon_state = "pharaoh"
body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/chaplain/holidaypriest
name = "holiday priest"
desc = "This is a nice holiday, my son."
icon_state = "holidaypriest"
item_state = "w_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
//Chef
/obj/item/clothing/suit/toggle/chef
@@ -135,6 +153,7 @@
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "suspenders"
blood_overlay_type = "armor" //it's the less thing that I can put here
body_parts_covered = NONE
//Security
/obj/item/clothing/suit/security/officer
@@ -197,3 +216,4 @@
item_state = "techpriesthood"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEEARS
mutantrace_variation = MUTANTRACE_VARIATION
+20 -28
View File
@@ -67,6 +67,7 @@
item_state = "death"
flags_1 = CONDUCT_1
fire_resist = T0C+5200
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -75,6 +76,7 @@
desc = "this pretty much looks ridiculous" //Needs no fixing
icon_state = "justice"
item_state = "justice"
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -100,14 +102,14 @@
desc = "A fancy purple apron for a stylish person."
icon_state = "purplebartenderapron"
item_state = "purplebartenderapron"
body_parts_covered = CHEST|GROIN|LEGS
body_parts_covered = CHEST
/obj/item/clothing/suit/syndicatefake
name = "black and red space suit replica"
icon_state = "syndicate-black-red"
item_state = "syndicate-black-red"
desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = WEIGHT_CLASS_NORMAL
body_parts_covered = CHEST|ARMS|GROIN|LEGS|FEET|HANDS
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
resistance_flags = NONE
@@ -154,7 +156,7 @@
icon_state = "owl_wings"
item_state = "owl_wings"
togglename = "wings"
body_parts_covered = ARMS|CHEST
body_parts_covered = ARMS
actions_types = list(/datum/action/item_action/toggle_wings)
/obj/item/clothing/suit/toggle/owlwings/Initialize()
@@ -167,16 +169,6 @@
icon_state = "griffin_wings"
item_state = "griffin_wings"
/obj/item/clothing/suit/holidaypriest
name = "holiday priest"
desc = "This is a nice holiday, my son."
icon_state = "holidaypriest"
item_state = "w_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/suit/cardborg
name = "cardborg suit"
desc = "An ordinary cardboard box with holes cut in the sides."
@@ -219,6 +211,7 @@
desc = "Your classic, non-racist poncho."
icon_state = "classicponcho"
item_state = "classicponcho"
body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/poncho/green
name = "green poncho"
@@ -255,7 +248,7 @@
desc = "A costume made from 'synthetic' carp scales, it smells."
icon_state = "carp_casual"
item_state = "labcoat"
body_parts_covered = CHEST|GROIN|ARMS
body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun)
@@ -275,9 +268,7 @@
desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
icon_state = "ian"
item_state = "labcoat"
body_parts_covered = CHEST|GROIN|ARMS
//cold_protection = CHEST|GROIN|ARMS
//min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
allowed = list()
hoodtype = /obj/item/clothing/head/hooded/ian_hood
dog_fashion = /datum/dog_fashion/back
@@ -287,8 +278,6 @@
desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits."
icon_state = "ian"
body_parts_covered = HEAD
//cold_protection = HEAD
//min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
/obj/item/clothing/suit/hooded/bee_costume // It's Hip!
@@ -314,7 +303,7 @@
desc = "A horribly bloated suit made from human skins."
icon_state = "lingspacesuit"
item_state = "labcoat"
body_parts_covered = CHEST|GROIN|ARMS
body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET|HANDS
allowed = list()
actions_types = list(/datum/action/item_action/toggle_human_head)
hoodtype = /obj/item/clothing/head/hooded/human_head
@@ -355,18 +344,21 @@
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it, but it's pretty close. Good for sleeping in."
icon_state = "ianshirt"
item_state = "ianshirt"
body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/nerdshirt
name = "gamer shirt"
desc = "A baggy shirt with vintage game character Phanic the Weasel. Why would anyone wear this?"
icon_state = "nerdshirt"
item_state = "nerdshirt"
body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
name = "Vape Naysh shirt"
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
icon_state = "vapeshirt"
item_state = "vapeshirt"
body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/jacket
name = "bomber jacket"
@@ -374,7 +366,7 @@
icon_state = "bomberjacket"
item_state = "brownjsuit"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/radio)
body_parts_covered = CHEST|GROIN|ARMS
body_parts_covered = CHEST|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
@@ -399,6 +391,7 @@
desc = "A thick jacket with a rubbery, water-resistant shell."
icon_state = "pufferjacket"
item_state = "hostrench"
body_parts_covered = CHEST|GROIN|ARMS
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/suit/jacket/puffer/vest
@@ -446,18 +439,21 @@
desc = "Looks like this belongs in a very old movie set."
icon_state = "draculacoat"
item_state = "draculacoat"
body_parts_covered = CHEST|ARMS
/obj/item/clothing/suit/drfreeze_coat
name = "doctor freeze's labcoat"
desc = "A labcoat imbued with the power of features and freezes."
icon_state = "drfreeze_coat"
item_state = "drfreeze_coat"
body_parts_covered = CHEST|GROIN|ARMS
/obj/item/clothing/suit/gothcoat
name = "gothic coat"
desc = "Perfect for those who want stalk in a corner of a bar."
icon_state = "gothcoat"
item_state = "gothcoat"
body_parts_covered = CHEST|ARMS|HAND_LEFT //peculiar
/obj/item/clothing/suit/xenos
name = "xenos suit"
@@ -468,13 +464,6 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
allowed = list(/obj/item/clothing/mask/facehugger/toy)
/obj/item/clothing/suit/pharaoh
name = "pharaoh tunic"
desc = "Lavish space tomb not included."
icon_state = "pharaoh"
icon_state = "pharaoh"
body_parts_covered = CHEST|GROIN
// WINTER COATS
@@ -603,6 +592,7 @@
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
icon_state = "bedsheet"
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
@@ -611,6 +601,7 @@
desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_cuirass_old"
body_parts_covered = CHEST|GROIN|LEGS
armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
/obj/item/clothing/suit/ghost_sheet
@@ -623,4 +614,5 @@
throw_range = 2
w_class = WEIGHT_CLASS_TINY
flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
alternate_worn_layer = UNDER_HEAD_LAYER
+2 -2
View File
@@ -130,7 +130,7 @@
equip_delay_other = 60
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = NONE
rad_flags = RAD_PROTECT_CONTENTS
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/suit/radiation
@@ -150,5 +150,5 @@
equip_delay_other = 60
flags_inv = HIDEJUMPSUIT|HIDETAUR
resistance_flags = NONE
rad_flags = RAD_PROTECT_CONTENTS
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
tauric = TRUE //Citadel Add for tauric hardsuits
+34 -2
View File
@@ -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'
@@ -368,7 +368,7 @@
/obj/item/clothing/accessory/kevlar
name = "kevlar sheets"
desc = "Long thin sheets of kevlar to help resist bullets and some physical attacks.."
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)
@@ -379,3 +379,35 @@
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")
@@ -0,0 +1,100 @@
/obj/item/clothing/under/plasmaman/cargo
name = "cargo plasma envirosuit"
desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs."
icon_state = "cargo_envirosuit"
item_state = "cargo_envirosuit"
item_color = "cargo_envirosuit"
/obj/item/clothing/under/plasmaman/mining
name = "mining plasma envirosuit"
desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen."
icon_state = "explorer_envirosuit"
item_state = "explorer_envirosuit"
item_color = "explorer_envirosuit"
/obj/item/clothing/under/plasmaman/chef
name = "chef's plasma envirosuit"
desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef."
icon_state = "chef_envirosuit"
item_state = "chef_envirosuit"
item_color = "chef_envirosuit"
/obj/item/clothing/under/plasmaman/enviroslacks
name = "enviroslacks"
desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike."
icon_state = "enviroslacks"
item_state = "enviroslacks"
item_color = "enviroslacks"
/obj/item/clothing/under/plasmaman/chaplain
name = "chaplain's plasma envirosuit"
desc = "An envirosuit specially designed for only the most pious of plasmamen."
icon_state = "chap_envirosuit"
item_state = "chap_envirosuit"
item_color = "chap_envirosuit"
/obj/item/clothing/under/plasmaman/curator
name = "curator's plasma envirosuit"
desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike."
icon_state = "prototype_envirosuit"
item_state = "prototype_envirosuit"
item_color = "prototype_envirosuit"
/obj/item/clothing/under/plasmaman/janitor
name = "janitor's plasma envirosuit"
desc = "A grey and purple envirosuit designated for plasmamen janitors."
icon_state = "janitor_envirosuit"
item_state = "janitor_envirosuit"
item_color = "janitor_envirosuit"
/obj/item/clothing/under/plasmaman/botany
name = "botany envirosuit"
desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries."
icon_state = "botany_envirosuit"
item_state = "botany_envirosuit"
item_color = "botany_envirosuit"
/obj/item/clothing/under/plasmaman/hop
name = "head of personell's envirosuit"
desc = "A prestigious azure envirosuit designed for head of personell."
icon_state = "hop_envirosuit"
item_state = "hop_envirosuit"
item_color = "hop_envirosuit"
/obj/item/clothing/under/plasmaman/captain
name = "captain's envirosuit"
desc = "An expensive piece of plasmaman envirosuit fashion. guaranteed to keep you cool while the station goes down in fierceful fires."
icon_state = "captain_envirosuit"
item_state = "captain_envirosuit"
item_color = "captain_envirosuit"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/mime
name = "mime envirosuit"
desc = "It's not very colourful."
icon_state = "mime_envirosuit"
item_state = "mime_envirosuit"
item_color = "mime_envirosuit"
/obj/item/clothing/under/plasmaman/clown
name = "clown envirosuit"
desc = "<i>'HONK!'</i>"
icon_state = "clown_envirosuit"
item_state = "clown_envirosuit"
item_color = "clown_envirosuit"
/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H)
if(!istype(H))
return
if(H.on_fire)
if(extinguishes_left)
if(next_extinguish > world.time)
return
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
H.visible_message("<span class='warning'>[H]'s suit spews out a tonne of space lube!</span>","<span class='warning'>Your suit spews out a tonne of space lube!</span>")
H.ExtinguishMob()
new /obj/effect/particle_effect/foam(loc) //Truely terrifying.
return FALSE
@@ -0,0 +1,21 @@
/obj/item/clothing/under/plasmaman/engineering
name = "engineering plasma envirosuit"
desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
icon_state = "engineer_envirosuit"
item_state = "engineer_envirosuit"
item_color = "engineer_envirosuit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/engineering/ce
name = "chief engineer's plasma envirosuit"
desc = "An advanced air-tight suit designed to be used by plasmamen chief engineers, complete with ornamental widgets and gizmo. It protects the user from fire and acid damage."
icon_state = "ce_envirosuit"
item_state = "ce_envirosuit"
item_color = "ce_envirosuit"
/obj/item/clothing/under/plasmaman/atmospherics
name = "atmospherics plasma envirosuit"
desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue."
icon_state = "atmos_envirosuit"
item_state = "atmos_envirosuit"
item_color = "atmos_envirosuit"
@@ -0,0 +1,56 @@
/obj/item/clothing/under/plasmaman/medical
name = "medical plasma envirosuit"
desc = "A suit designed for the station's more plasma-based doctors."
icon_state = "doctor_envirosuit"
item_state = "doctor_envirosuit"
item_color = "doctor_envirosuit"
/obj/item/clothing/under/plasmaman/cmo
name = "chief medical officer's plasma envirosuit"
desc = "A suit designed for the station's most plasma-based chief medical officer, but not for their cat."
icon_state = "cmo_envirosuit"
item_state = "cmo_envirosuit"
item_color = "cmo_envirosuit"
/obj/item/clothing/under/plasmaman/science
name = "science plasma envirosuit"
desc = "A plasmaman envirosuit designed for scientists."
icon_state = "scientist_envirosuit"
item_state = "scientist_envirosuit"
item_color = "scientist_envirosuit"
/obj/item/clothing/under/plasmaman/rd
name = "research direactor's plasma envirosuit"
desc = "A plasmaman envirosuit designed for the research director to aid them in their job of directing research into the right direction."
icon_state = "rd_envirosuit"
item_state = "rd_envirosuit"
item_color = "rd_envirosuit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/robotics
name = "robotics plasma envirosuit"
desc = "A plasmaman envirosuit designed for roboticists."
icon_state = "roboticist_envirosuit"
item_state = "roboticist_envirosuit"
item_color = "roboticist_envirosuit"
/obj/item/clothing/under/plasmaman/viro
name = "virology plasma envirosuit"
desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create."
icon_state = "virologist_envirosuit"
item_state = "virologist_envirosuit"
item_color = "virologist_envirosuit"
/obj/item/clothing/under/plasmaman/genetics
name = "genetics plasma envirosuit"
desc = "A plasmaman envirosuit designed for geneticists."
icon_state = "geneticist_envirosuit"
item_state = "geneticist_envirosuit"
item_color = "geneticist_envirosuit"
/obj/item/clothing/under/plasmaman/chemist
name = "chemistry plasma envirosuit"
desc = "A plasmaman envirosuit designed for chemists."
icon_state = "chemist_envirosuit"
item_state = "chemist_envirosuit"
item_color = "chemist_envirosuit"
@@ -0,0 +1,21 @@
/obj/item/clothing/under/plasmaman/security
name = "security plasma envirosuit"
desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
icon_state = "security_envirosuit"
item_state = "security_envirosuit"
item_color = "security_envirosuit"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/security/warden
name = "warden plasma envirosuit"
desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security."
icon_state = "warden_envirosuit"
item_state = "warden_envirosuit"
item_color = "warden_envirosuit"
/obj/item/clothing/under/plasmaman/security/hos
name = "security plasma envirosuit"
desc = "A slick black and red plasmaman containment suit designed for the head of security, also called the LAW."
icon_state = "hos_envirosuit"
item_state = "hos_envirosuit"
item_color = "hos_envirosuit"
+16 -8
View File
@@ -589,6 +589,7 @@
item_state = "b_suit"
item_color = "sailor"
can_adjust = FALSE
/obj/item/clothing/under/plasmaman
name = "plasma envirosuit"
desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy."
@@ -596,12 +597,14 @@
item_state = "plasmaman"
item_color = "plasmaman"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
slowdown = 1
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
can_adjust = FALSE
strip_delay = 80
var/next_extinguish = 0
var/extinguish_cooldown = 100
var/extinguishes_left = 5
/obj/item/clothing/under/plasmaman/examine(mob/user)
..()
to_chat(user, "<span class='notice'>There are [extinguishes_left] extinguisher charges left in this suit.</span>")
@@ -618,6 +621,7 @@
H.ExtinguishMob()
new /obj/effect/particle_effect/water(get_turf(H))
return 0
/obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params)
..()
if (istype(E, /obj/item/extinguisher_refill))
@@ -631,11 +635,13 @@
return
return
return
/obj/item/extinguisher_refill
name = "envirosuit extinguisher cartridge"
desc = "A cartridge loaded with a compressed extinguisher mix, used to refill the automatic extinguisher on plasma envirosuits."
icon_state = "plasmarefill"
icon = 'icons/obj/device.dmi'
/obj/item/clothing/under/rank/security/navyblue/russian
name = "\improper Russian officer's uniform"
desc = "The latest in fashionable russian outfits."
@@ -703,14 +709,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"
@@ -725,5 +723,15 @@
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)
+11
View File
@@ -67,3 +67,14 @@
icon_state = "syndicate_combat"
item_color = "syndicate_combat"
can_adjust = FALSE
/obj/item/clothing/under/syndicate/baseball
name = "major league, number unknown"
desc = "A major league outfit with the number faded number on the back. Seems rather robust for just a game"
icon_state = "syndicatebaseball"
item_state = "syndicatebaseball"
item_color = "syndicatebaseball"
has_sensor = NO_SENSORS
armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
alt_covers_chest = TRUE
+13
View File
@@ -133,6 +133,18 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/minigun
name = "Laser Minigun"
result = /obj/item/minigunpack2
reqs = list(/obj/item/gun/energy/laser/carbine = 3,
/obj/item/stack/sheet/plasteel = 5,
/obj/item/stack/cable_coil = 30,
/obj/item/stock_parts/cell/bluespace = 2)
tools = list(TOOL_WIRECUTTER, TOOL_SCREWDRIVER, TOOL_WELDER)
time = 150
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/ed209
name = "ED209"
result = /mob/living/simple_animal/bot/ed209
@@ -359,6 +371,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
@@ -16,6 +16,7 @@
//Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change(changetype) to change names, descs and sprites.
var/list/possible_states = list(
"ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."),
"mustard" = list("mustard", "mustard bottle", "A spice mixed with enzymes and water."),
"capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"),
"enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"),
"soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"),
@@ -282,6 +283,12 @@
originalname = "ketchup"
list_reagents = list("ketchup" = 10)
//Mustard
/obj/item/reagent_containers/food/condiment/pack/mustard
name = "mustard pack"
originalname = "mustard"
list_reagents = list("mustard" = 10)
//Hot sauce
/obj/item/reagent_containers/food/condiment/pack/hotsauce
name = "hotsauce pack"
@@ -108,7 +108,7 @@
tastes = list("maggots" = 1, "the inside of a reactor" = 1)
foodtype = MEAT | RAW | GROSS
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
icon_state = "mothmeat"
desc = "Unpleasantly powdery and dry. Kind of pretty, though."
filling_color = "#BF896B"
@@ -335,7 +335,7 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
icon_state = "vanillacake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
bonus_reagents = list("sugar" = 15, "vanilla" = 15)
tastes = list("caje" = 1, "sugar" = 1, "vanilla" = 10)
tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
@@ -361,4 +361,21 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
icon_state = "clowncake_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
foodtype = GRAIN | SUGAR | DAIRY
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/store/cake/peach_cake
name = "peach cake"
desc = "A peach filled cake."
icon_state = "peachcake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/peach_slice
bonus_reagents = list("sugar" = 5, "peachjuice" = 15)
tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/cakeslice/peach_slice
name = "peach cake slice"
desc = "A slice of peach cake."
icon_state = "peach_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10)
foodtype = GRAIN | SUGAR | DAIRY
@@ -28,6 +28,50 @@
tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/banana_split
name = "banana split"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "A long glass dish filled with ice-cream, chocolate and a banana down the middle. A timeless classic by any standards."
icon_state = "banana_split"
bonus_reagents = list("nutriment" = 5, "vitamin" = 3)
list_reagents = list("nutriment" = 3, "banana" = 10, "vitamin" = 2)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "banana" = 1, "charries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/cola_float
name = "Root Beer Float"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "A glass filled with cream, soda and ice-cream with a cherry on top."
icon_state = "cola_float"
bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
list_reagents = list("nutriment" = 3, "vitamin" = 2)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "space coal" = 1, "cherries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/charrie_float
name = "Cherry Shake"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "Cherries mixed with ice-cream, known for its filling tastes"
icon_state = "cherryshake"
bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
list_reagents = list("nutriment" = 3, "vitamin" = 2, "cherryshake" = 15)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "charries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/bluecharrie_float
name = "Blue Cherry Shake"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "Cherries mixed with ice-cream, known for its filling tastes. This one is a exotic blue!"
icon_state = "bluecherryshake"
bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
list_reagents = list("nutriment" = 3, "vitamin" = 2, "bluecherryshake" = 10)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "blue cherries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/spacefreezy
name = "space freezy"
desc = "The best icecream in space."
@@ -126,6 +170,22 @@
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/snowcones/peach
name = "peach flavored snowcone"
desc = "A peach flavord snowball in a paper cup."
icon_state = "peach_sc"
list_reagents = list("nutriment" = 1, "peachjuice" = 10)
tastes = list("ice" = 1, "water" = 1, " peach" = 5)
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/snowcones/strawberry
name = "strawberry flavored snowcone"
desc = "A strawberry flavord snowball in a paper cup."
icon_state = "blue_sc"
list_reagents = list("nutriment" = 1, "berryjuice" = 10)
tastes = list("ice" = 1, "water" = 1, " strawberry" = 5)
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/snowcones/fruitsalad
name = "mixed fruit flavored snowcone"
desc = "A mix of different flavors dizzled on a snowball in a paper cup."
@@ -322,6 +322,14 @@
filling_color = "#800000"
tastes = list("meat" = 1, "butter" = 1)
/obj/item/reagent_containers/food/snacks/corndog
name = "corndog plate"
desc = "A plate with two small corn dogs, with two dimples of ketchup and mustard to dip them in."
icon_state = "dorndog"
trash = /obj/item/trash/plate/alt
tastes = list("hotdog" = 2, "mustard and ketchup" = 1, "fryed bread" = 1)
bonus_reagents = list("nutriment" = 6, "vitamin" = 2, "mustard" = 5, "ketchup" = 5)
/obj/item/reagent_containers/food/snacks/kebab/rat
name = "rat-kebab"
desc = "Not so delicious rat meat, on a stick."
@@ -581,6 +581,14 @@
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
/obj/item/reagent_containers/food/snacks/chocolatebanana
name = "Chocolate dipped banana"
desc = "A banana dipped in a bit of chocolate and held on a stick."
icon_state = "banana_coco"
list_reagents = list("sugar" = 5, "nutriment" = 3, "vitamin" = 1)
filling_color = "#ffdf26"
tastes = list("banana" = 5, "chocolate" = 3)
foodtype = FRUIT | SUGAR
@@ -319,8 +319,16 @@
/obj/item/reagent_containers/food/snacks/pie/strawberrypie
name = "strawberry pie"
desc = "A 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
/obj/item/reagent_containers/food/snacks/pie/peachpie
name = "peach pie"
desc = "A pie with peach filling."
icon_state = "strawberrypie"
bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "peachjuice" = 15)
tastes = list("peach" = 1, "pie" = 1)
foodtype = GRAIN | FRUIT
@@ -1,9 +1,13 @@
#define ICECREAM_VANILLA 1
#define ICECREAM_CHOCOLATE 2
#define ICECREAM_STRAWBERRY 3
#define ICECREAM_BLUE 4
#define CONE_WAFFLE 5
#define CONE_CHOC 6
#define ICECREAM_PEACH 4
#define ICECREAM_GRAPE 5
#define ICECREAM_BLUE 6
#define CONE_WAFFLE 7
#define CONE_CHOC 8
/obj/machinery/icecream_vat
name = "ice cream vat"
@@ -26,7 +30,9 @@
"cocoa" = 5,
"vanilla" = 5,
"berryjuice" = 5,
"singulo" = 5)
"singulo" = 5,
"peachjuice" = 5,
"grapejuice" = 5)
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -34,6 +40,10 @@
return list("milk", "ice", "cocoa")
if(ICECREAM_STRAWBERRY)
return list("milk", "ice", "berryjuice")
if(ICECREAM_PEACH)
return list("milk", "ice", "peachjuice")
if(ICECREAM_GRAPE)
return list("milk", "ice", "grapejuice")
if(ICECREAM_BLUE)
return list("milk", "ice", "singulo")
if(CONE_WAFFLE)
@@ -50,6 +60,10 @@
return "chocolate"
if(ICECREAM_STRAWBERRY)
return "strawberry"
if(ICECREAM_PEACH)
return "peach"
if(ICECREAM_GRAPE)
return "grape"
if(ICECREAM_BLUE)
return "blue"
if(CONE_WAFFLE)
@@ -62,7 +76,7 @@
/obj/machinery/icecream_vat/Initialize()
. = ..()
while(product_types.len < 6)
while(product_types.len < 8)
product_types.Add(5)
create_reagents(100, OPENCONTAINER | NO_REACT)
for(var/reagent in icecream_vat_reagents)
@@ -76,6 +90,8 @@
dat += "<b>Vanilla ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)<br>"
dat += "<b>Strawberry ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_STRAWBERRY]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_STRAWBERRY];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_STRAWBERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)<br>"
dat += "<b>Chocolate ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_CHOCOLATE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CHOCOLATE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CHOCOLATE];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)<br>"
dat += "<b>Peach ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_PEACH]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_PEACH];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_PEACH];amount=5'><b>x5</b></a> [product_types[ICECREAM_PEACH]] dollops left. (Ingredients: milk, ice, peach juice)<br>"
dat += "<b>Grape ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_GRAPE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_GRAPE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_GRAPE];amount=5'><b>x5</b></a> [product_types[ICECREAM_GRAPE]] dollops left. (Ingredients: milk, ice, grape juice)<br>"
dat += "<b>Blue ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br></div>"
dat += "<br><b>CONES</b><br><div class='statusDisplay'>"
dat += "<b>Waffle cones:</b> <a href='?src=[REF(src)];cone=[CONE_WAFFLE]'><b>Dispense</b></a> <a href='?src=[REF(src)];make=[CONE_WAFFLE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[CONE_WAFFLE];amount=5'><b>x5</b></a> [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)<br>"
@@ -207,6 +223,12 @@
if ("strawberry")
desc = "A delicious [cone_type] cone filled with strawberry ice cream. Definitely not made with real strawberries."
reagents.add_reagent("berryjuice", 2)
if ("peach")
desc = "A delicious [cone_type] cone filled with peach ice cream. Definitely made with real peaches!"
reagents.add_reagent("peachjuice", 2)
if ("grape")
desc = "A delicious [cone_type] cone filled with grape ice cream. Surprisingly, made with real pink grape, likely not real sugarcanes used."
reagents.add_reagent("grapejuice", 2)
if ("blue")
desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?"
reagents.add_reagent("singulo", 2)
@@ -228,6 +250,8 @@
#undef ICECREAM_VANILLA
#undef ICECREAM_CHOCOLATE
#undef ICECREAM_STRAWBERRY
#undef ICECREAM_PEACH
#undef ICECREAM_GRAPE
#undef ICECREAM_BLUE
#undef CONE_WAFFLE
#undef CONE_CHOC
@@ -144,6 +144,13 @@
else
O.forceMove(src)
return TRUE
///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge
/obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M)
if(!M.put_in_hands(O))
O.forceMove(drop_location())
adjust_item_drop_location(O)
/obj/machinery/smartfridge/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)
@@ -197,9 +204,7 @@
if(desired == 1 && Adjacent(usr) && !issilicon(usr))
for(var/obj/item/O in src)
if(O.name == params["name"])
if(!usr.put_in_hands(O))
O.forceMove(drop_location())
adjust_item_drop_location(O)
dispense(O, usr)
break
if (visible_contents)
update_icon()
@@ -209,8 +214,7 @@
if(desired <= 0)
break
if(O.name == params["name"])
O.forceMove(drop_location())
adjust_item_drop_location(O)
dispense(O, usr)
desired--
if (visible_contents)
update_icon()
@@ -378,6 +382,44 @@
/obj/machinery/smartfridge/extract/preloaded
initial_contents = list(/obj/item/slime_scanner = 2)
// ------------------------- You think you're better than Chem, huh?
// Organ Surgery Smartfridge
// ------------------------- Just wait till Tamiorgans
/obj/machinery/smartfridge/organ
name = "smart organ storage"
desc = "A refrigerated storage unit for organ storage."
max_n_of_items = 20 //vastly lower to prevent processing too long
var/repair_rate = 0
/obj/machinery/smartfridge/organ/accept_check(obj/item/O)
if(istype(O, /obj/item/organ))
return TRUE
return FALSE
/obj/machinery/smartfridge/organ/load(obj/item/O)
. = ..()
if(!.) //if the item loads, clear can_decompose
return
var/obj/item/organ/organ = O
organ.organ_flags |= ORGAN_FROZEN
/obj/machinery/smartfridge/organ/RefreshParts()
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
max_n_of_items = 20 * B.rating
repair_rate = max(0, STANDARD_ORGAN_HEALING * (B.rating - 1))
/obj/machinery/smartfridge/organ/process()
for(var/organ in contents)
var/obj/item/organ/O = organ
if(!istype(O))
return
O.applyOrganDamage(-repair_rate)
/obj/machinery/smartfridge/organ/Exited(obj/item/organ/AM, atom/newLoc)
. = ..()
if(istype(AM))
AM.organ_flags &= ~ORGAN_FROZEN
// -----------------------------
// Chemistry Medical Smartfridge
// -----------------------------
@@ -381,6 +381,36 @@
id = "neurotoxin"
results = list("neurotoxin" = 2)
required_reagents = list("gargleblaster" = 1, "morphine" = 1)
//FermiChem vars: Easy to make, but hard to make potent
OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 950 // Upper end for above
ExplodeTemp = 999 //Temperature at which reaction explodes
OptimalpHMin = 4.6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
OptimalpHMax = 5.2 // Higest value for above
ReactpHLim = 5 // How far out pH wil react, giving impurity place (Exponential phase)
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
CurveSharpT = 2 // How sharp the temperature exponential curve is (to the power of value)
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = 10 //Temperature change per 1u produced
HIonRelease = 0.02 //pH change per 1u reaction
RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect
FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
FermiExplode = FALSE //If the chemical explodes in a special way
PurityMin = 0 //The minimum purity something has to be above, otherwise it explodes.
clear_conversion = REACTION_CLEAR_INVERSE
/*
/datum/chemical_reaction/neurotoxin/FermiFinish(datum/reagents/holder, var/atom/my_atom)
var/datum/reagent/consumable/ethanol/neurotoxin/Nt = locate(/datum/reagent/consumable/ethanol/neurotoxin) in my_atom.reagents.reagent_list
var/cached_volume = Nt.volume
if(Nt.purity < 0.5)
holder.remove_reagent(src.id, cached_volume)
holder.add_reagent("neuroweak", cached_volume)
*/
/datum/chemical_reaction/neurotoxin/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//reduced size
volume = volume/10
..()
/datum/chemical_reaction/snowwhite
name = "Snow White"
@@ -454,18 +484,6 @@
results = list("vanillapudding" = 20)
required_reagents = list("vanilla" = 5, "milk" = 5, "eggyolk" = 5)
/datum/chemical_reaction/cherryshake
name = "Cherry Shake"
id = "cherryshake"
results = list("cherryshake" = 3)
required_reagents = list("cherryjelly" = 1, "ice" = 1, "cream" = 1)
/datum/chemical_reaction/bluecherryshake
name = "Blue Cherry Shake"
id = "bluecherryshake"
results = list("bluecherryshake" = 3)
required_reagents = list("bluecherryjelly" = 1, "ice" = 1, "cream" = 1)
/datum/chemical_reaction/drunkenblumpkin
name = "Drunken Blumpkin"
id = "drunkenblumpkin"
@@ -794,4 +812,17 @@
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/catnip_tea
name = "Catnip Tea"
id = "catnip_tea"
results = list("catnip_tea" = 3)
required_reagents = list("tea" = 5, "catnip" = 2)
/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-..."
@@ -169,6 +169,15 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/peachcake
name = "Peach cake"
reqs = list(
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/peach = 5
)
result = /obj/item/reagent_containers/food/snacks/store/cake/peach_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/cak
name = "Living cat/cake hybrid"
reqs = list(
@@ -42,6 +42,52 @@
result = /obj/item/reagent_containers/food/snacks/honkdae
subcategory = CAT_ICE
/datum/crafting_recipe/food/banana_split
name = "Banana Split"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 3,
/obj/item/reagent_containers/food/snacks/grown/banana = 1,
/obj/item/reagent_containers/food/snacks/grown/cherries = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 1
)
result = /obj/item/reagent_containers/food/snacks/banana_split
subcategory = CAT_ICE
/datum/crafting_recipe/food/root_float
name = "Cola Float"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 1,
/obj/item/reagent_containers/food/snacks/grown/cherries = 1,
/datum/reagent/consumable/space_cola = 10,
/obj/item/reagent_containers/food/drinks/drinkingglass = 1
)
result = /obj/item/reagent_containers/food/snacks/cola_float
subcategory = CAT_ICE
/datum/crafting_recipe/food/charrie_float
name = "Cherry Shake"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 1,
/obj/item/reagent_containers/food/snacks/grown/cherries = 3,
/obj/item/reagent_containers/food/drinks/drinkingglass = 1
)
result = /obj/item/reagent_containers/food/snacks/charrie_float
subcategory = CAT_ICE
/datum/crafting_recipe/food/bluecharrie_float
name = "Blue Cherry Shake"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 1,
/obj/item/reagent_containers/food/snacks/grown/bluecherries = 3,
/obj/item/reagent_containers/food/drinks/drinkingglass = 1
)
result = /obj/item/reagent_containers/food/snacks/bluecharrie_float
subcategory = CAT_ICE
//////////////////////////SNOW CONES///////////////////////
/datum/crafting_recipe/food/flaverless_sc
@@ -232,6 +278,28 @@
result = /obj/item/reagent_containers/food/snacks/snowcones/honey
subcategory = CAT_ICE
/datum/crafting_recipe/food/peach_sc
name = "Peach snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/water = 5,
/datum/reagent/consumable/ice = 15,
/obj/item/reagent_containers/food/snacks/grown/peach = 1
)
result = /obj/item/reagent_containers/food/snacks/snowcones/peach
subcategory = CAT_ICE
/datum/crafting_recipe/food/strawberry_sc
name = "Strawberry snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/water = 5,
/datum/reagent/consumable/ice = 15,
/obj/item/reagent_containers/food/snacks/grown/strawberry = 2
)
result = /obj/item/reagent_containers/food/snacks/snowcones/strawberry
subcategory = CAT_ICE
/datum/crafting_recipe/food/honey_sc
name = "Rainbow snowcone"
reqs = list(
@@ -128,6 +128,18 @@
result = /obj/item/reagent_containers/food/snacks/pigblanket
subcategory = CAT_MEAT
/datum/crafting_recipe/food/corndog
name = "Corndog meal"
reqs = list(
/obj/item/stack/rods = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
/obj/item/reagent_containers/food/snacks/bun = 1,
/datum/reagent/consumable/mustard = 5,
/datum/reagent/consumable/ketchup = 5
)
result = /obj/item/reagent_containers/food/snacks/corndog
subcategory = CAT_MEAT
/datum/crafting_recipe/food/ratkebab
name = "Rat Kebab"
reqs = list(
@@ -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(
@@ -214,4 +214,13 @@
/obj/item/slime_extract = 1
)
result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart
subcategory = CAT_PIE
/datum/crafting_recipe/food/peachpie
name = "Peach Pie"
reqs = list(
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/peach = 3
)
result = /obj/item/reagent_containers/food/snacks/pie/peachpie
subcategory = CAT_PIE
+6 -11
View File
@@ -82,11 +82,13 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
if("setMusicVolume")
data = setMusicVolume(arglist(params))
if("swaptodarkmode")
swaptodarkmode()
if("colorPresetPost") //User just swapped color presets in their goonchat preferences. Do we do anything else?
switch(href_list["preset"])
if("light")
owner.force_white_theme()
if("dark" || "normal")
owner.force_dark_theme()
if("swaptolightmode")
swaptolightmode()
if(data)
ehjax_send(data = data)
@@ -246,10 +248,3 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
// url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
C << output(url_encode(url_encode(message)), "browseroutput:output")
/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
owner.force_white_theme()
/datum/chatOutput/proc/swaptodarkmode()
owner.force_dark_theme()
@@ -7,20 +7,16 @@ html, body {
padding: 0;
margin: 0;
height: 100%;
color: #f0f0f0;
color: #000000;
}
body {
background: #171717;
background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/
font-family: Verdana, sans-serif;
font-size: 9pt;
font-color: #f0f0f0;
line-height: 1.2;
overflow-x: hidden;
overflow-y: scroll;
word-wrap: break-word;
scrollbar-face-color:#1A1A1A;
scrollbar-track-color:#171717;
scrollbar-highlight-color:#171717;
word-wrap: break-word;
}
em {
@@ -60,9 +56,9 @@ img.icon {
border-radius: 10px;
}
a {color: #397ea5;}
a.visited {color: #7c00e6;}
a:visited {color: #7c00e6;}
a {color: #0000ff;}
a.visited {color: #ff00ff;}
a:visited {color: #ff00ff;}
a.popt {text-decoration: none;}
/*****************************************
@@ -93,21 +89,21 @@ a.popt {text-decoration: none;}
bottom: 0;
right: 0;
padding: 8px;
background: #202020;
background: #d0d0d0;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
color: #a4bad6;
color: #333;
}
#newMessages:hover {background: #171717;}
#newMessages:hover {background: #ccc;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#ping {
position: fixed;
top: 0;
right: 115px;
width: 45px;
background: #202020;
background: #d0d0d0;
height: 30px;
padding: 8px 0 2px 0;
}
@@ -124,19 +120,19 @@ a.popt {text-decoration: none;}
right: 0;
}
#userBar .subCell {
background: #202020;
background: #d0d0d0;
height: 30px;
padding: 5px 0;
display: block;
color: #a4bad6;
color: #333;
text-decoration: none;
line-height: 28px;
border-top: 1px solid #171717;
border-top: 1px solid #b4b4b4;
}
#userBar .subCell:hover {background: #202020;}
#userBar .subCell:hover {background: #ccc;}
#userBar .toggle {
width: 40px;
background: #202020;
background: #ccc;
border-top: 0;
float: right;
text-align: center;
@@ -172,7 +168,7 @@ a.popt {text-decoration: none;}
position: fixed;
top: 50%;
left: 50%;
background: #ddd;
background: #d0d0d0;
}
.popup .close {
position: absolute;
@@ -189,7 +185,7 @@ a.popt {text-decoration: none;}
.popup .close:hover {background: #999;}
.popup .head {
background: #999;
color: #ddd;
color: #d0d0d0;
padding: 0 10px;
height: 30px;
line-height: 30px;
@@ -200,7 +196,7 @@ a.popt {text-decoration: none;}
}
.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;}
.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;}
.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
.popup input[type=submit] {padding: 5px 10px; background: #999; color: #d0d0d0; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;}
.changeFont {padding: 10px;}
@@ -214,7 +210,7 @@ a.popt {text-decoration: none;}
/* ADMIN CONTEXT MENU */
.contextMenu {
background-color: #ddd;
background-color: #d0d0d0;
position: fixed;
margin: 2px;
width: 150px;
@@ -246,9 +242,9 @@ a.popt {text-decoration: none;}
******************************************/
/* MOTD */
.motd {color: #a4bad6; font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #a4bad6; text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #a4bad6;}
.motd {color: #638500; font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;}
/* ADD HERE FOR BOLD */
.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
@@ -259,90 +255,91 @@ a.popt {text-decoration: none;}
/* OUTPUT COLORS */
.highlight {background: yellow;}
h1, h2, h3, h4, h5, h6 {color: #a4bad6;font-family: Georgia, Verdana, sans-serif;}
h1.alert, h2.alert {color: #a4bad6;}
h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;}
h1.alert, h2.alert {color: #000000;}
em {font-style: normal; font-weight: bold;}
.ooc {color: #cca300; font-weight: bold;}
.antagooc {color: #ce254f; font-weight: bold;}
.ooc {color: #002eb8; font-weight: bold;}
.looc {color: #6699CC; font-weight: bold;}
.antagooc {color: #b8002e; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #3d5bc3; font-weight: bold;}
.adminooc {color: #700038; font-weight: bold;}
.adminsay {color: #ff4500; font-weight: bold;}
.admin {color: #5975da; font-weight: bold;}
.adminsay {color: #FF4500}
.admin {color: #386aff; font-weight: bold;}
.name { font-weight: bold;}
.say {}
.deadsay {color: #e2c1ff;}
.deadsay {color: #5c00e6;}
.binarysay {color: #20c20e; background-color: #000000; display: block;}
.binarysay a {color: #00ff00;}
.binarysay a:active, .binarysay a:visited {color: #88ff88;}
.radio {color: #1ecc43;}
.sciradio {color: #c68cfa;}
.comradio {color: #5177ff;}
.secradio {color: #dd3535;}
.medradio {color: #57b8f0;}
.engradio {color: #f37746;}
.suppradio {color: #b88646;}
.servradio {color: #6ca729;}
.syndradio {color: #8f4a4b;}
.centcomradio {color: #2681a5;}
.aiprivradio {color: #d65d95;}
.redteamradio {color: #ff4444;}
.blueteamradio {color: #3434fd;}
.radio {color: #008000;}
.sciradio {color: #993399;}
.comradio {color: #948f02;}
.secradio {color: #a30000;}
.medradio {color: #337296;}
.engradio {color: #fb5613;}
.suppradio {color: #a8732b;}
.servradio {color: #6eaa2c;}
.syndradio {color: #6d3f40;}
.centcomradio {color: #686868;}
.aiprivradio {color: #ff00ff;}
.redteamradio {color: #ff0000;}
.blueteamradio {color: #0000ff;}
.yell { font-weight: bold;}
.alert {color: #d82020;}
h1.alert, h2.alert {color: #99aab5;}
.alert {color: #ff0000;}
h1.alert, h2.alert {color: #000000;}
.emote { font-style: italic;}
.selecteddna {color: #ffffff; background-color: #001B1B}
.attack {color: #e01c1c;}
.disarm {color: #b42525;}
.passive {color: #a00f0f;}
.attack {color: #ff0000;}
.disarm {color: #990000;}
.passive {color: #660000;}
.userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;}
.danger {color: #c51e1e;}
.warning {color: #c51e1e; font-style: italic;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
.danger {color: #ff0000;}
.warning {color: #ff0000; font-style: italic;}
.alertwarning {color: #FF0000; font-weight: bold}
.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold}
.announce {color: #c51e1e; font-weight: bold;}
.boldannounce {color: #c51e1e; font-weight: bold;}
.greenannounce {color: #059223; font-weight: bold;}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
.greenannounce {color: #00ff00; font-weight: bold;}
.rose {color: #ff5050;}
.info {color: #6685f5;}
.notice {color: #6685f5;}
.boldnotice {color: #6685f5; font-weight: bold;}
.adminnotice {color: #6685f5;}
.info {color: #0000CC;}
.notice {color: #000099;}
.boldnotice {color: #000099; font-weight: bold;}
.adminnotice {color: #0000ff;}
.adminhelp {color: #ff0000; font-weight: bold;}
.unconscious {color: #a4bad6; font-weight: bold;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.red {color: #FF0000}
.pink {color: #ff70c1;}
.blue {color: #215cff}
.green {color: #059223;}
.nicegreen {color: #059223;}
.green {color: #03ff39;}
.red {color: #FF0000;}
.pink {color: #FF69Bf;}
.blue {color: #0000FF;}
.nicegreen {color: #14a833;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
.shadowling {color: #8e8a99;}
.cult {color: #aa1c1c;}
.shadowling {color: #3b2769;}
.cult {color: #960000;}
.cultitalic {color: #aa1c1c; font-style: italic;}
.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.cultitalic {color: #960000; font-style: italic;}
.cultbold {color: #960000; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;}
.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;}
.cultlarge {color: #960000; font-weight: bold; font-size: 24px;}
.narsie {color: #960000; font-weight: bold; font-size: 120px;}
.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;}
.colossus {color: #7F282A; font-size: 40px;}
.hierophant {color: #b441ee; font-weight: bold; font-style: italic;}
.hierophant_warning {color: #c56bf1; font-style: italic;}
.purple {color: #9956d3;}
.holoparasite {color: #88809c;}
.hierophant {color: #660099; font-weight: bold; font-style: italic;}
.hierophant_warning {color: #660099; font-style: italic;}
.purple {color: #5e2d79;}
.holoparasite {color: #35333a;}
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}
@@ -350,11 +347,11 @@ h1.alert, h2.alert {color: #99aab5;}
.revenminor {color: #823abb}
.revenwarning {color: #760fbb; font-style: italic;}
.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;}
.umbra {color: #7c00e6;}
.umbra_emphasis {color: #7c00e6; font-weight: bold; font-style: italic;}
.umbra_large {color: #7c00e6; font-size: 24px; font-weight: bold; font-style: italic;}
.umbra {color: #5000A0;}
.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;}
.umbra_large {color: #5000A0; font-size: 24px; font-weight: bold; font-style: italic;}
.deconversion_message {color: #a947ff; font-size: 24px; font-style: italic;}
.deconversion_message {color: #5000A0; font-size: 24px; font-style: italic;}
.brass {color: #BE8700;}
.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
@@ -379,17 +376,17 @@ h1.alert, h2.alert {color: #99aab5;}
.neovgre {color: #6E001A; font-weight: bold; font-style: italic;}
.neovgre_small {color: #6E001A;}
.newscaster {color: #c05d5d;}
.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;}
.newscaster {color: #800000;}
.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
.alien {color: #855d85;}
.noticealien {color: #059223;}
.alertalien {color: #059223; font-weight: bold;}
.changeling {color: #059223; font-style: italic;}
.alien {color: #543354;}
.noticealien {color: #00c000;}
.alertalien {color: #00c000; font-weight: bold;}
.changeling {color: #800080; font-style: italic;}
.spider {color: #8800ff;}
.spider {color: #4d004d;}
.interface {color: #750e75;}
.interface {color: #330033;}
.sans {font-family: "Comic Sans MS", cursive, sans-serif;}
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
@@ -400,9 +397,9 @@ h1.alert, h2.alert {color: #99aab5;}
.big {font-size: 24px;}
.reallybig {font-size: 32px;}
.extremelybig {font-size: 40px;}
.greentext {color: #059223; font-size: 24px;}
.redtext {color: #c51e1e; font-size: 24px;}
.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.greentext {color: #00FF00; font-size: 24px;}
.redtext {color: #FF0000; font-size: 24px;}
.clown {color: #FF69Bf; 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 {
@@ -434,20 +431,20 @@ h1.alert, h2.alert {color: #99aab5;}
.memo {color: #638500; text-align: center;}
.memoedit {text-align: center; font-size: 16px;}
.abductor {color: #c204c2; font-style: italic;}
.mind_control {color: #df3da9; font-size: 3; font-weight: bold; font-style: italic;}
.abductor {color: #800080; font-style: italic;}
.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
.slime {color: #00CED1;}
.drone {color: #848482;}
.monkey {color: #975032;}
.swarmer {color: #2C75FF;}
.resonate {color: #298F85;}
.monkeyhive {color: #a56408;}
.monkeylead {color: #af6805; font-size: 2;}
.monkeyhive {color: #774704;}
.monkeylead {color: #774704; font-size: 2;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: #3d5bc3; font-weight: bold;}
.internal.boldnshit {color: #000099; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
@@ -0,0 +1,159 @@
html, body {color: #E0E0E0;}
body {
background: #171717;
font-color: #E0E0E0;
scrollbar-face-color:#1A1A1A;
scrollbar-track-color:#171717;
scrollbar-highlight-color:#171717;
}
a {color: #397ea5;}
a.visited {color: #7c00e6;}
a:visited {color: #7c00e6;}
#newMessages {
background: #242424;
color: #E0E0E0;
}
#newMessages:hover {background: #272727;}
#ping {background: #272727;}
#userBar .subCell {
background: #272727;
color: #E0E0E0;
border-top: 1px solid #171717;
}
#userBar .subCell:hover {background: #272727;}
#userBar .toggle {background: #272727;}
/* MOTD */
.motd {color: #E0E0E0; font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #E0E0E0; text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #E0E0E0;}
h1, h2, h3, h4, h5, h6 {color: #E0E0E0;font-family: Georgia, Verdana, sans-serif;}
h1.alert, h2.alert {color: #E0E0E0;}
.ooc {color: #cca300; font-weight: bold;}
.looc {color: #d8b555; font-weight: bold;}
.antagooc {color: #ce254f; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #3d5bc3; font-weight: bold;}
.admin {color: #5975da; font-weight: bold;}
.deadsay {color: #e2c1ff;}
.radio {color: #1ecc43;}
.sciradio {color: #c68cfa;}
.comradio {color: #5177ff;}
.secradio {color: #dd3535;}
.medradio {color: #57b8f0;}
.engradio {color: #f37746;}
.suppradio {color: #b88646;}
.servradio {color: #6ca729;}
.syndradio {color: #8f4a4b;}
.centcomradio {color: #2681a5;}
.aiprivradio {color: #d65d95;}
.redteamradio {color: #ff4444;}
.blueteamradio {color: #3434fd;}
.alert {color: #d82020;}
h1.alert, h2.alert {color: #99aab5;}
.attack {color: #e01c1c;}
.disarm {color: #b42525;}
.passive {color: #a00f0f;}
.userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;}
.danger {color: #c51e1e;}
.warning {color: #c51e1e; font-style: italic;}
.alertwarning {color: #c51e1e; font-weight: bold}
.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold}
.announce {color: #c51e1e; font-weight: bold;}
.boldannounce {color: #c51e1e; font-weight: bold;}
.greenannounce {color: #059223; font-weight: bold;}
.info {color: #6685f5;}
.notice {color: #6685f5;}
.boldnotice {color: #6685f5; font-weight: bold;}
.adminnotice {color: #6685f5;}
.adminhelp {color: #ff0000; font-weight: bold;}
.unconscious {color: #E0E0E0; font-weight: bold;}
.red {color: #FF0000}
.pink {color: #ff70c1;}
.blue {color: #215cff}
.green {color: #059223;}
.nicegreen {color: #059223;}
.userlove {color: #ff42a6; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #82365e;}
.love {color: #ff4591; font-style: italic; text-shadow: 0 0 6px #994449;}
.shadowling {color: #8e8a99;}
.cult {color: #aa1c1c;}
.cultitalic {color: #aa1c1c; font-style: italic;}
.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;}
.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;}
.hierophant {color: #b441ee; font-weight: bold; font-style: italic;}
.hierophant_warning {color: #c56bf1; font-style: italic;}
.purple {color: #9956d3;}
.holoparasite {color: #88809c;}
.revennotice {color: #3645aa;}
.revenboldnotice {color: #3645aa; font-weight: bold;}
.revenbignotice {color: #3645aa; font-weight: bold; font-size: 24px;}
.revenminor {color: #823ddd}
.revenwarning {color: #8911d9; font-style: italic;}
.revendanger {color: #8911d9; font-weight: bold; font-size: 24px;}
.umbra {color: #7c00e6;}
.umbra_emphasis {color: #7c00e6; font-weight: bold; font-style: italic;}
.umbra_large {color: #7c00e6; font-size: 24px; font-weight: bold; font-style: italic;}
.deconversion_message {color: #a947ff; font-size: 24px; font-style: italic;}
.alloy {color: #545b64;}
.heavy_alloy {color: #545b64; font-weight: bold; font-style: italic;}
.nezbere_large {color: #545b64; font-size: 24px; font-weight: bold; font-style: italic;}
.nezbere {color: #545b64; font-weight: bold; font-style: italic;}
.nezbere_small {color: #545b64;}
.inathneq_large {color: #1d7dc7; font-size: 24px; font-weight: bold; font-style: italic;}
.inathneq {color: #1d7dc7; font-weight: bold; font-style: italic;}
.inathneq_small {color: #1d7dc7;}
.neovgre_large {color: #7c0622; font-size: 24px; font-weight: bold; font-style: italic;}
.neovgre {color: #7c0622; font-weight: bold; font-style: italic;}
.neovgre_small {color: #7c0622;}
.newscaster {color: #c05d5d;}
.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;}
.alien {color: #855d85;}
.noticealien {color: #059223;}
.alertalien {color: #059223; font-weight: bold;}
.changeling {color: #059223; font-style: italic;}
.spider {color: #8800ff;}
.interface {color: #750e75;}
.greentext {color: #059223; font-size: 24px;}
.redtext {color: #c51e1e; font-size: 24px;}
.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
@keyframes velvet {
0% { color: #890020; }
40% { color: #c51e1e; }
50% { color: #FF8888; }
60% { color: #c51e1e; }
100% { color: #890020; }
}
.abductor {color: #c204c2; font-style: italic;}
.mind_control {color: #df3da9; font-size: 3; font-weight: bold; font-style: italic;}
.drone {color: #979795;}
.monkeyhive {color: #a56408;}
.monkeylead {color: #af6805; font-size: 2;}
.internal.boldnshit {color: #3d5bc3; font-weight: bold;}
@@ -1,236 +1,18 @@
/*****************************************
*
* GLOBAL STYLES
*
******************************************/
html, body {
padding: 0;
margin: 0;
height: 100%;
color: #000000;
}
body {
background: #fff;
font-family: Verdana, sans-serif;
font-size: 9pt;
line-height: 1.2;
overflow-x: hidden;
overflow-y: scroll;
word-wrap: break-word;
}
body {background: #F1F1F1;}
em {
font-style: normal;
font-weight: bold;
}
#newMessages {background: #ddd;}
#ping {background: #ddd;}
img {
margin: 0;
padding: 0;
line-height: 1;
-ms-interpolation-mode: nearest-neighbor;
image-rendering: pixelated;
}
img.icon {
height: 1em;
min-height: 16px;
width: auto;
vertical-align: bottom;
}
.r:before { /* "repeated" badge class for combined messages */
content: 'x';
}
.r {
display: inline-block;
min-width: 0.5em;
font-size: 0.7em;
padding: 0.2em 0.3em;
line-height: 1;
color: white;
text-align: center;
white-space: nowrap;
vertical-align: middle;
background-color: crimson;
border-radius: 10px;
}
a {color: #0000ff;}
a.visited {color: #ff00ff;}
a:visited {color: #ff00ff;}
a.popt {text-decoration: none;}
/*****************************************
*
* OUTPUT NOT RELATED TO ACTUAL MESSAGES
*
******************************************/
#loading {
position: fixed;
width: 300px;
height: 150px;
text-align: center;
left: 50%;
top: 50%;
margin: -75px 0 0 -150px;
}
#loading i {display: block; padding-bottom: 3px;}
#messages {
font-size: 13px;
padding: 3px;
margin: 0;
word-wrap: break-word;
}
#newMessages {
position: fixed;
display: block;
bottom: 0;
right: 0;
padding: 8px;
background: #ddd;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
color: #333;
}
#newMessages:hover {background: #ccc;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#ping {
position: fixed;
top: 0;
right: 115px;
width: 45px;
background: #ddd;
height: 30px;
padding: 8px 0 2px 0;
}
#ping i {display: block; text-align: center;}
#ping .ms {
display: block;
text-align: center;
font-size: 8pt;
padding-top: 2px;
}
#userBar {
position: fixed;
top: 0;
right: 0;
}
#userBar .subCell {
background: #ddd;
height: 30px;
padding: 5px 0;
display: block;
color: #333;
text-decoration: none;
line-height: 28px;
border-top: 1px solid #b4b4b4;
}
#userBar .subCell:hover {background: #ccc;}
#userBar .toggle {
width: 40px;
background: #ccc;
border-top: 0;
float: right;
text-align: center;
}
#userBar .sub {clear: both; display: none; width: 160px;}
#userBar .sub.scroll {overflow-y: scroll;}
#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
#userBar .sub span {
display: block;
line-height: 30px;
float: left;
}
#userBar .sub i {
display: block;
padding: 0 5px;
font-size: 1.1em;
width: 22px;
text-align: center;
line-height: 30px;
float: right;
}
#userBar .sub input {
position: absolute;
padding: 7px 5px;
width: 121px;
line-height: 30px;
float: left;
}
#userBar .topCell {border-top: 0;}
#userBar .subCell {background: #ddd;}
/* POPUPS */
.popup {
position: fixed;
top: 50%;
left: 50%;
background: #ddd;
}
.popup .close {
position: absolute;
background: #aaa;
top: 0;
right: 0;
color: #333;
text-decoration: none;
z-index: 2;
padding: 0 10px;
height: 30px;
line-height: 30px;
}
.popup .close:hover {background: #999;}
.popup .head {
background: #999;
color: #ddd;
padding: 0 10px;
height: 30px;
line-height: 30px;
text-transform: uppercase;
font-size: 0.9em;
font-weight: bold;
border-bottom: 2px solid green;
}
.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;}
.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;}
.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;}
.changeFont {padding: 10px;}
.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;}
.changeFont a:hover {background: #ccc;}
.highlightPopup {padding: 10px; text-align: center;}
.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;}
.highlightPopup input.highlightColor {background-color: #FFFF00;}
.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
.popup {background: #ddd;}
.popup .head {color: #ddd;}
.popup input[type=submit] {color: #ddd;}
/* ADMIN CONTEXT MENU */
.contextMenu {
background-color: #ddd;
position: fixed;
margin: 2px;
width: 150px;
}
.contextMenu a {
display: block;
padding: 2px 5px;
text-decoration: none;
color: #333;
}
.contextMenu {background-color: #ddd;}
.contextMenu a:hover {
background-color: #ccc;
}
/* ADMIN FILTER MESSAGES MENU */
.filterMessages {padding: 5px;}
.filterMessages div {padding: 2px 0;}
.filterMessages input {}
.filterMessages label {}
.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
@@ -261,12 +43,13 @@ h1.alert, h2.alert {color: #000000;}
em {font-style: normal; font-weight: bold;}
.ooc {color: #002eb8; font-weight: bold;}
.looc {color: #6699CC; font-weight: bold;}
.antagooc {color: #b8002e; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #700038; font-weight: bold;}
.adminsay {color: #ff4500; font-weight: bold;}
.admin {color: #4473ff; font-weight: bold;}
.adminsay {color: #FF4500}
.admin {color: #386aff; font-weight: bold;}
.name { font-weight: bold;}
@@ -304,7 +87,7 @@ h1.alert, h2.alert {color: #000000;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
.danger {color: #ff0000;}
.warning {color: #ff0000; font-style: italic;}
.alertwarning {color: #FF0000; font-weight: bold}
.alertwarning {color: #FF0000; font-weight: bold}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
@@ -317,10 +100,10 @@ h1.alert, h2.alert {color: #000000;}
.adminhelp {color: #ff0000; font-weight: bold;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
.red {color: #FF0000}
.green {color: #03ff39;}
.red {color: #FF0000;}
.pink {color: #FF69Bf;}
.blue {color: #0000FF}
.blue {color: #0000FF;}
.nicegreen {color: #14a833;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
@@ -329,7 +112,7 @@ h1.alert, h2.alert {color: #000000;}
.cultitalic {color: #960000; font-style: italic;}
.cultbold {color: #960000; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
.cultlarge {color: #960000; font-weight: bold; font-size: 24px;}
.narsie {color: #960000; font-weight: bold; font-size: 120px;}
@@ -400,13 +183,38 @@ h1.alert, h2.alert {color: #000000;}
.redtext {color: #FF0000; font-size: 24px;}
.clown {color: #FF69Bf; 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;}
.memo {color: #638500; text-align: center;}
.memoedit {text-align: center; font-size: 16px;}
.abductor {color: #800080; font-style: italic;}
.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
.slime {color: #00CED1;}
.drone {color: #848482;}
.monkey {color: #975032;}
@@ -418,9 +226,8 @@ h1.alert, h2.alert {color: #000000;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: blue; font-weight: bold;}
.internal.boldnshit {color: #000099; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
@@ -5,8 +5,9 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="font-awesome.css" />
<link id="sheetofstyles" rel="stylesheet" type="text/css" href="browserOutput_white.css" />
<link rel="stylesheet" type="text/css" href="browserOutput.css" />
<link rel="stylesheet" type="text/css" href="spritesheet_chat.css" />
<link rel="stylesheet" type="text/css" id="colorPresetLink"/>
<script type="text/javascript" src="errorHandler.js"></script>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="json2.min.js"></script>
@@ -29,7 +30,7 @@
<span class="ms" id="pingMs">--ms</span>
</div>
<div id="darkmodething">
<a href="#" class="subCell toggle" id="darkmodetoggle" title="Darkmode"><i class="icon-adjust"></i></a>
<a href="#" class="subCell toggle" id="changeColorPreset" title="Change color preset"><i class="icon-eye-open"></i></a>
</div>
<div id="audio">
<a href="#" class="subCell toggle" id="toggleAudio" title="Audio"><i class="icon-volume-up"></i></a>
@@ -35,7 +35,7 @@ var opts = {
'wasd': false, //Is the user in wasd mode?
'priorChatHeight': 0, //Thing for height-resizing detection
'restarting': false, //Is the round restarting?
'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009???
'colorPreset': 0, // index in the color presets list.
//Options menu
'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu
@@ -73,6 +73,14 @@ var opts = {
};
// Array of names for chat display color presets.
// If not set to normal, a CSS file `browserOutput_${name}.css` will be added to the head.
var colorPresets = [
'normal',
'light',
'dark'
]
function clamp(val, min, max) {
return Math.max(min, Math.min(val, max))
}
@@ -96,6 +104,12 @@ if (typeof String.prototype.trim !== 'function') {
};
}
function updateColorPreset() {
var el = $("#colorPresetLink")[0];
el.href = "browserOutput_"+colorPresets[opts.colorPreset]+".css";
runByond('?_src_=chat&proc=colorPresetPost&preset='+colorPresets[opts.colorPreset]);
}
// Linkify the contents of a node, within its parent.
function linkify(parent, insertBefore, text) {
var start = 0;
@@ -395,19 +409,6 @@ function toHex(n) {
return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
}
function swap() { //Swap to darkmode
if (opts.darkmode){
document.getElementById("sheetofstyles").href = "browserOutput_white.css";
opts.darkmode = false;
runByond('?_src_=chat&proc=swaptolightmode');
} else {
document.getElementById("sheetofstyles").href = "browserOutput.css";
opts.darkmode = true;
runByond('?_src_=chat&proc=swaptodarkmode');
}
setCookie('darkmode', (opts.darkmode ? 'true' : 'false'), 365);
}
function handleClientData(ckey, ip, compid) {
//byond sends player info to here
var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid};
@@ -615,7 +616,7 @@ $(function() {
'shighlightColor': getCookie('highlightcolor'),
'smusicVolume': getCookie('musicVolume'),
'smessagecombining': getCookie('messagecombining'),
'sdarkmode': getCookie('darkmode'),
'scolorPreset': getCookie('colorpreset'),
};
if (savedConfig.sfontSize) {
@@ -626,9 +627,6 @@ $(function() {
$("body").css('line-height', savedConfig.slineHeight);
internalOutput('<span class="internal boldnshit">Loaded line height setting of: '+savedConfig.slineHeight+'</span>', 'internal');
}
if(savedConfig.sdarkmode == 'true'){
swap();
}
if (savedConfig.spingDisabled) {
if (savedConfig.spingDisabled == 'true') {
opts.pingDisabled = true;
@@ -654,6 +652,13 @@ $(function() {
opts.highlightColor = savedConfig.shighlightColor;
internalOutput('<span class="internal boldnshit">Loaded highlight color of: '+savedConfig.shighlightColor+'</span>', 'internal');
}
if (savedConfig.scolorPreset) {
opts.colorPreset = Number(savedConfig.scolorPreset);
updateColorPreset();
internalOutput('<span class="internal boldnshit">Loaded color preset of: '+colorPresets[opts.colorPreset]+'</span>', 'internal');
}
if (savedConfig.smusicVolume) {
var newVolume = clamp(savedConfig.smusicVolume, 0, 100);
$('#adminMusic').prop('volume', newVolume / 100);
@@ -839,9 +844,6 @@ $(function() {
$('#toggleOptions').click(function(e) {
handleToggleClick($subOptions, $(this));
});
$('#darkmodetoggle').click(function(e) {
swap();
});
$('#toggleAudio').click(function(e) {
handleToggleClick($subAudio, $(this));
});
@@ -913,7 +915,7 @@ $(function() {
$.ajax({
type: 'GET',
url: 'browserOutput_white.css',
url: 'browserOutput.css',
success: function(styleData) {
var blob = new Blob(['<head><title>Chat Log</title><style>', styleData, '</style></head><body>', $messages.html(), '</body>']);
@@ -992,6 +994,13 @@ $(function() {
opts.messageCount = 0;
});
$('#changeColorPreset').click(function() {
opts.colorPreset = (opts.colorPreset+1) % colorPresets.length;
updateColorPreset();
setCookie('colorpreset', opts.colorPreset, 365);
internalOutput('<span class="internal boldnshit">Changed color preset to: '+colorPresets[opts.colorPreset]);
});
$('#musicVolumeSpan').hover(function() {
$('#musicVolumeText').addClass('hidden');
$('#musicVolume').removeClass('hidden');
@@ -224,6 +224,10 @@
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()
+59 -1
View File
@@ -37,7 +37,7 @@
species = "lily"
plantname = "Lily Plants"
product = /obj/item/reagent_containers/food/snacks/grown/poppy/lily
mutatelist = list()
mutatelist = list(/obj/item/seeds/bee_balm)
/obj/item/reagent_containers/food/snacks/grown/poppy/lily
seed = /obj/item/seeds/poppy/lily
@@ -221,3 +221,61 @@
if(!user.gloves)
to_chat(user, "<span class='danger'>The [name] burns your bare hand!</span>")
user.adjustFireLoss(rand(1, 5))
// Beebalm
/obj/item/seeds/bee_balm
name = "pack of Bee Balm seeds"
desc = "These seeds grow into Bee Balms."
icon_state = "seed-bee_balm"
species = "bee_balm"
plantname = "Bee Balm Buds"
product = /obj/item/reagent_containers/food/snacks/grown/bee_balm
endurance = 10
maturation = 8
yield = 3
potency = 30
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
icon_grow = "bee_balm-grow"
icon_dead = "bee_balm-dead"
mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey) //Lower odds of becoming honey
reagents_add = list("spaceacillin" = 0.1, "sterilizine" = 0.05)
/obj/item/reagent_containers/food/snacks/grown/bee_balm
seed = /obj/item/seeds/bee_balm
name = "bee balm"
desc = "A flower used for medical antiseptic in history."
icon_state = "bee_balm"
filling_color = "#FF6347"
bitesize_mod = 8
tastes = list("strong antiseptic " = 1)
foodtype = GROSS
// Beebalm
/obj/item/seeds/bee_balm/honey
name = "pack of Honey Balm seeds"
desc = "These seeds grow into Honey Balms."
icon_state = "seed-bee_balmalt"
species = "seed-bee_balm_alt"
plantname = "Honey Balm Pods"
product = /obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
endurance = 1
maturation = 10
yield = 1
potency = 1
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
icon_grow = "bee_balmalt-grow"
icon_dead = "bee_balmalt-dead"
reagents_add = list("honey" = 0.1, "lye" = 0.3) //To make wax
rarity = 30
/obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
seed = /obj/item/seeds/bee_balm/honey
name = "honey balm"
desc = "A large honey filled pod of a flower."
icon_state = "bee_balmalt"
filling_color = "#FF6347"
bitesize_mod = 8
tastes = list("wax" = 1)
foodtype = SUGAR
+3 -2
View File
@@ -1,7 +1,7 @@
// Starthistle
/obj/item/seeds/starthistle
name = "pack of starthistle seeds"
desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots."
desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots. Grind down these seeds for a substitution for mustardgrind."
icon_state = "seed-starthistle"
species = "starthistle"
plantname = "Starthistle"
@@ -9,9 +9,10 @@
endurance = 50 // damm pesky weeds
maturation = 5
production = 1
yield = 2
yield = 6
potency = 10
growthstages = 3
grind_results = list("mustardgrind" = 1)
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
mutatelist = list(/obj/item/seeds/harebell)
+27
View File
@@ -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)
+19 -1
View File
@@ -33,7 +33,7 @@
species = "teaastra"
plantname = "Tea Astra Plant"
product = /obj/item/reagent_containers/food/snacks/grown/tea/astra
mutatelist = list()
mutatelist = list(/obj/item/seeds/tea/catnip)
reagents_add = list("synaptizine" = 0.1, "vitamin" = 0.04, "teapowder" = 0.1)
rarity = 20
@@ -44,6 +44,24 @@
filling_color = "#4582B4"
grind_results = list("teapowder" = 0, "salglu_solution" = 0)
// Kitty drugs
/obj/item/seeds/tea/catnip
name = "pack of catnip seeds"
icon_state = "seed-catnip"
desc = "Long stocks with flowering tips that has a chemical to make feline attracted to it."
species = "catnip"
plantname = "Catnip Plant"
growthstages = 3
product = /obj/item/reagent_containers/food/snacks/grown/tea/catnip
reagents_add = list("catnip" = 0.1, "vitamin" = 0.06, "teapowder" = 0.3)
rarity = 50
/obj/item/reagent_containers/food/snacks/grown/tea/catnip
seed = /obj/item/seeds/tea/catnip
name = "Catnip buds"
icon_state = "catnip_leaves"
filling_color = "#4582B4"
grind_results = list("catnp" = 2, "water" = 1)
// Coffee
/obj/item/seeds/coffee
+2
View File
@@ -8,6 +8,8 @@ GLOBAL_PROTECT(exp_to_update)
return 0
if(!CONFIG_GET(flag/use_exp_tracking))
return 0
if(!SSdbcore.Connect())
return 0
if(!exp_requirements || !exp_type)
return 0
if(!job_is_xp_locked(src.title))
@@ -1,240 +1,245 @@
/datum/job
//The name of the job
var/title = "NOPE"
//Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access
var/list/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population)
var/list/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!)
//Determines who can demote this position
var/department_head = list()
//Tells the given channels that the given mob is the new department head. See communications.dm for valid channels.
var/list/head_announce = null
//Bitflags for the job
var/flag = 0
var/department_flag = 0
//Players will be allowed to spawn in as jobs that are set to "Station"
var/faction = "None"
//How many players can be this job
var/total_positions = 0
//How many players can spawn in as this job
var/spawn_positions = 0
//How many players have this job
var/current_positions = 0
//Supervisors, who this person answers to directly
var/supervisors = ""
//Sellection screen color
var/selection_color = "#ffffff"
//If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
var/req_admin_notify
var/custom_spawn_text
//If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
var/minimal_player_age = 0
var/outfit = null
var/exp_requirements = 0
var/exp_type = ""
var/exp_type_department = ""
//The amount of good boy points playing this role will earn you towards a higher chance to roll antagonist next round
//can be overridden by antag_rep.txt config
var/antag_rep = 10
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)
//do actions on H but send messages to M as the key may not have been transferred_yet
if(mind_traits)
for(var/t in mind_traits)
ADD_TRAIT(H.mind, t, JOB_TRAIT)
/datum/job/proc/announce(mob/living/carbon/human/H)
if(head_announce)
announce_head(H, head_announce)
/datum/job/proc/override_latejoin_spawn(mob/living/carbon/human/H) //Return TRUE to force latejoining to not automatically place the person in latejoin shuttle/whatever.
return FALSE
//Used for a special check of whether to allow a client to latejoin as this job.
/datum/job/proc/special_check_latejoin(client/C)
return TRUE
/datum/job/proc/GetAntagRep()
. = CONFIG_GET(keyed_list/antag_rep)[lowertext(title)]
if(. == null)
return antag_rep
//Don't override this unless the job transforms into a non-human (Silicons do this for example)
/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null)
if(!H)
return FALSE
if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions))
if(H.dna.species.id != "human")
H.set_species(/datum/species/human)
H.apply_pref_name("human", H.client)
//Equip the rest of the gear
H.dna.species.before_equip_job(src, H, visualsOnly)
if(outfit_override || outfit)
H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly)
H.dna.species.after_equip_job(src, H, visualsOnly)
if(!visualsOnly && announce)
announce(H)
/datum/job/proc/get_access()
if(!config) //Needed for robots.
return src.minimal_access.Copy()
. = list()
if(CONFIG_GET(flag/jobs_have_minimal_access))
. = src.minimal_access.Copy()
else
. = src.access.Copy()
if(CONFIG_GET(flag/everyone_has_maint_access)) //Config has global maint access set
. |= list(ACCESS_MAINT_TUNNELS)
/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels.
if(H && GLOB.announcement_systems.len)
//timer because these should come after the captain announcement
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1))
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
/datum/job/proc/player_old_enough(client/C)
if(available_in_days(C) == 0)
return TRUE //Available in 0 days = available right now = player is old enough to play.
return FALSE
/datum/job/proc/available_in_days(client/C)
if(!C)
return 0
if(!CONFIG_GET(flag/use_age_restriction_for_jobs))
return 0
if(C.prefs.db_flags & DB_FLAG_EXEMPT)
return 0
if(!isnum(C.player_age))
return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
if(!isnum(minimal_player_age))
return 0
return max(0, minimal_player_age - C.player_age)
/datum/job/proc/config_check()
return TRUE
/datum/job/proc/map_check()
return TRUE
/datum/outfit/job
name = "Standard Gear"
var/jobtype = null
uniform = /obj/item/clothing/under/color/grey
id = /obj/item/card/id
ears = /obj/item/radio/headset
belt = /obj/item/pda
back = /obj/item/storage/backpack
shoes = /obj/item/clothing/shoes/sneakers/black
var/backpack = /obj/item/storage/backpack
var/satchel = /obj/item/storage/backpack/satchel
var/duffelbag = /obj/item/storage/backpack/duffelbag
var/box = /obj/item/storage/box/survival
var/pda_slot = SLOT_BELT
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
switch(H.backbag)
if(GBACKPACK)
back = /obj/item/storage/backpack //Grey backpack
if(GSATCHEL)
back = /obj/item/storage/backpack/satchel //Grey satchel
if(GDUFFELBAG)
back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag
if(LSATCHEL)
back = /obj/item/storage/backpack/satchel/leather //Leather Satchel
if(DSATCHEL)
back = satchel //Department satchel
if(DDUFFELBAG)
back = duffelbag //Department duffel bag
else
back = backpack //Department backpack
if(box)
if(!backpack_contents)
backpack_contents = list()
backpack_contents.Insert(1, box) // Box always takes a first slot in backpack
backpack_contents[box] = 1
//converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
var/holder
if(H.jumpsuit_style == PREF_SKIRT)
holder = "[uniform]/skirt"
if(!text2path(holder))
holder = "[uniform]"
else
holder = "[uniform]"
uniform = text2path(holder)
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
return
var/datum/job/J = SSjob.GetJobType(jobtype)
if(!J)
J = SSjob.GetJob(H.job)
if(H.nameless && J.dresscodecompliant)
if(J.title in GLOB.command_positions)
H.real_name = J.title
else
H.real_name = "[J.title] #[rand(10000, 99999)]"
var/obj/item/card/id/C = H.wear_id
if(istype(C))
C.access = J.get_access()
shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable
C.registered_name = H.real_name
C.assignment = J.title
C.update_label()
H.sec_hud_set_ID()
var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot)
if(istype(PDA))
PDA.owner = H.real_name
PDA.ownjob = J.title
PDA.update_label()
/datum/outfit/job/get_chameleon_disguise_info()
var/list/types = ..()
types -= /obj/item/storage/backpack //otherwise this will override the actual backpacks
types += backpack
types += satchel
types += duffelbag
return types
/datum/job
//The name of the job , used for preferences, bans and more. Make sure you know what you're doing before changing this.
var/title = "NOPE"
//Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access
var/list/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population)
var/list/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!)
//Determines who can demote this position
var/department_head = list()
//Tells the given channels that the given mob is the new department head. See communications.dm for valid channels.
var/list/head_announce = null
//Bitflags for the job
var/flag = NONE //Deprecated
var/department_flag = NONE //Deprecated
// var/auto_deadmin_role_flags = NONE
//Players will be allowed to spawn in as jobs that are set to "Station"
var/faction = "None"
//How many players can be this job
var/total_positions = 0
//How many players can spawn in as this job
var/spawn_positions = 0
//How many players have this job
var/current_positions = 0
//Supervisors, who this person answers to directly
var/supervisors = ""
//Sellection screen color
var/selection_color = "#ffffff"
//If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
var/req_admin_notify
// This is for Citadel specific tweaks to job notices.
var/custom_spawn_text
//If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
var/minimal_player_age = 0
var/outfit = null
var/exp_requirements = 0
var/exp_type = ""
var/exp_type_department = ""
//The amount of good boy points playing this role will earn you towards a higher chance to roll antagonist next round
//can be overridden by antag_rep.txt config
var/antag_rep = 10
var/list/mind_traits // Traits added to the mind of the mob assigned this job
var/list/blacklisted_quirks //list of quirk typepaths blacklisted.
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
//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)
//do actions on H but send messages to M as the key may not have been transferred_yet
if(mind_traits)
for(var/t in mind_traits)
ADD_TRAIT(H.mind, t, JOB_TRAIT)
/datum/job/proc/announce(mob/living/carbon/human/H)
if(head_announce)
announce_head(H, head_announce)
/datum/job/proc/override_latejoin_spawn(mob/living/carbon/human/H) //Return TRUE to force latejoining to not automatically place the person in latejoin shuttle/whatever.
return FALSE
//Used for a special check of whether to allow a client to latejoin as this job.
/datum/job/proc/special_check_latejoin(client/C)
return TRUE
/datum/job/proc/GetAntagRep()
. = CONFIG_GET(keyed_list/antag_rep)[lowertext(title)]
if(. == null)
return antag_rep
//Don't override this unless the job transforms into a non-human (Silicons do this for example)
/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source)
if(!H)
return FALSE
if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions))
if(H.dna.species.id != "human")
H.set_species(/datum/species/human)
H.apply_pref_name("human", preference_source)
//Equip the rest of the gear
H.dna.species.before_equip_job(src, H, visualsOnly)
if(outfit_override || outfit)
H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly)
H.dna.species.after_equip_job(src, H, visualsOnly)
if(!visualsOnly && announce)
announce(H)
/datum/job/proc/get_access()
if(!config) //Needed for robots.
return src.minimal_access.Copy()
. = list()
if(CONFIG_GET(flag/jobs_have_minimal_access))
. = src.minimal_access.Copy()
else
. = src.access.Copy()
if(CONFIG_GET(flag/everyone_has_maint_access)) //Config has global maint access set
. |= list(ACCESS_MAINT_TUNNELS)
/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels.
if(H && GLOB.announcement_systems.len)
//timer because these should come after the captain announcement
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1))
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
/datum/job/proc/player_old_enough(client/C)
if(available_in_days(C) == 0)
return TRUE //Available in 0 days = available right now = player is old enough to play.
return FALSE
/datum/job/proc/available_in_days(client/C)
if(!C)
return 0
if(!CONFIG_GET(flag/use_age_restriction_for_jobs))
return 0
if(!SSdbcore.Connect())
return 0 //Without a database connection we can't get a player's age so we'll assume they're old enough for all jobs
if(C.prefs.db_flags & DB_FLAG_EXEMPT)
return 0
if(!isnum(minimal_player_age))
return 0
return max(0, minimal_player_age - C.player_age)
/datum/job/proc/config_check()
return TRUE
/datum/job/proc/map_check()
return TRUE
/datum/job/proc/radio_help_message(mob/M)
to_chat(M, "<b>Prefix your message with :h to speak on your department's radio. To see other prefixes, look closely at your headset.</b>")
/datum/outfit/job
name = "Standard Gear"
var/jobtype = null
uniform = /obj/item/clothing/under/color/grey
id = /obj/item/card/id
ears = /obj/item/radio/headset
belt = /obj/item/pda
back = /obj/item/storage/backpack
shoes = /obj/item/clothing/shoes/sneakers/black
box = /obj/item/storage/box/survival
var/backpack = /obj/item/storage/backpack
var/satchel = /obj/item/storage/backpack/satchel
var/duffelbag = /obj/item/storage/backpack/duffelbag
var/pda_slot = SLOT_BELT
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
switch(H.backbag)
if(GBACKPACK)
back = /obj/item/storage/backpack //Grey backpack
if(GSATCHEL)
back = /obj/item/storage/backpack/satchel //Grey satchel
if(GDUFFELBAG)
back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag
if(LSATCHEL)
back = /obj/item/storage/backpack/satchel/leather //Leather Satchel
if(DSATCHEL)
back = satchel //Department satchel
if(DDUFFELBAG)
back = duffelbag //Department duffel bag
else
back = backpack //Department backpack
//converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
var/holder
if(H.jumpsuit_style == PREF_SKIRT)
holder = "[uniform]/skirt"
if(!text2path(holder))
holder = "[uniform]"
else
holder = "[uniform]"
uniform = text2path(holder)
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
return
var/datum/job/J = SSjob.GetJobType(jobtype)
if(!J)
J = SSjob.GetJob(H.job)
if(H.nameless && J.dresscodecompliant)
if(J.title in GLOB.command_positions)
H.real_name = J.title
else
H.real_name = "[J.title] #[rand(10000, 99999)]"
var/obj/item/card/id/C = H.wear_id
if(istype(C))
C.access = J.get_access()
shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable
C.registered_name = H.real_name
C.assignment = J.title
C.update_label()
H.sec_hud_set_ID()
var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot)
if(istype(PDA))
PDA.owner = H.real_name
PDA.ownjob = J.title
PDA.update_label()
/datum/outfit/job/get_chameleon_disguise_info()
var/list/types = ..()
types -= /obj/item/storage/backpack //otherwise this will override the actual backpacks
types += backpack
types += satchel
types += duffelbag
return types
//Warden and regular officers add this result to their get_access()
/datum/job/proc/check_config_for_sec_maint()
if(CONFIG_GET(flag/security_has_maint_access))
return list(ACCESS_MAINT_TUNNELS)
return list()
@@ -1,90 +1,69 @@
/*
AI
*/
/datum/job/ai
title = "AI"
flag = AI_JF
department_flag = ENGSEC
faction = "Station"
total_positions = 1
spawn_positions = 1
selection_color = "#ccffcc"
supervisors = "your laws"
req_admin_notify = TRUE
minimal_player_age = 30
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SILICON
var/do_special_check = TRUE
/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, outfit_override)
. = H.AIize(latejoin)
/datum/job/ai/after_spawn(mob/H, mob/M, latejoin)
. = ..()
if(latejoin)
var/obj/structure/AIcore/latejoin_inactive/lateJoinCore
for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores)
if(P.is_available())
lateJoinCore = P
GLOB.latejoin_ai_cores -= P
break
if(lateJoinCore)
lateJoinCore.available = FALSE
H.forceMove(lateJoinCore.loc)
qdel(lateJoinCore)
var/mob/living/silicon/ai/AI = H
AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked.
AI.set_core_display_icon(null, M.client)
//we may have been created after our borg
if(SSticker.current_state == GAME_STATE_SETTING_UP)
for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs)
if(!R.connected_ai)
R.TryConnectToAI()
if(latejoin)
announce(AI)
/datum/job/ai/override_latejoin_spawn()
return TRUE
/datum/job/ai/special_check_latejoin(client/C)
if(!do_special_check)
return TRUE
for(var/i in GLOB.latejoin_ai_cores)
var/obj/structure/AIcore/latejoin_inactive/LAI = i
if(istype(LAI))
if(LAI.is_available())
return TRUE
return FALSE
/datum/job/ai/announce(mob/living/silicon/ai/AI)
. = ..()
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "[AI] has been downloaded to an empty bluespace-networked AI core at [AREACOORD(AI)]."))
/datum/job/ai/config_check()
return CONFIG_GET(flag/allow_ai)
/*
Cyborg
*/
/datum/job/cyborg
title = "Cyborg"
flag = CYBORG
department_flag = ENGSEC
faction = "Station"
total_positions = 0
spawn_positions = 1
supervisors = "your laws and the AI" //Nodrak
selection_color = "#ddffdd"
minimal_player_age = 21
exp_requirements = 120
exp_type = EXP_TYPE_CREW
/datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, outfit_override = null)
return H.Robotize(FALSE, latejoin)
/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M)
R.updatename(M.client)
R.gender = NEUTER
/datum/job/ai
title = "AI"
flag = AI_JF
// auto_deadmin_role_flags = DEADMIN_POSITION_SILICON
department_flag = ENGSEC
faction = "Station"
total_positions = 1
spawn_positions = 1
selection_color = "#ccffcc"
supervisors = "your laws"
req_admin_notify = TRUE
minimal_player_age = 30
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SILICON
display_order = JOB_DISPLAY_ORDER_AI
var/do_special_check = TRUE
/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, datum/outfit/outfit_override, client/preference_source = null)
if(visualsOnly)
CRASH("dynamic preview is unsupported")
. = H.AIize(latejoin,preference_source)
/datum/job/ai/after_spawn(mob/H, mob/M, latejoin)
. = ..()
if(latejoin)
var/obj/structure/AIcore/latejoin_inactive/lateJoinCore
for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores)
if(P.is_available())
lateJoinCore = P
GLOB.latejoin_ai_cores -= P
break
if(lateJoinCore)
lateJoinCore.available = FALSE
H.forceMove(lateJoinCore.loc)
qdel(lateJoinCore)
var/mob/living/silicon/ai/AI = H
AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked.
AI.set_core_display_icon(null, M.client)
//we may have been created after our borg
if(SSticker.current_state == GAME_STATE_SETTING_UP)
for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs)
if(!R.connected_ai)
R.TryConnectToAI()
if(latejoin)
announce(AI)
/datum/job/ai/override_latejoin_spawn()
return TRUE
/datum/job/ai/special_check_latejoin(client/C)
if(!do_special_check)
return TRUE
for(var/i in GLOB.latejoin_ai_cores)
var/obj/structure/AIcore/latejoin_inactive/LAI = i
if(istype(LAI))
if(LAI.is_available())
return TRUE
return FALSE
/datum/job/ai/announce(mob/living/silicon/ai/AI)
. = ..()
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "[AI] has been downloaded to an empty bluespace-networked AI core at [AREACOORD(AI)]."))
/datum/job/ai/config_check()
return CONFIG_GET(flag/allow_ai)
+1 -1
View File
@@ -14,7 +14,7 @@ Assistant
minimal_access = list() //See /datum/job/assistant/get_access()
outfit = /datum/outfit/job/assistant
antag_rep = 7
display_order = JOB_DISPLAY_ORDER_ASSISTANT
/datum/job/assistant/get_access()
if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set
@@ -0,0 +1,44 @@
/datum/job/atmos
title = "Atmospheric Technician"
flag = ATMOSTECH
department_head = list("Chief Engineer")
department_flag = ENGSEC
faction = "Station"
total_positions = 3
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#ff9b3d"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/atmos
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN
/datum/outfit/job/atmos
name = "Atmospheric Technician"
jobtype = /datum/job/atmos
belt = /obj/item/storage/belt/utility/atmostech
l_pocket = /obj/item/pda/atmos
ears = /obj/item/radio/headset/headset_eng
uniform = /obj/item/clothing/under/rank/atmospheric_technician
r_pocket = /obj/item/analyzer
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
box = /obj/item/storage/box/engineer
pda_slot = SLOT_L_STORE
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
/datum/outfit/job/atmos/rig
name = "Atmospheric Technician (Hardsuit)"
mask = /obj/item/clothing/mask/gas
suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos
suit_store = /obj/item/tank/internals/oxygen
internals_slot = SLOT_S_STORE
+30
View File
@@ -0,0 +1,30 @@
/datum/job/bartender
title = "Bartender"
flag = BARTENDER
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_type_department = EXP_TYPE_SERVICE // This is so the jobs menu can work properly
outfit = /datum/outfit/job/bartender
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_BARTENDER
/datum/outfit/job/bartender
name = "Bartender"
jobtype = /datum/job/bartender
glasses = /obj/item/clothing/glasses/sunglasses/reagent
belt = /obj/item/pda/bar
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/bartender
suit = /obj/item/clothing/suit/armor/vest
backpack_contents = list(/obj/item/storage/box/beanbag=1,/obj/item/book/granter/action/drink_fling=1)
shoes = /obj/item/clothing/shoes/laceup
+32
View File
@@ -0,0 +1,32 @@
/datum/job/hydro
title = "Botanist"
flag = BOTANIST
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 3
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#bbe291"
outfit = /datum/outfit/job/botanist
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_BOTANIST
/datum/outfit/job/botanist
name = "Botanist"
jobtype = /datum/job/hydro
belt = /obj/item/pda/botanist
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/hydroponics
suit = /obj/item/clothing/suit/apron
gloves =/obj/item/clothing/gloves/botanic_leather
suit_store = /obj/item/plant_analyzer
backpack = /obj/item/storage/backpack/botany
satchel = /obj/item/storage/backpack/satchel/hyd
+66 -114
View File
@@ -1,114 +1,66 @@
/*
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()
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)
/datum/job/captain
title = "Captain"
flag = CAPTAIN
// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY //:eyes:
department_head = list("CentCom")
department_flag = ENGSEC
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "Nanotrasen officials and Space law"
selection_color = "#aac1ee"
req_admin_notify = 1
minimal_player_age = 14
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_COMMAND
outfit = /datum/outfit/job/captain
access = list() //See get_access()
minimal_access = list() //See get_access()
mind_traits = list(TRAIT_CAPTAIN_METABOLISM)
// mind_traits = list(TRAIT_DISK_VERIFIER)
display_order = JOB_DISPLAY_ORDER_CAPTAIN
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
@@ -1,293 +0,0 @@
/*
Quartermaster
*/
/datum/job/qm
title = "Quartermaster"
flag = QUARTERMASTER
department_head = list("Head of Personnel")
department_flag = CIVILIAN
head_announce = list(RADIO_CHANNEL_SUPPLY)
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#d7b088"
outfit = /datum/outfit/job/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
belt = /obj/item/pda/quartermaster
ears = /obj/item/radio/headset/headset_cargo
uniform = /obj/item/clothing/under/rank/cargo
shoes = /obj/item/clothing/shoes/sneakers/brown
glasses = /obj/item/clothing/glasses/sunglasses
l_hand = /obj/item/clipboard
chameleon_extras = /obj/item/stamp/qm
/*
Cargo Technician
*/
/datum/job/cargo_tech
title = "Cargo Technician"
flag = CARGOTECH
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 3
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
outfit = /datum/outfit/job/cargo_tech
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/cargo_tech
name = "Cargo Technician"
jobtype = /datum/job/cargo_tech
belt = /obj/item/pda/cargo
ears = /obj/item/radio/headset/headset_cargo
uniform = /obj/item/clothing/under/rank/cargotech
l_hand = /obj/item/export_scanner
/*
Shaft Miner
*/
/datum/job/mining
title = "Shaft Miner"
flag = MINER
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 3
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
custom_spawn_text = "Remember, you are a miner, not a hunter. Hunting monsters is not a requirement of your job, the only requirement of your job is to provide materials for the station. Don't be afraid to run away if you're inexperienced with fighting the mining area's locals."
outfit = /datum/outfit/job/miner
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/miner
name = "Shaft Miner (Lavaland)"
jobtype = /datum/job/mining
belt = /obj/item/pda/shaftminer
ears = /obj/item/radio/headset/headset_cargo/mining
shoes = /obj/item/clothing/shoes/workboots/mining
gloves = /obj/item/clothing/gloves/color/black
uniform = /obj/item/clothing/under/rank/miner/lavaland
l_pocket = /obj/item/reagent_containers/hypospray/medipen/survival
r_pocket = /obj/item/storage/bag/ore //causes issues if spawned in backpack
backpack_contents = list(
/obj/item/flashlight/seclite=1,\
/obj/item/kitchen/knife/combat/survival=1,\
/obj/item/mining_voucher=1,\
/obj/item/suit_voucher=1,\
/obj/item/stack/marker_beacon/ten=1)
backpack = /obj/item/storage/backpack/explorer
satchel = /obj/item/storage/backpack/satchel/explorer
duffelbag = /obj/item/storage/backpack/duffelbag
box = /obj/item/storage/box/survival_mining
chameleon_extras = /obj/item/gun/energy/kinetic_accelerator
/datum/outfit/job/miner/asteroid
name = "Shaft Miner (Asteroid)"
uniform = /obj/item/clothing/under/rank/miner
shoes = /obj/item/clothing/shoes/workboots
/datum/outfit/job/miner/equipped
name = "Shaft Miner (Lavaland + Equipment)"
suit = /obj/item/clothing/suit/hooded/explorer/standard
mask = /obj/item/clothing/mask/gas/explorer
glasses = /obj/item/clothing/glasses/meson
suit_store = /obj/item/tank/internals/oxygen
internals_slot = SLOT_S_STORE
backpack_contents = list(
/obj/item/flashlight/seclite=1,\
/obj/item/kitchen/knife/combat/survival=1,
/obj/item/mining_voucher=1,
/obj/item/t_scanner/adv_mining_scanner/lesser=1,
/obj/item/gun/energy/kinetic_accelerator=1,\
/obj/item/stack/marker_beacon/ten=1)
/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
if(istype(H.wear_suit, /obj/item/clothing/suit/hooded))
var/obj/item/clothing/suit/hooded/S = H.wear_suit
S.ToggleHood()
/datum/outfit/job/miner/equipped/hardsuit
name = "Shaft Miner (Equipment + Hardsuit)"
suit = /obj/item/clothing/suit/space/hardsuit/mining
mask = /obj/item/clothing/mask/breath
/*
Bartender
*/
/datum/job/bartender
title = "Bartender"
flag = BARTENDER
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
outfit = /datum/outfit/job/bartender
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/bartender
name = "Bartender"
jobtype = /datum/job/bartender
glasses = /obj/item/clothing/glasses/sunglasses/reagent
belt = /obj/item/pda/bar
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/bartender
suit = /obj/item/clothing/suit/armor/vest
backpack_contents = list(/obj/item/storage/box/beanbag=1,/obj/item/book/granter/action/drink_fling=1)
shoes = /obj/item/clothing/shoes/laceup
/*
Cook
*/
/datum/job/cook
title = "Cook"
flag = COOK
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/cooks = 0 //Counts cooks amount
outfit = /datum/outfit/job/cook
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/cook
name = "Cook"
jobtype = /datum/job/cook
belt = /obj/item/pda/cook
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/chef
suit = /obj/item/clothing/suit/toggle/chef
head = /obj/item/clothing/head/chefhat
mask = /obj/item/clothing/mask/fakemoustache/italian
backpack_contents = list(/obj/item/sharpener = 1)
/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
var/datum/job/cook/J = SSjob.GetJobType(jobtype)
if(J) // Fix for runtime caused by invalid job being passed
if(J.cooks>0)//Cooks
suit = /obj/item/clothing/suit/apron/chef
head = /obj/item/clothing/head/soft/mime
if(!visualsOnly)
J.cooks++
/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
var/list/possible_boxes = subtypesof(/obj/item/storage/box/ingredients)
var/chosen_box = pick(possible_boxes)
var/obj/item/storage/box/I = new chosen_box(src)
H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK)
var/datum/martial_art/cqc/under_siege/justacook = new
justacook.teach(H)
/*
Botanist
*/
/datum/job/hydro
title = "Botanist"
flag = BOTANIST
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 3
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#bbe291"
outfit = /datum/outfit/job/botanist
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
// Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS
// Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT
// Given Morgue access because they have a viable means of cloning.
/datum/outfit/job/botanist
name = "Botanist"
jobtype = /datum/job/hydro
belt = /obj/item/pda/botanist
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/hydroponics
suit = /obj/item/clothing/suit/apron
gloves =/obj/item/clothing/gloves/botanic_leather
suit_store = /obj/item/plant_analyzer
backpack = /obj/item/storage/backpack/botany
satchel = /obj/item/storage/backpack/satchel/hyd
/*
Janitor
*/
/datum/job/janitor
title = "Janitor"
flag = JANITOR
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/global/janitors = 0
outfit = /datum/outfit/job/janitor
access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/janitor
name = "Janitor"
jobtype = /datum/job/janitor
belt = /obj/item/pda/janitor
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/janitor
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
@@ -0,0 +1,27 @@
/datum/job/cargo_tech
title = "Cargo Technician"
flag = CARGOTECH
department_head = list("Quartermaster")
department_flag = CIVILIAN
faction = "Station"
total_positions = 3
spawn_positions = 2
supervisors = "the quartermaster"
selection_color = "#ca8f55"
outfit = /datum/outfit/job/cargo_tech
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN
/datum/outfit/job/cargo_tech
name = "Cargo Technician"
jobtype = /datum/job/cargo_tech
belt = /obj/item/pda/cargo
ears = /obj/item/radio/headset/headset_cargo
uniform = /obj/item/clothing/under/rank/cargotech
l_hand = /obj/item/export_scanner
@@ -1,95 +1,121 @@
//Due to how large this one is it gets its own file
/*
Chaplain
*/
/datum/job/chaplain
title = "Chaplain"
flag = CHAPLAIN
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
outfit = /datum/outfit/job/chaplain
access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
/datum/job/chaplain/after_spawn(mob/living/H, mob/M)
. = ..()
if(H.mind)
H.mind.isholy = TRUE
var/obj/item/storage/book/bible/booze/B = new
if(GLOB.religion)
B.deity_name = GLOB.deity
B.name = GLOB.bible_name
B.icon_state = GLOB.bible_icon_state
B.item_state = GLOB.bible_item_state
to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.")
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod
var/obj/item/nullrod/N = new nrt(H)
H.put_in_hands(N)
return
var/new_religion = "Christianity"
if(M.client && M.client.prefs.custom_names["religion"])
new_religion = M.client.prefs.custom_names["religion"]
var/new_deity = "Space Jesus"
if(M.client && M.client.prefs.custom_names["deity"])
new_deity = M.client.prefs.custom_names["deity"]
B.deity_name = new_deity
switch(lowertext(new_religion))
if("christianity")
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
if("satanism")
B.name = "The Unholy Bible"
if("cthulhu")
B.name = "The Necronomicon"
if("islam")
B.name = "Quran"
if("scientology")
B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
if("chaos")
B.name = "The Book of Lorgar"
if("imperium")
B.name = "Uplifting Primer"
if("toolboxia")
B.name = "Toolbox Manifesto"
if("homosexuality")
B.name = "Guys Gone Wild"
if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes")
B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
H.adjustBrainLoss(100) // starts off retarded as fuck
if("science")
B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
else
B.name = "The Holy Book of [new_religion]"
GLOB.religion = new_religion
GLOB.bible_name = B.name
GLOB.deity = B.deity_name
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1)
SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1)
/datum/outfit/job/chaplain
name = "Chaplain"
jobtype = /datum/job/chaplain
belt = /obj/item/pda/chaplain
uniform = /obj/item/clothing/under/rank/chaplain
backpack_contents = list(/obj/item/camera/spooky = 1)
backpack = /obj/item/storage/backpack/cultpack
satchel = /obj/item/storage/backpack/cultpack
/datum/job/chaplain
title = "Chaplain"
flag = CHAPLAIN
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
outfit = /datum/outfit/job/chaplain
access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
display_order = JOB_DISPLAY_ORDER_CHAPLAIN
/datum/job/chaplain/after_spawn(mob/living/H, mob/M)
. = ..()
if(H.mind)
H.mind.isholy = TRUE
var/obj/item/storage/book/bible/booze/B = new
if(GLOB.religion)
B.deity_name = GLOB.deity
B.name = GLOB.bible_name
B.icon_state = GLOB.bible_icon_state
B.item_state = GLOB.bible_item_state
to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.")
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod
var/obj/item/nullrod/N = new nrt(H)
H.put_in_hands(N)
return
var/new_religion = DEFAULT_RELIGION
if(M.client && M.client.prefs.custom_names["religion"])
new_religion = M.client.prefs.custom_names["religion"]
var/new_deity = DEFAULT_DEITY
if(M.client && M.client.prefs.custom_names["deity"])
new_deity = M.client.prefs.custom_names["deity"]
B.deity_name = new_deity
switch(lowertext(new_religion))
if("christianity") // DEFAULT_RELIGION
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
if("buddhism")
B.name = "The Sutras"
if("clownism","honkmother","honk","honkism","comedy")
B.name = pick("The Holy Joke Book", "Just a Prank", "Hymns to the Honkmother")
if("chaos")
B.name = "The Book of Lorgar"
if("cthulhu")
B.name = "The Necronomicon"
if("hinduism")
B.name = "The Vedas"
if("homosexuality")
B.name = pick("Guys Gone Wild","Coming Out of The Closet")
if("imperium")
B.name = "Uplifting Primer"
if("islam")
B.name = "Quran"
if("judaism")
B.name = "The Torah"
if("lampism")
B.name = "Fluorescent Incandescence"
if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes")
B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition","F.A.T.A.L. Rulebook")
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // starts off retarded as fuck
if("monkeyism","apism","gorillism","primatism")
B.name = pick("Going Bananas", "Bananas Out For Harambe")
if("mormonism")
B.name = "The Book of Mormon"
if("pastafarianism")
B.name = "The Gospel of the Flying Spaghetti Monster"
if("rastafarianism","rasta")
B.name = "The Holy Piby"
if("satanism")
B.name = "The Unholy Bible"
if("science")
B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
if("scientology")
B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
if("servicianism", "partying")
B.name = "The Tenets of Servicia"
B.deity_name = pick("Servicia", "Space Bacchus", "Space Dionysus")
B.desc = "Happy, Full, Clean. Live it and give it."
if("subgenius")
B.name = "Book of the SubGenius"
if("toolboxia","greytide")
B.name = pick("Toolbox Manifesto","iGlove Assistants")
if("weeaboo","kawaii")
B.name = pick("Fanfiction Compendium","Japanese for Dummies","The Manganomicon","Establishing Your O.T.P")
else
B.name = "The Holy Book of [new_religion]"
GLOB.religion = new_religion
GLOB.bible_name = B.name
GLOB.deity = B.deity_name
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1)
SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1)
/datum/outfit/job/chaplain
name = "Chaplain"
jobtype = /datum/job/chaplain
belt = /obj/item/pda/chaplain
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/chaplain
backpack_contents = list(/obj/item/camera/spooky = 1)
backpack = /obj/item/storage/backpack/cultpack
satchel = /obj/item/storage/backpack/cultpack
+36
View File
@@ -0,0 +1,36 @@
/datum/job/chemist
title = "Chemist"
flag = CHEMIST
department_head = list("Chief Medical Officer")
department_flag = MEDSCI
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#74b5e0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
outfit = /datum/outfit/job/chemist
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_CHEMIST
/datum/outfit/job/chemist
name = "Chemist"
jobtype = /datum/job/chemist
glasses = /obj/item/clothing/glasses/science
belt = /obj/item/pda/chemist
ears = /obj/item/radio/headset/headset_med
uniform = /obj/item/clothing/under/rank/chemist
shoes = /obj/item/clothing/shoes/sneakers/white
suit = /obj/item/clothing/suit/toggle/labcoat/chemist
backpack = /obj/item/storage/backpack/chemistry
satchel = /obj/item/storage/backpack/satchel/chem
duffelbag = /obj/item/storage/backpack/duffelbag/med
chameleon_extras = /obj/item/gun/syringe
@@ -0,0 +1,64 @@
/datum/job/chief_engineer
title = "Chief Engineer"
flag = CHIEF
// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
department_head = list("Captain")
department_flag = ENGSEC
head_announce = list(RADIO_CHANNEL_ENGINEERING)
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ee7400"
req_admin_notify = 1
minimal_player_age = 7
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_ENGINEERING
outfit = /datum/outfit/job/ce
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER
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
id = /obj/item/card/id/silver
belt = /obj/item/storage/belt/utility/chief/full
l_pocket = /obj/item/pda/heads/ce
ears = /obj/item/radio/headset/heads/ce
uniform = /obj/item/clothing/under/rank/chief_engineer
shoes = /obj/item/clothing/shoes/sneakers/brown
head = /obj/item/clothing/head/hardhat/white
gloves = /obj/item/clothing/gloves/color/black/ce
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1)
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
box = /obj/item/storage/box/engineer
pda_slot = SLOT_L_STORE
chameleon_extras = /obj/item/stamp/ce
/datum/outfit/job/ce/rig
name = "Chief Engineer (Hardsuit)"
mask = /obj/item/clothing/mask/breath
suit = /obj/item/clothing/suit/space/hardsuit/engine/elite
shoes = /obj/item/clothing/shoes/magboots/advance
suit_store = /obj/item/tank/internals/oxygen
glasses = /obj/item/clothing/glasses/meson/engine
gloves = /obj/item/clothing/gloves/color/yellow
head = null
internals_slot = SLOT_S_STORE
@@ -0,0 +1,59 @@
/datum/job/cmo
title = "Chief Medical Officer"
flag = CMO_JF
department_head = list("Captain")
department_flag = MEDSCI
// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
head_announce = list(RADIO_CHANNEL_MEDICAL)
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the captain"
selection_color = "#509ed1"
req_admin_notify = 1
minimal_player_age = 7
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_MEDICAL
outfit = /datum/outfit/job/cmo
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM,
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM,
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS)
display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
/datum/outfit/job/cmo
name = "Chief Medical Officer"
jobtype = /datum/job/cmo
id = /obj/item/card/id/silver
belt = /obj/item/pda/heads/cmo
l_pocket = /obj/item/pinpointer/crew
ears = /obj/item/radio/headset/heads/cmo
uniform = /obj/item/clothing/under/rank/chief_medical_officer
shoes = /obj/item/clothing/shoes/sneakers/brown
suit = /obj/item/clothing/suit/toggle/labcoat/cmo
l_hand = /obj/item/storage/firstaid/regular
suit_store = /obj/item/flashlight/pen
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
backpack = /obj/item/storage/backpack/medic
satchel = /obj/item/storage/backpack/satchel/med
duffelbag = /obj/item/storage/backpack/duffelbag/med
chameleon_extras = list(/obj/item/gun/syringe, /obj/item/stamp/cmo)
/datum/outfit/job/cmo/hardsuit
name = "Chief Medical Officer (Hardsuit)"
mask = /obj/item/clothing/mask/breath
suit = /obj/item/clothing/suit/space/hardsuit/medical
suit_store = /obj/item/tank/internals/oxygen
r_pocket = /obj/item/flashlight/pen
-206
View File
@@ -1,206 +0,0 @@
/*
Clown
*/
/datum/job/clown
title = "Clown"
flag = CLOWN
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
outfit = /datum/outfit/job/clown
access = list(ACCESS_THEATRE)
minimal_access = list(ACCESS_THEATRE)
/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
. = ..()
H.apply_pref_name("clown", M.client)
/datum/outfit/job/clown
name = "Clown"
jobtype = /datum/job/clown
belt = /obj/item/pda/clown
uniform = /obj/item/clothing/under/rank/clown
shoes = /obj/item/clothing/shoes/clown_shoes
mask = /obj/item/clothing/mask/gas/clown_hat
l_pocket = /obj/item/bikehorn
backpack_contents = list(
/obj/item/stamp/clown = 1,
/obj/item/reagent_containers/spray/waterflower = 1,
/obj/item/reagent_containers/food/snacks/grown/banana = 1,
/obj/item/instrument/bikehorn = 1,
)
implants = list(/obj/item/implant/sad_trombone)
backpack = /obj/item/storage/backpack/clown
satchel = /obj/item/storage/backpack/clown
duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel
box = /obj/item/storage/box/hug/survival
chameleon_extras = /obj/item/stamp/clown
/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names))
/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
H.dna.add_mutation(CLOWNMUT)
H.dna.add_mutation(SMILE)
/*
Mime
*/
/datum/job/mime
title = "Mime"
flag = MIME
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
outfit = /datum/outfit/job/mime
access = list(ACCESS_THEATRE)
minimal_access = list(ACCESS_THEATRE)
/datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M)
H.apply_pref_name("mime", M.client)
/datum/outfit/job/mime
name = "Mime"
jobtype = /datum/job/mime
belt = /obj/item/pda/mime
uniform = /obj/item/clothing/under/rank/mime
mask = /obj/item/clothing/mask/gas/mime
gloves = /obj/item/clothing/gloves/color/white
head = /obj/item/clothing/head/frenchberet
suit = /obj/item/clothing/suit/suspenders
backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1)
accessory = /obj/item/clothing/accessory/pocketprotector/cosmetology
backpack = /obj/item/storage/backpack/mime
satchel = /obj/item/storage/backpack/mime
/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
if(H.mind)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null))
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
H.mind.miming = 1
/*
Curator
*/
/datum/job/curator
title = "Curator"
flag = CURATOR
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
outfit = /datum/outfit/job/curator
access = list(ACCESS_LIBRARY)
minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION,ACCESS_MINING_STATION)
/datum/outfit/job/curator
name = "Curator"
jobtype = /datum/job/curator
belt = /obj/item/pda/curator
uniform = /obj/item/clothing/under/rank/curator
l_hand = /obj/item/storage/bag/books
r_pocket = /obj/item/key/displaycase
l_pocket = /obj/item/laser_pointer
accessory = /obj/item/clothing/accessory/pocketprotector/full
backpack_contents = list(
/obj/item/melee/curator_whip = 1,
/obj/item/soapstone = 1,
/obj/item/barcodescanner = 1
)
/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
H.grant_all_languages(omnitongue=TRUE)
/*
Lawyer
*/
/datum/job/lawyer
title = "Lawyer"
flag = LAWYER
department_head = list("Head of Personnel")
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#dddddd"
var/lawyers = 0 //Counts lawyer amount
outfit = /datum/outfit/job/lawyer
access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
/datum/outfit/job/lawyer
name = "Lawyer"
jobtype = /datum/job/lawyer
belt = /obj/item/pda/lawyer
ears = /obj/item/radio/headset/headset_sec
uniform = /obj/item/clothing/under/lawyer/bluesuit
suit = /obj/item/clothing/suit/toggle/lawyer
shoes = /obj/item/clothing/shoes/laceup
l_hand = /obj/item/storage/briefcase/lawyer
l_pocket = /obj/item/laser_pointer
r_pocket = /obj/item/clothing/accessory/lawyers_badge
chameleon_extras = /obj/item/stamp/law
/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
var/datum/job/lawyer/J = SSjob.GetJobType(jobtype)
J.lawyers++
if(J.lawyers>1)
uniform = /obj/item/clothing/under/lawyer/purpsuit
suit = /obj/item/clothing/suit/toggle/lawyer/purple

Some files were not shown because too many files have changed in this diff Show More