Files
kiwistation/code/datums/wires/explosive.dm
T
Ryll Ryll 1b9777df1f Changes grenade proc names to be more clear (#55181)
Grenades have, for the longest time, used the proc name preprime() to refer to arming a timed grenade so that it will boom in a few seconds, and prime() to refer to the grenade actually going boom (or releasing foam or anything else grenades do when they go off). This was very confusing, so now these two procs are called arm_grenade() and detonate().
2020-11-28 07:44:28 -03:00

122 lines
3.5 KiB
Plaintext

/datum/wires/explosive
var/duds_number = 2 // All "dud" wires cause an explosion when cut or pulsed
proper_name = "Explosive Device"
randomize = TRUE // Prevents wires from showing up on blueprints
/datum/wires/explosive/New(atom/holder)
add_duds(duds_number) // Duds also explode here.
..()
/datum/wires/explosive/on_pulse(index)
explode()
/datum/wires/explosive/on_cut(index, mend)
explode()
/datum/wires/explosive/proc/explode()
return
/datum/wires/explosive/chem_grenade
duds_number = 1
holder_type = /obj/item/grenade/chem_grenade
var/fingerprint
/datum/wires/explosive/chem_grenade/interactable(mob/user)
var/obj/item/grenade/chem_grenade/G = holder
if(G.stage == GRENADE_WIRED)
return TRUE
/datum/wires/explosive/chem_grenade/attach_assembly(color, obj/item/assembly/S)
if(istype(S,/obj/item/assembly/timer))
var/obj/item/grenade/chem_grenade/G = holder
var/obj/item/assembly/timer/T = S
G.det_time = T.saved_time*10
else if(istype(S,/obj/item/assembly/prox_sensor))
var/obj/item/grenade/chem_grenade/G = holder
G.landminemode = S
S.proximity_monitor.wire = TRUE
fingerprint = S.fingerprintslast
return ..()
/datum/wires/explosive/chem_grenade/explode()
var/obj/item/grenade/chem_grenade/G = holder
var/obj/item/assembly/assembly = get_attached(get_wire(1))
message_admins("\An [assembly] has pulsed a grenade, which was installed by [fingerprint].")
log_game("\An [assembly] has pulsed a grenade, which was installed by [fingerprint].")
var/mob/M = get_mob_by_ckey(fingerprint)
var/turf/T = get_turf(M)
G.log_grenade(M, T) //Used in arm_grenade() too but this one convays where the mob who triggered the bomb is
G.arm_grenade() //The one here conveys where the bomb was when it went boom
/datum/wires/explosive/chem_grenade/detach_assembly(color)
var/obj/item/assembly/S = get_attached(color)
if(S && istype(S))
assemblies -= color
S.connected = null
S.forceMove(holder.drop_location())
var/obj/item/grenade/chem_grenade/G = holder
G.landminemode = null
return S
/datum/wires/explosive/c4 // Also includes X4
holder_type = /obj/item/grenade/c4
/datum/wires/explosive/c4/interactable(mob/user) // No need to unscrew wire panels on plastic explosives
return TRUE
/datum/wires/explosive/c4/explode()
var/obj/item/grenade/c4/P = holder
P.detonate()
/datum/wires/explosive/pizza
holder_type = /obj/item/pizzabox
/datum/wires/explosive/pizza/New(atom/holder)
wires = list(
WIRE_DISARM
)
add_duds(3) // Duds also explode here.
..()
/datum/wires/explosive/pizza/interactable(mob/user)
var/obj/item/pizzabox/P = holder
if(P.open && P.bomb)
return TRUE
/datum/wires/explosive/pizza/get_status()
var/obj/item/pizzabox/P = holder
var/list/status = list()
status += "The red light is [P.bomb_active ? "on" : "off"]."
status += "The green light is [P.bomb_defused ? "on": "off"]."
return status
/datum/wires/explosive/pizza/on_pulse(wire)
var/obj/item/pizzabox/P = holder
switch(wire)
if(WIRE_DISARM) // Pulse to toggle
P.bomb_defused = !P.bomb_defused
else // Boom
explode()
/datum/wires/explosive/pizza/on_cut(wire, mend)
var/obj/item/pizzabox/P = holder
switch(wire)
if(WIRE_DISARM) // Disarm and untrap the box.
if(!mend)
P.bomb_defused = TRUE
else
if(!mend && !P.bomb_defused)
explode()
/datum/wires/explosive/pizza/explode()
var/obj/item/pizzabox/P = holder
P.bomb.detonate()
/datum/wires/explosive/gibtonite
holder_type = /obj/item/gibtonite
/datum/wires/explosive/gibtonite/explode()
var/obj/item/gibtonite/P = holder
P.GibtoniteReaction(null, 2)