mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 16:47:13 +01:00
Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-05
This commit is contained in:
@@ -1939,8 +1939,11 @@
|
||||
var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant", max_length = MAX_NAME_LEN)
|
||||
if(!after_input_check(user))
|
||||
return TRUE
|
||||
|
||||
var/new_age = tgui_input_number(user, "Choose the ID's age", "Agent card age", AGE_MIN, AGE_MAX, AGE_MIN)
|
||||
var/default_age = AGE_MIN
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
default_age = human_user.age ? clamp(human_user.age, AGE_MIN, AGE_MAX) : AGE_MIN
|
||||
var/new_age = tgui_input_number(user, "Choose the ID's age", "Agent card age", default_age, AGE_MAX, AGE_MIN)
|
||||
if(!after_input_check(user))
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -1380,13 +1380,6 @@
|
||||
greyscale_colors = CIRCUIT_COLOR_SERVICE
|
||||
build_path = /obj/machinery/rnd/production/techfab/department/service
|
||||
|
||||
/obj/item/circuitboard/machine/vendatray
|
||||
name = "Vend-A-Tray"
|
||||
greyscale_colors = CIRCUIT_COLOR_SERVICE
|
||||
build_path = /obj/structure/displaycase/forsale
|
||||
req_components = list(
|
||||
/datum/stock_part/card_reader = 1)
|
||||
|
||||
/obj/item/circuitboard/machine/fishing_portal_generator
|
||||
name = "Fishing Portal Generator"
|
||||
greyscale_colors = CIRCUIT_COLOR_SERVICE
|
||||
|
||||
@@ -30,10 +30,9 @@
|
||||
var/static/list/area/restricted_areas = list(
|
||||
/area/station/command/bridge, /*so Captain's remote isn't totally useless*/
|
||||
/area/station/security, /*so antag RD/HoP/QM/CMO can't easily screw up the brig doors*/
|
||||
/area/station/ai_monitored/command/nuke_storage, /*aka Vault since it's QM's special thing*/
|
||||
/area/station/ai_monitored/turret_protected/ai, // these are areas exclusive to RD
|
||||
/area/station/ai_monitored/turret_protected/ai_upload_foyer, // but sometimes mappers might misconfig
|
||||
/area/station/ai_monitored/turret_protected/ai_upload, // their doors with our several dozen access helpers
|
||||
/area/station/command/vault, /*aka Vault since it's QM's special thing*/
|
||||
/area/station/ai/satellite/chamber, // these are areas exclusive to RD
|
||||
/area/station/ai/upload, // but sometimes mappers might misconfig their doors with our several dozen access helpers
|
||||
)
|
||||
COOLDOWN_DECLARE(shock_cooldown)
|
||||
/// sound played when mode is switched
|
||||
@@ -127,9 +126,8 @@
|
||||
region_access = REGION_RESEARCH
|
||||
owner_trim = /datum/id_trim/job/research_director
|
||||
our_domain = list(
|
||||
/area/station/ai_monitored/turret_protected/ai,
|
||||
/area/station/ai_monitored/turret_protected/ai_upload_foyer,
|
||||
/area/station/ai_monitored/turret_protected/ai_upload,
|
||||
/area/station/ai/satellite/chamber,
|
||||
/area/station/ai/upload,
|
||||
)
|
||||
|
||||
/obj/item/door_remote/head_of_security
|
||||
@@ -147,7 +145,7 @@
|
||||
department = "cargo"
|
||||
region_access = REGION_SUPPLY
|
||||
owner_trim = /datum/id_trim/job/quartermaster
|
||||
our_domain = list( /area/station/ai_monitored/command/nuke_storage )
|
||||
our_domain = list( /area/station/command/vault )
|
||||
|
||||
/obj/item/door_remote/chief_medical_officer
|
||||
name = "medical door remote"
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
/area/station/service = COLOR_SERVICE_LIME,
|
||||
/area/centcom = COLOR_CENTCOM_BLUE, // how?
|
||||
/area/station/command = COLOR_COMMAND_BLUE,
|
||||
/area/station/ai_monitored = COLOR_COMMAND_BLUE,
|
||||
/area/station/ai = COLOR_COMMAND_BLUE,
|
||||
/area/station/medical = COLOR_MEDICAL_BLUE,
|
||||
/area/station/science = COLOR_SCIENCE_PINK,
|
||||
/area/station/engineering = COLOR_ENGINEERING_ORANGE,
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
if(!do_after(user, 3 SECONDS, target = target) || target.get_item_by_slot(ITEM_SLOT_HEAD))
|
||||
return
|
||||
target.visible_message(span_warning("[user] forces and locks [src] onto [target]'s head!"), \
|
||||
span_userdanger("[target] locks [src] onto your head!"), "<i>You hear a click, and then a timer ticking down.</i>")
|
||||
span_userdanger("[user] locks [src] onto your head!"), "<i>You hear a click, and then a timer ticking down.</i>")
|
||||
to_chat(user, span_danger("You force [src] onto [target]'s head and click the padlock shut."))
|
||||
|
||||
user.dropItemToGround(src)
|
||||
|
||||
@@ -211,6 +211,10 @@
|
||||
foodtypes = RAW | MEAT | BUGS
|
||||
blood_decal_type = /obj/effect/decal/cleanable/insectguts
|
||||
|
||||
/obj/item/food/meat/slab/bugmeat/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/raptor_food, health_modifier = 2, color_chances = string_list(list(/datum/raptor_color/green = 2)))
|
||||
|
||||
/obj/item/food/meat/slab/mouse
|
||||
name = "mouse meat"
|
||||
desc = "A slab of mouse meat. Best not eat it raw."
|
||||
@@ -337,6 +341,10 @@
|
||||
tastes = list("meat" = 1)
|
||||
foodtypes = RAW | MEAT | TOXIC
|
||||
|
||||
/obj/item/food/meat/slab/goliath/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/raptor_food, attack_modifier = 0.5, speed_modifier = -0.05, color_chances = string_list(list(/datum/raptor_color/red = 5)))
|
||||
|
||||
/obj/item/food/meat/slab/goliath/burn()
|
||||
visible_message(span_notice("[src] finishes cooking!"))
|
||||
new /obj/item/food/meat/steak/goliath(loc)
|
||||
@@ -569,6 +577,10 @@
|
||||
trash_type = null
|
||||
tastes = list("meat" = 1, "rock" = 1)
|
||||
|
||||
/obj/item/food/meat/steak/goliath/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/raptor_food, attack_modifier = 1, speed_modifier = -0.075, color_chances = string_list(list(/datum/raptor_color/red = 7)))
|
||||
|
||||
/obj/item/food/meat/steak/gondola
|
||||
name = "gondola steak"
|
||||
tastes = list("meat" = 1, "tranquility" = 1)
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
martial_name = "sleeping carp"
|
||||
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
|
||||
greet = span_sciradio("You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
|
||||
directed toward you while in Combat Mode. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. \
|
||||
However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.")
|
||||
directed toward you while in Combat Mode. You are also able to sometimes dodge melee and unarmed attacks against you, but only as long as you dress in appropriate martial arts clothing. Or \
|
||||
carp-themed clothing. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. However, you are also unable to \
|
||||
use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.")
|
||||
icon = 'icons/obj/scrolls.dmi'
|
||||
icon_state = "sleepingcarp"
|
||||
worn_icon_state = "scroll"
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
if(living_mob.stat == DEAD) //They're dead!
|
||||
return
|
||||
living_mob.show_message(span_warning("BANG"), MSG_AUDIBLE)
|
||||
var/distance = max(0, get_dist(get_turf(src), turf))
|
||||
var/distance = get_dist(get_turf(src), turf)
|
||||
var/sweetspot_range = clamp(CEILING(flashbang_range/sweetspot_divider, 1), 0, flashbang_range)
|
||||
|
||||
//Flash
|
||||
@@ -61,19 +61,19 @@
|
||||
living_mob.dropItemToGround(living_mob.get_inactive_held_item())
|
||||
|
||||
//Bang
|
||||
if(!distance || loc == living_mob || loc == living_mob.loc)
|
||||
living_mob.soundbang_act(2, 20 SECONDS, 10, 15)
|
||||
if(!distance)
|
||||
living_mob.soundbang_act(SOUNDBANG_OVERWHELMING, 20 SECONDS, 10, 15)
|
||||
return
|
||||
|
||||
if(distance <= 1) // Adds more stun as to not prime n' pull (#45381)
|
||||
living_mob.soundbang_act(2, 3 SECONDS, 5)
|
||||
living_mob.soundbang_act(SOUNDBANG_STRONG, 3 SECONDS, 5)
|
||||
return
|
||||
|
||||
if(distance <= sweetspot_range)
|
||||
living_mob.soundbang_act(1, max(200 / max(1, distance), 60), rand(0, 5))
|
||||
living_mob.soundbang_act(SOUNDBANG_NORMAL, max(20 SECONDS / max(1, distance), 60), rand(0, 5))
|
||||
return
|
||||
|
||||
if(!living_mob.soundbang_act(1, 0, rand(0, 2)))
|
||||
if(!living_mob.soundbang_act(SOUNDBANG_NORMAL, 0, rand(0, 2)))
|
||||
return
|
||||
|
||||
living_mob.adjust_staggered_up_to(max(200/max(1, distance), 5), 10 SECONDS)
|
||||
@@ -133,17 +133,17 @@
|
||||
if(living_mob.stat == DEAD) //They're dead!
|
||||
return
|
||||
living_mob.show_message(span_warning("POP"), MSG_AUDIBLE)
|
||||
var/distance = max(0, get_dist(get_turf(src), turf))
|
||||
var/distance = get_dist(get_turf(src), turf)
|
||||
//Flash
|
||||
if(living_mob.flash_act(affect_silicon = 1))
|
||||
living_mob.Paralyze(max(10/max(1, distance), 5))
|
||||
living_mob.Knockdown(max(100/max(1, distance), 60))
|
||||
|
||||
//Bang
|
||||
if(!distance || loc == living_mob || loc == living_mob.loc)
|
||||
living_mob.Paralyze(20)
|
||||
living_mob.Knockdown(200)
|
||||
living_mob.soundbang_act(1, 200, 10, 15)
|
||||
if(!distance)
|
||||
living_mob.Paralyze(2 SECONDS)
|
||||
living_mob.Knockdown(20 SECONDS)
|
||||
living_mob.soundbang_act(SOUNDBANG_NORMAL, 200, 10, 15)
|
||||
if(living_mob.apply_damages(brute = 10, burn = 10))
|
||||
to_chat(living_mob, span_userdanger("The blast from \the [src] bruises and burns you!"))
|
||||
|
||||
|
||||
@@ -32,46 +32,38 @@
|
||||
/obj/item/grenade/hypnotic/proc/bang(turf/turf, mob/living/living_mob)
|
||||
if(living_mob.stat == DEAD) //They're dead!
|
||||
return
|
||||
var/distance = max(0, get_dist(get_turf(src), turf))
|
||||
var/distance = get_dist(get_turf(src), turf)
|
||||
|
||||
//Bang
|
||||
var/hypno_sound = FALSE
|
||||
|
||||
//Hearing protection check
|
||||
if(iscarbon(living_mob))
|
||||
var/mob/living/carbon/target = living_mob
|
||||
var/list/reflist = list(1)
|
||||
SEND_SIGNAL(target, COMSIG_CARBON_SOUNDBANG, reflist)
|
||||
var/intensity = reflist[1]
|
||||
var/ear_safety = target.get_ear_protection()
|
||||
var/effect_amount = intensity - ear_safety
|
||||
if(effect_amount > 0)
|
||||
hypno_sound = TRUE
|
||||
if(living_mob.get_ear_protection() < 0)
|
||||
hypno_sound = TRUE
|
||||
|
||||
if(!distance || loc == living_mob || loc == living_mob.loc)
|
||||
living_mob.Paralyze(10)
|
||||
living_mob.Knockdown(100)
|
||||
if(!distance)
|
||||
living_mob.Paralyze(1 SECONDS)
|
||||
living_mob.Knockdown(10 SECONDS)
|
||||
to_chat(living_mob, span_hypnophrase("The sound echoes in your brain..."))
|
||||
living_mob.adjust_hallucinations(150 SECONDS)
|
||||
|
||||
else
|
||||
if(distance <= 1)
|
||||
living_mob.Paralyze(5)
|
||||
living_mob.Knockdown(30)
|
||||
living_mob.Paralyze(0.5 SECONDS)
|
||||
living_mob.Knockdown(3 SECONDS)
|
||||
if(hypno_sound)
|
||||
to_chat(living_mob, span_hypnophrase("The sound echoes in your brain..."))
|
||||
living_mob.adjust_hallucinations(150 SECONDS)
|
||||
|
||||
//Flash
|
||||
if(living_mob.flash_act(affect_silicon = 1))
|
||||
living_mob.Paralyze(max(10/max(1, distance), 5))
|
||||
living_mob.Knockdown(max(100/max(1, distance), 40))
|
||||
if(iscarbon(living_mob))
|
||||
var/mob/living/carbon/target = living_mob
|
||||
if(target.hypnosis_vulnerable()) //The sound causes the necessary conditions unless the target has mindshield or hearing protection
|
||||
target.apply_status_effect(/datum/status_effect/trance, 100, TRUE)
|
||||
else
|
||||
to_chat(target, span_hypnophrase("The light is so pretty..."))
|
||||
target.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS)
|
||||
target.adjust_confusion_up_to(10 SECONDS, 20 SECONDS)
|
||||
target.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS)
|
||||
if(!living_mob.flash_act(affect_silicon = TRUE))
|
||||
return
|
||||
living_mob.Paralyze(max(1 SECONDS / (distance || 1), 0.5 SECONDS))
|
||||
living_mob.Knockdown(max(10 SECONDS / (distance || 1), 4 SECONDS))
|
||||
if(living_mob.hypnosis_vulnerable()) //The sound causes the necessary conditions unless the target has mindshield or hearing protection
|
||||
living_mob.apply_status_effect(/datum/status_effect/trance, 10 SECONDS, TRUE)
|
||||
return
|
||||
to_chat(living_mob, span_hypnophrase("The light is so pretty..."))
|
||||
living_mob.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS)
|
||||
living_mob.adjust_confusion_up_to(10 SECONDS, 20 SECONDS)
|
||||
living_mob.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS)
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/obj/item/implant/kaza_ruk
|
||||
name = "kaza ruk implant"
|
||||
desc = "Teaches you the Tiziran martial arts of Kaza Ruk in 5 short instructional videos beamed directly into your eyeballs."
|
||||
icon = 'icons/obj/scrolls.dmi'
|
||||
icon_state ="scroll2"
|
||||
/// The martial art style this implant teaches.
|
||||
var/datum/martial_art/kaza_ruk/style
|
||||
|
||||
/obj/item/implant/kaza_ruk/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Kaza Ruk Implant<BR>
|
||||
<b>Life:</b> 4 hours after death of host<BR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Teaches even the clumsiest host the arts of Kaza Ruk."}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/kaza_ruk/Initialize(mapload)
|
||||
. = ..()
|
||||
style = new(src)
|
||||
|
||||
/obj/item/implant/kaza_ruk/Destroy()
|
||||
QDEL_NULL(style)
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/kaza_ruk/activate()
|
||||
. = ..()
|
||||
if(isnull(imp_in.mind))
|
||||
return
|
||||
if(style.unlearn(imp_in))
|
||||
return
|
||||
|
||||
style.teach(imp_in)
|
||||
|
||||
/obj/item/implanter/kaza_ruk
|
||||
name = "implanter (kaza ruk)"
|
||||
imp_type = /obj/item/implant/kaza_ruk
|
||||
|
||||
/obj/item/implantcase/kaza_ruk
|
||||
name = "implant case - 'Kaza Ruk'"
|
||||
desc = "A glass case containing an implant that can teach the user the Tiziran martial arts of Kaza Ruk."
|
||||
imp_type = /obj/item/implant/kaza_ruk
|
||||
@@ -1,41 +0,0 @@
|
||||
/obj/item/implant/krav_maga
|
||||
name = "krav maga implant"
|
||||
desc = "Teaches you the arts of Krav Maga in 5 short instructional videos beamed directly into your eyeballs."
|
||||
icon = 'icons/obj/scrolls.dmi'
|
||||
icon_state ="scroll2"
|
||||
/// The martial art style this implant teaches.
|
||||
var/datum/martial_art/krav_maga/style
|
||||
|
||||
/obj/item/implant/krav_maga/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Krav Maga Implant<BR>
|
||||
<b>Life:</b> 4 hours after death of host<BR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Teaches even the clumsiest host the arts of Krav Maga."}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/krav_maga/Initialize(mapload)
|
||||
. = ..()
|
||||
style = new(src)
|
||||
|
||||
/obj/item/implant/krav_maga/Destroy()
|
||||
QDEL_NULL(style)
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/krav_maga/activate()
|
||||
. = ..()
|
||||
if(isnull(imp_in.mind))
|
||||
return
|
||||
if(style.unlearn(imp_in))
|
||||
return
|
||||
|
||||
style.teach(imp_in)
|
||||
|
||||
/obj/item/implanter/krav_maga
|
||||
name = "implanter (krav maga)"
|
||||
imp_type = /obj/item/implant/krav_maga
|
||||
|
||||
/obj/item/implantcase/krav_maga
|
||||
name = "implant case - 'Krav Maga'"
|
||||
desc = "A glass case containing an implant that can teach the user the arts of Krav Maga."
|
||||
imp_type = /obj/item/implant/krav_maga
|
||||
@@ -56,8 +56,8 @@
|
||||
)
|
||||
|
||||
// Give our owner shock touch when entering the digital realm
|
||||
/obj/item/stock_parts/power_store/cell/lead/proc/shockingly_improve_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags)
|
||||
if(external_load_flags & DOMAIN_FORBIDS_ABILITIES)
|
||||
/obj/item/stock_parts/power_store/cell/lead/proc/shockingly_improve_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
|
||||
if(domain_flags & DOMAIN_FORBIDS_ABILITIES)
|
||||
return BITRUNNER_GEAR_LOAD_BLOCKED
|
||||
|
||||
if(!avatar.can_mutate())
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
. = ..()
|
||||
|
||||
register_item_context()
|
||||
add_deep_lore()
|
||||
|
||||
/obj/item/melee/baton/add_weapon_description()
|
||||
AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_baton_notes))
|
||||
@@ -99,6 +100,9 @@
|
||||
readout += "\nIt has a stun armor-piercing capability of [span_warning("[stun_armour_penetration]%")]."
|
||||
return readout.Join("\n")
|
||||
|
||||
/obj/item/melee/baton/proc/add_deep_lore()
|
||||
return
|
||||
|
||||
/// Checks if we can actually USE the baton. Impure
|
||||
/obj/item/melee/baton/proc/can_baton(mob/living/target, mob/living/user)
|
||||
PROTECTED_PROC(TRUE)
|
||||
@@ -420,7 +424,7 @@
|
||||
|
||||
/obj/item/melee/baton/telescopic/contractor_baton
|
||||
name = "contractor baton"
|
||||
desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets."
|
||||
desc = "A high tech telescopic stun baton, as developed by Cybersun Industries. Delivers a precise shock to a target's central nervous system to incapacitate them."
|
||||
icon = 'icons/obj/weapons/baton.dmi'
|
||||
icon_state = "contractor_baton"
|
||||
worn_icon_state = "contractor_baton"
|
||||
@@ -453,7 +457,7 @@
|
||||
|
||||
/obj/item/melee/baton/security
|
||||
name = "stun baton"
|
||||
desc = "A stun baton for incapacitating people with."
|
||||
desc = "The Secure Apprehension Device, as developed by Nanotrasen. Delivers a precise shock to a target's central nervous system to incapacitate them."
|
||||
desc_controls = "Left click to stun, right click to harm."
|
||||
icon = 'icons/obj/weapons/baton.dmi'
|
||||
icon_state = "stunbaton"
|
||||
@@ -792,6 +796,9 @@
|
||||
unique_reskin_changes_inhand = TRUE
|
||||
unique_reskin_changes_base_icon_state = TRUE
|
||||
|
||||
/obj/item/melee/baton/security/stunsword/loaded/add_deep_lore()
|
||||
return
|
||||
|
||||
/obj/item/melee/baton/security/stunsword/loaded
|
||||
preload_cell_type = /obj/item/stock_parts/power_store/cell/bluespace // 40% stun_armour_penetration
|
||||
|
||||
@@ -825,6 +832,9 @@
|
||||
. = ..()
|
||||
sparkler = new (src)
|
||||
|
||||
/obj/item/melee/baton/security/cattleprod/add_deep_lore()
|
||||
return
|
||||
|
||||
/obj/item/melee/baton/security/cattleprod/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)//handles sticking a crystal onto a stunprod to make an improved cattleprod
|
||||
if(!istype(item, /obj/item/stack))
|
||||
return ..()
|
||||
@@ -888,6 +898,9 @@
|
||||
. = ..()
|
||||
AddComponent(/datum/component/boomerang, throw_range + 2, TRUE)
|
||||
|
||||
/obj/item/melee/baton/security/boomerang/add_deep_lore()
|
||||
return
|
||||
|
||||
/obj/item/melee/baton/security/boomerang/loaded //Same as above, comes with a cell.
|
||||
preload_cell_type = /obj/item/stock_parts/power_store/cell/high
|
||||
|
||||
@@ -995,3 +1008,56 @@
|
||||
melee_attack_chain(owner, attacker, LEFT_CLICK)
|
||||
|
||||
return ..()
|
||||
|
||||
// Deep Lore //
|
||||
|
||||
/obj/item/melee/baton/security/add_deep_lore()
|
||||
AddElement(/datum/element/examine_lore, \
|
||||
lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \
|
||||
lore = "The Secure Apprehension Device (sometimes referred to as the SAD in the officer training manuals) is \
|
||||
the unholy union of a mace and a cattleprod. This nonlethal device was designed to put a stop to ruffians, \
|
||||
scoundrels, ne'er-do-wells and criminals wherever they may rear their ugly heads.<br>\
|
||||
<br>\
|
||||
A symbol of Nanotrasen security forces, the stun baton is the primary tool officers employ against the \
|
||||
unlawful scum and villainy of the Spinward and abroad. Trained to 'baton first, interrogate later', \
|
||||
Nanotrasen security has long since earned itself a mixed reputation. Able to rapidly shut down the \
|
||||
central nervous system of a criminal with only a few direct applications of the conductive striking head \
|
||||
of the device, few would-be troublemakers want to find themselves on the wrong end of an officer brandishing \
|
||||
this baton.<br>\
|
||||
<br>\
|
||||
TerraGov law enforcement has avoided the adoption of stun batons due to various ethical dilemmas posed by \
|
||||
their usage, largely because of the longterm physical and mental ramifications of being struck by a human cattleprod. \
|
||||
Citizens' rights advocacy groups protest against the proliferation of stun batons as a policing tool, \
|
||||
arguing that they are 'inhumane' and 'authoritarian'. Nanotrasen, on the other hand, has had no such qualms \
|
||||
when deploying stun batons as a compliance measure across all of their existing stations and facilities against \
|
||||
unruly members of staff." \
|
||||
)
|
||||
|
||||
// Contractor Baton
|
||||
|
||||
/obj/item/melee/baton/telescopic/contractor_baton/add_deep_lore()
|
||||
AddElement(/datum/element/examine_lore, \
|
||||
lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \
|
||||
lore = "The Contract Acquisition Device (sometimes referred to as the CAD in encrypted correspondence) is \
|
||||
one of the more frequently encountered examples of Cybersun Industries weaponry. Extremely similar to Nanotrasen's \
|
||||
own Secure Apprehension Device (also simply known as the stun baton), the contractor baton is able to induce \
|
||||
CNS disruption in a target to render them helpless. It is also capable of devastating blunt force trauma if \
|
||||
used as a bludgeon. The contractor baton is also capable of telescopic deployment, allowing for discretion while \
|
||||
making an approach towards a target.<br>\
|
||||
<br>\
|
||||
The contractor baton is famously associated with contractors, elite Cybersun field agents. While the standard \
|
||||
agent would often be tasked with sabotage, terrorism, murder or theft, contractors have the critical task of \
|
||||
kidnapping high value personnel. Anyone with the potential to possess classified or sensitive data about Nanotrasen \
|
||||
security systems and devices could be a target for Cybersun. <br>\
|
||||
<br>\
|
||||
Extracting this information is most easily performed on living subjects. As such, the contractor baton was designed \
|
||||
with nonlethal incapacitation in mind. However, Cybersun Industries has long since found workarounds for extracting \
|
||||
data from the recently deceased, should the contractor find themselves with only a corpse left to send back. Death \
|
||||
may not spare you from the machinations of Cybersun Industries if they deem you a valuable asset towards their goals.<br>\
|
||||
<br>\
|
||||
Nanotrasen utilizes a number of countermeasures to contractor insurgencies, such as employing selective memory wiping \
|
||||
or falsified memory injection, the establishment of 'dummy' command staff through the artificial acceleration \
|
||||
of otherwise incompetent but useful crewmembers (whose incompetence will often result in an acceptable degree \
|
||||
of operational disruption), which provides convenient scapegoats in the event of a security breach as well as \
|
||||
frequent staff turnover and reassignment." \
|
||||
)
|
||||
|
||||
@@ -66,7 +66,8 @@
|
||||
/atom/movable/screen/alert/status_effect/commanded
|
||||
name = "Commanded"
|
||||
desc = "You are inspired to do things faster!"
|
||||
icon_state = "commanded"
|
||||
use_user_hud_icon = TRUE
|
||||
overlay_state = "commanded"
|
||||
|
||||
/obj/item/melee/chainofcommand/tailwhip
|
||||
name = "liz o' nine tails"
|
||||
|
||||
@@ -373,7 +373,7 @@
|
||||
span_danger("The siren pierces your hearing!"),
|
||||
)
|
||||
for(var/mob/living/carbon/carbon in get_hearers_in_view(9, user))
|
||||
if(carbon.get_ear_protection())
|
||||
if(carbon.get_ear_protection() > 0)
|
||||
continue
|
||||
carbon.adjust_confusion(6 SECONDS)
|
||||
|
||||
@@ -386,18 +386,20 @@
|
||||
to_chat(robot_user.connected_ai, "<br>[span_notice("NOTICE - Peacekeeping 'HARM ALARM' used by: [user]")]<br>")
|
||||
else
|
||||
user.audible_message("<font color='red' size='7'>BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZT</font>")
|
||||
for(var/mob/living/carbon/carbon in get_hearers_in_view(9, user))
|
||||
var/bang_effect = carbon.soundbang_act(2, 0, 0, 5)
|
||||
for(var/mob/living/living in get_hearers_in_view(9, user))
|
||||
var/bang_effect = living.soundbang_act(SOUNDBANG_STRONG, 0, 0, 5)
|
||||
switch(bang_effect)
|
||||
if(0)
|
||||
continue
|
||||
if(1)
|
||||
carbon.adjust_confusion(5 SECONDS)
|
||||
carbon.adjust_stutter(20 SECONDS)
|
||||
carbon.adjust_jitter(20 SECONDS)
|
||||
if(2)
|
||||
carbon.Paralyze(40)
|
||||
carbon.adjust_confusion(10 SECONDS)
|
||||
carbon.adjust_stutter(30 SECONDS)
|
||||
carbon.adjust_jitter(50 SECONDS)
|
||||
living.adjust_confusion(5 SECONDS)
|
||||
living.adjust_stutter(20 SECONDS)
|
||||
living.adjust_jitter(20 SECONDS)
|
||||
else
|
||||
living.Paralyze(4 SECONDS)
|
||||
living.adjust_confusion(10 SECONDS)
|
||||
living.adjust_stutter(30 SECONDS)
|
||||
living.adjust_jitter(50 SECONDS)
|
||||
playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3)
|
||||
COOLDOWN_START(src, alarm_cooldown, HARM_ALARM_NO_SAFETY_COOLDOWN)
|
||||
user.log_message("used an emagged Cyborg Harm Alarm", LOG_ATTACK)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define BATON_BASH_COOLDOWN (3 SECONDS)
|
||||
#define WEAPON_BASH_COOLDOWN (3 SECONDS)
|
||||
|
||||
/obj/item/shield
|
||||
name = "shield"
|
||||
@@ -26,7 +26,7 @@
|
||||
/// sound the shield makes when it breaks
|
||||
var/shield_break_sound = 'sound/effects/bang.ogg'
|
||||
/// baton bash cooldown
|
||||
COOLDOWN_DECLARE(baton_bash)
|
||||
COOLDOWN_DECLARE(weapon_bash)
|
||||
/// is shield bashable?
|
||||
var/is_bashable = TRUE
|
||||
/// sound when a shield is bashed
|
||||
@@ -75,13 +75,14 @@
|
||||
. = ..()
|
||||
if(. & ITEM_INTERACT_ANY_BLOCKER)
|
||||
return .
|
||||
if(!istype(tool, /obj/item/melee/baton) || !is_bashable)
|
||||
if(!istype(tool, /obj/item/melee) || !is_bashable)
|
||||
return .
|
||||
if(!COOLDOWN_FINISHED(src, baton_bash))
|
||||
if(!COOLDOWN_FINISHED(src, weapon_bash))
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
user.visible_message(span_warning("[user] bashes [src] with [tool]!"))
|
||||
playsound(src, shield_bash_sound, 50, TRUE)
|
||||
COOLDOWN_START(src, baton_bash, BATON_BASH_COOLDOWN)
|
||||
user.manual_emote("bashes [src] with [tool]!")
|
||||
COOLDOWN_START(src, weapon_bash, WEAPON_BASH_COOLDOWN)
|
||||
user.Shake(3, 3, 0.5 SECONDS)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
/obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
@@ -484,4 +485,4 @@
|
||||
armor_type = /datum/armor/item_shield/improvised
|
||||
block_sound = 'sound/items/trayhit/trayhit2.ogg'
|
||||
|
||||
#undef BATON_BASH_COOLDOWN
|
||||
#undef WEAPON_BASH_COOLDOWN
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
. = ..()
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
AddElement(/datum/element/raptor_food, ability_modifier = 0.05, attack_modifier = 0.5, color_chances = string_list(list(/datum/raptor_color/black = 1)))
|
||||
|
||||
/obj/item/stack/ore/bluespace_crystal/get_part_rating()
|
||||
return 1
|
||||
|
||||
@@ -566,7 +566,7 @@
|
||||
return
|
||||
|
||||
var/obj/item/ammo_casing/rebar/ammo_to_load = contents[1]
|
||||
held_crossbow.attackby(ammo_to_load, user)
|
||||
held_crossbow.item_interaction(user, ammo_to_load)
|
||||
|
||||
/obj/item/storage/bag/quiver
|
||||
name = "quiver"
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
new /obj/item/clothing/under/rank/security/warden/formal(src)
|
||||
new /obj/item/clothing/suit/jacket/warden/blue(src) //SKYRAT ADDITION - FORMAL COAT
|
||||
new /obj/item/clothing/under/rank/security/warden/skirt(src)
|
||||
new /obj/item/clothing/gloves/krav_maga/sec(src)
|
||||
new /obj/item/clothing/gloves/kaza_ruk/sec(src)
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
|
||||
|
||||
@@ -301,7 +301,7 @@
|
||||
new /obj/item/clothing/head/helmet/marine/pmc(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
new /obj/item/clothing/glasses/night(src) // 3~ TC
|
||||
new /obj/item/clothing/gloves/krav_maga/combatglovesplus(src) //5TC
|
||||
new /obj/item/clothing/gloves/kaza_ruk/combatglovesplus(src) //5TC
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/storage/belt/military/assault/fisher(src) //items in this belt easily costs 18 TC
|
||||
|
||||
@@ -751,7 +751,7 @@
|
||||
new spess_suit(src) // Above allows me to get the helmet from a variable on the object
|
||||
var/obj/item/clothing/head/helmet/space/syndicate/spess_helmet = GLOB.syndicate_space_suits_to_helmets[spess_suit]
|
||||
new spess_helmet(src) // 4 TC for the space gear
|
||||
new /obj/item/tank/jetpack/oxygen/harness(src) // They kinda need this to fly to the cruiser.
|
||||
new /obj/item/tank/jetpack/harness(src) // They kinda need this to fly to the cruiser.
|
||||
// Tacticool gear
|
||||
new /obj/item/clothing/shoes/combat(src)
|
||||
new /obj/item/clothing/under/syndicate(src)
|
||||
@@ -892,6 +892,12 @@
|
||||
new /obj/item/slimepotion/slime/sentience/nuclear/dangerous_horse(src)
|
||||
new /obj/item/food/grown/apple(src)
|
||||
|
||||
/obj/item/storage/box/syndicate/sleeping_carp/PopulateContents()
|
||||
new /obj/item/book/granter/martial/carp(src)
|
||||
new /obj/item/clothing/head/costume/snakeeater(src)
|
||||
new /obj/item/clothing/under/costume/gi(src)
|
||||
new /obj/item/clothing/shoes/sandal(src)
|
||||
|
||||
#undef KIT_RECON
|
||||
#undef KIT_BLOODY_SPAI
|
||||
#undef KIT_STEALTHY
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/tank/jetpack
|
||||
name = "jetpack (empty)"
|
||||
name = "jetpack (oxygen)"
|
||||
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
inhand_icon_state = "jetpack"
|
||||
@@ -207,13 +207,7 @@
|
||||
icon_state = "jetpack-void"
|
||||
inhand_icon_state = "jetpack-void"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen
|
||||
name = "jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
inhand_icon_state = "jetpack"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/harness
|
||||
/obj/item/tank/jetpack/harness
|
||||
name = "jet harness (oxygen)"
|
||||
desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
|
||||
icon_state = "jetpack-mini"
|
||||
@@ -222,7 +216,7 @@
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/captain
|
||||
/obj/item/tank/jetpack/captain
|
||||
name = "captain's jetpack"
|
||||
desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
|
||||
icon_state = "jetpack-captain"
|
||||
@@ -234,14 +228,12 @@
|
||||
drift_force = 2 NEWTONS
|
||||
stabilizer_force = 2 NEWTONS
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/security
|
||||
/obj/item/tank/jetpack/security
|
||||
name = "security jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
|
||||
icon_state = "jetpack-sec"
|
||||
inhand_icon_state = "jetpack-sec"
|
||||
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/carbondioxide
|
||||
name = "jetpack (carbon dioxide)"
|
||||
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
|
||||
|
||||
Reference in New Issue
Block a user