mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 04:30:44 +01:00
Security modsuit update (#67131)
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user