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 += "
There are currently no open positions!
" @@ -465,9 +467,11 @@ "Science" = list(jobs = list(), titles = GLOB.science_positions, color = "#e6b3e6"), "Security" = list(jobs = list(), titles = GLOB.security_positions, color = "#ff9999"), ) - for(var/obj/effect/mob_spawn/spawner in GLOB.mob_spawners) - if(spawner.can_latejoin()) - categorizedJobs["Ghost Role"]["jobs"] += spawner + 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 + categorizedJobs["Ghost Role"]["jobs"] += S for(var/datum/job/job in SSjob.occupations) if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 2ced3054c4..dafc6cf5e0 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -265,7 +265,7 @@ var/list/datum/brain_trauma/possible_traumas = list() for(var/T in subtypesof(brain_trauma_type)) var/datum/brain_trauma/BT = T - if(can_gain_trauma(BT, resilience)) + if(can_gain_trauma(BT, resilience) && initial(BT.random_gain)) possible_traumas += BT if(!LAZYLEN(possible_traumas)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 51ee5b372b..92a993958a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -496,9 +496,12 @@ add_splatter_floor(T) if(stun) adjustBruteLoss(3) + else if(src.reagents.has_reagent("blazaam")) + if(T) + T.add_vomit_floor(src, VOMIT_PURPLE) else if(T) - T.add_vomit_floor(src, toxic)//toxic barf looks different + T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different T = get_step(T, dir) if (is_blocked_turf(T)) break diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index d1ec7f3e4b..de976da40f 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -22,7 +22,7 @@ var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup var/lip_color = "white" - var/age = 30 //Player's age (pure fluff) + var/age = 30 //Player's age var/underwear = "Nude" //Which underwear the player wants var/undershirt = "Nude" //Which undershirt the player wants diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index c3d1e1aedb..0da4073f1d 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -73,6 +73,9 @@ /datum/species/pod/pseudo_weak id = "podweak" limbs_id = "pod" + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS) + mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs") + default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") light_nutrition_gain_factor = 7.5 light_bruteheal = 0.2 light_burnheal = 0.2 diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index f6e43f487f..c52b827964 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -39,10 +39,21 @@ else . = initial(dt.flags) & TONGUELESS_SPEECH -/mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) +/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) . = ..() if(!client) return for(var/T in get_traumas()) var/datum/brain_trauma/trauma = T - message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) \ No newline at end of file + message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) + + if (src.mind.has_antag_datum(/datum/antagonist/traitor)) + for (var/codeword in GLOB.syndicate_code_phrase) + var/regex/codeword_match = new("([codeword])", "ig") + message = codeword_match.Replace(message, "$1") + + for (var/codeword in GLOB.syndicate_code_response) + var/regex/codeword_match = new("([codeword])", "ig") + message = codeword_match.Replace(message, "$1") + + return message diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index e2f62b054c..160e596882 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -229,9 +229,14 @@ GLOBAL_LIST_INIT(department_radio_keys, list( // Recompose message for AI hrefs, language incomprehension. message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + show_message(message, 2, deaf_message, deaf_type) return message +/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) + return message + /mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode) var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE) var/eavesdrop_range = 0 @@ -389,8 +394,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( else . = ..() -/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null) - say("#[message]", bubble_type, spans, sanitize, language) +/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced) /mob/living/get_language_holder(shadow=TRUE) if(mind && shadow) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e71e269222..29fbd39e2c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -580,6 +580,19 @@ else return ..() +/mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/I) //TODO: make fucking everything up there in that attackby() proc use the proper tool_act() procs. But honestly, who has time for that? 'cause I know for sure that you, the person reading this, sure as hell doesn't. + var/validbreakout = FALSE + for(var/obj/item/dogborg/sleeper/S in held_items) + if(!LAZYLEN(S.contents)) + continue + if(!validbreakout) + visible_message("[user] wedges [I] into the crevice separating [S] from [src]'s chassis, and begins to pry...", "You wedge [I] into the crevice separating [S] from [src]'s chassis, and begin to pry...") + validbreakout = TRUE + S.go_out() + if(validbreakout) + return TRUE + return ..() + /mob/living/silicon/robot/verb/unlock_own_cover() set category = "Robot Commands" set name = "Unlock Cover" diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9a08276999..5e5b486435 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -284,12 +284,8 @@ if(health < maxHealth) adjustBruteLoss(-8) //Fast life regen for(var/obj/item/reagent_containers/food/snacks/donut/D in range(1, src)) //Frosts nearby donuts! - if(D.icon_state != "donut2") - D.name = "frosted donut" - D.icon_state = "donut2" - D.reagents.add_reagent("sprinkles", 2) - D.bonus_reagents = list("sprinkles" = 2, "sugar" = 1) - D.filling_color = "#FF69B4" + if(!D.is_frosted) + D.frost_donut() /mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L) ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a04ed08611..40f71b81d4 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -90,7 +90,7 @@ /obj/machinery/power/emitter/ComponentInitialize() . = ..() - AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_FLIP ,null,CALLBACK(src, .proc/can_be_rotated)) + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) /obj/machinery/power/emitter/proc/can_be_rotated(mob/user,rotation_type) if (anchored) @@ -495,4 +495,4 @@ #undef EMITTER_UNWRENCHED #undef EMITTER_WRENCHED -#undef EMITTER_WELDED \ No newline at end of file +#undef EMITTER_WELDED diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 8b18eb7805..fa9d60a219 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -549,7 +549,8 @@ "creme_de_menthe", "creme_de_cacao", "triple_sec", - "sake" + "sake", + "applejack" ) upgrade_reagents = list( "ethanol", diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 80e195d5ac..211fddca26 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -333,7 +333,7 @@ All effects don't start immediately, but rather get worse over time; the rate is id = "grappa" description = "A fine Italian brandy, for when regular wine just isn't alcoholic enough for you." color = "#F8EBF1" - boozepwr = 45 + boozepwr = 60 taste_description = "classy bitter sweetness" glass_icon_state = "grappa" glass_name = "glass of grappa" @@ -379,6 +379,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Hooch" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." +/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M) + if(M.mind && M.mind.assigned_role == "Assistant") + M.heal_bodypart_damage(1,1) + . = TRUE + return ..() || . /datum/reagent/consumable/ethanol/ale name = "Ale" @@ -633,25 +638,48 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#664300" // rgb: 102, 67, 0 boozepwr = 90 //THE FIST OF THE LAW IS STRONG AND HARD quality = DRINK_GOOD - metabolization_rate = 0.8 + metabolization_rate = 0.5 taste_description = "JUSTICE" glass_icon_state = "beepskysmashglass" glass_name = "Beepsky Smash" glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + overdose_threshold = 40 + var/datum/brain_trauma/special/beepsky/B + +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M) + if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) + metabolization_rate = 0.8 + if(!HAS_TRAIT(M, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + B = new() + M.gain_trauma(B, TRAUMA_RESILIENCE_ABSOLUTE) + ..() /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/M) - if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) - M.Stun(30, 0) //this realistically does nothing to prevent chainstunning but will cause them to recover faster once it's out of their system - else - M.Stun(40, 0) + M.Jitter(2) + if(HAS_TRAIT(M, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + M.adjustStaminaLoss(-10, 0) + if(prob(20)) + new /datum/hallucination/items_other(M) + if(prob(10)) + new /datum/hallucination/stray_bullet(M) + ..() + . = TRUE + +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_end_metabolize(mob/living/carbon/M) + if(B) + QDEL_NULL(B) return ..() +/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/M) + if(!HAS_TRAIT(M, TRAIT_LAW_ENFORCEMENT_METABOLISM)) + M.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC) + /datum/reagent/consumable/ethanol/irish_cream name = "Irish Cream" id = "irishcream" description = "Whiskey-imbued cream, what else would you expect from the Irish?" color = "#664300" // rgb: 102, 67, 0 - boozepwr = 70 + boozepwr = 50 quality = DRINK_NICE taste_description = "creamy alcohol" glass_icon_state = "irishcreamglass" @@ -947,7 +975,7 @@ All effects don't start immediately, but rather get worse over time; the rate is id = "red_mead" description = "The true Viking drink! Even though it has a strange red color." color = "#C73C00" // rgb: 199, 60, 0 - boozepwr = 51 //Red drinks are stronger + boozepwr = 31 //Red drinks are stronger quality = DRINK_GOOD taste_description = "sweet and salty alcohol" glass_icon_state = "red_meadglass" @@ -960,7 +988,7 @@ All effects don't start immediately, but rather get worse over time; the rate is description = "A Viking drink, though a cheap one." color = "#664300" // rgb: 102, 67, 0 nutriment_factor = 1 * REAGENTS_METABOLISM - boozepwr = 50 + boozepwr = 30 quality = DRINK_NICE taste_description = "sweet, sweet alcohol" glass_icon_state = "meadglass" @@ -1319,32 +1347,49 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/neurotoxin name = "Neurotoxin" - id = "neurotoxin" description = "A strong neurotoxin that puts the subject into a death-like state." color = "#2E2E61" // rgb: 46, 46, 97 - boozepwr = 0 //custom drunk effect + boozepwr = 50 quality = DRINK_VERYGOOD taste_description = "a numbing sensation" + metabolization_rate = 1 * REAGENTS_METABOLISM glass_icon_state = "neurotoxinglass" glass_name = "Neurotoxin" glass_desc = "A drink that is guaranteed to knock you silly." +/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt() + return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG)) + /datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/M) - M.Knockdown(60, 1, 0) + M.set_drugginess(50) M.dizziness +=2 - switch(current_cycle) - if(15 to 45) - M.slurring = max(M.slurring,50) - M.slurring += 3 - if(45 to 55) - if(prob(50)) - M.confused = max(M.confused+3,0) - if(55 to 200) - M.set_drugginess(55) - if(200 to INFINITY) - M.adjustToxLoss(2, 0) + M.adjustBrainLoss(1*REM, 150) + if(prob(20)) + M.adjustStaminaLoss(10) + M.drop_all_held_items() + to_chat(M, "You cant feel your hands!") + if(current_cycle > 5) + if(prob(20)) + var/t = pickt() + ADD_TRAIT(M, t, type) + M.adjustStaminaLoss(10) + if(current_cycle > 30) + M.adjustBrainLoss(2*REM) + if(current_cycle > 50 && prob(15)) + if(!M.undergoing_cardiac_arrest() && M.can_heartattack()) + M.set_heartattack(TRUE) + if(M.stat == CONSCIOUS) + M.visible_message("[M] clutches at [M.p_their()] chest as if [M.p_their()] heart stopped!") + . = TRUE + ..() + +/datum/reagent/consumable/ethanol/neurotoxin/on_mob_end_metabolize(mob/living/carbon/M) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_ARM, type) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_ARM, type) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_LEG, type) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_LEG, type) + M.adjustStaminaLoss(10) ..() - . = 1 /datum/reagent/consumable/ethanol/hippies_delight name = "Hippie's Delight" @@ -1468,7 +1513,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M) - if(M.mind && M.mind.assigned_role in list("Security Officer", "Detective", "Head of Security", "Warden", "Lawyer")) //Securidrink in line with the screwderiver for engineers or nothing for mimes. + if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes. M.heal_bodypart_damage(1, 1) M.adjustBruteLoss(-2,0) . = 1 @@ -1487,7 +1532,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Now you are become law, destroyer of clowns." /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M) - if(M.mind && M.mind.assigned_role in list("Security Officer", "Detective", "Head of Security", "Warden", "Lawyer")) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG.. + if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG.. M.heal_bodypart_damage(2,2,2) M.adjustBruteLoss(-5,0) M.adjustOxyLoss(-5,0) @@ -1826,6 +1871,230 @@ All effects don't start immediately, but rather get worse over time; the rate is . = TRUE ..() +/datum/reagent/consumable/ethanol/blank_paper + name = "Blank Paper" + id = "blank_paper" + description = "A bubbling glass of blank paper. Just looking at it makes you feel fresh." + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#DCDCDC" // rgb: 220, 220, 220 + boozepwr = 20 + quality = DRINK_GOOD + taste_description = "bubbling possibility" + glass_icon_state = "blank_paper" + glass_name = "glass of blank paper" + glass_desc = "A fizzy cocktail for those looking to start fresh." + +/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M) + if(ishuman(M) && M.job == "Mime") + M.heal_bodypart_damage(1,1) + . = 1 + return ..() + +/datum/reagent/consumable/ethanol/champagne //How the hell did we not have champagne already!? + name = "Champagne" + id = "champagne" + description = "A sparkling wine known for its ability to strike fast and hard." + color = "#ffffc1" + boozepwr = 40 + taste_description = "auspicious occasions and bad decisions" + glass_icon_state = "champagne_glass" + glass_name = "Champagne" + glass_desc = "The flute clearly displays the slowly rising bubbles." + +/datum/reagent/consumable/ethanol/wizz_fizz + name = "Wizz Fizz" + id = "wizz_fizz" + description = "A magical potion, fizzy and wild! However the taste, you will find, is quite mild." + color = "#4235d0" //Just pretend that the triple-sec was blue curacao. + boozepwr = 50 + quality = DRINK_GOOD + taste_description = "friendship! It is magic, after all" + glass_icon_state = "wizz_fizz" + glass_name = "Wizz Fizz" + glass_desc = "The glass bubbles and froths with an almost magical intensity." + +/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M) + //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting + if(M?.mind?.has_antag_datum(/datum/antagonist/wizard)) + M.heal_bodypart_damage(1,1,1) + M.adjustOxyLoss(-1,0) + M.adjustToxLoss(-1,0) + return ..() + +/datum/reagent/consumable/ethanol/bug_spray + name = "Bug Spray" + id = "bug_spray" + description = "A harsh, acrid, bitter drink, for those who need something to brace themselves." + color = "#33ff33" + boozepwr = 50 + quality = DRINK_GOOD + taste_description = "the pain of ten thousand slain mosquitos" + glass_icon_state = "bug_spray" + glass_name = "Bug Spray" + glass_desc = "Your eyes begin to water as the sting of alcohol reaches them." + +/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M) +//Bugs should not drink Bug spray. + if(ismoth(M) || isflyperson(M)) + M.adjustToxLoss(1,0) + return ..() + +/datum/reagent/consumable/ethanol/bug_spray/on_mob_add(mob/living/carbon/M) + if(ismoth(M) || isflyperson(M)) + M.emote("scream") + return ..() + +/datum/reagent/consumable/ethanol/applejack + name = "Applejack" + id = "applejack" + description = "The perfect beverage for when you feel the need to horse around." + color = "#ff6633" + boozepwr = 20 + taste_description = "an honest day's work at the orchard" + glass_icon_state = "applejack_glass" + glass_name = "Applejack" + glass_desc = "You feel like you could drink this all neight." + +/datum/reagent/consumable/ethanol/jack_rose + name = "Jack Rose" + id = "jack_rose" + description = "A light cocktail perfect for sipping with a slice of pie." + color = "#ff6633" + boozepwr = 15 + quality = DRINK_NICE + taste_description = "a sweet and sour slice of apple" + glass_icon_state = "jack_rose" + glass_name = "Jack Rose" + glass_desc = "Enough of these, and you really will start to suppose your toeses are roses." + +/datum/reagent/consumable/ethanol/turbo + name = "Turbo" + id = "turbo" + description = "A turbulent cocktail associated with outlaw hoverbike racing. Not for the faint of heart." + color = "#e94c3a" + boozepwr = 85 + quality = DRINK_VERYGOOD + taste_description = "the outlaw spirit" + glass_icon_state = "turbo" + glass_name = "Turbo" + glass_desc = "A turbulent cocktail for outlaw hoverbikers." + +/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M) + if(prob(4)) + to_chat(M, "[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]") + M.adjustStaminaLoss(-M.drunkenness * 0.25) + return ..() + +/datum/reagent/consumable/ethanol/old_timer + name = "Old Timer" + id = "old_timer" + description = "An archaic potation enjoyed by old coots of all ages." + color = "#996835" + boozepwr = 35 + quality = DRINK_NICE + taste_description = "simpler times" + glass_icon_state = "old_timer" + glass_name = "Old Timer" + glass_desc = "WARNING! May cause premature aging!" + +/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M) + if(prob(20)) + if(ishuman(M)) + var/mob/living/carbon/human/N = M + N.age += 1 + if(N.age > 70) + N.facial_hair_color = "ccc" + N.hair_color = "ccc" + N.update_hair() + if(N.age > 100) + N.become_nearsighted(id) + if(N.gender == MALE) + N.facial_hair_style = "Beard (Very Long)" + N.update_hair() + + if(N.age > 969) //Best not let people get older than this or i might incur G-ds wrath + M.visible_message("[M] becomes older than any man should be.. and crumbles into dust!") + M.dust(0,1,0) + + return ..() + +/datum/reagent/consumable/ethanol/rubberneck + name = "Rubberneck" + id = "rubberneck" + description = "A quality rubberneck should not contain any gross natural ingredients." + color = "#ffe65b" + boozepwr = 60 + quality = DRINK_GOOD + taste_description = "artifical fruityness" + glass_icon_state = "rubberneck" + glass_name = "Rubberneck" + glass_desc = "A popular drink amongst those adhering to an all synthetic diet." + +/datum/reagent/consumable/ethanol/duplex + name = "Duplex" + id = "duplex" + description = "An inseparable combination of two fruity drinks." + color = "#50e5cf" + boozepwr = 25 + quality = DRINK_NICE + taste_description = "green apples and blue raspberries" + glass_icon_state = "duplex" + glass_name = "Duplex" + glass_desc = "To imbibe one component separately from the other is consider a great faux pas." + +/datum/reagent/consumable/ethanol/trappist + name = "Trappist Beer" + id = "trappist" + description = "A strong dark ale brewed by space-monks." + color = "#390c00" + boozepwr = 40 + quality = DRINK_VERYGOOD + taste_description = "dried plums and malt" + glass_icon_state = "trappistglass" + glass_name = "Trappist Beer" + glass_desc = "boozy Catholicism in a glass." + +/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M) + if(M.mind.isholy) + M.adjustFireLoss(-2.5, 0) + M.jitteriness = max(0, M.jitteriness-1) + M.stuttering = max(0, M.stuttering-1) + return ..() + +/datum/reagent/consumable/ethanol/blazaam + name = "Blazaam" + id = "blazaam" + description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover." + boozepwr = 70 + quality = DRINK_FANTASTIC + taste_description = "alternate realities" + glass_icon_state = "blazaamglass" + glass_name = "Blazaam" + glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." + var/stored_teleports = 0 + +/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M) + if(M.drunkenness > 40) + if(stored_teleports) + do_teleport(M, get_turf(M), rand(1,3)) + stored_teleports-- + if(prob(10)) + stored_teleports += rand(2,6) + if(prob(70)) + M.vomit() + return ..() + +/datum/reagent/consumable/ethanol/planet_cracker + name = "Planet Cracker" + id = "planet_cracker" + description = "This jubilant drink celebrates humanity's triumph over the alien menace. May be offensive to non-human crewmembers." + boozepwr = 50 + quality = DRINK_FANTASTIC + taste_description = "triumph with a hint of bitterness" + glass_icon_state = "planet_cracker" + glass_name = "Planet Cracker" + glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." + /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" id = "fruit_wine" diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index d2ca7d0c87..4e40233713 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -305,6 +305,16 @@ ..() . = 1 +/datum/reagent/consumable/lemonade + name = "Lemonade" + id = "lemonade" + description = "Sweet, tangy lemonade. Good for the soul." + quality = DRINK_NICE + taste_description = "sunshine and summertime" + glass_icon_state = "lemonpitcher" + glass_name = "pitcher of lemonade" + glass_desc = "This drink leaves you feeling nostalgic for some reason." + /datum/reagent/consumable/tea/arnold_palmer name = "Arnold Palmer" id = "arnold_palmer" @@ -498,6 +508,34 @@ /datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) ..() + +/datum/reagent/consumable/grey_bull + name = "Grey Bull" + id = "grey_bull" + description = "Grey Bull, it gives you gloves!" + color = "#EEFF00" // rgb: 238, 255, 0 + quality = DRINK_VERYGOOD + taste_description = "carbonated oil" + glass_icon_state = "grey_bull_glass" + glass_name = "glass of Grey Bull" + glass_desc = "Surprisingly it isnt grey." + +/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, id) + +/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, id) + ..() + +/datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/M) + M.Jitter(20) + M.dizziness +=1 + M.drowsyness = 0 + M.AdjustSleeping(-40, FALSE) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + ..() + /datum/reagent/consumable/sodawater name = "Soda Water" id = "sodawater" @@ -719,6 +757,11 @@ glass_name = "glass of grape juice" glass_desc = "It's grape (soda)!" +/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/M) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + ..() + + /datum/reagent/consumable/milk/chocolate_milk name = "Chocolate Milk" id = "chocolate_milk" @@ -746,6 +789,65 @@ glass_name = "glass of grenadine" glass_desc = "Delicious flavored syrup." +/datum/reagent/consumable/parsnipjuice + name = "Parsnip Juice" + id = "parsnipjuice" + description = "Why..." + color = "#FFA500" + taste_description = "parsnip" + glass_name = "glass of parsnip juice" + +/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink + name = "Peach Juice" + id = "peachjuice" + description = "Just peachy." + color = "#E78108" + taste_description = "peaches" + glass_name = "glass of peach juice" + +/datum/reagent/consumable/cream_soda + name = "Cream Soda" + id = "cream_soda" + description = "A classic space-American vanilla flavored soft drink." + color = "#dcb137" + quality = DRINK_VERYGOOD + taste_description = "fizzy vanilla" + glass_icon_state = "cream_soda" + glass_name = "Cream Soda" + glass_desc = "A classic space-American vanilla flavored soft drink." + +/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) + ..() + +/datum/reagent/consumable/red_queen + name = "Red Queen" + id = "red_queen" + description = "DRINK ME." + color = "#e6ddc3" + quality = DRINK_GOOD + taste_description = "wonder" + glass_icon_state = "red_queen" + glass_name = "Red Queen" + glass_desc = "DRINK ME." + var/current_size = 1 + +/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H) + if(prob(75)) + return ..() + var/newsize = pick(0.5, 0.75, 1, 1.50, 2) + H.resize = newsize/current_size + current_size = newsize + H.update_transform() + if(prob(40)) + H.emote("sneeze") + ..() + +/datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/M) + M.resize = 1/current_size + M.update_transform() + ..() + /datum/reagent/consumable/pinkmilk name = "Strawberry Milk" id = "pinkmilk" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 38db62fd2a..7efa13898d 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -433,11 +433,19 @@ taste_description = "childhood whimsy" /datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M) - if(ishuman(M) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.heal_bodypart_damage(1,1, 0) . = 1 ..() +/datum/reagent/consumable/peanut_butter + name = "Peanut Butter" + id = "peanut_butter" + description = "A popular food paste made from ground dry-roasted peanuts." + color = "#C29261" + nutriment_factor = 15 * REAGENTS_METABOLISM + taste_description = "peanuts" + /datum/reagent/consumable/cornoil name = "Corn Oil" id = "cornoil" @@ -714,6 +722,24 @@ color = "#eef442" // rgb: 238, 244, 66 taste_description = "mournful honking" +/datum/reagent/consumable/astrotame + name = "Astrotame" + id = "astrotame" + description = "A space age artifical sweetener." + nutriment_factor = 0 + metabolization_rate = 2 * REAGENTS_METABOLISM + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255, 255, 255 + taste_mult = 8 + taste_description = "sweetness" + overdose_threshold = 17 + +/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/M) + if(M.disgust < 80) + M.adjust_disgust(10) + ..() + . = TRUE + /datum/reagent/consumable/secretsauce name = "secret sauce" id = "secret_sauce" diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm index 8ddf975c54..c2cbb5685e 100644 --- a/code/modules/research/designs/smelting_designs.dm +++ b/code/modules/research/designs/smelting_designs.dm @@ -7,7 +7,7 @@ materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/plasteel category = list("initial", "Stock Parts") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SECURITY maxstack = 50 /datum/design/plastitanium_alloy diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 0e3793d2e4..0ba6fd7fcd 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -103,3 +103,23 @@ desc = "A single use autosurgeon that contains a penis. A screwdriver can be used to remove it, but implants can't be placed back in." uses = 1 starting_organ = /obj/item/organ/genital/penis + +/obj/item/autosurgeon/testicles + desc = "A single use autosurgeon that contains a set of testicles. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/genital/testicles + +/obj/item/autosurgeon/vagina + desc = "A single use autosurgeon that contains a vagina. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/genital/vagina + +/obj/item/autosurgeon/breasts + desc = "A single use autosurgeon that contains a set of breasts. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/genital/breasts + +/obj/item/autosurgeon/womb + desc = "A single use autosurgeon that contains a womb. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/genital/womb \ No newline at end of file diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index af1c954c5b..e41eebf7d6 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -418,7 +418,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 30 include_modes = list(/datum/game_mode/nuclear) -/datum/uplink_item/badass/rapid +/datum/uplink_item/dangerous/rapid name = "Gloves of the North Star" desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk." item = /obj/item/clothing/gloves/rapid diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 735967440f..55cd0a196e 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -33,6 +33,9 @@ /obj/item/reagent_containers/food/drinks/beer = 6) contraband = list(/obj/item/reagent_containers/food/drinks/mug/tea = 12, /obj/item/reagent_containers/food/drinks/bottle/fernet = 5) + premium = list(/obj/item/reagent_containers/glass/bottle/ethanol = 4, + /obj/item/reagent_containers/food/drinks/bottle/champagne = 5, + /obj/item/reagent_containers/food/drinks/bottle/trappist = 5) product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?" product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" req_access = list(ACCESS_BAR) diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index f61c392ff7..3da3398aad 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -16,7 +16,8 @@ contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6, /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6) premium = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1, - /obj/item/reagent_containers/food/drinks/soda_cans/air = 1) + /obj/item/reagent_containers/food/drinks/soda_cans/air = 1, + /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1) refill_canister = /obj/item/vending_refill/cola /obj/item/vending_refill/cola diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index 33e839c039..749a3b7c2b 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -11,6 +11,7 @@ /obj/item/clothing/suit/apron/chef = 2, /obj/item/reagent_containers/food/condiment/pack/ketchup = 5, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 5, + /obj/item/reagent_containers/food/condiment/pack/astrotame = 5, /obj/item/reagent_containers/food/condiment/saltshaker = 5, /obj/item/reagent_containers/food/condiment/peppermill = 5, /obj/item/reagent_containers/glass/bowl = 30) diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 9aa11c7bfb..4594048256 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -23,6 +23,7 @@ /obj/item/seeds/lime = 3, /obj/item/seeds/onion = 3, /obj/item/seeds/orange = 3, + /obj/item/seeds/peanutseed = 3, /obj/item/seeds/pineapple = 3, /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3, diff --git a/html/changelogs/AutoChangeLog-pr-8632.yml b/html/changelogs/AutoChangeLog-pr-8632.yml new file mode 100644 index 0000000000..b2f74869c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8632.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - rscadd: "Traitor codewords are now highlighted for traitors." diff --git a/html/changelogs/AutoChangeLog-pr-8663.yml b/html/changelogs/AutoChangeLog-pr-8663.yml new file mode 100644 index 0000000000..3f5aeacd3c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8663.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Adding in peanuts, peanut butter, peanut butter toasts and sandwiches, and the PB&J sandwich. +The peanuts contain a little bit of extractable cooking oil (similarly to soy beans) and can be microwaved or dried in a drying rack to make roasted peanuts, which can be mixed in a all-in-one-grinder for peanut butter, required to make those sandwiches." diff --git a/html/changelogs/AutoChangeLog-pr-8768.yml b/html/changelogs/AutoChangeLog-pr-8768.yml new file mode 100644 index 0000000000..de8338b545 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8768.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - imageadd: "New sprites for the some pda cartridges." diff --git a/html/changelogs/AutoChangeLog-pr-8773.yml b/html/changelogs/AutoChangeLog-pr-8773.yml new file mode 100644 index 0000000000..6cc39f8184 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8773.yml @@ -0,0 +1,4 @@ +author: "Sishen1542" +delete-after: True +changes: + - tweak: "Podpeople now have customization options." diff --git a/html/changelogs/AutoChangeLog-pr-8775.yml b/html/changelogs/AutoChangeLog-pr-8775.yml new file mode 100644 index 0000000000..51e8a15b13 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8775.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "The crew monitor's entry for the Quartermaster will now appear bolded, while HoP's will be of the same color of the service/unknown/other jobs." diff --git a/html/changelogs/AutoChangeLog-pr-8776.yml b/html/changelogs/AutoChangeLog-pr-8776.yml new file mode 100644 index 0000000000..bd3d30677a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8776.yml @@ -0,0 +1,11 @@ +author: "Ghommie (original PRs by ShizCalev, coiax and Tlaltecuhtli)" +delete-after: True +changes: + - bugfix: "Caks will no longer override the bonus reagents provided in a donut when frosting them." + - bugfix: "Caks can no longer create frosted frosted jelly donuts." + - bugfix: "Jelly donuts will no longer lose their vitamins when they're frosted." + - bugfix: "Fixed chaos donuts potentially doubling the amount of reagents added when microwaved with something else." + - bugfix: "Donuts now always contain 1 sprinkles as was stated on the wiki. Frosted donuts have a chance at adding an extra sprinkle." + - code_imp: "Improved the code for ensuring that security members enjoy donuts and security-themed alcoholic drinks." + - balance: "neurotoxin doesnt insta stun but gives you limb paralysis overtime and heart attacks if it stays in for too long and it is also alcholic" + - balance: "beepsky smash now summons imaginary beepskys that deal stamina damage instead of outright stunning" diff --git a/html/changelogs/AutoChangeLog-pr-8778.yml b/html/changelogs/AutoChangeLog-pr-8778.yml new file mode 100644 index 0000000000..1fa8446e6a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8778.yml @@ -0,0 +1,16 @@ +author: "Ghommie (original PRs by carshalash, GranpaWalton, BebeYoshi & Hexmaniacosanna, Fire Chance, Ordonis, Krysonism and OnlineGirlfriend)" +delete-after: True +changes: + - tweak: "Reduced booze power of Mead, Red Mead, and Irish Cream." + - tweak: "Increased booze power of Grappa." + - rscadd: "Added a new premium drink to the soda machine called \"Grey Bull\" which gives temporary shock resistance" + - rscadd: "A new drink called Blank Paper was added to the bar menu, it was made by a mime and it represents a new start." + - rscadd: "Adds a variety of fine alcoholic beverages for discerning patrons of the bar: Wizz Fizz, Bug Spray, Champagne, Applejack, Jack Rose, Turbo, Old Timer, Rubberneck, Duplex, Trappist Beer, Blazaam and Planet Cracker!" + - rscadd: "Also more nonalcoholic drinks: Cream Soda, Lemonade and Red Queen." + - rscadd: "Packs of a novel artificial sweetener have been added to the kitchen vendor." + - rscadd: "Bottles of trappist beer and champagne are now available in the premium seection of the booze-o-mat." + - rscadd: "Juicing parsnips now yields parsnip juice." + - rscadd: "Maintenance peaches." + - bugfix: "Grape soda now cools you down like other sodas." + - tweak: "tweaked the Arnold Palmer recipe, it now uses lemonade." + - imageadd: "Added new drink, bottle, vomit and peach can sprites." diff --git a/html/changelogs/AutoChangeLog-pr-8781.yml b/html/changelogs/AutoChangeLog-pr-8781.yml new file mode 100644 index 0000000000..12bd5ccdf0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8781.yml @@ -0,0 +1,4 @@ +author: "Sishen1542" +delete-after: True +changes: + - tweak: "Adds plasteel to medical and security techfabs." diff --git a/html/changelogs/AutoChangeLog-pr-8783.yml b/html/changelogs/AutoChangeLog-pr-8783.yml new file mode 100644 index 0000000000..5b283b9b21 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8783.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "emergency pods' storage will now properly work." diff --git a/html/changelogs/AutoChangeLog-pr-8790.yml b/html/changelogs/AutoChangeLog-pr-8790.yml new file mode 100644 index 0000000000..0c0e6cd116 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8790.yml @@ -0,0 +1,6 @@ +author: "Bhijn" +delete-after: True +changes: + - rscadd: "It's now possible to forcefully eject the occupants of a dogborg's sleeper by using a crowbar on them. This action is instant." + - tweak: "Resist values for dogborg sleepers have been adjusted. The baseline has been decreased from 30 seconds to 15 seconds. Medihound sleepers have a resist timer of 3 seconds. Sechound sleepers retain a resist timer of 30 seconds." + - tweak: "It now takes 10 full seconds to insert people into your sleeper. This should hopefully give people some more room to breathe and react to a dogborg attempting to sleeper someone either for no reason or in a way that violates law 2." diff --git a/html/changelogs/AutoChangeLog-pr-8793.yml b/html/changelogs/AutoChangeLog-pr-8793.yml new file mode 100644 index 0000000000..82a113c94d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8793.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "The PDA skin preference will now properly save up." + - tweak: "Changed the default PDA icon var to match the default PDA skin preference." diff --git a/html/changelogs/AutoChangeLog-pr-8794.yml b/html/changelogs/AutoChangeLog-pr-8794.yml new file mode 100644 index 0000000000..612a3e655b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8794.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixing the `(pointless) badassary` category appearing between the `dangerous and conspicious` and `stealthy and inconspicious` categories." + - bugfix: "Combat gloves plus now properly use the combat gloves sprite." diff --git a/html/changelogs/AutoChangeLog-pr-8797.yml b/html/changelogs/AutoChangeLog-pr-8797.yml new file mode 100644 index 0000000000..40c7afc570 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8797.yml @@ -0,0 +1,4 @@ +author: "Sishen1542, original by @Tlaltecuhtli" +delete-after: True +changes: + - bugfix: "alt clicking the emitter now rotates it instead of only flipping" diff --git a/html/changelogs/AutoChangeLog-pr-8798.yml b/html/changelogs/AutoChangeLog-pr-8798.yml new file mode 100644 index 0000000000..367aadad80 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8798.yml @@ -0,0 +1,4 @@ +author: "Sishen1542, original by Arkatos" +delete-after: True +changes: + - rscadd: "Action buttons can now be dragged onto each other to swap places" diff --git a/html/changelogs/AutoChangeLog-pr-8799.yml b/html/changelogs/AutoChangeLog-pr-8799.yml new file mode 100644 index 0000000000..73d3f590ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8799.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Promiscuous Organs crate, pills to lewd crate and testicles to maints" diff --git a/html/changelogs/AutoChangeLog-pr-8801.yml b/html/changelogs/AutoChangeLog-pr-8801.yml new file mode 100644 index 0000000000..e1089f2f1d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8801.yml @@ -0,0 +1,4 @@ +author: "Sishen1542, original by NewSta" +delete-after: True +changes: + - tweak: "updated the miasma canister sprites" diff --git a/html/changelogs/AutoChangeLog-pr-8805.yml b/html/changelogs/AutoChangeLog-pr-8805.yml new file mode 100644 index 0000000000..8abefd9ce2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8805.yml @@ -0,0 +1,4 @@ +author: "Linzolle" +delete-after: True +changes: + - bugfix: "supply display are now properly on the wall" diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index dce76f58b5..6a1a35f326 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/emoji.dmi b/icons/emoji.dmi index 128a3b243c..089c0ff3f8 100644 Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index 9a51635b81..ee42e95dd2 100644 Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index a32d0234d6..dc3aca6b19 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index c40dfaaa22..cd7fc1742b 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index c348fb4f8f..f64dfd4740 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 9861a2e618..92b5203f5d 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi index 9fc1520175..63cf069186 100644 Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 054aa47bbd..a1ab5b08e5 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 4c898aecd3..5a2088c332 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 1957fb1666..7d184c6459 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index cd61efe145..347f1fffea 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -428,3 +428,10 @@ datum/gear/darksabresheath category = SLOT_W_UNIFORM path = /obj/item/clothing/under/singery ckeywhitelist = list("maxlynchy") + +/datum/gear/csheet + name = "NT Bedsheet" + category = SLOT_NECK + path = /obj/item/bedsheet/captain + ckeywhitelist = list("tikibomb") + diff --git a/tgstation.dme b/tgstation.dme index bb47c443ff..531806171e 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1719,6 +1719,7 @@ #include "code\modules\hydroponics\grown\mushrooms.dm" #include "code\modules\hydroponics\grown\nettle.dm" #include "code\modules\hydroponics\grown\onion.dm" +#include "code\modules\hydroponics\grown\peanuts.dm" #include "code\modules\hydroponics\grown\pineapple.dm" #include "code\modules\hydroponics\grown\potato.dm" #include "code\modules\hydroponics\grown\pumpkin.dm"