diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 60c91e51bb..485666a8ff 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -1688,8 +1688,7 @@
/obj/machinery/button/door{
id = "hos";
name = "HoS Office Shutters";
- pixel_y = -25;
-
+ pixel_y = -25
},
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
@@ -26228,9 +26227,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/office)
"bkx" = (
-/obj/machinery/status_display/supply{
- pixel_y = 2
- },
+/obj/machinery/status_display/supply,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -31345,7 +31342,9 @@
id = "QMLoad"
},
/obj/machinery/light,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = -32
+ },
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -33612,7 +33611,9 @@
name = "Station Intercom (General)";
pixel_y = -35
},
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = -32
+ },
/obj/machinery/computer/security/qm{
dir = 4
},
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 1bcb5c20a8..efd4d0f56e 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -17692,7 +17692,9 @@
pixel_x = -28;
pixel_y = 23
},
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = 32
+ },
/obj/machinery/conveyor{
dir = 5;
id = "QMLoad2"
@@ -21617,7 +21619,9 @@
/obj/structure/table,
/obj/item/clipboard,
/obj/item/stamp/qm,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = 32
+ },
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"aQu" = (
@@ -27037,7 +27041,9 @@
/area/hallway/primary/port)
"baA" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = 32
+ },
/obj/structure/table,
/obj/item/folder/yellow,
/obj/effect/turf_decal/tile/brown{
@@ -27920,7 +27926,9 @@
/area/quartermaster/office)
"bbS" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_y = 32
+ },
/obj/effect/turf_decal/tile/brown{
dir = 1
},
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index dbb26f8808..cef0aefc50 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -2833,7 +2833,9 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hop)
"aeP" = (
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = -32
+ },
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 7935a2a3f9..9efbb28e2b 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -21743,7 +21743,9 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aZj" = (
-/obj/machinery/status_display/supply,
+/obj/machinery/status_display/supply{
+ pixel_x = -32
+ },
/obj/machinery/computer/bounty{
dir = 4
},
@@ -36058,7 +36060,9 @@
/obj/item/folder/white,
/obj/item/pen,
/obj/item/stamp/rd,
-/obj/machinery/status_display/ai,
+/obj/machinery/status_display/ai{
+ pixel_y = -32
+ },
/obj/machinery/camera{
c_tag = "Research Director's Office";
dir = 1;
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 28e4e8f5ea..fc8e7dda2f 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -489,4 +489,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define AREASELECT_CORNERA "corner A"
#define AREASELECT_CORNERB "corner B"
-#define PREF_SAVELOAD_COOLDOWN 5
\ No newline at end of file
+#define PREF_SAVELOAD_COOLDOWN 5
+
+#define VOMIT_TOXIC 1
+#define VOMIT_PURPLE 2
\ No newline at end of file
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index d490a76611..7f3c063777 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -112,6 +112,7 @@
#define TRAIT_PARALYSIS_R_ARM "para-r-arm"
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
+#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer"
@@ -153,6 +154,7 @@
#define TRAUMA_TRAIT "trauma"
#define SPECIES_TRAIT "species"
#define ORGAN_TRAIT "organ"
+#define JOB_TRAIT "job"
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
// unique trait sources, still defines
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 0bd99825a2..7f9e0c6ca5 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -108,10 +108,12 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/storage/toolbox/artistic = 2,
/obj/item/toy/eightball = 1,
/obj/item/reagent_containers/pill/floorpill = 1,
+ /obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 1,
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
/obj/item/storage/pill_bottle/penis_enlargement = 2,
/obj/item/clothing/shoes/wheelys = 1,
/obj/item/clothing/shoes/kindleKicks = 1,
/obj/item/autosurgeon/penis = 1,
+ /obj/item/autosurgeon/testicles = 1,
"" = 3
))
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index 73a207a457..2b5af9ddb8 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -20,10 +20,23 @@
else
return TRUE
-/obj/screen/movable/action_button/MouseDrop()
- if (!can_use(usr))
+/obj/screen/movable/action_button/MouseDrop(over_object)
+ if(!can_use(usr))
return
- return ..()
+ if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle)))
+ if(locked)
+ to_chat(usr, "Action button \"[name]\" is locked, unlock it first.")
+ return
+ var/obj/screen/movable/action_button/B = over_object
+ var/list/actions = usr.actions
+ actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action))
+ moved = FALSE
+ ordered = TRUE
+ B.moved = FALSE
+ B.ordered = TRUE
+ usr.update_action_buttons()
+ else
+ return ..()
/obj/screen/movable/action_button/Click(location,control,params)
if (!can_use(usr))
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 4a3143da79..74f9ad0382 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -126,9 +126,9 @@ SUBSYSTEM_DEF(ticker)
if(!GLOB.syndicate_code_phrase)
- GLOB.syndicate_code_phrase = generate_code_phrase()
+ GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE)
if(!GLOB.syndicate_code_response)
- GLOB.syndicate_code_response = generate_code_phrase()
+ GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE)
start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10)
if(CONFIG_GET(flag/randomize_shift_time))
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index d70493dedf..ee1f5b8c3d 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -72,7 +72,7 @@ SUBSYSTEM_DEF(traumas)
"security" = typecacheof(list(/obj/item/clothing/under/rank/security, /obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/det,
/obj/item/melee/baton, /obj/item/gun/energy/taser, /obj/item/restraints/handcuffs,
- /obj/machinery/door/airlock/security)),
+ /obj/machinery/door/airlock/security, /obj/effect/hallucination/simple/securitron)),
"clowns" = typecacheof(list(/obj/item/clothing/under/rank/clown, /obj/item/clothing/shoes/clown_shoes,
/obj/item/clothing/mask/gas/clown_hat, /obj/item/instrument/bikehorn,
@@ -160,22 +160,22 @@ SUBSYSTEM_DEF(traumas)
/obj/item/grown/bananapeel/mimanapeel, /obj/item/cartridge/virus/mime, /obj/item/clothing/shoes/sneakers/mime,
/obj/item/bedsheet/mime, /obj/item/reagent_containers/food/snacks/burger/mime, /obj/item/clothing/head/beret, /obj/item/clothing/mask/gas/sexymime,
/obj/item/clothing/under/sexymime, /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)),
-
+
"cats" = typecacheof(list(/obj/item/organ/ears/cat, /obj/item/organ/tail/cat, /obj/item/laser_pointer, /obj/item/toy/cattoy, /obj/item/clothing/head/kitty,
/obj/item/clothing/head/collectable/kitty, /obj/item/melee/chainofcommand/tailwhip/kitty, /obj/item/stack/sheet/animalhide/cat)),
-
+
"syndicate" = typecacheof(list(/obj/item/stack/tile/mineral/plastitanium, /obj/machinery/computer/shuttle/syndicate, /obj/machinery/computer/shuttle/syndicate/recall, /obj/machinery/computer/shuttle/syndicate/drop_pod, /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate, /obj/machinery/recharge_station,
/obj/machinery/porta_turret/syndicate, /obj/structure/closet/syndicate, /obj/machinery/suit_storage_unit/syndicate, /obj/item/clothing/under/syndicate, /obj/item/folder/syndicate, /obj/item/documents/syndicate, /obj/item/clothing/glasses/phantomthief/syndicate, /obj/item/antag_spawner/nuke_ops, /obj/item/storage/box/syndicate,
/obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver/syndie,
/obj/item/gun/ballistic/automatic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/m90, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/storage/belt/grenade/full, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate, /obj/item/gun/energy/kinetic_accelerator/crossbow,
- /obj/item/melee/transforming/energy/sword/saber, /obj/item/twohanded/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm,
+ /obj/item/melee/transforming/energy/sword/saber, /obj/item/twohanded/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate,
/obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/aiModule/syndicate,
- /obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited,
- /obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate,
- /obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake,
- /obj/item/radio/headset/syndicate, /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate, /obj/item/pda/syndicate, /obj/item/clothing/suit/armor/vest/capcarapace/syndicate, /obj/item/gun/ballistic/automatic/flechette, /obj/item/ammo_box/magazine/flechette, /obj/item/clothing/suit/toggle/lawyer/black/syndie, /obj/item/melee/transforming/energy/sword/cx/traitor,
- /obj/structure/sign/poster/contraband/syndicate_pistol, /obj/structure/sign/poster/contraband/syndicate_recruitment, /obj/item/bedsheet/syndie, /obj/item/borg/upgrade/syndicate, /obj/item/tank/jetpack/oxygen/harness, /obj/item/firing_pin/implant/pindicate, /obj/item/reagent_containers/glass/bottle/traitor, /obj/item/storage/belt/military,
+ /obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited,
+ /obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate,
+ /obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake,
+ /obj/item/radio/headset/syndicate, /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate, /obj/item/pda/syndicate, /obj/item/clothing/suit/armor/vest/capcarapace/syndicate, /obj/item/gun/ballistic/automatic/flechette, /obj/item/ammo_box/magazine/flechette, /obj/item/clothing/suit/toggle/lawyer/black/syndie, /obj/item/melee/transforming/energy/sword/cx/traitor,
+ /obj/structure/sign/poster/contraband/syndicate_pistol, /obj/structure/sign/poster/contraband/syndicate_recruitment, /obj/item/bedsheet/syndie, /obj/item/borg/upgrade/syndicate, /obj/item/tank/jetpack/oxygen/harness, /obj/item/firing_pin/implant/pindicate, /obj/item/reagent_containers/glass/bottle/traitor, /obj/item/storage/belt/military,
/obj/item/twohanded/shockpaddles/syndicate, /obj/item/clothing/mask/cigarette/syndicate, /obj/item/toy/plush/nukeplushie)),
"eye" = typecacheof(list(/obj/item/organ/eyes, /obj/item/reagent_containers/syringe))
@@ -199,7 +199,7 @@ SUBSYSTEM_DEF(traumas)
"anime" = typecacheof(list(/datum/species/human/felinid)),
"cats" = typecacheof(list(/datum/species/human/felinid)),
"syndicate" = typecacheof(list(/datum/species/corporate, /datum/species/zombie/infectious))
- )
+ )
return ..()
diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm
index 941e7103c6..3731397170 100644
--- a/code/datums/brain_damage/brain_trauma.dm
+++ b/code/datums/brain_damage/brain_trauma.dm
@@ -9,7 +9,8 @@
var/obj/item/organ/brain/brain //the poor bastard's brain
var/gain_text = "You feel traumatized."
var/lose_text = "You no longer feel traumatized."
- var/can_gain = TRUE //can this be gained through random traumas?
+ var/can_gain = TRUE
+ var/random_gain = TRUE //can this be gained through random traumas?
var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure?
/datum/brain_trauma/Destroy()
@@ -23,7 +24,7 @@
//Called on life ticks
/datum/brain_trauma/proc/on_life()
return
-
+
//Called on death
/datum/brain_trauma/proc/on_death()
return
diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm
index c6ccbee38c..71a5f21454 100644
--- a/code/datums/brain_damage/phobia.dm
+++ b/code/datums/brain_damage/phobia.dm
@@ -81,7 +81,7 @@
/datum/brain_trauma/mild/phobia/on_say(message)
for(var/word in trigger_words)
var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i")
-
+
if(findtext(message, reg))
to_chat(owner, "You can't bring yourself to say the word \"[word]\"!")
return ""
@@ -119,3 +119,7 @@
owner.confused += 10
owner.Jitter(10)
owner.stuttering += 10
+
+/datum/brain_trauma/mild/phobia/security
+ phobia_type = "security"
+ random_gain = FALSE
diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm
index 0bbbf8de08..d9e6f00643 100644
--- a/code/datums/brain_damage/special.dm
+++ b/code/datums/brain_damage/special.dm
@@ -134,3 +134,71 @@
/datum/brain_trauma/special/psychotic_brawling/bath_salts
name = "Chemical Violent Psychosis"
+ random_gain = FALSE
+
+/datum/brain_trauma/special/beepsky
+ name = "Criminal"
+ desc = "Patient seems to be a criminal."
+ scan_desc = "criminal mind"
+ gain_text = "Justice is coming for you."
+ lose_text = "You were absolved for your crimes."
+ random_gain = FALSE
+ var/obj/effect/hallucination/simple/securitron/beepsky
+
+/datum/brain_trauma/special/beepsky/on_gain()
+ create_securitron()
+ ..()
+
+/datum/brain_trauma/special/beepsky/proc/create_securitron()
+ var/turf/where = locate(owner.x + pick(-12, 12), owner.y + pick(-12, 12), owner.z)
+ beepsky = new(where, owner)
+ beepsky.victim = owner
+
+/datum/brain_trauma/special/beepsky/on_lose()
+ QDEL_NULL(beepsky)
+ ..()
+
+/datum/brain_trauma/special/beepsky/on_life()
+ if(QDELETED(beepsky) || !beepsky.loc || beepsky.z != owner.z)
+ QDEL_NULL(beepsky)
+ if(prob(30))
+ create_securitron()
+ else
+ return
+ if(get_dist(owner, beepsky) >= 10 && prob(20))
+ QDEL_NULL(beepsky)
+ create_securitron()
+ if(owner.stat != CONSCIOUS)
+ if(prob(20))
+ owner.playsound_local(beepsky, 'sound/voice/beepsky/iamthelaw.ogg', 50)
+ return
+ if(get_dist(owner, beepsky) <= 1)
+ owner.playsound_local(owner, 'sound/weapons/egloves.ogg', 50)
+ owner.visible_message("[owner]'s body jerks as if it was shocked.", "You feel the fist of the LAW.")
+ owner.take_bodypart_damage(0,0,rand(40, 70))
+ QDEL_NULL(beepsky)
+ if(prob(20) && get_dist(owner, beepsky) <= 8)
+ owner.playsound_local(beepsky, 'sound/voice/beepsky/criminal.ogg', 40)
+ ..()
+
+/obj/effect/hallucination/simple/securitron
+ name = "Securitron"
+ desc = "The LAW is coming."
+ image_icon = 'icons/mob/aibots.dmi'
+ image_state = "secbot-c"
+ var/victim
+
+/obj/effect/hallucination/simple/securitron/New()
+ name = pick ( "officer Beepsky", "officer Johnson", "officer Pingsky")
+ START_PROCESSING(SSfastprocess,src)
+ ..()
+
+/obj/effect/hallucination/simple/securitron/process()
+ if(prob(60))
+ forceMove(get_step_towards(src, victim))
+ if(prob(5))
+ to_chat(victim, "[name] exclaims, \"Level 10 infraction alert!\"")
+
+/obj/effect/hallucination/simple/securitron/Destroy()
+ STOP_PROCESSING(SSfastprocess,src)
+ return ..()
\ No newline at end of file
diff --git a/code/datums/components/storage/concrete/emergency.dm b/code/datums/components/storage/concrete/emergency.dm
index e5f9d83a17..48880ff605 100644
--- a/code/datums/components/storage/concrete/emergency.dm
+++ b/code/datums/components/storage/concrete/emergency.dm
@@ -7,12 +7,28 @@
. = ..()
RegisterSignal(parent, COMSIG_ATOM_EMAG_ACT, .proc/unlock_me)
+/datum/component/storage/concrete/emergency/on_attack_hand(datum/source, mob/user)
+ var/atom/A = parent
+ if(!attack_hand_interact)
+ return
+ if(user.active_storage == src && A.loc == user) //if you're already looking inside the storage item
+ user.active_storage.close(user)
+ close(user)
+ . = COMPONENT_NO_ATTACK_HAND
+ return
+ . = COMPONENT_NO_ATTACK_HAND
+ if(!check_locked(source, user, TRUE))
+ show_to(user)
+ A.do_jiggle()
+ if(rustle_sound)
+ playsound(A, "rustle", 50, 1, -5)
+
/datum/component/storage/concrete/emergency/signal_insertion_attempt(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE)
if(!silent && istype(I, /obj/item/card/emag))
silent = TRUE // suppresses the message
return ..()
-/datum/component/storage/concrete/check_locked(datum/source, mob/user, message = FALSE)
+/datum/component/storage/concrete/emergency/check_locked(datum/source, mob/user, message = FALSE)
. = locked && GLOB.security_level < SEC_LEVEL_RED
if(message && . && user)
to_chat(user, "The storage unit will only unlock during a Red or Delta security alert.")
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 869fe59ae9..52d0036154 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -531,11 +531,9 @@
if(!istype(M))
return FALSE
A.add_fingerprint(M)
- if(locked && !force)
- to_chat(M, "[parent] seems to be locked!")
+ if(!force && (check_locked(null, M) || !M.CanReach(parent, view_only = TRUE)))
return FALSE
- if(force || M.CanReach(parent, view_only = TRUE))
- show_to(M)
+ show_to(M)
/datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M)
if(isitem(O))
@@ -749,7 +747,8 @@
if(!quickdraw)
A.add_fingerprint(user)
user_show_to_mob(user)
- playsound(A, "rustle", 50, 1, -5)
+ if(rustle_sound)
+ playsound(A, "rustle", 50, 1, -5)
return
if(!user.incapacitated())
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 127413262c..4283d7f78f 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -195,7 +195,7 @@
/obj/item/clothing/gloves/krav_maga/combatglovesplus
name = "combat gloves plus"
desc = "These tactical gloves are fireproof and shock resistant, and using nanochip technology it teaches you the powers of krav maga."
- icon_state = "black"
+ icon_state = "combat"
item_state = "blackglovesplus"
siemens_coefficient = 0
permeability_coefficient = 0.05
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index ccc2121929..c11f7d9edc 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -31,7 +31,6 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
var/list/jobs = new/list()
jobs["Captain"] = 00
- jobs["Head of Personnel"] = 50
jobs["Head of Security"] = 10
jobs["Warden"] = 11
jobs["Security Officer"] = 12
@@ -47,9 +46,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
jobs["Chief Engineer"] = 40
jobs["Station Engineer"] = 41
jobs["Atmospheric Technician"] = 42
- jobs["Quartermaster"] = 51
- jobs["Shaft Miner"] = 52
- jobs["Cargo Technician"] = 53
+ jobs["Quartermaster"] = 50
+ jobs["Shaft Miner"] = 51
+ jobs["Cargo Technician"] = 52
+ jobs["Head of Personnel"] = 60
jobs["Bartender"] = 61
jobs["Cook"] = 62
jobs["Botanist"] = 63
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 4700dda60d..fc0665f51e 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -537,7 +537,7 @@
var/oldloc = loc
if(internal_damage & MECHA_INT_CONTROL_LOST)
move_result = mechsteprand()
- else if(dir != direction && !strafe)
+ else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"]))
move_result = mechturn(direction)
else
move_result = mechstep(direction)
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index 6d42c302e1..7b00e208cc 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -128,7 +128,7 @@
/datum/action/innate/mecha/strafe
- name = "Toggle Strafing"
+ name = "Toggle Strafing. Disabled when Alt is held."
button_icon_state = "strafe"
/datum/action/innate/mecha/strafe/Activate()
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 79c90b2a2f..15c88d168f 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda
name = "\improper PDA"
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
- icon = 'icons/obj/pda.dmi'
+ icon = 'icons/obj/pda_alt.dmi'
icon_state = "pda"
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 1a733fbff2..bf352e8eb7 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -87,7 +87,7 @@
/obj/item/cartridge/detective
name = "\improper D.E.T.E.C.T. cartridge"
- icon_state = "cart-s"
+ icon_state = "cart-eye"
access = CART_SECURITY | CART_MEDICAL | CART_MANIFEST
bot_access_flags = SEC_BOT
@@ -100,23 +100,25 @@
/obj/item/cartridge/lawyer
name = "\improper P.R.O.V.E. cartridge"
- icon_state = "cart-s"
+ icon_state = "cart-law"
access = CART_SECURITY
spam_enabled = 1
/obj/item/cartridge/curator
name = "\improper Lib-Tweet cartridge"
- icon_state = "cart-s"
+ icon_state = "cart-lib"
access = CART_NEWSCASTER
/obj/item/cartridge/roboticist
name = "\improper B.O.O.P. Remote Control cartridge"
desc = "Packed with heavy duty triple-bot interlink!"
+ icon_state = "cart-robo"
bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT
access = CART_DRONEPHONE
/obj/item/cartridge/signal
name = "generic signaler cartridge"
+ icon_state = "cart-sig"
desc = "A data cartridge with an integrated radio signaler module."
/obj/item/cartridge/signal/toxins
diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm
index 13d653a4fe..d35b2b58cf 100644
--- a/code/game/objects/items/devices/PDA/virus_cart.dm
+++ b/code/game/objects/items/devices/PDA/virus_cart.dm
@@ -53,7 +53,6 @@
/obj/item/cartridge/virus/syndicate
name = "\improper Detomatix cartridge"
- icon_state = "cart"
access = CART_REMOTE_DOOR
remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
charges = 4
@@ -85,7 +84,7 @@
/obj/item/cartridge/virus/frame
name = "\improper F.R.A.M.E. cartridge"
- icon_state = "cart"
+ icon_state = "cart-f"
var/telecrystals = 0
/obj/item/cartridge/virus/frame/send_virus(obj/item/pda/target, mob/living/U)
diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm
index 9163fb0849..7f3c7f3bfc 100644
--- a/code/game/objects/items/devices/dogborg_sleeper.dm
+++ b/code/game/objects/items/devices/dogborg_sleeper.dm
@@ -17,7 +17,7 @@
var/eject_port = "ingestion"
var/escape_in_progress = FALSE
var/message_cooldown
- var/breakout_time = 300
+ var/breakout_time = 150
var/tmp/last_hearcheck = 0
var/tmp/list/hearing_mobs
var/list/items_preserved = list()
@@ -77,7 +77,7 @@
to_chat(user, "Your [src] is already occupied.")
return
user.visible_message("[hound.name] is carefully inserting [target.name] into their [src].", "You start placing [target] into your [src]...")
- if(!patient && iscarbon(target) && !target.buckled && do_after (user, 50, target = target))
+ if(!patient && iscarbon(target) && !target.buckled && do_after (user, 100, target = target))
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
@@ -420,6 +420,7 @@
desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves."
icon = 'icons/mob/dogborg.dmi'
icon_state = "sleeper"
+ breakout_time = 30 //Medical sleepers should be designed to be as easy as possible to get out of.
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
name = "Mobile Brig"
@@ -429,6 +430,7 @@
inject_amount = 0
min_health = -100
injection_chems = null //So they don't have all the same chems as the medihound!
+ breakout_time = 300
/obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity)
if(istype(K9))
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index e21ce71843..b2313969f0 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -192,7 +192,7 @@
w_class = WEIGHT_CLASS_HUGE //heyo no bohing this!
force = 18 //spear damage
-/obj/item/storage/toolbox/durasteel/afterattack(atom/A, mob/user, proximity)
+/obj/item/storage/toolbox/plastitanium/afterattack(atom/A, mob/user, proximity)
. = ..()
if(proximity && isobj(A) && !isitem(A))
var/obj/O = A
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 032c5b6511..7110ff4405 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -452,16 +452,16 @@
/turf/AllowDrop()
return TRUE
-/turf/proc/add_vomit_floor(mob/living/carbon/M, toxvomit = 0)
+/turf/proc/add_vomit_floor(mob/living/carbon/M, toxvomit = NONE)
var/obj/effect/decal/cleanable/vomit/V = new /obj/effect/decal/cleanable/vomit(src, M.get_static_viruses())
// If the vomit combined, apply toxicity and reagents to the old vomit
if (QDELETED(V))
V = locate() in src
- // Make toxins vomit look different
- if(toxvomit)
+ // Make toxins and blazaam vomit look different
+ if(toxvomit == VOMIT_PURPLE)
+ V.icon_state = "vomitpurp_[pick(1,4)]"
+ else if(toxvomit == VOMIT_TOXIC)
V.icon_state = "vomittox_[pick(1,4)]"
- if(M.reagents)
- clear_reagents_to_vomit_pool(M,V)
/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V)
M.reagents.trans_to(V, M.reagents.total_volume / 10)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 47823a2dc4..828e19e3f6 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -18,7 +18,7 @@
/datum/antagonist/traitor/on_gain()
if(owner.current && isAI(owner.current))
traitor_kind = TRAITOR_AI
-
+
SSticker.mode.traitors += owner
owner.special_role = special_role
if(give_objectives)
@@ -48,7 +48,7 @@
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
A.malf_picker.remove_malf_verbs(A)
qdel(A.malf_picker)
-
+
SSticker.mode.traitors -= owner
if(!silent && owner.current)
to_chat(owner.current," You are no longer the [special_role]! ")
@@ -244,14 +244,16 @@
return
var/mob/traitor_mob=owner.current
- to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:")
- to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]")
- to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]")
+ var/phrases = jointext(GLOB.syndicate_code_phrase, ", ")
+ var/responses = jointext(GLOB.syndicate_code_response, ", ")
- antag_memory += "Code Phrase: [GLOB.syndicate_code_phrase]
"
- antag_memory += "Code Response: [GLOB.syndicate_code_response]
"
+ var/dat = "The Syndicate have provided you with the following codewords to identify fellow agents:\n"
+ dat += "Code Phrase: [phrases]\n"
+ dat += "Code Response: [responses]"
+ to_chat(traitor_mob, dat)
- to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.")
+ antag_memory += "Code Phrase: [phrases]
"
+ antag_memory += "Code Response: [responses]
"
/datum/antagonist/traitor/proc/add_law_zero()
var/mob/living/silicon/ai/killer = owner.current
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 8d2e6fcedf..07cc5c8225 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -71,13 +71,14 @@
/obj/effect/mob_spawn/Destroy()
GLOB.poi_list -= src
- LAZYREMOVE(GLOB.mob_spawners[job_description ? job_description : name], src)
- if(!LAZYLEN(GLOB.mob_spawners[job_description ? job_description : name]))
- GLOB.mob_spawners -= job_description ? job_description : name
+ var/job_name = job_description ? job_description : name
+ GLOB.mob_spawners -= job_name
+ if(!LAZYLEN(GLOB.mob_spawners[job_name]))
+ LAZYREMOVE(GLOB.mob_spawners[job_name], src)
return ..()
/obj/effect/mob_spawn/proc/can_latejoin() //If it can be taken from the lobby.
- return TRUE
+ return ghost_usable
/obj/effect/mob_spawn/proc/special(mob/M)
return
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index bde3021c76..46cc1fa93c 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1157,7 +1157,7 @@
/datum/supply_pack/materials/bz
name = "BZ Canister Crate"
desc = "Contains a canister of BZ. Requires Toxins access to open."
- cost = 7500 // Costs 3 credits more than what you can get for selling it.
+ cost = 7500 // Costs 3 credits more than what you can get for selling it.
access = ACCESS_TOX_STORAGE
contains = list(/obj/machinery/portable_atmospherics/canister/bz)
crate_name = "BZ canister crate"
@@ -2716,6 +2716,7 @@
/obj/item/restraints/handcuffs/fake/kinky,
/obj/item/clothing/head/kitty/genuine, // Why its illegal
/obj/item/clothing/head/kitty/genuine,
+ /obj/item/storage/pill_bottle/penis_enlargement,
/obj/structure/reagent_dispensers/keg/aphro)
crate_name = "lewd kit"
crate_type = /obj/structure/closet/crate
@@ -2750,6 +2751,19 @@
/obj/item/pen/fountain)
crate_name = "Paperwork"
+/datum/supply_pack/misc/randomised/promiscuous
+ name = "Promiscuous Organs"
+ desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick."
+ cost = 4000 //Only get 2!
+ contraband = TRUE
+ var/num_contained = 2
+ contains = list(/obj/item/autosurgeon/penis,
+ /obj/item/autosurgeon/testicles,
+ /obj/item/autosurgeon/vagina,
+ /obj/item/autosurgeon/breasts,
+ /obj/item/autosurgeon/womb)
+ crate_name = "promiscuous organs"
+
/datum/supply_pack/misc/toner
name = "Toner Crate"
desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'"
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 3c5d547b46..e8a76c63a4 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -202,6 +202,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["tip_delay"], tip_delay)
WRITE_FILE(S["pda_style"], pda_style)
WRITE_FILE(S["pda_color"], pda_color)
+ WRITE_FILE(S["pda_skin"], pda_skin)
//citadel code
WRITE_FILE(S["screenshake"], screenshake)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 64edd69e17..7b1d8be85e 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -515,6 +515,13 @@
list_reagents = list("shamblers" = 30)
foodtype = SUGAR | JUNKFOOD
+/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
+ name = "Grey Bull"
+ desc = "Grey Bull, it gives you gloves!"
+ icon_state = "energy_drink"
+ list_reagents = list("grey_bull" = 20)
+ foodtype = SUGAR | JUNKFOOD
+
/obj/item/reagent_containers/food/drinks/soda_cans/air
name = "canned air"
desc = "There is no air shortage. Do not drink."
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index dab933ca4e..a2a1c6d03f 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -330,6 +330,33 @@
icon_state = "fernetbottle"
list_reagents = list("fernet" = 100)
+/obj/item/reagent_containers/food/drinks/bottle/applejack
+ name = "Buckin' Bronco's Applejack"
+ desc = "Kicks like a horse, tastes like an apple!"
+ icon_state = "applejack_bottle"
+ list_reagents = list("applejack" = 100)
+ foodtype = FRUIT
+
+/obj/item/reagent_containers/food/drinks/bottle/champagne
+ name = "Eau d' Dandy Brut Champagne"
+ desc = "Finely sourced from only the most pretentious French vineyards."
+ icon_state = "champagne_bottle"
+ list_reagents = list("champagne" = 100)
+
+/obj/item/reagent_containers/food/drinks/bottle/blazaam
+ name = "Ginbad's Blazaam"
+ desc = "You feel like you should give the bottle a good rub before opening."
+ icon_state = "blazaambottle"
+ list_reagents = list("blazaam" = 100)
+
+/obj/item/reagent_containers/food/drinks/bottle/trappist
+ name = "Mont de Requin Trappistes Bleu"
+ desc = "Brewed in space-Belgium. Fancy!"
+ icon_state = "trappistbottle"
+ volume = 50
+ list_reagents = list("trappist" = 50)
+
+
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 9d173a34a5..1e5c2eaf60 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -23,6 +23,7 @@
icon_state = R.glass_icon_state
else
var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "glassoverlay")
+ icon_state = "glass_empty"
reagent_overlay.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(reagent_overlay)
else
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index 0aef697883..31e99535d1 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -24,7 +24,8 @@
"blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"),
"cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"),
"sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"),
- "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."))
+ "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."),
+ "peanut_butter" = list("peanutbutter", "peanut butter jar", "A deliciously and sticky spread made from peanuts."))
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
/obj/item/reagent_containers/food/condiment/suicide_act(mob/living/carbon/user)
@@ -236,7 +237,7 @@
volume = 10
amount_per_transfer_from_this = 10
possible_transfer_amounts = list()
- possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!"))
+ possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!"), "astrotame" = list("condi_astrotame", "Astrotame", "The sweetness of a thousand sugars but none of the calories."))
/obj/item/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly.
return
@@ -286,3 +287,8 @@
name = "hotsauce pack"
originalname = "hotsauce"
list_reagents = list("capsaicin" = 10)
+
+/obj/item/reagent_containers/food/condiment/pack/astrotame
+ name = "astrotame pack"
+ originalname = "astrotame"
+ list_reagents = list("astrotame" = 5)
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index c1abec86c1..e36efe750b 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -558,3 +558,19 @@
list_reagents = list("nutriment" = 6, "sodiumchloride" = 2)
tastes = list("rice" = 3, "salt" = 1)
foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/cannedpeaches
+ name = "Canned Peaches"
+ desc = "Just a nice can of ripe peaches swimming in their own juices."
+ icon_state = "peachcan"
+ list_reagents = list("peachjuice" = 20, "sugar" = 8, "nutriment" = 2)
+ filling_color = "#ffdf26"
+ w_class = WEIGHT_CLASS_NORMAL
+ tastes = list("peaches" = 7, "tin" = 1)
+ foodtype = FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cannedpeaches/maint
+ name = "Maintenance Peaches"
+ desc = "I have a mouth and I must eat."
+ icon_state = "peachcanmaint"
+ tastes = list("peaches" = 1, "tin" = 7)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 927a7d2697..238bb4f86a 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -8,27 +8,34 @@
icon_state = "donut1"
bitesize = 5
bonus_reagents = list("sugar" = 1)
- list_reagents = list("nutriment" = 3, "sugar" = 2)
- var/extra_reagent = null
+ list_reagents = list("nutriment" = 3, "sprinkles" = 1, "sugar" = 2)
filling_color = "#D2691E"
tastes = list("donut" = 1)
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR
+ var/frosted_icon = "donut2"
+ var/is_frosted = FALSE
+ var/extra_reagent = null
/obj/item/reagent_containers/food/snacks/donut/Initialize()
. = ..()
if(prob(30))
- icon_state = "donut2"
- name = "frosted donut"
- reagents.add_reagent("sprinkles", 2)
- bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
- filling_color = "#FF69B4"
+ frost_donut()
+/obj/item/reagent_containers/food/snacks/donut/proc/frost_donut()
+ if(is_frosted || !frosted_icon)
+ return
+ is_frosted = TRUE
+ name = "frosted [name]"
+ icon_state = frosted_icon //delish~!
+ reagents.add_reagent("sprinkles", 1)
+ filling_color = "#FF69B4"
+ return TRUE
/obj/item/reagent_containers/food/snacks/donut/checkLiked(fraction, mob/M) //Sec officers always love donuts
if(last_check_time + 50 < world.time)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.mind && H.mind.assigned_role == "Security Officer" || H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Warden" || H.mind.assigned_role == "Head of Security" && !HAS_TRAIT(H, TRAIT_AGEUSIA))
+ if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM) && !HAS_TRAIT(H, TRAIT_AGEUSIA))
to_chat(H,"I love this taste!")
H.adjust_disgust(-5 + -2.5 * fraction)
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
@@ -48,18 +55,12 @@
. = ..()
extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine")
reagents.add_reagent("[extra_reagent]", 3)
- bonus_reagents = list("[extra_reagent]" = 3, "sugar" = 1)
- if(prob(30))
- icon_state = "donut2"
- name = "frosted chaos donut"
- reagents.add_reagent("sprinkles", 2)
- bonus_reagents = list("sprinkles" = 2, "[extra_reagent]" = 3, "sugar" = 1)
- filling_color = "#FF69B4"
/obj/item/reagent_containers/food/snacks/donut/jelly
name = "jelly donut"
desc = "You jelly?"
icon_state = "jdonut1"
+ frosted_icon = "jdonut2"
bonus_reagents = list("sugar" = 1, "vitamin" = 1)
extra_reagent = "berryjuice"
tastes = list("jelly" = 1, "donut" = 3)
@@ -69,12 +70,6 @@
. = ..()
if(extra_reagent)
reagents.add_reagent("[extra_reagent]", 3)
- if(prob(30))
- icon_state = "jdonut2"
- name = "frosted jelly Donut"
- reagents.add_reagent("sprinkles", 2)
- bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
- filling_color = "#FF69B4"
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly
name = "jelly donut"
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 1b602b6759..17a710ada2 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -52,6 +52,33 @@
list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2)
foodtype = GRAIN | FRUIT
+/obj/item/reagent_containers/food/snacks/jellysandwich/pbj
+ name = "\improper PB & J sandwich"
+ desc = "A grand creation of peanut butter, jelly and bread! An all-american classic."
+ icon_state = "pbjsandwich"
+ tastes = list("bread" = 1, "jelly" = 1, "peanuts" = 1)
+
+/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry
+ bonus_reagents = list("cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ foodtype = GRAIN | FRUIT
+
+/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime
+ bonus_reagents = list("slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
+ foodtype = GRAIN | TOXIC
+
+/obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
+ name = "peanut butter sandwich"
+ desc = "You wish you had some jelly to go with this..."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "peanutbuttersandwich"
+ trash = /obj/item/trash/plate
+ bitesize = 3
+ bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "peanut_butter" = 5, "vitamin" = 2)
+ foodtype = GRAIN
+
/obj/item/reagent_containers/food/snacks/notasandwich
name = "not-a-sandwich"
desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache."
@@ -83,6 +110,19 @@
list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2)
foodtype = GRAIN | TOXIC | SUGAR
+/obj/item/reagent_containers/food/snacks/peanut_buttertoast
+ name = "peanut butter toast"
+ desc = "A slice of toast covered with delicious peanut butter."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "peanutbuttertoast"
+ trash = /obj/item/trash/plate
+ bitesize = 3
+ bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "peanut_butter" = 5, "vitamin" = 2)
+ tastes = list("toast" = 1, "peanuts" = 1)
+ foodtype = GRAIN
+
+
/obj/item/reagent_containers/food/snacks/twobread
name = "two bread"
desc = "This seems awfully bitter."
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index f41f6cce80..7c44857b1d 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -152,8 +152,8 @@
/datum/chemical_reaction/beepsky_smash
name = "Beepksy Smash"
id = "beepksysmash"
- results = list("beepskysmash" = 4)
- required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1)
+ results = list("beepskysmash" = 5)
+ required_reagents = list("limejuice" = 2, "quadruple_sec" = 2, "iron" = 1)
/datum/chemical_reaction/doctor_delight
name = "The Doctor's Delight"
@@ -532,11 +532,18 @@
required_reagents = list("hooch" = 1, "absinthe" = 1, "manlydorf" = 1, "syndicatebomb" = 1)
mix_message = "The mixture turns to a sickening froth."
+/datum/chemical_reaction/lemonade
+ name = "Lemonade"
+ id = "lemonade"
+ results = list("lemonade" = 5)
+ required_reagents = list("lemonjuice" = 2, "water" = 2, "sugar" = 1, "ice" = 1)
+ mix_message = "You're suddenly reminded of home."
+
/datum/chemical_reaction/arnold_palmer
name = "Arnold Palmer"
id = "arnold_palmer"
results = list("arnold_palmer" = 2)
- required_reagents = list("tea" = 1, "lemonjuice" = 1)
+ required_reagents = list("tea" = 1, "lemonade" = 1)
mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange."
/datum/chemical_reaction/chocolate_milk
@@ -704,3 +711,87 @@
id = "pinktea"
results = list("pinktea" = 5)
required_reagents = list("aphro" = 1, "arnold_palmer" = 1, "sugar" = 1)
+
+/datum/chemical_reaction/blank_paper
+ name = "Blank Paper"
+ id = "blank_paper"
+ results = list("blank_paper" = 3)
+ required_reagents = list("silencer" = 1, "nothing" = 1, "nuka_cola" = 1)
+
+/datum/chemical_reaction/wizz_fizz
+ name = "Wizz Fizz"
+ id = "wizz_fizz"
+ results = list("wizz_fizz" = 3)
+ required_reagents = list("triple_sec" = 1, "sodawater" = 1, "champagne" = 1)
+ mix_message = "The beverage starts to froth with an almost mystical zeal!"
+ mix_sound = 'sound/effects/bubbles2.ogg'
+
+/datum/chemical_reaction/bug_spray
+ name = "Bug Spray"
+ id = "bug_spray"
+ results = list("bug_spray" = 5)
+ required_reagents = list("triple_sec" = 2, "lemon_lime" = 1, "rum" = 2, "vodka" = 1)
+ mix_message = "The faint aroma of summer camping trips wafts through the air; but what's that buzzing noise?"
+ mix_sound = 'sound/creatures/bee.ogg'
+
+/datum/chemical_reaction/jack_rose
+ name = "Jack Rose"
+ id = "jack_rose"
+ results = list("jack_rose" = 4)
+ required_reagents = list("grenadine" = 1, "applejack" = 2, "limejuice" = 1)
+ mix_message = "As the grenadine incorporates, the beverage takes on a mellow, red-orange glow."
+
+/datum/chemical_reaction/turbo
+ name = "Turbo"
+ id = "turbo"
+ results = list("turbo" = 5)
+ required_reagents = list("moonshine" = 2, "nitrous_oxide" = 1, "sugar_rush" = 1, "pwr_game" = 1)
+
+/datum/chemical_reaction/old_timer
+ name = "Old Timer"
+ id = "old_timer"
+ results = list("old_timer" = 6)
+ required_reagents = list("whiskeysoda" = 3, "parsnipjuice" = 2, "alexander" = 1)
+
+/datum/chemical_reaction/rubberneck
+ name = "Rubberneck"
+ id = "rubberneck"
+ results = list("rubberneck" = 10)
+ required_reagents = list("ethanol" = 4, "grey_bull" = 5, "astrotame" = 1)
+
+/datum/chemical_reaction/duplex
+ name = "Duplex"
+ id = "duplex"
+ results = list("duplex" = 4)
+ required_reagents = list("hcider" = 2, "applejuice" = 1, "berryjuice" = 1)
+
+/datum/chemical_reaction/trappist
+ name = "Trappist"
+ id = "trappist"
+ results = list("trappist" = 5)
+ required_reagents = list("ale" = 2, "holywater" = 2, "sugar" = 1)
+
+/datum/chemical_reaction/cream_soda
+ name = "Cream Soda"
+ id = "cream_soda"
+ results = list("cream_soda" = 4)
+ required_reagents = list("sugar" = 2, "sodawater" = 2, "vanilla" = 1)
+
+/datum/chemical_reaction/blazaam
+ name = "Blazaam"
+ id = "blazaam"
+ results = list("blazaam" = 3)
+ required_reagents = list("gin" = 2, "peachjuice" = 1, "bluespace" = 1)
+
+/datum/chemical_reaction/planet_cracker
+ name = "Planet Cracker"
+ id = "planet_cracker"
+ results = list("planet_cracker" = 4)
+ required_reagents = list("champagne" = 2, "lizardwine" = 2, "eggyolk" = 1, "gold" = 1)
+ mix_message = "The liquid's color starts shifting as the nanogold is alternately corroded and redeposited."
+
+/datum/chemical_reaction/red_queen
+ name = "Red Queen"
+ id = "red_queen"
+ results = list("red_queen" = 10)
+ required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 0c4e2c2e30..a6240e5b48 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -116,7 +116,7 @@
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/jelliedyoast
+/datum/crafting_recipe/food/jelliedtoast
name = "Jellied toast"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
@@ -125,6 +125,15 @@
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
subcategory = CAT_MISCFOOD
+/datum/crafting_recipe/food/peanutbuttertoast
+ name = "Peanut butter toast"
+ reqs = list(
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/peanut_buttertoast
+ subcategory = CAT_MISCFOOD
+
/datum/crafting_recipe/food/twobread
name = "Two bread"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index 133713ac75..127b2cc238 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -43,6 +43,48 @@
result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry
subcategory = CAT_SANDWICH
+/datum/crafting_recipe/food/pbj_slimesandwich
+ name = "PB&J sandwich"
+ reqs = list(
+ /datum/reagent/toxin/slimejelly = 5,
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime
+ subcategory = CAT_SANDWICH
+
+/datum/crafting_recipe/food/pbj_slimesandwich/alt
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/jelliedtoast/slime = 1,
+ /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
+ )
+
+/datum/crafting_recipe/food/pbj_sandwich
+ name = "PB&J sandwich"
+ reqs = list(
+ /datum/reagent/consumable/cherryjelly = 5,
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry
+ subcategory = CAT_SANDWICH
+
+/datum/crafting_recipe/food/pbj_sandwich/alt
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry = 1,
+ /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
+ )
+
+/datum/crafting_recipe/peanutbutter_sandwich
+ name = "Peanut butter sandwich"
+ reqs = list(
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
+ subcategory = CAT_SANDWICH
+
+
/datum/crafting_recipe/food/notasandwich
name = "Not a sandwich"
reqs = list(
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 33884f8ef0..cf11b77879 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -303,6 +303,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}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
@@ -316,6 +317,8 @@ h1.alert, h2.alert {color: #000000;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
+.red {color: #FF0000}
+.blue {color: #215cff}
.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;}
diff --git a/code/modules/hydroponics/grown/peanuts.dm b/code/modules/hydroponics/grown/peanuts.dm
new file mode 100644
index 0000000000..2423300cc4
--- /dev/null
+++ b/code/modules/hydroponics/grown/peanuts.dm
@@ -0,0 +1,30 @@
+/obj/item/seeds/peanutseed
+ name = "pack of peanut seeds"
+ desc = "These seeds grow to produce fruits botanically classified as legumes, but mundanely referred as nuts."
+ icon_state = "seed-peanut"
+ species = "peanut"
+ plantname = "Peanut Vines"
+ product = /obj/item/reagent_containers/food/snacks/grown/peanut
+ yield = 6
+ growthstages = 4
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list("vitamin" = 0.02, "nutriment" = 0.15, "cooking_oil" = 0.03)
+
+/obj/item/reagent_containers/food/snacks/grown/peanut
+ seed = /obj/item/seeds/peanutseed
+ name = "peanut"
+ desc = "Peanuts for the peanut gallery!" //get me a better description, boys.
+ icon_state = "peanut"
+ filling_color = "#C4AE7A"
+ bitesize = 100
+ foodtype = VEGETABLES
+ dried_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
+ cooked_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
+
+/obj/item/reagent_containers/food/snacks/roasted_peanuts
+ name = "roasted peanuts"
+ desc = "A handful of roasted peanuts, with or without salt."
+ icon_state = "roasted_peanuts"
+ foodtype = VEGETABLES
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+ juice_results = list("peanut_butter" = 3)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm
index be0a209c9f..090809ca88 100644
--- a/code/modules/hydroponics/grown/root.dm
+++ b/code/modules/hydroponics/grown/root.dm
@@ -54,6 +54,7 @@
icon_state = "parsnip"
bitesize_mod = 2
foodtype = VEGETABLES
+ juice_results = list("parsnipjuice" = 0)
wine_power = 35
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 944499470a..46e3d66f55 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -18,6 +18,7 @@ Clown
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
@@ -174,6 +175,8 @@ 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
diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm
index 776727a5f8..2d190cfe60 100644
--- a/code/modules/jobs/job_types/civilian_chaplain.dm
+++ b/code/modules/jobs/job_types/civilian_chaplain.dm
@@ -19,6 +19,7 @@ Chaplain
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
diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm
index e441b3e889..f678700735 100644
--- a/code/modules/jobs/job_types/job.dm
+++ b/code/modules/jobs/job_types/job.dm
@@ -54,10 +54,15 @@
//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
+
//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)
diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm
index e7e0922f62..8d2b9e8681 100644
--- a/code/modules/jobs/job_types/security.dm
+++ b/code/modules/jobs/job_types/security.dm
@@ -35,6 +35,8 @@ Head of Security
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
/datum/outfit/job/hos
name = "Head of Security"
jobtype = /datum/job/hos
@@ -92,6 +94,8 @@ Warden
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS()
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
/datum/job/warden/get_access()
var/list/L = list()
L = ..() | check_config_for_sec_maint()
@@ -145,6 +149,8 @@ Detective
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
/datum/outfit/job/detective
name = "Detective"
jobtype = /datum/job/detective
@@ -198,6 +204,7 @@ Security Officer
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
/datum/job/officer/get_access()
var/list/L = list()
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 686a028b47..315ffff7c7 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -443,10 +443,12 @@
for(var/datum/job/job in SSjob.occupations)
if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE)
available_job_count++
- for(var/obj/effect/mob_spawn/spawner in GLOB.mob_spawners)
- if(spawner.can_latejoin())
- available_job_count++
- break
+ for(var/spawner in GLOB.mob_spawners)
+ var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner])
+ if(!istype(S) || !S.can_latejoin())
+ continue
+ available_job_count++
+ break
if(!available_job_count)
dat += "