Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-05

This commit is contained in:
Roxy
2025-11-05 19:43:07 -05:00
461 changed files with 41708 additions and 37517 deletions
+5 -2
View File
@@ -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
+6 -8
View File
@@ -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)
+12
View File
@@ -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"
+11 -11
View File
@@ -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!"))
+19 -27
View File
@@ -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
+2 -2
View File
@@ -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())
+68 -2
View File
@@ -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"
+13 -11
View File
@@ -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)
+8 -7
View File
@@ -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
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+4 -12
View File
@@ -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."