Files
Bubberstation/code/datums/wires/explosive.dm
SmArtKar a916f4ec62 Cleans up chem grenade code, fixes prox sensors not working in grenades (#89891)
## About The Pull Request

Closes #89886
Closes #89887
Closes #89888

## Changelog
🆑
fix: You can no longer insert infinite amounts of slime cores into
advanced chem grenades
fix: Non-beaker containers in grenades work once more
fix: Proximity sensors in grenade finally work after like, 4 years.
code: Cleaned up chemical grenade code
/🆑
2025-03-15 04:23:21 +00:00

156 lines
4.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, source)
if (!isnull(source))
log_combat(source, holder, "cut the detonation wire for")
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, source)
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/assembly)
fingerprint = assembly.fingerprintslast
var/obj/item/grenade/chem_grenade/grenade = holder
if(!assembly.secured)
assembly.toggle_secure()
if(istype(assembly, /obj/item/assembly/timer))
var/obj/item/assembly/timer/timer = assembly
grenade.det_time = timer.saved_time SECONDS
return ..()
if(istype(assembly, /obj/item/assembly/prox_sensor))
var/obj/item/assembly/prox_sensor/sensor = assembly
grenade.landminemode = sensor
sensor.proximity_monitor.set_ignore_if_not_on_turf(FALSE)
sensor.time = grenade.det_time * 0.1
return ..()
if(!istype(assembly, /obj/item/assembly/health))
return ..()
var/obj/item/assembly/health/sensor = assembly
if(!sensor.scanning)
sensor.toggle_scan()
return ..()
/datum/wires/explosive/chem_grenade/explode()
var/obj/item/grenade/chem_grenade/grenade = holder
var/obj/item/assembly/pulser = get_attached(get_wire(1))
var/message = "\An [pulser] has pulsed [grenade] ([grenade.type]), which was installed by [fingerprint]"
if(istype(pulser, /obj/item/assembly/voice))
var/obj/item/assembly/voice/spoken_trigger = pulser
message += " with the following activation message: \"[spoken_trigger.recorded]\""
if(!grenade.dud_flags)
message_admins(message)
log_game(message)
grenade.log_grenade(get_mob_by_ckey(fingerprint)) //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/assembly = get_attached(color)
if(!istype(assembly))
return
var/obj/item/grenade/chem_grenade/grenade = holder
assemblies -= color
assembly.connected = null
assembly.holder = null
assembly.forceMove(holder.drop_location())
grenade.landminemode = null
return assembly
/datum/wires/explosive/c4 // Also includes X4
holder_type = /obj/item/grenade/c4
/datum/wires/explosive/c4/explode()
var/obj/item/grenade/c4/bomb = holder
bomb.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/pizza_bomb = holder
if(pizza_bomb.open && pizza_bomb.bomb)
return TRUE
/datum/wires/explosive/pizza/get_status()
var/obj/item/pizzabox/pizza_bomb = holder
var/list/status = list()
status += "The red light is [pizza_bomb.bomb_active ? "on" : "off"]."
status += "The green light is [pizza_bomb.bomb_defused ? "on": "off"]."
return status
/datum/wires/explosive/pizza/on_pulse(wire)
var/obj/item/pizzabox/pizza_bomb = holder
if(wire == WIRE_DISARM) // Pulse to toggle
pizza_bomb.bomb_defused = !pizza_bomb.bomb_defused
else // Boom
explode()
/datum/wires/explosive/pizza/on_cut(wire, mend, source)
if (mend)
return
var/obj/item/pizzabox/pizza_bomb = holder
if(wire == WIRE_DISARM) // Disarm and untrap the box.
pizza_bomb.bomb_defused = TRUE
return
if(!pizza_bomb.bomb_defused)
if (!isnull(source))
log_combat(source, holder, "cut the detonation wire for")
explode()
/datum/wires/explosive/pizza/explode()
var/obj/item/pizzabox/pizza_bomb = holder
pizza_bomb.bomb.detonate()