Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BOUNTY][PORT] Corporate Judo Port #4468

Open
wants to merge 37 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
fdd0870
include
Coll6 Dec 2, 2024
b767ddc
Ported all Corp Judo abilites except Wheel Throw
Coll6 Dec 3, 2024
a23277a
Ported all media and icons from Paradise.
Coll6 Dec 3, 2024
bc44153
Restricted items close to Paradise settings.
Coll6 Dec 3, 2024
bfd072a
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Dec 3, 2024
2da4fc0
Merge branch 'Corp-Judo' of https://github.com/Coll6/Monkestation2.0 …
Coll6 Dec 3, 2024
9f8e29d
Ports Armbar debuff to setup for Wheel Throw
Coll6 Dec 3, 2024
7a019db
Wheel Throw ported.
Coll6 Dec 3, 2024
33cf0eb
Ports Wheel throw no batons and armbar effect
Coll6 Dec 4, 2024
087105f
reduce max moves to 6, stage goldblast 7s timer
Coll6 Dec 4, 2024
5b4a0a9
minor fix
Coll6 Dec 4, 2024
1b101bc
oops
Coll6 Dec 4, 2024
d0693ec
Adjusted stamina damage values for MonkeStation
Coll6 Dec 4, 2024
f9b7c38
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Dec 4, 2024
570c093
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Dec 22, 2024
03e295b
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Dec 27, 2024
9829286
Setup for combo change.
Coll6 Dec 27, 2024
3ff670a
Added active grab req for Judo Throw
Coll6 Dec 27, 2024
49c16a9
Flavor text for failed Judo Throw.
Coll6 Dec 27, 2024
5f06c5e
Setup for DMC style comboing (Refresh on combo)
Coll6 Dec 29, 2024
0c26e9e
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Dec 29, 2024
be55f54
Combo timer resets on combo additions.
Coll6 Dec 29, 2024
5094bfa
Combos now refresh time, removed left over code.
Coll6 Dec 30, 2024
7c1788d
Puts belt in HoS locker, 3 in sectech for 300
Coll6 Dec 30, 2024
379cfad
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Dec 30, 2024
64d034c
Fix stunharm, lowered timer, belts in sec lockers
Coll6 Jan 2, 2025
03c1f62
Teachings help and GC, base remove returns
Coll6 Jan 2, 2025
f5d0277
Applying comments
Coll6 Jan 2, 2025
51be495
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Jan 2, 2025
1e3e777
Fix harm bug, makes armbar refresh.
Coll6 Jan 2, 2025
0b0a522
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Jan 3, 2025
1bb1473
Applying comment. Teachings to_chat performance
Coll6 Jan 3, 2025
0879a68
Merge branch 'master' into Corp-Judo
Coll6 Jan 9, 2025
d614c27
Merge conflict.
Coll6 Jan 9, 2025
b2e4944
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Jan 12, 2025
4576630
Merge branch 'master' into Corp-Judo
Coll6 Jan 16, 2025
9f16cf4
Merge branch 'Monkestation:master' into Corp-Judo
Coll6 Jan 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions code/__DEFINES/melee.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#define MARTIALART_PSYCHOBRAWL "psychotic brawling"
#define MARTIALART_SLEEPINGCARP "sleeping carp"
#define MARTIALART_WRESTLING "wrestling"
#define MARTIALART_JUDO "corporate judo"
#define MARTIALART_AWAKENEDDRAGON "awakened dragon"

/// The number of hits required to crit a target
Expand Down
16 changes: 16 additions & 0 deletions code/__DEFINES/traits/declarations.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// This file contains all of the "static" define strings that tie to a trait.

Check failure on line 1 in code/__DEFINES/traits/declarations.dm

View workflow job for this annotation

GitHub Actions / Run Linters

Define Sanity

TRAIT_COMBAT_MODE_SKIP_INTERACTION is defined in code/__DEFINES/traits/declarations.dm but not added to code/_globalvars/traits/_traits.dm!
// WARNING: The sections here actually matter in this file as it's tested by CI. Please do not toy with the sections."

