diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 919915b820..60c91e51bb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -1689,6 +1689,7 @@ id = "hos"; name = "HoS Office Shutters"; pixel_y = -25; + }, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) @@ -11710,7 +11711,7 @@ /area/maintenance/port/fore) "aAW" = ( /obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide/eva, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -11834,7 +11835,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide/eva, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c8e551b9fe..402633f42b 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -79373,12 +79373,12 @@ }, /obj/structure/window/reinforced, /obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide{ +/obj/item/tank/jetpack/carbondioxide/eva{ pixel_x = 4; pixel_y = -1 }, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide{ +/obj/item/tank/jetpack/carbondioxide/eva, +/obj/item/tank/jetpack/carbondioxide/eva{ pixel_x = -4; pixel_y = 1 }, @@ -80186,11 +80186,11 @@ /area/engine/storage) "cEi" = ( /obj/structure/table/reinforced, -/obj/item/tank/jetpack/carbondioxide{ +/obj/item/tank/jetpack/carbondioxide/eva{ pixel_x = 3; pixel_y = 3 }, -/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide/eva, /obj/machinery/power/apc{ dir = 4; name = "Engineering Storage APC"; diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 78ffa3881c..1bcb5c20a8 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -47699,12 +47699,12 @@ }, /obj/structure/window/reinforced, /obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide{ +/obj/item/tank/jetpack/carbondioxide/eva{ pixel_x = 4; pixel_y = -1 }, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide{ +/obj/item/tank/jetpack/carbondioxide/eva, +/obj/item/tank/jetpack/carbondioxide/eva{ pixel_x = -4; pixel_y = 1 }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 0dc0afcd0c..7935a2a3f9 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -16464,8 +16464,8 @@ /area/storage/eva) "aNt" = ( /obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide{ +/obj/item/tank/jetpack/carbondioxide/eva, +/obj/item/tank/jetpack/carbondioxide/eva{ pixel_x = -4; pixel_y = 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 a5b6e2d389..7363de55ed 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -114,6 +114,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" @@ -158,6 +159,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 036f3f55d0..c444e902fc 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -108,11 +108,13 @@ 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/storage/pill_bottle/breast_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/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 d438c23593..f65344af56 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -125,3 +125,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.dm b/code/datums/martial.dm index 2bc01e0bf6..ae8f92a342 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -5,6 +5,7 @@ var/current_target var/datum/martial_art/base // The permanent style. This will be null unless the martial art is temporary var/deflection_chance = 0 //Chance to deflect projectiles + var/reroute_deflection = FALSE //Delete the bullet, or actually deflect it in some direction? var/block_chance = 0 //Chance to block melee attacks using items while on throw mode. var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not var/help_verb diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 035e5ac833..5f19c37b99 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -7,6 +7,7 @@ /datum/martial_art/the_sleeping_carp name = "The Sleeping Carp" deflection_chance = 100 + reroute_deflection = TRUE no_guns = TRUE allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/sleeping_carp_help 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/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/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 0b520d9dc1..b672eb01ca 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -160,6 +160,11 @@ distribute_pressure = 0 gas_type = /datum/gas/carbon_dioxide +/obj/item/tank/jetpack/carbondioxide/eva + name = "surplus jetpack (carbon dioxide)" + desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals. Rated for less than stellar EVA speeds!" + full_speed = FALSE + /obj/item/tank/jetpack/suit name = "hardsuit jetpack upgrade" desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment." 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/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 07e41f1e01..6c859fb0c7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -203,6 +203,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..085cf61769 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -236,7 +236,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 +286,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/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/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 += "