From a3d9fc7d54a14c3fe09c737066c40f2f58eaf791 Mon Sep 17 00:00:00 2001 From: Victor Zisthus <56660717+VictorZisthus@users.noreply.github.com> Date: Sat, 1 Jul 2023 21:55:54 -0400 Subject: [PATCH 1/3] Minor Security Supply Tweak Fixes the Warden starting off with the wrong Mask Hailer. Gives regular officers mask hailers. Allows emagged consoles to order ERT armor. --- .../code/datums/supplypacks/contraband.dm | 151 ++++++++ .../crate_lockers/closets/secure/security.dm | 339 ++++++++++++++++++ .../code/modules/clothing/masks/hailer.dm | 169 +++++++++ vorestation.dme | 6 +- 4 files changed, 662 insertions(+), 3 deletions(-) create mode 100644 modular_chomp/code/datums/supplypacks/contraband.dm create mode 100644 modular_chomp/code/game/objects/structures/crate_lockers/closets/secure/security.dm create mode 100644 modular_chomp/code/modules/clothing/masks/hailer.dm diff --git a/modular_chomp/code/datums/supplypacks/contraband.dm b/modular_chomp/code/datums/supplypacks/contraband.dm new file mode 100644 index 0000000000..dbeec5351f --- /dev/null +++ b/modular_chomp/code/datums/supplypacks/contraband.dm @@ -0,0 +1,151 @@ +/* +* Here is where any supply packs that may or may not be legal +* and require modification of the supply controller live. +*/ + + +/datum/supply_pack/randomised/contraband + num_contained = 5 + contains = list( + /obj/item/seeds/bloodtomatoseed, + /obj/item/weapon/storage/pill_bottle/zoom, + /obj/item/weapon/storage/pill_bottle/happy, + /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine + ) + + name = "Contraband crate" + cost = 25 + containertype = /obj/structure/closet/crate + containername = "Unlabeled crate" + contraband = 1 + group = "Supplies" + +/datum/supply_pack/security/specialops + name = "Special Ops supplies" + contains = list( + /obj/item/weapon/storage/box/emps, + /obj/item/weapon/grenade/smokebomb = 4, + /obj/item/weapon/grenade/chem_grenade/incendiary + ) + cost = 25 + containertype = /obj/structure/closet/crate/weapon + containername = "Special Ops crate" + contraband = 1 + +/datum/supply_pack/supply/moghes + name = "Moghes imports" + contains = list( + /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 2, + /obj/item/weapon/reagent_containers/food/snacks/unajerky = 4 + ) + cost = 25 + containertype = /obj/structure/closet/crate/unathi + containername = "Moghes imports crate" + contraband = 1 + +/datum/supply_pack/munitions/bolt_rifles_militia + name = "Weapon - Surplus militia rifles" + contains = list( + /obj/item/weapon/gun/projectile/shotgun/pump/rifle = 3, + /obj/item/ammo_magazine/clip/c762 = 6 + ) + cost = 1000 + contraband = 1 + containertype = /obj/structure/closet/crate/hedberg + containername = "Ballistic weapons crate" + +/datum/supply_pack/randomised/misc/telecrate + name = "Confiscated equipment" + num_contained = 1 + contains = list( + list( //the operator, + /obj/item/clothing/suit/storage/vest/heavy/merc, + /obj/item/clothing/glasses/night, + /obj/item/weapon/storage/box/anti_photons + ), + list( //the indian, + /obj/item/weapon/gun/projectile/dartgun, + /obj/item/ammo_magazine/chemdart + ), + + list( //the doc, + /obj/item/weapon/storage/firstaid/combat, + /obj/item/weapon/reagent_containers/hypospray + ), + + list( //the sapper, + /obj/item/weapon/melee/energy/sword/ionic_rapier, + /obj/item/weapon/storage/box/syndie_kit/space, //doesn't matter what species you are, + /obj/item/device/multitool/ai_detector, + /obj/item/weapon/storage/toolbox/syndicate/powertools + ), + list( //the infiltrator, + /obj/item/device/chameleon, + /obj/item/weapon/storage/box/syndie_kit/chameleon, + /obj/item/device/encryptionkey/syndicate, + /obj/item/weapon/card/id/syndicate, + /obj/item/clothing/mask/gas/voice, + /obj/item/weapon/makeover + ), + list( //the professional, + /obj/item/weapon/gun/energy/ionrifle/pistol, + /obj/item/weapon/material/knife/tacknife/combatknife, + /obj/item/clothing/mask/balaclava + ) + ) + cost = 400 //price, + contraband = 1 + containertype = /obj/structure/closet/crate/large + containername = "Suspicious crate" + +/datum/supply_pack/security/bullet_resistant_plates + name = "Armor - Ballistic plates" + contains = list( + /obj/item/clothing/head/helmet/bulletproof, + /obj/item/clothing/suit/armor/pcarrier/bulletproof/full + ) + cost = 50 + containertype = /obj/structure/closet/crate/secure/heph + containername = "Ballistic armor crate" + access = access_armory + contraband = 1 + +/datum/supply_pack/security/combat_armor + name = "Armor - Combat" + contains = list( + /obj/item/clothing/head/helmet/combat, + /obj/item/clothing/suit/armor/combat, + /obj/item/clothing/gloves/arm_guard/combat, + /obj/item/clothing/shoes/leg_guard/combat + ) + cost = 40 + containertype = /obj/structure/closet/crate/secure/saare + containername = "Combat armor crate" + access = access_armory + contraband = 1 + +/datum/supply_pack/security/tactical + name = "Armor - Tactical" + containertype = /obj/structure/closet/crate/secure/saare + containername = "Tactical armor crate" + cost = 40 + access = access_armory + contains = list( + /obj/item/clothing/under/tactical, + /obj/item/clothing/suit/armor/tactical, + /obj/item/clothing/head/helmet/tactical, + /obj/item/clothing/mask/balaclava/tactical, + /obj/item/clothing/glasses/sunglasses/sechud/tactical, + /obj/item/weapon/storage/belt/security/tactical, + /obj/item/clothing/shoes/boots/jackboots, + /obj/item/clothing/gloves/black, + /obj/item/clothing/under/tactical, + /obj/item/clothing/suit/armor/tactical, + /obj/item/clothing/head/helmet/tactical, + /obj/item/clothing/mask/balaclava/tactical, + /obj/item/clothing/glasses/sunglasses/sechud/tactical, + /obj/item/weapon/storage/belt/security/tactical, + /obj/item/clothing/shoes/boots/jackboots, + /obj/item/clothing/gloves/black + ) + contraband = 1 \ No newline at end of file diff --git a/modular_chomp/code/game/objects/structures/crate_lockers/closets/secure/security.dm b/modular_chomp/code/game/objects/structures/crate_lockers/closets/secure/security.dm new file mode 100644 index 0000000000..12c2309172 --- /dev/null +++ b/modular_chomp/code/game/objects/structures/crate_lockers/closets/secure/security.dm @@ -0,0 +1,339 @@ +/obj/structure/closet/secure_closet/captains + name = "site manager's locker" + req_access = list(access_captain) + closet_appearance = /decl/closet_appearance/secure_closet/command + + starts_with = list( + /obj/item/weapon/storage/backpack/dufflebag/captain, + /obj/item/clothing/head/helmet, + /obj/item/clothing/suit/storage/vest, + /obj/item/weapon/cartridge/captain, + /obj/item/weapon/storage/lockbox/medal, + /obj/item/device/radio/headset/heads/captain, + /obj/item/device/radio/headset/heads/captain/alt, + /obj/item/weapon/gun/energy/gun, + /obj/item/weapon/melee/telebaton, + /obj/item/device/flash, + /obj/item/weapon/storage/box/ids) + + +/obj/structure/closet/secure_closet/hop + name = "head of personnel's locker" + req_access = list(access_hop) + closet_appearance = /decl/closet_appearance/secure_closet/command/hop + + starts_with = list( + /obj/item/clothing/suit/storage/vest, + /obj/item/clothing/head/helmet, + /obj/item/weapon/cartridge/hop, + /obj/item/device/radio/headset/heads/hop, + /obj/item/device/radio/headset/heads/hop/alt, + /obj/item/weapon/storage/box/ids = 2, + /obj/item/weapon/gun/energy/gun/compact, + /obj/item/weapon/storage/box/commandkeys, + /obj/item/weapon/storage/box/servicekeys, + /obj/item/device/flash) + +/obj/structure/closet/secure_closet/hop2 + name = "head of personnel's attire" + req_access = list(access_hop) + closet_appearance = /decl/closet_appearance/secure_closet/command/hop + + starts_with = list( + /obj/item/clothing/under/rank/head_of_personnel, + /obj/item/clothing/under/dress/dress_hop, + /obj/item/clothing/under/dress/dress_hr, + /obj/item/clothing/under/lawyer/female, + /obj/item/clothing/under/lawyer/black, + /obj/item/clothing/under/lawyer/black/skirt, + /obj/item/clothing/under/lawyer/red, + /obj/item/clothing/under/lawyer/red/skirt, + /obj/item/clothing/under/lawyer/oldman, + /obj/item/clothing/under/rank/neo_hop, + /obj/item/clothing/under/rank/neo_hop_skirt, + /obj/item/clothing/under/rank/neo_hop_parade_masc, + /obj/item/clothing/under/rank/neo_hop_parade_fem, + /obj/item/clothing/under/rank/neo_hop_turtle, + /obj/item/clothing/under/rank/neo_hop_turtle_skirt, + /obj/item/clothing/under/rank/neo_cmd_gorka, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_hopformal, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep, + /obj/item/clothing/shoes/brown, + /obj/item/clothing/shoes/black, + /obj/item/clothing/shoes/laceup, + /obj/item/clothing/shoes/laceup/brown, + /obj/item/clothing/shoes/white, + /obj/item/clothing/under/rank/head_of_personnel_whimsy, + /obj/item/clothing/head/caphat/hop, + /obj/item/clothing/under/suit_jacket/teal, + /obj/item/clothing/under/suit_jacket/teal/skirt, + /obj/item/clothing/glasses/sunglasses, + /obj/item/clothing/suit/storage/hooded/wintercoat/hop, + /obj/item/clothing/head/caphat/hop/beret, + /obj/item/clothing/head/caphat/hop/beret/white) + + +/obj/structure/closet/secure_closet/hos + name = "head of security's locker" + req_access = list(access_hos) + storage_capacity = 2.5 * MOB_MEDIUM + closet_appearance = /decl/closet_appearance/secure_closet/security/hos + + starts_with = list( + /obj/item/clothing/head/helmet/HoS, + /obj/item/clothing/head/helmet/HoS/hat, + /obj/item/clothing/suit/storage/vest/hos, + /obj/item/clothing/under/rank/head_of_security/jensen, + /obj/item/clothing/under/rank/head_of_security/corp, + /obj/item/clothing/suit/storage/vest/hoscoat/jensen, + /obj/item/clothing/suit/storage/vest/hoscoat, + /obj/item/clothing/head/helmet/dermal, + /obj/item/weapon/cartridge/hos, + /obj/item/device/radio/headset/heads/hos, + /obj/item/device/radio/headset/heads/hos/alt, + /obj/item/clothing/glasses/sunglasses/sechud, + /obj/item/taperoll/police, + /obj/item/weapon/shield/riot, + /obj/item/weapon/shield/riot/tele, + /obj/item/weapon/storage/box/holobadge/hos, + /obj/item/clothing/accessory/badge/holo/hos, + /obj/item/weapon/reagent_containers/spray/pepper, + /obj/item/weapon/tool/crowbar/red, + /obj/item/weapon/storage/box/flashbangs, + /obj/item/weapon/storage/belt/security, + /obj/item/device/flash, + /obj/item/weapon/melee/baton/loaded, + /obj/item/weapon/gun/magnetic/railgun/heater/pistol/hos, + /obj/item/weapon/rcd_ammo/large, + /obj/item/weapon/cell/device/weapon, + /obj/item/clothing/accessory/holster/waist, + /obj/item/weapon/melee/telebaton, + /obj/item/clothing/head/beret/sec/corporate/hos, + /obj/item/clothing/suit/storage/hooded/wintercoat/security, + /obj/item/clothing/suit/storage/hooded/wintercoat/security/hos, + /obj/item/clothing/shoes/boots/winter/security, + /obj/item/device/flashlight/maglight, + /obj/item/clothing/mask/gas/half, + /obj/item/clothing/mask/gas/sechailer/swat/hos) + +/obj/structure/closet/secure_closet/hos/Initialize() + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/security + else + starts_with += /obj/item/weapon/storage/backpack/satchel/sec + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec + return ..() + + +/obj/structure/closet/secure_closet/warden + name = "warden's locker" + storage_capacity = 42 + req_access = list(access_armory) + closet_appearance = /decl/closet_appearance/secure_closet/security/warden + + starts_with = list( + /obj/item/clothing/suit/storage/vest/warden, + /obj/item/clothing/under/rank/warden, + /obj/item/clothing/under/rank/warden/corp, + /obj/item/clothing/suit/storage/vest/wardencoat, + /obj/item/clothing/suit/storage/vest/wardencoat/alt, + /obj/item/clothing/suit/storage/vest/wardencoat/alt2, //VOREStation Add, + /obj/item/clothing/head/helmet/dermal, + /obj/item/clothing/head/helmet/warden, + /obj/item/clothing/head/helmet/warden/hat, + /obj/item/clothing/under/rank/neo_warden_red, + /obj/item/clothing/under/rank/neo_warden_red_skirt, + /obj/item/clothing/under/rank/neo_warden_blue, + /obj/item/clothing/suit/storage/vest/wardencoat/neo_armsco_trench, + /obj/item/clothing/suit/storage/vest/wardencoat/neo_bluewarden, + /obj/item/clothing/suit/storage/vest/wardencoat/neo_warden_heavy, + /obj/item/clothing/under/rank/neo_sec_gorka, + /obj/item/weapon/cartridge/security, + /obj/item/device/radio/headset/headset_sec, + /obj/item/device/radio/headset/headset_sec/alt, + /obj/item/clothing/glasses/sunglasses/sechud, + /obj/item/taperoll/police, + /obj/item/clothing/accessory/badge/holo/warden, + /obj/item/weapon/storage/box/flashbangs, + /obj/item/weapon/storage/belt/security, + /obj/item/weapon/reagent_containers/spray/pepper, + /obj/item/weapon/melee/baton/loaded, + /obj/item/weapon/gun/energy/gun, + /obj/item/weapon/cell/device/weapon, + /obj/item/weapon/storage/box/holobadge, + /obj/item/clothing/head/beret/sec/corporate/warden, + /obj/item/clothing/suit/storage/hooded/wintercoat/security, + /obj/item/clothing/shoes/boots/winter/security, + /obj/item/device/flashlight/maglight, + /obj/item/device/megaphone, + /obj/item/clothing/mask/gas/sechailer/swat/warden, + /obj/item/weapon/gun/projectile/revolvershotgun, + /obj/item/ammo_magazine/m12gdrumjack/beanbag, + /obj/item/ammo_magazine/m12gdrumjack/beanbag, + /obj/item/device/ticket_printer, //CHOMPStation addition + /obj/item/device/retail_scanner/security //CHOMPStation addition + ) + +/obj/structure/closet/secure_closet/warden/Initialize() + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/security + else + starts_with += /obj/item/weapon/storage/backpack/satchel/sec + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec + return ..() + +/obj/structure/closet/secure_closet/security + name = "security officer's locker" + req_access = list(access_brig) + closet_appearance = /decl/closet_appearance/secure_closet/security + + starts_with = list( + /obj/item/clothing/suit/storage/vest/officer, + /obj/item/clothing/head/helmet, + /obj/item/clothing/mask/gas/sechailer/swat/officer, + /obj/item/weapon/cartridge/security, + /obj/item/device/radio/headset/headset_sec, + /obj/item/device/radio/headset/headset_sec/alt, + /obj/item/weapon/storage/belt/security, + /obj/item/device/flash, + /obj/item/weapon/reagent_containers/spray/pepper, + /obj/item/weapon/grenade/flashbang, + /obj/item/weapon/melee/baton/loaded, + /obj/item/clothing/glasses/sunglasses/sechud, + /obj/item/taperoll/police, + /obj/item/device/hailer, + /obj/item/device/flashlight/flare, + /obj/item/clothing/accessory/storage/black_vest, + /obj/item/clothing/head/soft/sec/corp, + /obj/item/clothing/under/rank/security/corp, + /obj/item/ammo_magazine/m45/rubber, + /obj/item/weapon/gun/energy/taser, + /obj/item/weapon/cell/device/weapon, + /obj/item/clothing/suit/storage/hooded/wintercoat/security, + /obj/item/clothing/shoes/boots/winter/security, + /obj/item/device/flashlight/maglight, + /obj/item/device/holowarrant, //CHOMPStation addition + /obj/item/device/retail_scanner/security, //CHOMPStation addition + /obj/item/clothing/glasses/hud/security, //CHOMPStation addition + /obj/item/device/ticket_printer //CHOMPStation addition + ) + +/obj/structure/closet/secure_closet/security/Initialize() + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/security + else + starts_with += /obj/item/weapon/storage/backpack/satchel/sec + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec + if(prob(30)) + starts_with += /obj/item/poster/nanotrasen + return ..() + +/obj/structure/closet/secure_closet/security/cargo/Initialize() + starts_with += /obj/item/clothing/accessory/armband/cargo + starts_with += /obj/item/device/encryptionkey/headset_cargo + return ..() + +/obj/structure/closet/secure_closet/security/engine/Initialize() + starts_with += /obj/item/clothing/accessory/armband/engine + starts_with += /obj/item/device/encryptionkey/headset_eng + return ..() + +/obj/structure/closet/secure_closet/security/science/Initialize() + starts_with += /obj/item/clothing/accessory/armband/science + starts_with += /obj/item/device/encryptionkey/headset_sci + return ..() + +/obj/structure/closet/secure_closet/security/med/Initialize() + starts_with += /obj/item/clothing/accessory/armband/medblue + starts_with += /obj/item/device/encryptionkey/headset_med + return ..() + + +/obj/structure/closet/secure_closet/detective + name = "detective's cabinet" + req_access = list(access_forensics_lockers) + closet_appearance = /decl/closet_appearance/cabinet/secure + + open_sound = 'sound/effects/wooden_closet_open.ogg' + close_sound = 'sound/effects/wooden_closet_close.ogg' + + starts_with = list( + /obj/item/clothing/accessory/badge/holo/detective, + /obj/item/clothing/gloves/forensic, //CHOMP Edit replaces black gloves + /obj/item/gunbox, //CHOMP Edit undoes vorestation removal and adds back gunbox + /obj/item/gunbox/stun, + /obj/item/weapon/storage/belt/detective, + /obj/item/weapon/storage/box/evidence, + /obj/item/device/radio/headset/headset_sec, + /obj/item/device/radio/headset/headset_sec/alt, + /obj/item/clothing/suit/storage/vest/detective, + /obj/item/taperoll/police, + /obj/item/clothing/accessory/holster/armpit, + /obj/item/device/flashlight/maglight, + /obj/item/weapon/reagent_containers/food/drinks/flask/detflask, + /obj/item/weapon/storage/briefcase/crimekit, + /obj/item/device/taperecorder, + /obj/item/weapon/storage/bag/detective, + /obj/item/device/tape/random = 3, + /obj/item/device/retail_scanner/security, //CHOMPStation addition + /obj/item/clothing/glasses/hud/security //CHOMPStation addition + ) + +/obj/structure/closet/secure_closet/injection + name = "lethal injections locker" + req_access = list(access_captain) + closet_appearance = /decl/closet_appearance/secure_closet/courtroom + + starts_with = list( + /obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral = 2) + +GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/brig) + +/obj/structure/closet/secure_closet/brig + name = "brig locker" + req_access = list(access_brig) + closet_appearance = /decl/closet_appearance/secure_closet/brig + anchored = TRUE + var/id = null + + starts_with = list( + /obj/item/clothing/under/color/prison, + /obj/item/clothing/shoes/orange) + +/obj/structure/closet/secure_closet/posters + name = "morale storage" + req_access = list(access_security) + anchored = TRUE + + starts_with = list( + /obj/item/poster/nanotrasen, + /obj/item/poster/nanotrasen, + /obj/item/poster/nanotrasen, + /obj/item/poster/nanotrasen, + /obj/item/poster/nanotrasen) + +/obj/structure/closet/secure_closet/courtroom + name = "courtroom locker" + req_access = list(access_lawyer) + closet_appearance = /decl/closet_appearance/secure_closet/courtroom + + starts_with = list( + /obj/item/clothing/shoes/brown, + /obj/item/weapon/paper/Court = 3, + /obj/item/weapon/pen, + /obj/item/clothing/suit/judgerobe, + /obj/item/clothing/head/powdered_wig, + /obj/item/weapon/storage/briefcase) + + +/obj/structure/closet/secure_closet/wall + name = "wall locker" + req_access = list(access_security) + closet_appearance = /decl/closet_appearance/wall + density = TRUE + + //too small to put a man in + large = 0 diff --git a/modular_chomp/code/modules/clothing/masks/hailer.dm b/modular_chomp/code/modules/clothing/masks/hailer.dm new file mode 100644 index 0000000000..3f7cc57fd3 --- /dev/null +++ b/modular_chomp/code/modules/clothing/masks/hailer.dm @@ -0,0 +1,169 @@ +/obj/item/clothing/mask/gas/sechailer + name = "hailer face mask" + desc = "A compact, durable gas mask that can be connected to an air supply. This one possesses a security hailer." + description_info = "This mask has a hailer attached, you can activate it on the button or use the Halt! verb, for switching phrases you can alt+click it or change it using the change phrase verb." + icon_state = "halfgas" + armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 55, rad = 0) + action_button_name = "HALT!" + body_parts_covered = FACE + var/obj/item/device/hailer/hailer + var/cooldown = 0 + var/phrase = 1 + var/aggressiveness = 1 + var/safety = 1 + var/list/phrase_list = list( + "halt" = "HALT! HALT! HALT! HALT!", + "bobby" = "Stop in the name of the Law.", + "compliance" = "Compliance is in your best interest.", + "justice" = "Prepare for justice!", + "running" = "Running will only increase your sentence.", + "dontmove" = "Don't move, Creep!", + "floor" = "Down on the floor, Creep!", + "robocop" = "Dead or alive you're coming with me.", + "god" = "God made today for the crooks we could not catch yesterday.", + "freeze" = "Freeze, Scum Bag!", + "imperial" = "Stop right there, criminal scum!", + "bash" = "Stop or I'll bash you.", + "harry" = "Go ahead, make my day.", + "asshole" = "Stop breaking the law, asshole.", + "stfu" = "You have the right to shut the fuck up", + "shutup" = "Shut up crime!", + "super" = "Face the wrath of the golden bolt.", + "dredd" = "I am, the LAW!" + ) + +/obj/item/clothing/mask/gas/sechailer/swat/hos + name = "\improper HOS SWAT mask" + desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." + icon_state = "hosmask" + + +/obj/item/clothing/mask/gas/sechailer/swat/warden + name = "\improper Warden SWAT mask" + desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe." + icon_state = "wardenmask" + +/obj/item/clothing/mask/gas/sechailer/swat/officer //Just a little nicer to begin with. Can always up the anger with a screwdriver! + aggressiveness = 1 + phrase = 1 + +/obj/item/clothing/mask/gas/sechailer/swat + name = "\improper SWAT mask" + desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000." + icon_state = "officermask" + body_parts_covered = HEAD|FACE|EYES + flags_inv = HIDEFACE|BLOCKHAIR + aggressiveness = 3 + phrase = 12 + + +/obj/item/clothing/mask/gas/sechailer/ui_action_click() + halt() + +/obj/item/clothing/mask/gas/sechailer/AltClick(mob/user) + selectphrase() + +/obj/item/clothing/mask/gas/sechailer/verb/selectphrase() + set name = "Select gas mask phrase" + set category = "Object" + set desc = "Alter the message shouted by your complionator gas mask." + + var/key = phrase_list[phrase] + var/message = phrase_list[key] + + if (!safety) + to_chat(usr, "You set the restrictor to: FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT.") + return + switch(aggressiveness) + if(1) + phrase = (phrase < 6) ? (phrase + 1) : 1 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(usr,"You set the restrictor to: [message]") + if(2) + phrase = (phrase < 11 && phrase >= 7) ? (phrase + 1) : 7 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(usr,"You set the restrictor to: [message]") + if(3) + phrase = (phrase < 18 && phrase >= 12 ) ? (phrase + 1) : 12 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(usr,"You set the restrictor to: [message]") + if(4) + phrase = (phrase < 18 && phrase >= 1 ) ? (phrase + 1) : 1 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(usr,"You set the restrictor to: [message]") + else + to_chat(usr, "It's broken.") + +/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user) + if(safety) + safety = 0 + to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.") + else + return + +/obj/item/clothing/mask/gas/sechailer/attackby(obj/item/I, mob/user) + if(I.is_screwdriver()) + switch(aggressiveness) + if(1) + to_chat(user, "You set the aggressiveness restrictor to the second position.") + aggressiveness = 2 + phrase = 7 + if(2) + to_chat(user, "You set the aggressiveness restrictor to the third position.") + aggressiveness = 3 + phrase = 13 + if(3) + to_chat(user, "You set the aggressiveness restrictor to the fourth position.") + aggressiveness = 4 + phrase = 1 + if(4) + to_chat(user, "You set the aggressiveness restrictor to the first position.") + aggressiveness = 1 + phrase = 1 + if(5) + to_chat(user, "You adjust the restrictor but nothing happens, probably because its broken.") + if(I.is_wirecutter()) + if(aggressiveness != 5) + to_chat(user, "You broke it!") + aggressiveness = 5 + if(I.is_crowbar()) + if(!hailer) + to_chat(user, "This mask has an integrated hailer, you can't remove it!") + else + var/obj/N = new /obj/item/clothing/mask/gas/half(src.loc) + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) + N.fingerprints = src.fingerprints + N.fingerprintshidden = src.fingerprintshidden + N.fingerprintslast = src.fingerprintslast + N.suit_fibers = src.suit_fibers + if(!isturf(N.loc)) + user.put_in_hands(hailer) + user.put_in_hands(N) + else + hailer.loc = N.loc + qdel(src) + return + ..() + +/obj/item/clothing/mask/gas/sechailer/verb/halt() + set name = "HALT!" + set category = "Objects" + set desc = "Activate your face mask hailer." + var/key = phrase_list[phrase] + var/message = phrase_list[key] + + if(cooldown < world.time - 35) // A cooldown, to stop people being jerks + if(!safety) + message = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT." + usr.visible_message("[usr]'s Compli-o-Nator: [message]") + playsound(src, 'sound/voice/binsult.ogg', 50, 0, 4) //Future sound channel = something like SFX + cooldown = world.time + return + + usr.visible_message("[usr]'s Compli-o-Nator: [message]") + playsound(src, "sound/voice/complionator/[key].ogg", 50, 0, 4) //future sound channel = something like SFX + cooldown = world.time \ No newline at end of file diff --git a/vorestation.dme b/vorestation.dme index 90ea5ab8ab..cc23f7c70c 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -480,7 +480,6 @@ #include "code\datums\roundstats\departmentgoal.dm" #include "code\datums\roundstats\roundstats.dm" #include "code\datums\supplypacks\atmospherics.dm" -#include "code\datums\supplypacks\contraband.dm" #include "code\datums\supplypacks\contraband_vr.dm" #include "code\datums\supplypacks\costumes.dm" #include "code\datums\supplypacks\costumes_vr.dm" @@ -1669,7 +1668,6 @@ #include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\security_vr.dm" #include "code\game\objects\structures\flora\flora.dm" #include "code\game\objects\structures\flora\flora_vr.dm" @@ -2138,7 +2136,6 @@ #include "code\modules\clothing\masks\breath_vr.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\gasmask_vr.dm" -#include "code\modules\clothing\masks\hailer.dm" #include "code\modules\clothing\masks\miscellaneous.dm" #include "code\modules\clothing\masks\miscellaneous_vr.dm" #include "code\modules\clothing\masks\shiny_vr.dm" @@ -4556,6 +4553,7 @@ #include "modular_chomp\code\datums\components\gargoyle.dm" #include "modular_chomp\code\datums\interfaces\appearance.dm" #include "modular_chomp\code\datums\outfits\jobs\noncrew.dm" +#include "modular_chomp\code\datums\supplypacks\contraband.dm" #include "modular_chomp\code\datums\supplypacks\medical.dm" #include "modular_chomp\code\datums\supplypacks\science.dm" #include "modular_chomp\code\datums\supplypacks\security.dm" @@ -4583,6 +4581,7 @@ #include "modular_chomp\code\game\objects\structures\loot_pile.dm" #include "modular_chomp\code\game\objects\structures\watercloset_ch.dm" #include "modular_chomp\code\game\objects\structures\crate_lockers\largecrate.dm" +#include "modular_chomp\code\game\objects\structures\crate_lockers\closets\secure\security.dm" #include "modular_chomp\code\game\turfs\turf.dm" #include "modular_chomp\code\game\turfs\simulated\outdoors\desert_planet.dm" #include "modular_chomp\code\matrices\color_matrix.dm" @@ -4599,6 +4598,7 @@ #include "modular_chomp\code\modules\client\preference_setup\loadout\loadout_xeno.dm" #include "modular_chomp\code\modules\clothing\clothing.dm" #include "modular_chomp\code\modules\clothing\clothing_icons.dm" +#include "modular_chomp\code\modules\clothing\masks\hailer.dm" #include "modular_chomp\code\modules\clothing\spacesuits\rig\.behemoth.dm" #include "modular_chomp\code\modules\clothing\spacesuits\rig\clockwork_ch.dm" #include "modular_chomp\code\modules\clothing\spacesuits\rig\precursor.dm" From 5ce5cba5d7d28fa4b05545b05e5000903bacfaa9 Mon Sep 17 00:00:00 2001 From: Victor Zisthus <56660717+VictorZisthus@users.noreply.github.com> Date: Sun, 2 Jul 2023 18:55:15 -0400 Subject: [PATCH 2/3] Removed the "ERT" stuff Just looking to get this merged ASAP. --- .../code/datums/supplypacks/contraband.dm | 52 ------------------- 1 file changed, 52 deletions(-) diff --git a/modular_chomp/code/datums/supplypacks/contraband.dm b/modular_chomp/code/datums/supplypacks/contraband.dm index dbeec5351f..9ebdc4d3eb 100644 --- a/modular_chomp/code/datums/supplypacks/contraband.dm +++ b/modular_chomp/code/datums/supplypacks/contraband.dm @@ -97,55 +97,3 @@ contraband = 1 containertype = /obj/structure/closet/crate/large containername = "Suspicious crate" - -/datum/supply_pack/security/bullet_resistant_plates - name = "Armor - Ballistic plates" - contains = list( - /obj/item/clothing/head/helmet/bulletproof, - /obj/item/clothing/suit/armor/pcarrier/bulletproof/full - ) - cost = 50 - containertype = /obj/structure/closet/crate/secure/heph - containername = "Ballistic armor crate" - access = access_armory - contraband = 1 - -/datum/supply_pack/security/combat_armor - name = "Armor - Combat" - contains = list( - /obj/item/clothing/head/helmet/combat, - /obj/item/clothing/suit/armor/combat, - /obj/item/clothing/gloves/arm_guard/combat, - /obj/item/clothing/shoes/leg_guard/combat - ) - cost = 40 - containertype = /obj/structure/closet/crate/secure/saare - containername = "Combat armor crate" - access = access_armory - contraband = 1 - -/datum/supply_pack/security/tactical - name = "Armor - Tactical" - containertype = /obj/structure/closet/crate/secure/saare - containername = "Tactical armor crate" - cost = 40 - access = access_armory - contains = list( - /obj/item/clothing/under/tactical, - /obj/item/clothing/suit/armor/tactical, - /obj/item/clothing/head/helmet/tactical, - /obj/item/clothing/mask/balaclava/tactical, - /obj/item/clothing/glasses/sunglasses/sechud/tactical, - /obj/item/weapon/storage/belt/security/tactical, - /obj/item/clothing/shoes/boots/jackboots, - /obj/item/clothing/gloves/black, - /obj/item/clothing/under/tactical, - /obj/item/clothing/suit/armor/tactical, - /obj/item/clothing/head/helmet/tactical, - /obj/item/clothing/mask/balaclava/tactical, - /obj/item/clothing/glasses/sunglasses/sechud/tactical, - /obj/item/weapon/storage/belt/security/tactical, - /obj/item/clothing/shoes/boots/jackboots, - /obj/item/clothing/gloves/black - ) - contraband = 1 \ No newline at end of file From 617de0a58a8dacdc8049f9522e56376b91a9ab0d Mon Sep 17 00:00:00 2001 From: Victor Zisthus <56660717+VictorZisthus@users.noreply.github.com> Date: Sun, 2 Jul 2023 20:08:19 -0400 Subject: [PATCH 3/3] Fixes missing Sprite Yay --- icons/inventory/face/mob_vr.dmi | Bin 45147 -> 46243 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/inventory/face/mob_vr.dmi b/icons/inventory/face/mob_vr.dmi index 6270461d76ac30489d20906cf98a56a3988b3330..a4d9154749be3975e955dd312467f8915d0dfc12 100644 GIT binary patch delta 9695 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 delta 8590 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