mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-12 08:27:13 +01:00
4ecb0bc21c
Repaths obj/machinery to obj/structure/machinery. **Note for reviewers:** the only meaningful changed code exists within **code/game/objects/structures.dm** and **code/game/objects/structures/_machinery.dm**, largely concerning damage procs. With the exception of moving airlock defines to their own file, ALL OTHER CHANGES ARE STRICTLY PATH CHANGES. Objects, _categorically_, are largely divided between those you can hold in your hand/inventory and those you can't. Machinery objects are already subtypes of Structures behaviorally, this PR just makes their pathing reflect that, and allows for future work (tool actions, more health/destruction functionality) to be developed without unnecessary code duplication. I have tested this PR by loading up the Horizon and dismantling various machines and structures with tools, shooting guns of various types throughout the ship, and detonating a bunch of explosions throughout the ship.
94 lines
3.3 KiB
Plaintext
94 lines
3.3 KiB
Plaintext
/// An effect that chooses random turfs in an area, then calls `ex_act` on them. Useful for mapping randomized destruction!
|
|
ABSTRACT_TYPE(/obj/effect/map_effect/randomized_destruction)
|
|
name = "randomized destruction"
|
|
|
|
/// Amount of turfs that will be selected for destruction, randomized between its halved value (rand(max_turf_amount / 2, max_turf_amount))
|
|
var/max_turf_amount
|
|
|
|
/// Weighted assoc list that determines the destruction severity per picked turf, candidate is picked by `pick_weight()`
|
|
// we can't use integer numbers as a key, because Byond will flatten them and make this a regular list instead of assoc list
|
|
// we can't use defines like "[SEVERE_DESTRUCTION]" = 1 either without handling this in a proc, because non-constant. This shit is so ass
|
|
var/list/possible_severities = list(
|
|
"1" = 1, // Severe destruction
|
|
"2" = 1, // Moderate
|
|
"3" = 1, // Mild
|
|
)
|
|
|
|
var/static/list/ignored_atoms = typecacheof(list(
|
|
/obj/effect,
|
|
/obj/structure/machinery/computer,
|
|
/obj/structure/machinery/hologram,
|
|
/obj/structure/machinery/atmospherics/pipe/tank,
|
|
/obj/structure/machinery/atmospherics/unary,
|
|
/obj/structure/machinery/embedded_controller,
|
|
/obj/structure/machinery/airlock_sensor,
|
|
/obj/structure/machinery/access_button,
|
|
/obj/structure/machinery/shipsensors,
|
|
/obj/structure/machinery/iff_beacon,
|
|
/obj/structure/fuel_port,
|
|
|
|
))
|
|
|
|
/obj/effect/map_effect/randomized_destruction/Initialize(mapload)
|
|
. = ..()
|
|
if(mapload)
|
|
addtimer(CALLBACK(src, PROC_REF(start_destruction)), 90 SECONDS)
|
|
return
|
|
|
|
start_destruction()
|
|
|
|
/obj/effect/map_effect/randomized_destruction/proc/start_destruction()
|
|
var/list/turf_pool = get_area_turfs(get_area(src))
|
|
var/list/picked_turfs = list()
|
|
for(var/i in 0 to round(rand(max_turf_amount / 2, max_turf_amount)))
|
|
picked_turfs += pick_n_take(turf_pool)
|
|
|
|
var/chosen_severity
|
|
for(var/turf/T in picked_turfs)
|
|
chosen_severity = text2num(pick_weight(possible_severities)) // severity value that'll also affect every applicaple atom in turfs content
|
|
for(var/atom/thing in T.contents)
|
|
if(!thing.simulated || is_type_in_typecache(thing, ignored_atoms))
|
|
continue
|
|
thing.ex_act(chosen_severity)
|
|
T.ex_act(chosen_severity)
|
|
|
|
qdel(src) // I did my part, goodbye world
|
|
|
|
// ---- Subtypes
|
|
|
|
// Mild impact
|
|
ABSTRACT_TYPE(/obj/effect/map_effect/randomized_destruction/mild)
|
|
possible_severities = list(
|
|
"1" = 0, // Severe 0%
|
|
"2" = 1, // Moderate 25%
|
|
"3" = 3, // Mild 75%
|
|
)
|
|
|
|
/obj/effect/map_effect/randomized_destruction/mild/low_range
|
|
name = "randomized destruction, mild impact low range"
|
|
icon_state = "rand_dest_mild_low"
|
|
max_turf_amount = 20
|
|
|
|
/obj/effect/map_effect/randomized_destruction/mild/high_range
|
|
name = "randomized destruction, mild impact high range"
|
|
icon_state = "rand_dest_mild_high"
|
|
max_turf_amount = 60
|
|
|
|
// Severe impact
|
|
ABSTRACT_TYPE(/obj/effect/map_effect/randomized_destruction/severe)
|
|
possible_severities = list(
|
|
"1" = 2, // Severe 10%
|
|
"2" = 9, // Moderate 45%
|
|
"3" = 9, // Mild 45%
|
|
)
|
|
|
|
/obj/effect/map_effect/randomized_destruction/severe/low_range
|
|
name = "randomized destruction, severe impact low range"
|
|
icon_state = "rand_dest_severe_low"
|
|
max_turf_amount = 20
|
|
|
|
/obj/effect/map_effect/randomized_destruction/severe/high_range
|
|
name = "randomized destruction, severe impact high range"
|
|
icon_state = "rand_dest_severe_high"
|
|
max_turf_amount = 60
|