158 lines
6.3 KiB
Plaintext
158 lines
6.3 KiB
Plaintext
//Maint modules for MODsuits
|
|
|
|
///Springlock Mechanism - allows your modsuit to activate faster, but reagents are very dangerous.
|
|
/obj/item/mod/module/springlock
|
|
name = "MOD springlock module"
|
|
desc = "A module that spans the entire size of the MOD unit, sitting under the outer shell. \
|
|
This mechanical exoskeleton pushes out of the way when the user enters and it helps in booting \
|
|
up, but was taken out of modern suits because of the springlock's tendency to \"snap\" back \
|
|
into place when exposed to humidity. You know what it's like to have an entire exoskeleton enter you?"
|
|
icon_state = "springlock"
|
|
complexity = 3 // it is inside every part of your suit, so
|
|
incompatible_modules = list(/obj/item/mod/module/springlock)
|
|
|
|
/obj/item/mod/module/springlock/on_install()
|
|
mod.activation_step_time *= 0.5
|
|
|
|
/obj/item/mod/module/springlock/on_uninstall(deleting = FALSE)
|
|
mod.activation_step_time *= 2
|
|
|
|
/obj/item/mod/module/springlock/on_suit_activation()
|
|
RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, .proc/on_wearer_exposed)
|
|
|
|
/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE)
|
|
UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS)
|
|
|
|
///Signal fired when wearer is exposed to reagents
|
|
/obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message, from_gas)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!reagents.len)
|
|
return
|
|
if(!(methods & (VAPOR|PATCH|TOUCH)))
|
|
return //remove non-touch reagent exposure
|
|
to_chat(mod.wearer, span_danger("[src] makes an ominous click sound..."))
|
|
playsound(src, 'sound/items/modsuit/springlock.ogg', 75, TRUE)
|
|
addtimer(CALLBACK(src, .proc/snap_shut), rand(3 SECONDS, 5 SECONDS))
|
|
RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_activate_spring_block)
|
|
|
|
///Signal fired when wearer attempts to activate/deactivate suits
|
|
/obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user)
|
|
SIGNAL_HANDLER
|
|
|
|
balloon_alert(user, "springlocks aren't responding...?")
|
|
return MOD_CANCEL_ACTIVATE
|
|
|
|
///Delayed death proc of the suit after the wearer is exposed to reagents
|
|
/obj/item/mod/module/springlock/proc/snap_shut()
|
|
UnregisterSignal(mod, COMSIG_MOD_ACTIVATE)
|
|
if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc
|
|
return
|
|
mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*"))
|
|
mod.wearer.emote("scream")
|
|
playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5)
|
|
playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5)
|
|
mod.wearer.client?.give_award(/datum/award/achievement/misc/springlock, mod.wearer)
|
|
mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE, sharpness = SHARP_POINTY) //boggers, bogchamp, etc
|
|
if(!HAS_TRAIT(mod.wearer, TRAIT_NODEATH))
|
|
mod.wearer.death() //just in case, for some reason, they're still alive
|
|
flash_color(mod.wearer, flash_color = "#FF0000", flash_time = 10 SECONDS)
|
|
|
|
///Rave Visor - Pointless
|
|
|
|
///Tanner - Maybe another time
|
|
|
|
///Balloon Blower - Blows a balloon.
|
|
/obj/item/mod/module/balloon
|
|
name = "MOD balloon blower module"
|
|
desc = "A strange module invented years ago by some ingenious mimes. It blows balloons."
|
|
icon_state = "bloon"
|
|
module_type = MODULE_USABLE
|
|
complexity = 1
|
|
use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
|
|
incompatible_modules = list(/obj/item/mod/module/balloon)
|
|
cooldown_time = 15 SECONDS
|
|
|
|
/obj/item/mod/module/balloon/on_use()
|
|
. = ..()
|
|
if(!.)
|
|
return
|
|
if(!do_after(mod.wearer, 10 SECONDS, target = mod))
|
|
return FALSE
|
|
mod.wearer.adjustOxyLoss(20)
|
|
playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE)
|
|
var/obj/item/toy/balloon/balloon = new(get_turf(src))
|
|
mod.wearer.put_in_hands(balloon)
|
|
drain_power(use_power_cost)
|
|
|
|
///Paper Dispenser - Dispenses (sometimes burning) paper sheets.
|
|
/obj/item/mod/module/paper_dispenser
|
|
name = "MOD paper dispenser module"
|
|
desc = "A simple module designed by the bureaucrats of Torch Bay. \
|
|
It dispenses 'warm, clean, and crisp sheets of paper' onto a nearby table. Usually."
|
|
icon_state = "paper_maker"
|
|
module_type = MODULE_USABLE
|
|
complexity = 1
|
|
use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
|
|
incompatible_modules = list(/obj/item/mod/module/paper_dispenser)
|
|
cooldown_time = 5 SECONDS
|
|
/// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire.
|
|
var/num_sheets_dispensed = 0
|
|
|
|
/obj/item/mod/module/paper_dispenser/on_use()
|
|
. = ..()
|
|
if(!.)
|
|
return
|
|
if(!do_after(mod.wearer, 1 SECONDS, target = mod))
|
|
return FALSE
|
|
|
|
var/obj/item/paper/crisp_paper = new(get_turf(src))
|
|
crisp_paper.desc = "It's crisp and warm to the touch. Must be fresh."
|
|
|
|
var/obj/structure/table/nearby_table = locate() in range(1, mod.wearer)
|
|
playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE)
|
|
balloon_alert(mod.wearer, "dispensed paper[nearby_table ? " onto table":""]")
|
|
|
|
mod.wearer.put_in_hands(crisp_paper)
|
|
if(nearby_table)
|
|
mod.wearer.transferItemToLoc(crisp_paper, nearby_table.drop_location(), silent = FALSE)
|
|
|
|
// Up to a 30% chance to set the sheet on fire, +2% per sheet made
|
|
if(prob(min(num_sheets_dispensed * 2, 30)))
|
|
if(crisp_paper in mod.wearer.held_items)
|
|
mod.wearer.dropItemToGround(crisp_paper, force = TRUE)
|
|
crisp_paper.balloon_alert(mod.wearer, "PC LOAD LETTER!")
|
|
crisp_paper.visible_message(span_warning("[crisp_paper] bursts into flames, it's too crisp!"))
|
|
crisp_paper.fire_act(1000, 100)
|
|
|
|
drain_power(use_power_cost)
|
|
num_sheets_dispensed++
|
|
|
|
|
|
///Stamper - Extends a stamp that can switch between accept/deny modes.
|
|
/obj/item/mod/module/stamp
|
|
name = "MOD stamper module"
|
|
desc = "A module installed into the wrist of the suit, this functions as a high-power stamp, \
|
|
able to switch between accept and deny modes."
|
|
icon_state = "stamp"
|
|
module_type = MODULE_ACTIVE
|
|
complexity = 1
|
|
active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
|
|
device = /obj/item/stamp/mod
|
|
incompatible_modules = list(/obj/item/mod/module/stamp)
|
|
cooldown_time = 0.5 SECONDS
|
|
|
|
/obj/item/stamp/mod
|
|
name = "MOD electronic stamp"
|
|
desc = "A high-power stamp, able to switch between accept and deny mode when used."
|
|
|
|
/obj/item/stamp/mod/attack_self(mob/user, modifiers)
|
|
. = ..()
|
|
if(icon_state == "stamp-ok")
|
|
icon_state = "stamp-deny"
|
|
else
|
|
icon_state = "stamp-ok"
|
|
balloon_alert(user, "switched mode")
|
|
|
|
///Atrocinator - Perhaps another time
|