// BEGIN TRAIT DEFINES
Expand Down Expand Up @@ -1282,4 +1282,20 @@
/// Trait applied to objects and mobs that can attack a boulder and break it down. (See /obj/item/boulder/manual_process())
#define TRAIT_BOULDER_BREAKER "boulder_breaker"

///Used to prevent Corpo Judo users from using Baton weapons.
#define TRAIT_NO_WEAPONTYPE "no_weapontype"

/**
*
* This trait is used in some interactions very high in the interaction chain to allow
* certain atoms to be skipped by said interactions if the user is in combat mode.
*
* Its primarily use case is for stuff like storage and tables, to allow things like emags to be bagged
* (because in some contexts you might want to be emagging a bag, and in others you might want to be storing it.)
*
* This is only checked by certain items explicitly so you can't just add the trait and expect it to work.
* (This may be changed later but I chose to do it this way to avoid messing up interactions which require combat mode)
*/
#define TRAIT_COMBAT_MODE_SKIP_INTERACTION "combat_mode_skip_interaction"

// END TRAIT DEFINES
1 change: 1 addition & 0 deletions code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM,
"TRAIT_NO_TRANSFORMATION_STING" = TRAIT_NO_TRANSFORMATION_STING,
"TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR,
"TRAIT_NO_WEAPONTYPE" = TRAIT_NO_WEAPONTYPE,
"TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY,
"TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE,
"TRAIT_OCCULTIST" = TRAIT_OCCULTIST,
Expand Down
3 changes: 2 additions & 1 deletion code/datums/martial/_martial.dm
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,15 @@

/datum/martial_art/proc/remove(mob/living/holder_living)
if(!istype(holder_living) || !holder_living.mind || holder_living.mind.martial_art != src)
return
return FALSE
on_remove(holder_living)
if(base)
base.teach(holder_living)
else
var/datum/martial_art/default = holder_living.mind.default_martial_art
default.teach(holder_living)
holder = null
return TRUE

/datum/martial_art/proc/on_remove(mob/living/holder_living)
if(help_verb)
Expand Down
309 changes: 309 additions & 0 deletions code/datums/martial/corporate_judo.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,309 @@
///
// PORTED FROM PARADISE STATION
///
//Don't know how a human would get a borg/stun but the cyberimp item sets worried me. So just in case.
#define BANNEDTYPES list(/obj/item/melee/baton, /obj/item/borg/stun)
#define MIN_COMBO 2

///
// ITEM INFORMATION
///
/obj/item/storage/belt/security/blueshield/corpjudo
name = "\improper Corporate Judo Belt"
desc = "You could learn Judo the hard way, but at NT money can buy you everything."
icon_state = "judobelt"
worn_icon_state = "judo"
inhand_icon_state = "judo"

custom_premium_price = PAYCHECK_COMMAND * 2
w_class = WEIGHT_CLASS_BULKY

var/datum/martial_art/corpjudo/style

/obj/item/storage/belt/security/blueshield/corpjudo/PopulateContents()
// Can fill with new /obj/item to fill with items
return

/obj/item/storage/belt/security/blueshield/corpjudo/Initialize(mapload)
. = ..()
style = new /datum/martial_art/corpjudo
atom_storage.max_slots = 3
atom_storage.remove_all()
atom_storage.set_holdable(list(
/obj/item/grenade/flashbang,
/obj/item/grenade/chem_grenade/teargas,
/obj/item/reagent_containers/spray/pepper,
/obj/item/restraints/handcuffs,
/obj/item/assembly/flash/handheld,
/obj/item/food/donut,
/obj/item/flashlight/seclite,
/obj/item/holosign_creator/security,
/obj/item/restraints/legcuffs/bola,
/obj/item/detective_scanner,
/obj/item/clothing/glasses,
/obj/item/clothing/gloves,
/obj/item/citationinator, //monkestation edit
/obj/item/food/spaghetti/security, //monkestation change: tactical belt
/obj/item/radio
))
PopulateContents()

/obj/item/storage/belt/security/blueshield/corpjudo/Destroy()
. = ..()
QDEL_NULL(style)

/obj/item/storage/belt/security/blueshield/corpjudo/equipped(mob/user, slot)
. = ..()
if(ishuman(user) && slot & ITEM_SLOT_BELT)
style.teach(user, TRUE)
ADD_TRAIT(user, TRAIT_NO_WEAPONTYPE, src)

