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