mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-21 12:08:55 +01:00
## About The Pull Request I have combed over implementations of `Destroy()` for `obj/machinery`, and noticed quite a few was spawning items or playing sounds. **Slot machines**: Moved payout to on_deconstruction() **Windoors**: Break sound moved to on_deconstruction(). I have also slightly cleaned up Destroy(), the windoor calls air_update_turf directly, as that proc already retrieves the turf it is on. **Atmospheric pipe**: Releases air and deconstructs meter objects on_deconstruction(). **Portable atmospheric devices**: Drop hyper noblium crystal on on_destruction(). **Pump, Scrubbers**: Releases air on_deconstruction(). **PACMAN power generator**: Spawns dropped fuel on_deconstruction(). **Runic vendor**: Moved vanishing effects to on_deconstruction(). I did not change Destroy side effects in the following instances: - side effects are critical for the round (e.g. doomsday device, nuke, blackbox recorder dropping the tape, gulag item reclaimer [less critical but still]) - might spawn messages and noises, but moving them to on_deconstruct would put linked items into an unusable state if deleted directly (e.g. express order console, cyborg lockdown console, tram paired sensors) - would potentially delete mobs we don't want deleted (e.g. disposals, slime camera console) Out of 220 Destroy defines, I found only 8 side effects that could not be moved to other procs, so `machinery\Destroy()` has almost always been used properly! I really hope `structure` will be as well made. Other changes: - Stasis beds had a completely empty destroy, removed - Mass drivers had two destroy procs, merged ## Why It's Good For The Game The Destroy() proc should only contain reference clean ups, barring edge cases that would harm playability. ## Changelog Nothing player facing.
93 lines
3.3 KiB
Plaintext
93 lines
3.3 KiB
Plaintext
#define PULSE_DISTANCE_RANGE 2
|
|
|
|
/obj/machinery/vending/runic_vendor
|
|
name = "\improper Runic Vending Machine"
|
|
desc = "This vending machine was designed for warfare! A perfect bait for Nanotrasen's crew thirst for consumerism."
|
|
icon_state = "RunicVendor"
|
|
panel_type = "panel10"
|
|
product_slogans = "Come get free magic!;50% off on Mjollnirs today!; Buy a warp whistle and get another one free!"
|
|
vend_reply = "Please, stand still near the vending machine for your special package!"
|
|
resistance_flags = FIRE_PROOF
|
|
light_mask = "RunicVendor-light-mask"
|
|
obj_flags = parent_type::obj_flags | NO_DEBRIS_AFTER_DECONSTRUCTION
|
|
/// How long the vendor stays up before it decays.
|
|
var/time_to_decay = 30 SECONDS
|
|
/// Area around the vendor that will pushback nearby mobs.
|
|
var/pulse_distance = PULSE_DISTANCE_RANGE
|
|
|
|
|
|
/obj/machinery/vending/runic_vendor/Initialize(mapload)
|
|
if(mapload)
|
|
log_mapping("[type] is not supposed to be mapped it, it decays after a set time")
|
|
stack_trace("Someone mapped in the meme vending machine the wizard scepter spawns, please remove it")
|
|
|
|
addtimer(CALLBACK(src, PROC_REF(decay)), time_to_decay, TIMER_STOPPABLE)
|
|
INVOKE_ASYNC(src, PROC_REF(runic_pulse))
|
|
|
|
switch(pick(1,3))
|
|
if(1)
|
|
products = list(
|
|
/obj/item/clothing/head/wizard = 1,
|
|
/obj/item/clothing/suit/wizrobe = 1,
|
|
/obj/item/clothing/shoes/sandal/magic = 1,
|
|
/obj/item/toy/foam_runic_scepter = 1,
|
|
)
|
|
if(2)
|
|
products = list(
|
|
/obj/item/clothing/head/wizard/red = 1,
|
|
/obj/item/clothing/suit/wizrobe/red = 1,
|
|
/obj/item/clothing/shoes/sandal/magic = 1,
|
|
/obj/item/toy/foam_runic_scepter = 1,
|
|
)
|
|
if(3)
|
|
products = list(
|
|
/obj/item/clothing/head/wizard/yellow = 1,
|
|
/obj/item/clothing/suit/wizrobe/yellow = 1,
|
|
/obj/item/clothing/shoes/sandal/magic = 1,
|
|
/obj/item/toy/foam_runic_scepter = 1,
|
|
)
|
|
|
|
return ..()
|
|
|
|
/obj/machinery/vending/runic_vendor/add_context(atom/source, list/context, obj/item/held_item, mob/user)
|
|
. = ..()
|
|
|
|
if(held_item)
|
|
if(istype(held_item, /obj/item/runic_vendor_scepter))
|
|
context[SCREENTIP_CONTEXT_LMB] = "Detonate"
|
|
context[SCREENTIP_CONTEXT_RMB] = "Force push"
|
|
|
|
return CONTEXTUAL_SCREENTIP_SET
|
|
|
|
return .
|
|
|
|
/obj/machinery/vending/runic_vendor/handle_deconstruct(disassembled)
|
|
SHOULD_NOT_OVERRIDE(TRUE)
|
|
|
|
visible_message(span_warning("[src] flickers and disappears!"))
|
|
playsound(src,'sound/weapons/resonator_blast.ogg',25,TRUE)
|
|
return ..()
|
|
|
|
/obj/machinery/vending/runic_vendor/proc/runic_explosion()
|
|
explosion(src, light_impact_range = 2)
|
|
deconstruct(FALSE)
|
|
|
|
/obj/machinery/vending/runic_vendor/proc/runic_pulse()
|
|
var/pulse_locs = spiral_range_turfs(pulse_distance, get_turf(src))
|
|
var/list/hit_things = list()
|
|
for(var/turf/pulsing_turf in pulse_locs)
|
|
for(var/mob/living/mob_to_be_pulsed_back in pulsing_turf.contents)
|
|
hit_things += mob_to_be_pulsed_back
|
|
var/atom/target = get_edge_target_turf(mob_to_be_pulsed_back, get_dir(src, get_step_away(mob_to_be_pulsed_back, src)))
|
|
to_chat(mob_to_be_pulsed_back, span_userdanger("The field repels you with tremendous force!"))
|
|
playsound(src, 'sound/effects/gravhit.ogg', 50, TRUE)
|
|
mob_to_be_pulsed_back.throw_at(target, 4, 4)
|
|
|
|
/obj/machinery/vending/runic_vendor/screwdriver_act(mob/living/user, obj/item/I)
|
|
runic_explosion()
|
|
|
|
/obj/machinery/vending/runic_vendor/proc/decay()
|
|
deconstruct(FALSE)
|
|
|
|
#undef PULSE_DISTANCE_RANGE
|