/obj/item/storage/belt/security/blueshield/corpjudo/dropped(mob/user)
. = ..()
if(ishuman(user) && user.get_item_by_slot(ITEM_SLOT_BELT) == src)
style.remove(user)
REMOVE_TRAIT(user, TRAIT_NO_WEAPONTYPE, src)


/mob/living/proc/is_weapon_restricted(mob/living/defender, obj/item/weapon, mob/living/attacker)
if(HAS_TRAIT(attacker, TRAIT_NO_WEAPONTYPE))
for(var/type in BANNEDTYPES)
if(istype(weapon, type))
if(attacker == defender)
to_chat(attacker, "<span class='warning'>Remember, the path of Corporate Judo is strength through balance and increased market share—not the folly of striking yourself with crude implements.</span>")
else
defender.visible_message("<span class='warning'>[attacker] remembers their Sensei's words: &quot;There is a time and place for everything...&quot; WAIT, YOU DON'T HAVE A SENSEI!</span>", \
"<span class='userdanger'>[attacker] freezes before striking, [attacker.p_their()] face giving off a pained expression!</span>")
return TRUE
return FALSE

/mob/living/attackby(obj/item/weapon, mob/living/user)
if(ishuman(user) && is_weapon_restricted(src, weapon, user))
return
..()

/mob/living/attackby_secondary(obj/item/weapon, mob/living/user)
if(ishuman(user) && is_weapon_restricted(src, weapon, user))
return
..()
///
// MARTIAL ART STYLE
///
/datum/martial_art/corpjudo
name = "Corporate Judo"
id = MARTIALART_JUDO
display_combos = TRUE
max_streak_length = 12
combo_timer = 2.5 SECONDS

help_verb = /mob/living/carbon/human/proc/judo_help

var/list/combo_moves = list(
"DG" = /datum/martial_art/corpjudo/proc/discombobulate,
"HD" = /datum/martial_art/corpjudo/proc/eye_poke,
"GD" = /datum/martial_art/corpjudo/proc/judo_throw,
"DDG" = /datum/martial_art/corpjudo/proc/armbar,
"DDGGDH" = /datum/martial_art/corpjudo/proc/wheel_throw,
"EDEGDDGEDDGE" = /datum/martial_art/corpjudo/proc/golden_blast,
)

/datum/martial_art/corpjudo/teach(mob/living/owner, make_temporary=FALSE)
. = ..()
if(.)
to_chat(owner, span_userdanger("You suddenly feel like you could negotiate with gravity itself... well at least your Boss."))

/datum/martial_art/corpjudo/remove(mob/living/owner)
. = ..()
if(.)
to_chat(owner, span_userdanger("As the belt leaves your waist, the secrets of Judo vanish like quarterly profits."))

/mob/living/carbon/human/proc/judo_help()
set name = "Recall Teachings"
set desc = "Focus on your Sensi's words and remember your training."
set category = "Corporate Judo"

to_chat(usr, "<b><i>An old wise voice echos your mind, it's voice distance and calm. You focus on voice; the world falls silent. With a satisfied treble, it begins to teach.</i></b>")

var/list/teach_msg = list()

teach_msg += span_notice("Upgraded Punch") + ": " + span_memo("Your punches strike harder than normal.")
teach_msg += span_notice("Discomboulate") + ": " + span_memo("Disarm Grab.") + " Gentle key strikes to the temple; drains some of the opponents stamina, and confuses them for a moment."
teach_msg += span_notice("Eye Poke") + ": " + span_memo("Harm Disarm.") + " Masterfully jab your fingers into your opponents eyes. Causes harm and makes it increasingly hard to see."
teach_msg += span_notice("Judo Throw") + ": " + span_memo("Grab Disarm.") + " You and your opponent must not be on the floor. With a gentle maintained grasp, throw them to the floor draining their stamina and ability to stand up."
teach_msg += span_notice("Armbar") + ": " + span_memo("Disarm Disarm Grab.") + " Twist the arm of a laying opponent causing them heavy exhaustion and knocking them into the floor. Standing leverage causes the opponent to drop their held possesions."
teach_msg += span_notice("Wheel Throw") + ": " + span_memo("Armbar->Grab Disarm Harm.") + " Continuing from Armbar this dance will throw a laying opponent over your body and back into the ground. Heavy exhaustion, confusion, and loss of balance will follow."
teach_msg += span_notice("Golden Blast") + ": " + span_memo("Help Disarm Help-Grab Disarm Disarm-Grab Help Disarm-Disarm Grab Help.") + " An absurdly intricate fighting move to demonstrate your mastery of the Judo arts. Hits opponent with golden energy. Knocks them down heavily causing confusion, exhaustion, balance loss."
to_chat(usr, teach_msg.Join("\n"))

