Files
Bubberstation/code/datums/wires/explosive.dm
SkyratBot f2f124867a [MIRROR] Fix: Health sensors inside chemical grenades [MDB IGNORE] (#12588)
* Health sensor in chemical grenades fix (#66014)

The health sensor is an assembly part. It contains two vars called 'secured' and 'scanning'.

In order to attach an assembly part to another assembly part (e.g. a health sensor to a signaller), both have to be attachable (meaning 'secured' = FALSE). After they are attached together, 'secured' will be TRUE. When the assembly is triggered, it checks if 'secured' == TRUE. Problem is, that a grenade is not an assembly part. If you use a screwdriver on the sensor to make it attachable, the chemical grenade won't work. The var 'secured' was simply not intended for usage inside a chemical grenade. Further confusion ensues when the now-attachable part is attached to the chemical grenade via an Attach-/Detach menu, which has nothing to do with the sensor being attachable (secured). This fix always secures the sensor when attaching it.

The other var, 'scanning' determines if the health sensor is currently active or not. A potential pitfall is to not activating it before attaching it to a chemical grenade, assuming that you have to activate the grenade itself to arm it (which in this case will just make the grenade go boom, disregarding the sensor). Since it does not make any sense to create a chemical grenade with an inactive sensor, this fix always enables the sensor when attaching it.

* Fix: Health sensors inside chemical grenades

Co-authored-by: LordVollkorn <66637090+LordVollkorn@users.noreply.github.com>
2022-04-08 03:30:32 +01:00

146 lines
4.1 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)
if(!..())
return FALSE
var/obj/item/grenade/chem_grenade/G = holder
if(G.stage == GRENADE_WIRED)
return TRUE
/datum/wires/explosive/chem_grenade/on_pulse(index)
var/obj/item/grenade/chem_grenade/grenade = holder
if(grenade.stage != GRENADE_READY)
return
. = ..()
/datum/wires/explosive/chem_grenade/on_cut(index, mend)
var/obj/item/grenade/chem_grenade/grenade = holder
if(grenade.stage != GRENADE_READY)
return
. = ..()
/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/assembly/prox_sensor/sensor = S
var/obj/item/grenade/chem_grenade/grenade = holder
grenade.landminemode = sensor
sensor.proximity_monitor.set_ignore_if_not_on_turf(FALSE)
else if(istype(S,/obj/item/assembly/health))
var/obj/item/assembly/health/sensor = S
if(!sensor.secured)
sensor.toggle_secure()
if(!sensor.scanning)
sensor.toggle_scan()
fingerprint = S.fingerprintslast
return ..()
/datum/wires/explosive/chem_grenade/explode()
var/obj/item/grenade/chem_grenade/grenade = holder
var/obj/item/assembly/assembly = get_attached(get_wire(1))
if(!grenade.dud_flags)
message_admins("\An [assembly] has pulsed [grenade] ([grenade.type]), which was installed by [fingerprint].")
log_game("\An [assembly] has pulsed [grenade] ([grenade.type]), which was installed by [fingerprint].")
var/mob/M = get_mob_by_ckey(fingerprint)
grenade.log_grenade(M) //Used in arm_grenade() too but this one conveys where the mob who triggered the bomb is
if(grenade.landminemode)
grenade.detonate() ///already armed
else
grenade.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/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)
if(!..())
return FALSE
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)