diff --git a/code/datums/ert.dm b/code/datums/ert.dm index ed745760ed23..c31690acdc85 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -30,6 +30,16 @@ leader_role = /datum/antagonist/ert/amber/commander roles = list(/datum/antagonist/ert/amber,/datum/antagonist/ert/amber,/datum/antagonist/ert/amber/medic) // entered duplicate here to increase change of soldiers +/datum/ert/occupying + opendoors = FALSE + code = "Blue" + rename_team = "Occupying Force" + mission = "Occupy the station. Minimize crew casulties. Enforce space law." + polldesc = "the Occupying Force" + teamsize = 5 // redundant but keeping this here for clarity + leader_role = /datum/antagonist/ert/occupying/commander + roles = list(/datum/antagonist/ert/occupying,/datum/antagonist/ert/occupying/heavy,/datum/antagonist/ert/occupying,/datum/antagonist/ert/occupying) + /datum/ert/red leader_role = /datum/antagonist/ert/commander/red roles = list(/datum/antagonist/ert/security/red, /datum/antagonist/ert/medic/red, /datum/antagonist/ert/engineer/red) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index ce49d48978a8..6b18088a4340 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1236,6 +1236,21 @@ if(hasPower() && !prying_so_hard) if (I.tool_behaviour == TOOL_CROWBAR) //we need another check, futureproofing for if/when bettertools actually completely replaces the old jaws time_to_open = 50 + if(istype(I,/obj/item/jawsoflife/jimmy)) + time_to_open = 30 + var/obj/item/jawsoflife/jimmy/J = I + if(J.pump_charge >= J.pump_cost) + J.pump_charge = J.pump_charge - J.pump_cost + if(J.pump_charge < 0) + J.pump_charge = 0 + playsound(src, 'sound/items/jimmy_pump.ogg', 100, TRUE) + if(J.obj_flags & EMAGGED) + time_to_open = 15 + else + if(user) + to_chat(user, "You do not have enough charge in the [J] for this. You need at least [J.pump_cost]% ") + return + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) //is it aliens or just the CE being a dick? prying_so_hard = TRUE if(do_after(user, time_to_open, TRUE, src)) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 84f889fa1382..6bd343a0335a 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -478,6 +478,15 @@ update_label("John Doe", "Clowny") desc = "An Amber Task Force ID card." assignment = "Amber Task Force" +/obj/item/card/id/ert/occupying + name = "\improper Occupying Force ID" + desc = "An Occupying Force ID card." + assignment = "Occupying Officer" + +/obj/item/card/id/ert/occupying/Initialize() + access = list(ACCESS_SECURITY,ACCESS_BRIG,ACCESS_WEAPONS,ACCESS_SEC_DOORS,ACCESS_MAINT_TUNNELS)+get_ert_access("sec") + . = ..() + /obj/item/card/id/ert/Initialize() access = get_all_accesses()+get_ert_access("commander")-ACCESS_CHANGE_IDS . = ..() diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index b10684f23202..956cbb5cb3bf 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -927,3 +927,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(reagents && reagents.total_volume) hand_reagents() + +/obj/item/clothing/mask/cigarette/lit/Initialize() + . = ..() + light() // These cigarettes start lit. + \ No newline at end of file diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 531e6567f836..da7b5998c30c 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -255,3 +255,9 @@ /obj/item/melee/baton/cattleprod/baton_stun() if(sparkler.activate()) ..() + +/obj/item/melee/baton/cattleprod/tactical + name = "tactical stunprod" + desc = "A cost-effective, mass-produced, tactical stun prod." + preload_cell_type = /obj/item/stock_parts/cell/high/plus // comes with a cell + color = "#aeb08c" // super tactical \ No newline at end of file diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 249af7cfeb2a..d9bd8aac6822 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -169,6 +169,9 @@ return 0 /turf/open/floor/crowbar_act(mob/living/user, obj/item/I) + if(istype(I,/obj/item/jawsoflife/jimmy)) + to_chat(user,"The [I] cannot pry tiles.") + return return intact ? pry_tile(I, user) : FALSE /turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index af3891f6eb88..b7365b42b4a2 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -136,6 +136,21 @@ outfit = /datum/outfit/amber/commander role = "Commander" +/datum/antagonist/ert/occupying + name = "Occupying Officer" + outfit = /datum/outfit/occupying + role = "Officer" + +/datum/antagonist/ert/occupying/heavy + name = "Occupying Riot Officer" + outfit = /datum/outfit/occupying/heavy + role = "Riot Officer" + +/datum/antagonist/ert/occupying/commander + name = "Occupying Commander" + outfit = /datum/outfit/occupying/commander + role = "Commander" + /datum/antagonist/ert/clown name = "Comedy Response Officer" outfit = /datum/outfit/centcom_clown diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 2b80e3d9a107..d2c171795ab8 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -173,7 +173,7 @@ SEE_MOBS // can see all mobs, no matter what SEE_OBJS // can see all objs, no matter what SEE_TURFS // can see all turfs (and areas), no matter what SEE_PIXELS// if an object is located on an unlit area, but some of its pixels are - // in a lit area (via pixel_x,y or smooth movement), can see those pixels + // in a lit area (via pixel_x,y or smooth movement), can see those pixels BLIND // can't see anything */ @@ -244,7 +244,14 @@ BLIND // can't see anything set src in usr rolldown() -/obj/item/clothing/under/proc/rolldown() +/obj/item/clothing/under/proc/rolldown(bypass = FALSE) + if(bypass) + toggle_jumpsuit_adjust() + if(usr) + var/mob/living/carbon/human/H = usr + H.update_inv_w_uniform() + H.update_body() + return if(!can_use(usr)) return if(!can_adjust) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index a97467c3e8c0..a759b629b2c0 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -73,6 +73,14 @@ return return ..() +/obj/item/clothing/head/helmet/sec/occupying + name = "occupying force helmet" + desc = "Standard deployment gear. Protects the head from impacts and has a built in mounted light." + +/obj/item/clothing/head/helmet/sec/occupying/Initialize(mob/user) + attached_light = new /obj/item/flashlight/seclite(null) + . = ..() + /obj/item/clothing/head/helmet/alt name = "bulletproof helmet" desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." diff --git a/code/modules/clothing/outfits/occupying.dm b/code/modules/clothing/outfits/occupying.dm new file mode 100644 index 000000000000..a89cf52b142c --- /dev/null +++ b/code/modules/clothing/outfits/occupying.dm @@ -0,0 +1,121 @@ +// occupying force clothing +/obj/item/clothing/under/rank/security/grey/amber/occupying + name = "occupying force jumpsuit" + color = "#55ff9b" + +/obj/item/clothing/under/rank/security/grey/amber/occupying/Initialize(mob/user) + . = ..() + if(prob(50)) // Adds variation to the uniform. 50% will be worn casually. + rolldown(TRUE) + +/obj/item/clothing/head/beret/sec/centcom/occupying + name = "occupying force beret" + desc = "A special green beret for the mundane life of an Occupying Force commander." + color = "#55ff9b" + +/obj/item/clothing/suit/armor/riot/occupying + armor = list("melee" = 40, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 40) + name = "occupying force riot suit" + desc = "A mass produced semi-flexible polycarbonate body armor with decent padding to protect against melee attacks. Not as strong as riot suits typically issued to NT stations." + color = "#55ff9b" + +/obj/item/clothing/head/helmet/riot/raised/occupying + name = "occupying force riot helmet" + desc = "It's a helmet specifically designed for the Occupying force to protect against close range attacks." + color = "#55ff9b" + +// occupying force vest loadouts +// To note: each vest has 7 normal slots - Hopek +/obj/item/storage/belt/military/occupying_officer/ComponentInitialize() // Occupying Officer + . = ..() + new /obj/item/ammo_box/magazine/wt550m9/wtr(src) + new /obj/item/ammo_box/magazine/wt550m9/wtr(src) + new /obj/item/reagent_containers/hypospray/medipen(src) + new /obj/item/restraints/handcuffs/cable/zipties(src) + new /obj/item/restraints/handcuffs/cable/zipties(src) + new /obj/item/reagent_containers/food/snacks/pizzaslice/pepperoni(src) + new /obj/item/jawsoflife/jimmy(src) + + +/obj/item/storage/belt/military/occupying_commander/ComponentInitialize() // Occupying force Commander + . = ..() + new /obj/item/ammo_box/magazine/wt550m9/wtr(src) + new /obj/item/ammo_box/magazine/wt550m9/wtr(src) + new /obj/item/reagent_containers/hypospray/medipen(src) + new /obj/item/reagent_containers/food/snacks/pizzaslice/pepperoni(src) + new /obj/item/megaphone(src) + new /obj/item/restraints/handcuffs/cable/zipties(src) + new /obj/item/jawsoflife/jimmy(src) + +/obj/item/storage/belt/military/occupying_heavy + color = "#55ff9b" + +/obj/item/storage/belt/military/occupying_heavy/ComponentInitialize() // Occupying Riot Officer + . = ..() + new /obj/item/restraints/legcuffs/bola/energy(src) + new /obj/item/restraints/legcuffs/bola/energy(src) + new /obj/item/restraints/handcuffs(src) + new /obj/item/reagent_containers/food/snacks/pizzaslice/pepperoni(src) + new /obj/item/reagent_containers/hypospray/medipen(src) + new /obj/item/flashlight/flare(src) + new /obj/item/jawsoflife/jimmy(src) + + +/datum/outfit/occupying + name = "Occupying Officer" + uniform = /obj/item/clothing/under/rank/security/grey/amber/occupying + suit = /obj/item/clothing/suit/armor/vest/alt + shoes = /obj/item/clothing/shoes/jackboots + gloves = /obj/item/clothing/gloves/color/black + ears = /obj/item/radio/headset/headset_cent/alt + mask = /obj/item/clothing/mask/cigarette/lit + belt = /obj/item/storage/belt/military/occupying_officer + suit_store = /obj/item/gun/ballistic/automatic/wt550/occupying + back = /obj/item/melee/baton/cattleprod/tactical + head = /obj/item/clothing/head/helmet/sec/occupying + l_pocket = /obj/item/reagent_containers/food/drinks/beer + r_pocket = /obj/item/storage/box/fancy/cigarettes + id = /obj/item/card/id/ert/occupying + implants = list(/obj/item/implant/mindshield) + + +/datum/outfit/occupying/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + + H.facial_hair_style = "None" // Everyone in the Occupying force is bald and has no facial hair + H.hair_style = "None" + + var/obj/item/radio/R = H.ears + R.set_frequency(FREQ_CENTCOM) + R.freqlock = TRUE + + var/obj/item/card/id/W = H.wear_id + W.icon_state = "centcom" + W.registered_name = "Unknown" // continuing the tradition of these ID's not being assigned to a particular person + W.assignment = "Occupying Force" + W.update_label(W.registered_name, W.assignment) + + H.ignores_capitalism = TRUE // Yogs -- Lets the Occupying force buy a damned smoke for christ's sake + + +/datum/outfit/occupying/commander + name = "Occupying force Commander" + head = /obj/item/clothing/head/beret/sec/centcom/occupying + belt = /obj/item/storage/belt/military/occupying_commander + l_pocket = /obj/item/pinpointer/nuke + r_pocket = /obj/item/lighter/greyscale // everyone has ciggies, only commander has a lighter + mask = /obj/item/clothing/mask/cigarette/cigar/cohiba + glasses = /obj/item/clothing/glasses/hud/security + +/datum/outfit/occupying/heavy + name = "Occupying Riot Officer" + belt = /obj/item/storage/belt/military/occupying_heavy + back = /obj/item/shield/riot + l_pocket = /obj/item/clothing/ears/earmuffs + r_pocket = /obj/item/tank/internals/emergency_oxygen/engi + head = /obj/item/clothing/head/helmet/riot/raised/occupying + suit = /obj/item/clothing/suit/armor/riot/occupying + mask = /obj/item/clothing/mask/breath/tactical + suit_store = /obj/item/melee/baton/loaded + glasses = /obj/item/clothing/glasses/sunglasses \ No newline at end of file diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 3a07363a584a..4ebe7182d258 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -97,6 +97,12 @@ mag_display_ammo = TRUE empty_indicator = TRUE +/obj/item/gun/ballistic/automatic/wt550/occupying + name = "surplus security auto rifle" + desc = "Crude surplus variant of the WT-550 Automatic Rifle meant for mass deployment. Does not come with the benefits of a two round burst." + burst_size = 1 + mag_type = /obj/item/ammo_box/magazine/wt550m9/wtr + /obj/item/gun/ballistic/automatic/mini_uzi name = "\improper Type U3 Uzi" desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds." diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 42ded804eae2..f232e01217cd 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/sound/items/jimmy_pump.ogg b/sound/items/jimmy_pump.ogg new file mode 100644 index 000000000000..9791969a49b1 Binary files /dev/null and b/sound/items/jimmy_pump.ogg differ diff --git a/yogstation.dme b/yogstation.dme index 627926337af6..85351dd65cff 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -1671,6 +1671,7 @@ #include "code\modules\clothing\outfits\amber.dm" #include "code\modules\clothing\outfits\ert.dm" #include "code\modules\clothing\outfits\event.dm" +#include "code\modules\clothing\outfits\occupying.dm" #include "code\modules\clothing\outfits\plasmaman.dm" #include "code\modules\clothing\outfits\standard.dm" #include "code\modules\clothing\outfits\vr.dm" diff --git a/yogstation/code/game/objects/items/tools.dm b/yogstation/code/game/objects/items/tools.dm index 940bcd5fa542..d26c09b3a87a 100644 --- a/yogstation/code/game/objects/items/tools.dm +++ b/yogstation/code/game/objects/items/tools.dm @@ -14,6 +14,7 @@ force = 15 toolspeed = 0.7 tool_behaviour = TOOL_CROWBAR + var/pryforce = 1 // the speed at which airlocks are pried open. Default is 1 . //jaws of life changing jaw code /obj/item/jawsoflife/attack_self(mob/user) @@ -131,3 +132,70 @@ to_chat(user, "You attach the screw driver bit to [src].") update_icon() +/obj/item/jawsoflife/jimmy + name = "airlock jimmy" + desc = "A pump assisted airlock prying jimmy." + icon_state = "jimmy" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + materials = list(MAT_METAL=400,MAT_SILVER=10,MAT_TITANIUM=80) + toolspeed = 0.3 // Starting minimum value. Pump it up by using it up to the max + tool_behaviour = TOOL_CROWBAR + pryforce = 0.4 + var/pump_charge = 0 + var/pump_max = 100 + var/pump_min = 0 + var/pump_cost = 50 // the cost to pump best if done in incriments of 25 up to the max + var/pump_rate = 25 + var/is_pumping = FALSE // are we charging at the moment? + +/obj/item/jawsoflife/jimmy/attack_self(mob/user) // airlock jimmy can't switch tool modes back to cutters. + if(user) + pump(user) + show_gage(user) + +/obj/item/jawsoflife/jimmy/proc/pump(mob/user) + if(pump_charge >= pump_max && user) + to_chat(user,"[src] is fully pumped.") + else + if(!is_pumping) + var/old_value = pump_charge + is_pumping = TRUE + pump_charge = (pump_charge + pump_rate) > pump_max ? pump_max : pump_charge + pump_rate + if(old_value != pump_charge) + playsound(src, 'sound/items/jimmy_pump.ogg', 100, TRUE) // no need you pump; didn't pump but instead looked at the gage + addtimer(CALLBACK(src, .proc/pump_cooldown), 5) // cooldown between pumps + addtimer(CALLBACK(src, .proc/pump_powerdown), 300) // lose gained power after 30 seconds + return + +/obj/item/jawsoflife/jimmy/proc/pump_powerdown(mob/user) + if((pump_charge - 25) >= 0) + pump_charge = pump_charge - 25 + return + +/obj/item/jawsoflife/jimmy/proc/show_gage(mob/user) + var/emag_givaway_flavor = "" + message_admins("pump charge is [pump_charge]") + if(pump_charge > 101) + emag_givaway_flavor = pick("somehow ","unironically ","ironically ","actually ","maybe ") + to_chat(user,"[src]'s pressure gage [emag_givaway_flavor]reads [pump_charge]%") + +/obj/item/jawsoflife/jimmy/proc/pump_cooldown() + is_pumping = FALSE + +/obj/item/jawsoflife/jimmy/emag_act(mob/user) + if(obj_flags & EMAGGED) + to_chat(user, "Nothing new seems to happen when you swipe the emag.") + return + to_chat(user, "You swipe the emag on [src]'s pressure gage' enabling you to pump more pressure. ") + obj_flags |= EMAGGED + pump_max = 150 + pump_cost = 75 + . = ..() + +/obj/item/jawsoflife/jimmy/examine(mob/user) + . = ..() + if(obj_flags & EMAGGED) + . += "The pressure gage has been tampered with." + if(user) + show_gage(user) \ No newline at end of file