/datum/martial_art/corpjudo/Destroy()
if(holder)
var/mob/living/owner = holder.resolve()
if(owner)
remove(owner) // Clean up the martial art effects from the owner
//some how need to call remove here
QDEL_NULL(combo_moves)
return ..()

///
// MARTIAL ART STYLE: ABILITIES
///
/datum/martial_art/corpjudo/proc/discombobulate(mob/living/carbon/human/attacker, mob/living/defender)
reset_streak(defender)
defender.visible_message("<span class='warning'>[attacker] strikes [defender] in the head with [attacker.p_their()] palm!</span>", \
"<span class='userdanger'>[attacker] strikes you with [attacker.p_their()] palm!</span>")
playsound(get_turf(attacker), 'sound/weapons/slap.ogg', 40, TRUE, -1)
defender.apply_damage(25, STAMINA)
defender.adjust_confusion(5 SECONDS)
log_combat(attacker, defender, "Melee attacked with martial-art [src] : Discombobulate")
return MARTIAL_ATTACK_SUCCESS

/datum/martial_art/corpjudo/proc/eye_poke(mob/living/attacker, mob/living/defender)
reset_streak(defender)
defender.visible_message("<span class='warning'>[attacker] jabs [defender] in [attacker.p_their()] eyes!</span>", \
"<span class='userdanger'>[attacker] jabs you in the eyes!</span>")
playsound(get_turf(attacker), 'sound/weapons/whip.ogg', 40, TRUE, -1)
defender.apply_damage(10, BRUTE)
defender.adjust_eye_blur_up_to(5,30)
defender.set_temp_blindness(2 SECONDS)
log_combat(attacker, defender, "Melee attacked with martial-art [src] : Eye Poke")
return MARTIAL_ATTACK_SUCCESS

/datum/martial_art/corpjudo/proc/judo_throw(mob/living/carbon/human/attacker, mob/living/defender)
reset_streak(defender)
if(!attacker.body_position == STANDING_UP || !defender.body_position == STANDING_UP)
return MARTIAL_ATTACK_INVALID

if(!defender.pulledby || !(defender.pulledby == attacker))
defender.visible_message("<span class='warning'>[defender] managed to struggle out of [attacker]'s throw.</span>", \
"<span class='userdanger'>You wrestle out of [attacker]'s grip!</span>")
return MARTIAL_ATTACK_INVALID
defender.visible_message("<span class='warning'>[attacker] judo throws [defender] to ground!</span>", \
"<span class='userdanger'>[attacker] judo throws you to the ground!</span>")
playsound(get_turf(attacker), 'sound/weapons/slam.ogg', 40, TRUE, -1)
defender.apply_damage(62, STAMINA)
defender.Knockdown(7 SECONDS)
log_combat(attacker, defender, "Melee attacked with martial-art [src] : Judo Throw")
return MARTIAL_ATTACK_SUCCESS

/datum/martial_art/corpjudo/proc/armbar(mob/living/carbon/human/attacker, mob/living/defender)
if(defender.body_position == STANDING_UP)
reset_streak(defender)
return MARTIAL_ATTACK_INVALID
defender.visible_message("<span class='warning'>[attacker] puts [defender] into an armbar!</span>", \
"<span class='userdanger'>[attacker] wrestles you into an armbar!</span>")
playsound(get_turf(attacker), 'sound/weapons/slashmiss.ogg', 40, TRUE, -1)
if(attacker.body_position == STANDING_UP)
defender.drop_all_held_items()
defender.apply_damage(112, STAMINA)
defender.Knockdown(5 SECONDS)
combo_refresh() // Flow combos need to refresh the chain.
log_combat(attacker, defender, "Melee attacked with martial-art [src] : Armbar")
return MARTIAL_ATTACK_SUCCESS

