From 4b5fc14909cecbb3cd9a7b0513e4f3e4852af0bd Mon Sep 17 00:00:00 2001 From: CatoChristopherMrow Date: Fri, 3 Jul 2026 15:03:00 -0400 Subject: [PATCH] Hos updates + kaza ruz prevents shove knockdown (#5719) ## About The Pull Request This PR is focused around the HoS and their gear. Most of it hasn't changed in ages, and is quite frankly, VERY underwhelming for what is widely considered the hardest job on station. What this PR does: Adds a case to the hoses locker instead of the x-01. It acts as a voucher more or less. When it's opened you can select one of the 4 available service weapons. One, is the classic x-01 One, is the compact peacekeeper shotgun Two, are new guns: The smart pistol is a prototype murphy. It does 10% less damage then normal murphys, HOWEVER, it shoots past anyone with a mindsheild implant. Great for HoSes who want to act more as supporters then direct combatents. The second, is the law. It's just a .38 revolver that does 10% more damage, with a cool new sprite by Niim The compact shotgun has been taken away from the warden, and in return: Their martial arts gloves now give the wearer the inability to be staggered or knocked down via shoving! They can still be knocked down via plenty of other means, but it's like riot armor. This is good for the warden, as they work in VERY close quarters. This makes it so their gear is more directed at that then just a good gun. The objective to steal the wardens compact has been changed to stealing said gloves. The x-01 traitor objective is of course accounted for. It now starts as an objective to steal the case itself, but when the cases gun is selected, it updates the objective to that specific gun and informs the traitor. Additionally, I resprited the compact shotgun slightly, and gave it some additional basic animation. I also added a bayonet lug to it with a custom placement/sprite for it. ## Why It's Good For The Game Hos has felt incredibly lame gear wise for quite some time. When the x-01 was initially added way back, it was cool and unique, but these days the game has changed so much that it's just...meh. Additionally, the warden having a compact shotgun felt...off. They're intended to mostly be in the brig, so a portable compact shotgun didn't entirely make sense for them. ## Proof Of Testing Videos were too big for direct upload on github, so here they are. Gun demo: https://files.catbox.moe/dzhihr.mp4
Screenshots/Videos image
## Changelog :cl: UvvU add: Added a HoS service weapon case, allowing them to select their weapon. Revolver sprite by Niim del: Removed the wardens compact shotgun from their locker balance: made the wardens martial arts gloves make them unable to be shoved down or staggered /:cl: --------- Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com> --- .../carwo_defense_systems/guns48x.dmi | Bin 3612 -> 3924 bytes .../nanotrasen_system_inc/pistol.dmi | Bin 1349 -> 3503 bytes .../game/gamemodes/objectives/overrides.dm | 26 +++ .../game/objects/items/storage/garment.dm | 4 +- .../crates_lockers/closets/secure/security.dm | 33 +++ .../projectiles/guns/ballistic/shotgun.dm | 46 ++++ .../modules/security/sec_vouchers_vendor.dm | 205 ++++++++++++++++++ .../security/security_glock/lockers.dm | 2 + .../icons/obj/weapons/hos_revolver.dmi | Bin 0 -> 698 bytes tgstation.dme | 1 + 10 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 modular_zubbers/code/game/gamemodes/objectives/overrides.dm create mode 100644 modular_zubbers/icons/obj/weapons/hos_revolver.dmi diff --git a/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns48x.dmi b/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns48x.dmi index b6e68e56dc79b78c30bf903f1173372a8d9012f1..8a8cc13c3822bf1d9c9655124dbc63d9acc26d92 100644 GIT binary patch literal 3924 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 BYNP-F diff --git a/modular_zubbers/code/game/gamemodes/objectives/overrides.dm b/modular_zubbers/code/game/gamemodes/objectives/overrides.dm new file mode 100644 index 00000000000..e2e3432808d --- /dev/null +++ b/modular_zubbers/code/game/gamemodes/objectives/overrides.dm @@ -0,0 +1,26 @@ +/datum/antagonist/traitor/forge_single_generic_objective() + if(prob(KILL_PROB)) + + var/datum/objective/gimmick/gimmick_objective = new() + gimmick_objective.owner = owner + return gimmick_objective + + var/datum/objective/steal/steal_objective = new() + steal_objective.owner = owner + steal_objective.find_target() + return steal_objective + +/datum/objective_item/steal/hoslaser + name = "the head of security's service weapon" + targetitem = /obj/item/gun/energy/e_gun/hos + altitems = list(/obj/item/hos_primary_case) + steal_hint = "A gun case found in the Head of Security's locker." + +/datum/objective_item/steal/compactshotty + name = "the warden's kaza ruk gloves" + targetitem = /obj/item/gun/ballistic/shotgun/automatic/combat/compact + altitems = list(/obj/item/clothing/gloves/kaza_ruk/sec/warden) + steal_hint = "A reinforced set of kaza ruk gloves found in the Warden's locker." + +/datum/objective_item/steal/compactshotty/check_special_completion(obj/item/thing) + return istype(thing, /obj/item/clothing/gloves/kaza_ruk/sec/warden) diff --git a/modular_zubbers/code/game/objects/items/storage/garment.dm b/modular_zubbers/code/game/objects/items/storage/garment.dm index 32d89fffde4..9fc1b888b4c 100644 --- a/modular_zubbers/code/game/objects/items/storage/garment.dm +++ b/modular_zubbers/code/game/objects/items/storage/garment.dm @@ -38,6 +38,9 @@ /obj/item/storage/bag/garment/warden/PopulateContents() . = ..() + for(var/obj/item/clothing/gloves/kaza_ruk/sec/original_gloves in src) + if(original_gloves.type == /obj/item/clothing/gloves/kaza_ruk/sec) + qdel(original_gloves) new /obj/item/clothing/under/rank/security/viro/warden/skirt/(src) new /obj/item/clothing/under/rank/security/viro/warden/(src) new /obj/item/clothing/under/rank/security/viro/warden/formal/(src) @@ -55,4 +58,3 @@ - diff --git a/modular_zubbers/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/modular_zubbers/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 438acde0120..e8abfcd103c 100644 --- a/modular_zubbers/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/modular_zubbers/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -1,6 +1,39 @@ +/obj/item/clothing/gloves/kaza_ruk/sec/warden + name = "warden's kaza ruk gloves" + desc = "These gloves seem to guide you through a non-lizardperson friendly variant of the Tiziran martial art, Kaza Ruk. \ + Reinforced bracing helps keep the wearer planted during close-quarters scuffles." + clothing_traits = list(TRAIT_FAST_CUFFING, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH) + +/obj/item/gun/energy/laser/scatter/shotty/warden + name = "warden's disabler shotgun" + desc = "A combat shotgun gutted and refitted with an internal disabler system. The power supply unit seems to have suffered during The Great Burgerstation Riots of '69" + ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter/disabler) + pin = /obj/item/firing_pin + projectile_damage_multiplier = 0.75 + +/obj/item/clothing/gloves/kaza_ruk/sec/warden/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/automatic/combat/compact) + +/obj/structure/closet/secure_closet/hos/populate_contents_immediate() + . = ..() + var/obj/item/gun/energy/e_gun/hos/original_primary = locate(/obj/item/gun/energy/e_gun/hos) in src + if(original_primary) + qdel(original_primary) + new /obj/item/hos_primary_case(src) + /obj/structure/closet/secure_closet/warden/PopulateContents() . = ..() new /obj/item/stamp/warden(src) + if(!locate(/obj/item/clothing/gloves/kaza_ruk/sec/warden) in src) + new /obj/item/clothing/gloves/kaza_ruk/sec/warden(src) + if(!locate(/obj/item/gun/energy/laser/scatter/shotty) in src) + new /obj/item/gun/energy/laser/scatter/shotty/warden(src) + +/obj/structure/closet/secure_closet/warden/populate_contents_immediate() + . = ..() + for(var/obj/item/gun/ballistic/shotgun/automatic/combat/compact/warden_primary in src) + if(warden_primary.type == /obj/item/gun/ballistic/shotgun/automatic/combat/compact) + qdel(warden_primary) /obj/structure/closet/secure_closet/hop/populate_contents_immediate() . = ..() diff --git a/modular_zubbers/code/modules/projectiles/guns/ballistic/shotgun.dm b/modular_zubbers/code/modules/projectiles/guns/ballistic/shotgun.dm index d80116c8524..bcedd3bc882 100644 --- a/modular_zubbers/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/modular_zubbers/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -1,3 +1,49 @@ +/datum/component/bayonet_attachable/no_overlay/on_update_overlays(obj/item/source, list/overlays) + return + +/datum/component/seclite_attachable/compact_shotgun/on_update_overlays(obj/item/source, list/overlays) + if(!light_overlay || !light_overlay_icon || !light) + return + + overlays += mutable_appearance(light_overlay_icon, "[light_overlay]_[light.light_on ? "on" : "off"]") + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_seclight_point() + AddComponent(/datum/component/seclite_attachable/compact_shotgun, \ + light_overlay_icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns48x.dmi', \ + light_overlay = "cshotgunc_light") + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable/no_overlay) + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact + var/compact_bolt_animating = FALSE + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_overlays() + . = ..() + var/datum/component/bayonet_attachable/bayonet_component = GetComponent(/datum/component/bayonet_attachable) + var/has_bayonet = bayonet_component?.bayonet ? TRUE : FALSE + if(has_bayonet) + . += "cshotgunc_bayonet" + . += has_bayonet ? "cshotgunc_laser_bayonet" : "cshotgunc_laser" + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/shoot_live_shot(mob/living/user) + . = ..() + animate_compact_bolt() + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/proc/animate_compact_bolt() + compact_bolt_animating = TRUE + update_appearance(UPDATE_OVERLAYS) + var/icon/bolt_icon = icon(src.icon, "cshotgunc_bolt_animated", SOUTH, 1) + var/atom/movable/flick_visual/bolt = flick_overlay_view(mutable_appearance(bolt_icon, "", layer + 0.1), 1) + if(bolt) + animate(bolt, icon = icon(src.icon, "cshotgunc_bolt_animated", SOUTH, 2), time = 0.2) + for(var/frame in 3 to 6) + animate(icon = icon(src.icon, "cshotgunc_bolt_animated", SOUTH, frame), time = 0.2) + addtimer(CALLBACK(src, PROC_REF(reset_compact_bolt_animation)), 1) + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/proc/reset_compact_bolt_animation() + compact_bolt_animating = FALSE + update_appearance(UPDATE_OVERLAYS) /obj/item/gun/ballistic/shotgun/bulldog/beanbag name = "\improper Beandog Shotgun" desc = "A 2-round burst fire, mag-fed shotgun for target suppression in narrow corridors, \ diff --git a/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm b/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm index 15d13e30b9d..297e78dce28 100644 --- a/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm +++ b/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm @@ -19,6 +19,211 @@ name = "security utility voucher" icon_state = "security_voucher_utility" +#define HOS_PRIMARY_MARKINGS " This one's markings indicate that it was issued to the Head of Security." + +/proc/retarget_hos_primary_objectives(obj/item/weapon_path, objective_name) + for(var/datum/objective/objective as anything in GLOB.objectives) + if(!istype(objective, /datum/objective/steal)) + continue + var/datum/objective/steal/steal_objective = objective + if(!istype(steal_objective.targetinfo, /datum/objective_item/steal/hoslaser)) + continue + + steal_objective.steal_target = weapon_path + steal_objective.explanation_text = "Steal [objective_name], the head of security's service weapon." + + for(var/datum/mind/owner as anything in steal_objective.get_owners()) + if(!owner.current) + continue + to_chat(owner.current, span_notice("Your objective has been updated: [steal_objective.explanation_text]")) + for(var/datum/antagonist/antag as anything in owner.antag_datums) + antag.update_static_data(owner.current) + +/obj/item/gun/energy/e_gun/hos/hos_primary + desc = parent_type::desc + HOS_PRIMARY_MARKINGS + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/hos_primary + desc = parent_type::desc + HOS_PRIMARY_MARKINGS + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/projectile/bullet/security/smart + name = "smart 9x19mm Murphy bullet" + +/obj/projectile/bullet/security/smart/prehit_pierce(atom/target) + if(isliving(target) && HAS_TRAIT(target, TRAIT_MINDSHIELD)) + return PROJECTILE_PIERCE_PHASE + return ..() + +/obj/item/ammo_casing/security/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", atom/fired_from) + if(istype(fired_from, /obj/item/gun/ballistic/automatic/pistol/sec_glock/smart)) + QDEL_NULL(loaded_projectile) + loaded_projectile = new /obj/projectile/bullet/security/smart(src) + return ..() + +/obj/item/gun/ballistic/automatic/pistol/sec_glock/smart + name = "\improper Smart Pistol" + desc = parent_type::desc + " This model is a new prototype that uses a compact IFF package to guide rounds past mindshield-implanted targets." + HOS_PRIMARY_MARKINGS + icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/nanotrasen_system_inc/pistol.dmi' + icon_state = "firefly" + base_icon_state = "firefly" + projectile_damage_multiplier = 0.9 + show_bolt_icon = FALSE + mag_display = FALSE + var/firefly_slide_animating = FALSE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/item/gun/ballistic/automatic/pistol/sec_glock/smart/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + starting_light = new /obj/item/flashlight/seclite(src), \ + is_light_removable = FALSE) + +/obj/item/gun/ballistic/automatic/pistol/sec_glock/smart/update_overlays() + . = ..() + if(magazine && !internal_magazine) + . += "firefly_mag" + var/datum/component/seclite_attachable/seclite = GetComponent(/datum/component/seclite_attachable) + if(seclite?.light) + var/light_state = seclite.light.light_on ? "on" : "off" + . += "firefly-light_[light_state]" + if(!firefly_slide_animating) + . += bolt_locked ? "firefly_bolt_locked" : "firefly_bolt" + +/obj/item/gun/ballistic/automatic/pistol/sec_glock/smart/shoot_live_shot(mob/living/user, pointblank = FALSE, atom/pbtarget = null, message = TRUE) + . = ..() + recoil_firefly_slide() + +/obj/item/gun/ballistic/automatic/pistol/sec_glock/smart/proc/recoil_firefly_slide() + firefly_slide_animating = TRUE + update_appearance(UPDATE_OVERLAYS) + var/atom/movable/flick_visual/slide = flick_overlay_view(mutable_appearance(icon, "firefly_bolt", layer + 0.1), 0.75) + if(slide) + animate(slide, pixel_w = -3, time = 0.375) + animate(pixel_w = 0, time = 0.375) + addtimer(CALLBACK(src, PROC_REF(reset_firefly_slide_recoil)), 0.75) + +/obj/item/gun/ballistic/automatic/pistol/sec_glock/smart/proc/reset_firefly_slide_recoil() + firefly_slide_animating = FALSE + update_appearance(UPDATE_OVERLAYS) + +/obj/item/gun/ballistic/revolver/c38/the_law + name = "\improper The Law" + desc = "A custom modified .38 Special revolver, it seems far heavier than standard models." + HOS_PRIMARY_MARKINGS + icon = 'modular_zubbers/icons/obj/weapons/hos_revolver.dmi' + icon_state = "the_law" + base_icon_state = "the_law" + projectile_damage_multiplier = 1.1 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/item/storage/belt/holster/detective/full/ert/the_law + desc = parent_type::desc + HOS_PRIMARY_MARKINGS + +/obj/item/storage/belt/holster/detective/full/ert/the_law/PopulateContents() + generate_items_inside(list( + /obj/item/ammo_box/speedloader/c38 = 3, + /obj/item/gun/ballistic/revolver/c38/the_law = 1, + ), src) + +/obj/item/hos_primary_case + name = "head of security's service weapon case" + desc = "A secure gun case containing one of the Head of Security's service weapons." + icon = 'modular_skyrat/modules/modular_weapons/icons/obj/gunsets.dmi' + icon_state = "guncase" + worn_icon = 'modular_skyrat/modules/modular_weapons/icons/mob/worn/cases.dmi' + worn_icon_state = "darkcase" + material_flags = NONE + w_class = WEIGHT_CLASS_NORMAL + /// Prevents double redemption if two interactions race each other. + var/redeemed = FALSE + +/obj/item/hos_primary_case/click_alt(mob/user) + try_redeem(user) + return CLICK_ACTION_SUCCESS + +/obj/item/hos_primary_case/attack_self(mob/user) + try_redeem(user) + +/obj/item/hos_primary_case/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/energy/e_gun/hos) + +/obj/item/hos_primary_case/proc/try_redeem(mob/user) + if(redeemed || QDELETED(src)) + return + if(!isliving(user)) + return + var/mob/living/redeemer = user + if(redeemer.incapacitated) + return + + var/static/list/primary_options + if(!primary_options) + var/datum/radial_menu_choice/x01_option = new + x01_option.image = image(icon = 'icons/obj/weapons/guns/energy.dmi', icon_state = "hoslaser") + x01_option.info = span_boldnotice("The Head of Security's unique three-mode energy gun.") + + var/datum/radial_menu_choice/shotgun_option = new + shotgun_option.image = image(icon = 'icons/obj/weapons/guns/ballistic.dmi', icon_state = "cshotgunc") + shotgun_option.info = span_boldnotice("A miniaturized combat shotgun.") + + var/datum/radial_menu_choice/smart_pistol_option = new + smart_pistol_option.image = image(icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/nanotrasen_system_inc/pistol.dmi', icon_state = "firefly") + smart_pistol_option.info = span_boldnotice("A Murphy-pattern pistol that fires past mindshield-implanted targets.") + + var/datum/radial_menu_choice/the_law_option = new + the_law_option.image = image(icon = 'modular_zubbers/icons/obj/weapons/hos_revolver.dmi', icon_state = "the_law") + the_law_option.info = span_boldnotice("The Law, an modified Detective Special that hits harder than standard models.") + + primary_options = list( + "X-01 MultiPhase Energy Gun" = x01_option, + "Compact Shotgun" = shotgun_option, + "Smart Pistol" = smart_pistol_option, + "The Law" = the_law_option, + ) + + var/selection = show_radial_menu(redeemer, src, primary_options, custom_check = CALLBACK(src, PROC_REF(check_redeem_menu), redeemer), radius = 38, require_near = TRUE, tooltips = TRUE) + if(!selection || redeemed || QDELETED(src)) + return + + var/spawn_path + var/objective_path + var/objective_name + switch(selection) + if("X-01 MultiPhase Energy Gun") + spawn_path = /obj/item/gun/energy/e_gun/hos/hos_primary + objective_name = "the X-01 MultiPhase Energy Gun" + if("Compact Shotgun") + spawn_path = /obj/item/gun/ballistic/shotgun/automatic/combat/compact/hos_primary + objective_name = "the compact shotgun" + if("Smart Pistol") + spawn_path = /obj/item/gun/ballistic/automatic/pistol/sec_glock/smart + objective_name = "the Smart Pistol" + if("The Law") + spawn_path = /obj/item/storage/belt/holster/detective/full/ert/the_law + objective_path = /obj/item/gun/ballistic/revolver/c38/the_law + objective_name = "\"The Law\"" + else + return + + objective_path ||= spawn_path + redeemed = TRUE + var/obj/item/chosen_item = new spawn_path(drop_location()) + redeemer.put_in_hands(chosen_item) + retarget_hos_primary_objectives(objective_path, objective_name) + balloon_alert(redeemer, "selected [LOWER_TEXT(selection)]") + qdel(src) + +/obj/item/hos_primary_case/proc/check_redeem_menu(mob/living/redeemer) + if(!istype(redeemer)) + return FALSE + if(redeemer.incapacitated) + return FALSE + if(QDELETED(src) || redeemed) + return FALSE + if(!redeemer.Adjacent(src)) + return FALSE + return TRUE + +#undef HOS_PRIMARY_MARKINGS + /obj/machinery/vending/security/Initialize(mapload) . = ..() AddElement(/datum/element/voucher_redeemer, /obj/item/security_voucher/primary, /datum/voucher_set/security/primary) diff --git a/modular_zubbers/code/modules/security/security_glock/lockers.dm b/modular_zubbers/code/modules/security/security_glock/lockers.dm index 531d184e40b..c37fcdc5f7d 100644 --- a/modular_zubbers/code/modules/security/security_glock/lockers.dm +++ b/modular_zubbers/code/modules/security/security_glock/lockers.dm @@ -4,4 +4,6 @@ /obj/structure/closet/secure_closet/warden/PopulateContents() . = ..() + if(!locate(/obj/item/clothing/gloves/kaza_ruk/sec/warden) in src) + new /obj/item/clothing/gloves/kaza_ruk/sec/warden(src) new /obj/item/storage/toolbox/guncase/skyrat/pistol/hos_glock(src) diff --git a/modular_zubbers/icons/obj/weapons/hos_revolver.dmi b/modular_zubbers/icons/obj/weapons/hos_revolver.dmi new file mode 100644 index 0000000000000000000000000000000000000000..90b69d9119135bb6d37b66e4b9c1c2a3bdbc29b8 GIT binary patch literal 698 zcmV;r0!96aP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sU#ycJ}0qUiHkEOv#1y-V#vjrR+N~V3SlcNxca$(3PH z6e2(X00Ih0L_t(|+U=FiZrV@~g+G(X1c3=j3?WoD>Y^wpDMDgfRcaSVMd}MQFT%U^ z1?Ub`q_&GzU?&C_i+|eUjk}=S1V{p<$)b{vbR~~Gch1~1=i1=IhYuhB3yN>vdfBs_ zx9$GyS3q4+i&w7+N0o&&8ICZGCYqk6=Q#8n2Tf0l*mb9zo}d3Y^)>D8I&w`<DiP7IXg4VYWWU|kBnTgV_zZbKf3`fXvP^{!hg2SVIA#vNbq_%BI2dauJ2SqH) z!4;0RCd_GjUOt<_xEjzM+7Nqo-C(OlI1-t8V>~7lQWj1>CtOyfZClbtBgkoc9zaS{ zFs=pwyt}xdTrNuhaaHwVu^82ARf?;s_v6`6jp_IM z0CXHj+UENpt&={bDOl#rT*lRa-p(PGWzPH%iHQ5WEu_21OT~g9o|88w(mxX}7_8A3gwn1IBaOg1%u{6aWAK07*qoM6N<$f~HA9B>(^b literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index b3f02dd1da4..24105fbacda 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9281,6 +9281,7 @@ #include "modular_zubbers\code\game\gamemodes\fleshmind\tyrant\tyrant.dm" #include "modular_zubbers\code\game\gamemodes\fleshmind\tyrant\tyrant_ai.dm" #include "modular_zubbers\code\game\gamemodes\objectives\gimmick.dm" +#include "modular_zubbers\code\game\gamemodes\objectives\overrides.dm" #include "modular_zubbers\code\game\Items\big_bertha_shield.dm" #include "modular_zubbers\code\game\Items\coins.dm" #include "modular_zubbers\code\game\Items\lipstick.dm"