Security modsuit update (#67131)

This commit is contained in:
Fikou
2022-05-26 12:24:06 -07:00
committed by GitHub
parent 721bd9d5b6
commit ccbd002c61
20 changed files with 369 additions and 153 deletions
+1 -4
View File
@@ -615,8 +615,7 @@
leading to an overall lower capacity for modules."
default_skin = "security"
armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 25, BIO = 100, FIRE = 75, ACID = 75, WOUND = 15)
siemens_coefficient = 0
complexity_max = DEFAULT_MAX_COMPLEXITY - 5
complexity_max = DEFAULT_MAX_COMPLEXITY - 3
slowdown_inactive = 1
slowdown_active = 0.5
allowed_suit_storage = list(
@@ -671,8 +670,6 @@
armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 40, BIO = 100, FIRE = 100, ACID = 95, WOUND = 15)
resistance_flags = FIRE_PROOF
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
siemens_coefficient = 0
complexity_max = DEFAULT_MAX_COMPLEXITY - 5
slowdown_inactive = 0.75
slowdown_active = 0.25
allowed_suit_storage = list(
+4
View File
@@ -109,6 +109,8 @@
/obj/item/mod/module/magnetic_harness,
/obj/item/mod/module/flashlight,
/obj/item/mod/module/pepper_shoulders,
/obj/item/mod/module/criminalcapture,
/obj/item/mod/module/dispenser/mirage,
)
/obj/item/mod/control/pre_equipped/safeguard
@@ -119,6 +121,8 @@
/obj/item/mod/module/magnetic_harness,
/obj/item/mod/module/flashlight,
/obj/item/mod/module/jetpack,
/obj/item/mod/module/megaphone,
/obj/item/mod/module/projectile_dampener,
/obj/item/mod/module/pepper_shoulders,
)
@@ -317,6 +317,7 @@
balloon_alert(mod.wearer, "[dispensed] dispensed")
playsound(src, 'sound/machines/click.ogg', 100, TRUE)
drain_power(use_power_cost)
return dispensed
///Longfall - Nullifies fall damage, removing charge instead.
/obj/item/mod/module/longfall
@@ -219,3 +219,196 @@
/obj/item/mod/module/holster/Destroy()
QDEL_NULL(holstered)
return ..()
///Megaphone - Lets you speak loud.
/obj/item/mod/module/megaphone
name = "MOD megaphone module"
desc = "A microchip megaphone linked to a MODsuit, for very important purposes, like: loudness."
icon_state = "megaphone"
module_type = MODULE_TOGGLE
complexity = 1
use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
incompatible_modules = list(/obj/item/mod/module/megaphone)
cooldown_time = 0.5 SECONDS
/// List of spans we add to the speaker.
var/list/voicespan = list(SPAN_COMMAND)
/obj/item/mod/module/megaphone/on_activation()
. = ..()
if(!.)
return
RegisterSignal(mod.wearer, COMSIG_MOB_SAY, .proc/handle_speech)
/obj/item/mod/module/megaphone/on_deactivation(display_message = TRUE, deleting = FALSE)
. = ..()
if(!.)
return
UnregisterSignal(mod.wearer, COMSIG_MOB_SAY)
/obj/item/mod/module/megaphone/proc/handle_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
speech_args[SPEECH_SPANS] |= voicespan
drain_power(use_power_cost)
///Criminal Capture - Lets you put people in transport bags.
/obj/item/mod/module/criminalcapture
name = "MOD criminal capture module"
desc = "The private security that had orders to take in people dead were quite \
happy with their space-proofed suit, but for those who wanted to bring back \
whomever their targets were still breathing needed a way to \"share\" the \
space-proofing. And thus: criminal capture! Creates a prisoner transport bag \
around the apprehended that has breathable atmos and even stabilizes critical \
conditions."
icon_state = "criminalcapture"
module_type = MODULE_ACTIVE
complexity = 2
use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
incompatible_modules = list(/obj/item/mod/module/criminalcapture)
cooldown_time = 0.5 SECONDS
/// Max bag capacity.
var/max_capacity = 3
/// Time to capture a prisoner.
var/capture_time = 1 SECONDS
/// Time to pack a bodybag up.
var/packup_time = 0.5 SECONDS
/// List of our capture bags.
var/list/criminal_capture_bags = list()
/obj/item/mod/module/criminalcapture/Initialize(mapload)
. = ..()
for(var/i in 1 to max_capacity)
criminal_capture_bags += new /obj/structure/closet/body_bag/environmental/prisoner/pressurized(src)
/obj/item/mod/module/criminalcapture/on_select_use(atom/target)
. = ..()
if(!.)
return
if(!mod.wearer.Adjacent(target))
return
if(isliving(target))
var/mob/living/living_target = target
var/turf/target_turf = get_turf(living_target)
playsound(src, 'sound/items/zip.ogg', 25, TRUE)
if(!do_after(mod.wearer, capture_time, target = living_target))
balloon_alert(mod.wearer, "interrupted!")
return
var/obj/structure/closet/body_bag/environmental/prisoner/dropped_bag = pop(criminal_capture_bags)
dropped_bag.forceMove(target_turf)
dropped_bag.close()
living_target.forceMove(dropped_bag)
else if(istype(target, /obj/structure/closet/body_bag/environmental/prisoner) || istype(target, /obj/item/bodybag/environmental/prisoner))
var/obj/item/bodybag/environmental/prisoner/bag = target
if(criminal_capture_bags.len >= max_capacity)
balloon_alert(mod.wearer, "bag limit reached!")
return
playsound(src, 'sound/items/zip.ogg', 25, TRUE)
if(!do_after(mod.wearer, packup_time, target = bag))
balloon_alert(mod.wearer, "interrupted!")
return
if(criminal_capture_bags.len >= max_capacity)
balloon_alert(mod.wearer, "bag limit reached!")
return
if(locate(/mob/living) in bag)
balloon_alert(mod.wearer, "living creatures inside!")
return
if(istype(bag, /obj/item/bodybag/environmental/prisoner))
bag = bag.deploy_bodybag(mod.wearer, get_turf(bag))
var/obj/structure/closet/body_bag/environmental/prisoner/structure_bag = bag
if(!structure_bag.opened)
structure_bag.open(mod.wearer, force = TRUE)
bag.forceMove(src)
criminal_capture_bags += bag
balloon_alert(mod.wearer, "bag stored")
else
balloon_alert(mod.wearer, "invalid target!")
///Mirage grenade dispenser - Dispenses grenades that copy the user's appearance.
/obj/item/mod/module/dispenser/mirage
name = "MOD mirage grenade dispenser module"
desc = "This module can create mirage grenades at the user's liking. These grenades create holographic copies of the user."
icon_state = "mirage_grenade"
cooldown_time = 20 SECONDS
overlay_state_inactive = "module_mirage_grenade"
dispense_type = /obj/item/grenade/mirage
/obj/item/mod/module/dispenser/mirage/on_use()
. = ..()
if(!.)
return
var/obj/item/grenade/mirage/grenade = .
grenade.arm_grenade(mod.wearer)
/obj/item/grenade/mirage
name = "mirage grenade"
desc = "A special device that, when activated, produces a holographic copy of the user."
icon_state = "mirage"
inhand_icon_state = "flashbang"
det_time = 3 SECONDS
/// Mob that threw the grenade.
var/mob/living/thrower
/obj/item/grenade/mirage/arm_grenade(mob/user, delayoverride, msg, volume)
. = ..()
thrower = user
/obj/item/grenade/mirage/detonate(mob/living/lanced_by)
. = ..()
do_sparks(rand(3, 6), FALSE, src)
if(thrower)
var/mob/living/simple_animal/hostile/illusion/mirage/mirage = new(get_turf(src))
mirage.Copy_Parent(thrower, 15 SECONDS)
qdel(src)
///Projectile Dampener - Weakens projectiles in range.
/obj/item/mod/module/projectile_dampener
name = "MOD projectile dampener module"
desc = "Using technology from peaceborgs, this module weakens all projectiles in nearby range."
icon_state = "projectile_dampener"
module_type = MODULE_TOGGLE
complexity = 3
active_power_cost = DEFAULT_CHARGE_DRAIN
incompatible_modules = list(/obj/item/mod/module/projectile_dampener)
cooldown_time = 1.5 SECONDS
/// Radius of the dampening field.
var/field_radius = 2
/// Damage multiplier on projectiles.
var/damage_multiplier = 0.75
/// Speed multiplier on projectiles, higher means slower.
var/speed_multiplier = 2.5
/// List of all tracked projectiles.
var/list/tracked_projectiles = list()
/// Effect image on projectiles.
var/image/projectile_effect
/// The dampening field
var/datum/proximity_monitor/advanced/projectile_dampener/dampening_field
/obj/item/mod/module/projectile_dampener/Initialize(mapload)
. = ..()
projectile_effect = image('icons/effects/fields.dmi', "projectile_dampen_effect")
/obj/item/mod/module/projectile_dampener/on_activation()
. = ..()
if(!.)
return
if(istype(dampening_field))
QDEL_NULL(dampening_field)
dampening_field = new(mod.wearer, field_radius, TRUE, src)
RegisterSignal(dampening_field, COMSIG_DAMPENER_CAPTURE, .proc/dampen_projectile)
RegisterSignal(dampening_field, COMSIG_DAMPENER_RELEASE, .proc/release_projectile)
/obj/item/mod/module/projectile_dampener/on_deactivation(display_message, deleting = FALSE)
. = ..()
if(!.)
return
QDEL_NULL(dampening_field)
/obj/item/mod/module/projectile_dampener/proc/dampen_projectile(datum/source, obj/projectile/projectile)
projectile.damage *= damage_multiplier
projectile.speed *= speed_multiplier
projectile.add_overlay(projectile_effect)
/obj/item/mod/module/projectile_dampener/proc/release_projectile(datum/source, obj/projectile/projectile)
projectile.damage /= damage_multiplier
projectile.speed /= speed_multiplier
projectile.cut_overlay(projectile_effect)