/datum/martial_art/corpjudo/proc/wheel_throw(mob/living/carbon/human/attacker, mob/living/defender)
reset_streak(defender)
if(defender.body_position == STANDING_UP)
return MARTIAL_ATTACK_INVALID
if(attacker.body_position == STANDING_UP)
defender.visible_message("<span class='warning'>[attacker] raises [defender] over [attacker.p_their()] shoulder, and slams [defender.p_them()] into the ground!</span>", \
"<span class='userdanger'>[attacker] throws you over [attacker.p_their()] shoulder, slamming you into the ground!</span>")
playsound(get_turf(attacker), 'sound/magic/tail_swing.ogg', 40, TRUE, -1)
defender.SpinAnimation(10, 1)
else
defender.visible_message("<span class='warning'>[attacker] manages to get a hold onto [defender], and pinning [defender.p_them()] to the ground!</span>", \
"<span class='userdanger'>[attacker] throws you over [attacker.p_their()] shoulder, slamming you into the ground!</span>")
playsound(get_turf(attacker), 'sound/weapons/slam.ogg', 40, TRUE, -1)
defender.apply_damage(250, STAMINA)
defender.Knockdown(15 SECONDS)
defender.set_confusion(10 SECONDS)
log_combat(attacker, defender, "Melee attacked with martial-art [src] : Wheel Throw")
return MARTIAL_ATTACK_SUCCESS

/datum/martial_art/corpjudo/proc/golden_blast(mob/living/carbon/human/attacker, mob/living/defender)
reset_streak(defender)
defender.visible_message("<span class='warning'>[attacker] blasts [defender] with energy, sending [defender.p_them()] to the ground!</span>", \
"<span class='userdanger'>[attacker] makes strange hand gestures, screams wildly and prods you directly in the chest! You feel the wrath of the GOLDEN BOLT surge through your body! You've been utterly robusted!</span>")
playsound(get_turf(defender), 'sound/weapons/taser.ogg', 55, TRUE, -1)
playsound(get_turf(defender), 'sound/weapons/taserhit.ogg', 55, TRUE, -1)
defender.SpinAnimation(10, 1)
do_sparks(5, FALSE, defender)
attacker.say("GOLDEN BLAST!")
playsound(get_turf(defender), 'sound/weapons/goldenblast.ogg', 60, TRUE, -1)
defender.apply_damage(250, STAMINA)
defender.Knockdown(30 SECONDS)
defender.set_confusion(30 SECONDS)
//says this causes a full stun not sure if that is something wanted.
log_combat(attacker, defender, "Melee attacked with martial-art [src] : Golden Blast")
return MARTIAL_ATTACK_SUCCESS

///
// Combo Adders
///
/datum/martial_art/corpjudo/help_act(mob/living/attacker, mob/living/defender)
if(attacker == defender || !can_use(attacker))
return MARTIAL_ATTACK_INVALID

add_to_streak("E", defender)
check_streak(attacker, defender)

/datum/martial_art/corpjudo/harm_act(mob/living/attacker, mob/living/defender)
if(attacker == defender || !can_use(attacker))
return MARTIAL_ATTACK_INVALID
add_to_streak("H", defender)

if(check_streak(attacker, defender) == MARTIAL_ATTACK_SUCCESS)
return MARTIAL_ATTACK_SUCCESS

var/picked_hit_type = pick("chops", "slices", "strikes")
attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH)
defender.apply_damage(10, BRUTE)
playsound(get_turf(defender), 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
defender.visible_message("<span class='danger'>[attacker] [picked_hit_type] [defender]!</span>", \
"<span class='userdanger'>[attacker] [picked_hit_type] you!</span>")
log_combat(attacker, defender, "Melee attacked with [src]")
return MARTIAL_ATTACK_SUCCESS // If we applied our buffed damage don't allow normal punches.

/datum/martial_art/corpjudo/disarm_act(mob/living/attacker, mob/living/defender)
if(attacker == defender || !can_use(attacker))
return MARTIAL_ATTACK_INVALID

add_to_streak("D", defender)
return check_streak(attacker, defender)

/datum/martial_art/corpjudo/grab_act(mob/living/attacker, mob/living/defender)
if(attacker == defender || !can_use(attacker))
return MARTIAL_ATTACK_INVALID

add_to_streak("G", defender)
return check_streak(attacker, defender)

/datum/martial_art/corpjudo/proc/combo_refresh()
// Since combo is continuing, refresh our timer sorta like DMC.
if(timerid)
deltimer(timerid)
if (display_combos)
var/mob/living/holder_living = holder.resolve()
timerid = addtimer(CALLBACK(src, PROC_REF(reset_streak), null, FALSE), combo_timer, TIMER_UNIQUE | TIMER_STOPPABLE)
holder_living?.hud_used?.combo_display.update_icon_state(streak, combo_timer - 2 SECONDS)

/datum/martial_art/corpjudo/proc/check_streak(mob/living/attacker, mob/living/defender)
if(length(streak) < MIN_COMBO)
combo_refresh()
return MARTIAL_ATTACK_INVALID
else
var/combo_action = combo_moves[streak] // Check for exact matches and fires ability.
if(combo_action)
return call(src, combo_action)(attacker, defender)

for(var/combo in combo_moves) // Check for partial combos so we can refresh our timer.
if(length(streak) < length(combo) && copytext(combo, 1, (length(streak) + 1)) == streak)
combo_refresh()
return MARTIAL_ATTACK_INVALID

var/last_move = copytext(streak, -1, 0) // Not building to a valid combo reset and carry over combo breaking move.
reset_streak(defender)
add_to_streak(last_move, defender)
return MARTIAL_ATTACK_INVALID

#undef MIN_COMBO
#undef BANNEDTYPES
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
new /obj/item/storage/photo_album/hos(src)
new /obj/item/ammo_box/magazine/m35(src) //monkestation edit: paco sec
new /obj/item/bodycam_upgrade(src) //monkestation edit: Security Liability Act
new /obj/item/storage/belt/security/blueshield/corpjudo(src) //monkestation edit: Paradise port

/obj/structure/closet/secure_closet/hos/populate_contents_immediate()
. = ..()
Expand Down Expand Up @@ -105,7 +106,6 @@
new /obj/item/gun/ballistic/shotgun/automatic/combat/compact(src) //undoing ancient removal
new /obj/item/ammo_box/advanced/s12gauge/rubber(src) //he can have some rubber ammo too


/obj/structure/closet/secure_closet/security
name = "security officer's locker"
req_access = list(ACCESS_BRIG)
Expand All @@ -122,6 +122,7 @@
new /obj/item/flashlight/seclite(src)
new /obj/item/ammo_box/magazine/m35/rubber(src) //monkestation edit: Paco sec
new /obj/item/bodycam_upgrade(src) //monkestation edit: Security Liability Act
new /obj/item/storage/belt/security/blueshield/corpjudo(src) //monkestation edit: Paradise port

/obj/structure/closet/secure_closet/security/sec

Expand Down
1 change: 1 addition & 0 deletions code/modules/vending/security.dm
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
/obj/item/grenade/stingbang = 1,
/obj/item/watertank/pepperspray = 2,
/obj/item/storage/belt/holster/energy = 4,
/obj/item/storage/belt/security/blueshield/corpjudo = 2, //monkestation edit: paradise port
/obj/item/clothing/head/helmet/civilprotection_helmet = 1, //monkestation edit
/obj/item/clothing/suit/armor/civilprotection_vest = 1, //monkestation edit
/obj/item/clothing/head/helmet/guardmanhelmet = 1, //monkestation edit: Guardman
Expand Down
Binary file modified icons/mob/clothing/belt.dmi
Binary file not shown.
Binary file modified icons/mob/inhands/equipment/belt_lefthand.dmi
Binary file not shown.
Binary file modified icons/mob/inhands/equipment/belt_righthand.dmi
Binary file not shown.
Binary file modified icons/obj/clothing/belts.dmi
Binary file not shown.
Binary file added sound/weapons/goldenblast.ogg
Binary file not shown.
Loading
Loading