From c542501b572cfa27bafdaab995ee092c1e057b3b Mon Sep 17 00:00:00 2001 From: Lucy Date: Fri, 21 Jun 2024 04:19:58 -0400 Subject: [PATCH] Meteor shield refactor part 2 --- code/__DEFINES/~monkestation/traits.dm | 4 + code/controllers/subsystem/explosions.dm | 12 +-- .../code/modules/cargo/packs/engineering.dm | 5 ++ .../code/modules/holomaps/icons/8x8.dmi | Bin 842 -> 880 bytes .../meteor_shield.dm | 83 ++---------------- .../meteor_shield/meteor_shield_capsule.dm | 10 +++ .../meteor_shield/meteor_shield_coverage.dm | 40 +++++++++ .../meteor_shield/meteor_shield_field.dm | 29 ++++++ .../meteor_shield/meteor_shield_zap.dm | 44 ++++++++++ tgstation.dme | 6 +- 10 files changed, 151 insertions(+), 82 deletions(-) rename monkestation/code/modules/{station_goals => meteor_shield}/meteor_shield.dm (51%) create mode 100644 monkestation/code/modules/meteor_shield/meteor_shield_capsule.dm create mode 100644 monkestation/code/modules/meteor_shield/meteor_shield_coverage.dm create mode 100644 monkestation/code/modules/meteor_shield/meteor_shield_field.dm create mode 100644 monkestation/code/modules/meteor_shield/meteor_shield_zap.dm diff --git a/code/__DEFINES/~monkestation/traits.dm b/code/__DEFINES/~monkestation/traits.dm index 514976c9580f..b93ef7439154 100644 --- a/code/__DEFINES/~monkestation/traits.dm +++ b/code/__DEFINES/~monkestation/traits.dm @@ -36,3 +36,7 @@ #define ABDUCTOR_GLAND_VENTCRAWLING_TRAIT "abductor_gland_ventcrawling" #define TRAIT_BETTER_CYBERCONNECTOR "better_cyberconnector_hacking" + +// /turf/open +/// If a trait is considered as having "coverage" by a meteor shield. +#define TRAIT_COVERED_BY_METEOR_SHIELD "covered_by_meteor_shield" diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index e9933a579932..66a171b90a3e 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -514,7 +514,7 @@ SUBSYSTEM_DEF(explosions) * - [creaking_sound][/sound]: The sound that plays when the station creaks during the explosion. * - [hull_creaking_sound][/sound]: The sound that plays when the station creaks after the explosion. */ -/datum/controller/subsystem/explosions/proc/shake_the_room(turf/epicenter, near_distance, far_distance, quake_factor, echo_factor, creaking, sound/near_sound = sound(get_sfx(SFX_EXPLOSION)), sound/far_sound = sound('sound/effects/explosionfar.ogg'), sound/echo_sound = sound('sound/effects/explosion_distant.ogg'), sound/creaking_sound = sound(get_sfx(SFX_EXPLOSION_CREAKING)), hull_creaking_sound = sound(get_sfx(SFX_HULL_CREAKING))) +/datum/controller/subsystem/explosions/proc/shake_the_room(turf/epicenter, near_distance, far_distance, quake_factor, echo_factor, creaking, sound/near_sound = sound(get_sfx(SFX_EXPLOSION)), sound/far_sound = sound('sound/effects/explosionfar.ogg'), sound/echo_sound = sound('sound/effects/explosion_distant.ogg'), sound/creaking_sound = sound(get_sfx(SFX_EXPLOSION_CREAKING)), hull_creaking_sound = sound(get_sfx(SFX_HULL_CREAKING)), pressure_affected = TRUE) // monkestation edit: add pressure_affected var/frequency = get_rand_frequency() var/blast_z = epicenter.z if(isnull(creaking)) // Autoset creaking. @@ -535,18 +535,18 @@ SUBSYSTEM_DEF(explosions) var/base_shake_amount = sqrt(near_distance / (distance + 1)) if(distance <= round(near_distance + world.view - 2, 1)) // If you are close enough to see the effects of the explosion first-hand (ignoring walls) - listener.playsound_local(epicenter, null, 100, TRUE, frequency, sound_to_use = near_sound) + listener.playsound_local(epicenter, null, 100, TRUE, frequency, pressure_affected = pressure_affected, sound_to_use = near_sound) // monkestation edit: pressure_affected if(base_shake_amount > 0) shake_camera(listener, NEAR_SHAKE_DURATION, clamp(base_shake_amount, 0, NEAR_SHAKE_CAP)) else if(distance < far_distance) // You can hear a far explosion if you are outside the blast radius. Small explosions shouldn't be heard throughout the station. var/far_volume = clamp(far_distance / 2, FAR_LOWER, FAR_UPPER) if(creaking) - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = creaking_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, pressure_affected = pressure_affected, sound_to_use = creaking_sound, distance_multiplier = 0) // monkestation edit: pressure_affected else if(prob(FAR_SOUND_PROB)) // Sound variety during meteor storm/tesloose/other bad event - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = far_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, pressure_affected = pressure_affected, sound_to_use = far_sound, distance_multiplier = 0) // monkestation edit: pressure_affected else - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, pressure_affected = pressure_affected, sound_to_use = echo_sound, distance_multiplier = 0) // monkestation edit: pressure_affected if(base_shake_amount || quake_factor) base_shake_amount = max(base_shake_amount, quake_factor * 3, 0) // Devastating explosions rock the station and ground @@ -559,7 +559,7 @@ SUBSYSTEM_DEF(explosions) shake_camera(listener, FAR_SHAKE_DURATION, clamp(quake_factor / 4, 0, FAR_SHAKE_CAP)) else echo_volume = 40 - listener.playsound_local(epicenter, null, echo_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) + listener.playsound_local(epicenter, null, echo_volume, TRUE, frequency, pressure_affected = pressure_affected, sound_to_use = echo_sound, distance_multiplier = 0) // monkestation edit: pressure_affected if(creaking) // 5 seconds after the bang, the station begins to creak addtimer(CALLBACK(listener, TYPE_PROC_REF(/mob, playsound_local), epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), TRUE, frequency, null, null, FALSE, hull_creaking_sound, 0), CREAK_DELAY) diff --git a/monkestation/code/modules/cargo/packs/engineering.dm b/monkestation/code/modules/cargo/packs/engineering.dm index 204dc92b3d32..ef7f8736642f 100644 --- a/monkestation/code/modules/cargo/packs/engineering.dm +++ b/monkestation/code/modules/cargo/packs/engineering.dm @@ -1,3 +1,8 @@ /datum/supply_pack/engineering/shield_sat + special = FALSE access_view = ACCESS_ENGINEERING contains = list(/obj/item/meteor_shield_capsule = 5) + +/datum/supply_pack/engineering/shield_sat_control + special = FALSE + access_view = ACCESS_ENGINEERING diff --git a/monkestation/code/modules/holomaps/icons/8x8.dmi b/monkestation/code/modules/holomaps/icons/8x8.dmi index ac8687dc1fcec8bc1040d62e111d8c4253b1f0a9..8e98b1dbe56ba5be69a9e39edc0f3a3debcd7d58 100644 GIT binary patch delta 857 zcmV-f1E&1S2Ji-uB!A6%R9JLGWpiV4X>fFDZ*Bkpc$}?~y$ZrG5P;|8DUP~|sC012 zA{FV-zCt+6wGB26T%x6K?@+LVt)j>+H+=Wq-wKYWb6!GL7ytkQUP(kjRA_ z-5TYIB*h&C-PVA>>^zYy-`C(g0G#yUa=HA7iR<ToU215p6B5G$b;=Ybni zpmy9G0F`}ePdF;vRuu>#d|S);_#KU3gwKDHX<^}&OMi{A@|y}sZFu)mLeBX2;2kr+ zqq)b!r{4r`E`uK#nu-p9=470TYrZKFb{9)=rX@*ITCjOpw0u6V}h6e2J(Co49u4`ox&y=Fj6(sY(sn;;r!gvxMP$k&iANV6U@VD{NK3 z=2HBb72e{_eE|LPf+qlv!0NC2*xyp^n_$lQNAv8v!ybT~^H1j4cSlozd4{F{9A5!j jWh9HwpnzfFDZ*Bkpc$}?}zY2pe5QpdFDGpsrsl~x1 zOHqo0zJeUhsiA7%l2&~C4niHOEke2FhVS>?pAatDH7_A8a`_~7#txt$KAxl)jrJ`l zNTg`VG_3~(iF6)4fr0>;uYE8U>ou$y! z;RFhz!)h&}$v)OC@rPsyIgf_7mfSOa7FF7g!yjz5VXAuM`_^Z^-GsikZf`n-tV|&- za`^%aCX&1G6Sx8Z00KfuL_t(&f$dqlb>lD)9PlZ06?cIOZ~@#pt^pOm;A(Kd0@Q%( zSQOv_7`The_kRL%ZI~tiz6VQd!k9!92jbfu?2nKWkyoVP+%M1Uwy2&+V%$;C_(P3bAniq!|00O>>6ws{>BO!#W_z+bHunzlJYf?TG zsG1b$i6pE6YY>qrCzw+OSlZw%2bp{DC1`U%_@$;9e=kk|Ks1QpdL*;V2Bf^L1%1Ei0^fOw@nBD$@Up7k4`UepryAvyqX zczoMktpOoqx!)5BZA1q3>Ecr5RY++a}T}*Z4R(Dz#2^eYXhv&1h6*1 z8gm;g=%YvHvk^ekAbcKO>>;H*0PuNCo;2N(Z*zdP0oG^&SQ}uCCP3)}`r%o^&(xY* zpr4lG{3-s%nBtbd$LCfRTa@EV(GSn!$3G^2x^zH!pUv%XX#`}SpV;9XUpxm8QPJ0$3YhjV1t)ZzDBhR|M27(0>xFr%H2_!bt!C002ovPDHLkV1n@+eJ%h1 diff --git a/monkestation/code/modules/station_goals/meteor_shield.dm b/monkestation/code/modules/meteor_shield/meteor_shield.dm similarity index 51% rename from monkestation/code/modules/station_goals/meteor_shield.dm rename to monkestation/code/modules/meteor_shield/meteor_shield.dm index b235ce907eaa..55a00da75ebf 100644 --- a/monkestation/code/modules/station_goals/meteor_shield.dm +++ b/monkestation/code/modules/meteor_shield/meteor_shield.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(meteor_shield_sats) /// Whether the meteor sat checks for line of sight to determine if it can intercept a meteor. var/check_sight = TRUE /// The proximity monitor used to detect meteors entering the shield's range. - var/datum/proximity_monitor/meteor_monitor + var/datum/proximity_monitor/advanced/meteor_shield/monitor /// A counter for how many meteors this specific satellite has zapped. var/meteors_zapped = 0 @@ -25,8 +25,7 @@ GLOBAL_LIST_EMPTY(meteor_shield_sats) /obj/machinery/satellite/meteor_shield/Destroy() GLOB.meteor_shield_sats -= src - if(meteor_monitor) - QDEL_NULL(meteor_monitor) + QDEL_NULL(monitor) return ..() /obj/machinery/satellite/meteor_shield/vv_edit_var(vname, vval) @@ -34,8 +33,9 @@ GLOBAL_LIST_EMPTY(meteor_shield_sats) if(.) switch(vname) if(NAMEOF(src, kill_range)) - meteor_monitor?.set_range(kill_range) + monitor?.set_range(kill_range) if(NAMEOF(src, active)) + set_anchored(active) setup_proximity() /obj/machinery/satellite/meteor_shield/add_context(atom/source, list/context, obj/item/held_item, mob/user) @@ -44,50 +44,6 @@ GLOBAL_LIST_EMPTY(meteor_shield_sats) context[SCREENTIP_CONTEXT_RMB] = "Pick up" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/satellite/meteor_shield/HasProximity(obj/effect/meteor/meteor) - if(!active || !istype(meteor) || QDELING(meteor) || (obj_flags & EMAGGED)) - return - var/turf/our_turf = get_turf(src) - var/turf/meteor_turf = get_turf(meteor) - if(!check_los(our_turf, meteor_turf)) - return - our_turf.Beam(meteor_turf, icon_state = "sat_beam", time = 5) - if(meteor.shield_defense(src)) - new /obj/effect/temp_visual/explosion(meteor_turf) - INVOKE_ASYNC(src, PROC_REF(play_zap_sound), meteor_turf) - SSblackbox.record_feedback("tally", "meteors_zapped", 1, "[meteor.type]") - meteors_zapped++ - qdel(meteor) - -/obj/machinery/satellite/meteor_shield/proc/check_los(turf/source, turf/target) as num - // if something goes fucky wucky, let's just assume line-of-sight by default - if(!check_sight) - return TRUE - for(var/turf/segment as anything in get_line(source, target)) - if(QDELETED(segment)) - continue - if(isclosedturf(segment) && !istransparentturf(segment)) - return FALSE - return TRUE - -/obj/machinery/satellite/meteor_shield/proc/play_zap_sound(turf/epicenter) - if(QDELETED(epicenter)) - return - var/static/near_distance - if(isnull(near_distance)) - var/list/world_view = getviewsize(world.view) - near_distance = max(world_view[1], world_view[2]) - SSexplosions.shake_the_room( - epicenter, - near_distance, - far_distance = near_distance * 3, - quake_factor = 0, - echo_factor = 0, - creaking = FALSE, - near_sound = sound('sound/weapons/lasercannonfire.ogg'), - far_sound = sound('sound/weapons/marauder.ogg') - ) - /obj/machinery/satellite/meteor_shield/toggle(user) . = ..() setup_proximity() @@ -98,27 +54,15 @@ GLOBAL_LIST_EMPTY(meteor_shield_sats) /obj/machinery/satellite/meteor_shield/proc/setup_proximity() if((obj_flags & EMAGGED) || !active) - if(!QDELETED(meteor_monitor)) - QDEL_NULL(meteor_monitor) + if(!QDELETED(monitor)) + QDEL_NULL(monitor) else - if(QDELETED(meteor_monitor)) - meteor_monitor = new(src, kill_range) + if(QDELETED(monitor)) + monitor = new(src, kill_range) /obj/machinery/satellite/meteor_shield/piercing check_sight = FALSE -/proc/get_meteor_sat_coverage() as num - var/list/covered_tiles = list() - for(var/obj/machinery/satellite/meteor_shield/sat as anything in GLOB.meteor_shield_sats) - if(QDELETED(sat) || !sat.active || !is_station_level(sat.z) || (sat.obj_flags & EMAGGED)) - continue - if(sat.check_sight) - covered_tiles |= view(sat.kill_range, sat) - else - covered_tiles |= range(sat.kill_range, sat) - return length(covered_tiles) - - /obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod = 1) var/static/list/meteor_event_typecache if(!meteor_event_typecache) @@ -146,14 +90,3 @@ GLOBAL_LIST_EMPTY(meteor_shield_sats) var/obj/item/meteor_shield_capsule/capsule = new(drop_location()) user.put_in_hands(capsule) qdel(src) - -/obj/item/meteor_shield_capsule - name = "meteor shield satellite capsule" - desc = "A bluespace capsule which a single unit of meteor shield satellite is compressed within. If you activate this capsule, a meteor shield satellite will pop out. You still need to install these." - icon_state = "capsule" - icon = 'icons/obj/mining.dmi' - w_class = WEIGHT_CLASS_TINY - -/obj/item/meteor_shield_capsule/Initialize(mapload) - . = ..() - AddComponent(/datum/component/deployable, 5 SECONDS, /obj/machinery/satellite/meteor_shield, delete_on_use = TRUE) diff --git a/monkestation/code/modules/meteor_shield/meteor_shield_capsule.dm b/monkestation/code/modules/meteor_shield/meteor_shield_capsule.dm new file mode 100644 index 000000000000..377429d1a2dd --- /dev/null +++ b/monkestation/code/modules/meteor_shield/meteor_shield_capsule.dm @@ -0,0 +1,10 @@ +/obj/item/meteor_shield_capsule + name = "meteor shield satellite capsule" + desc = "A bluespace capsule which a single unit of meteor shield satellite is compressed within. If you activate this capsule, a meteor shield satellite will pop out. You still need to install these." + icon_state = "capsule" + icon = 'icons/obj/mining.dmi' + w_class = WEIGHT_CLASS_TINY + +/obj/item/meteor_shield_capsule/Initialize(mapload) + . = ..() + AddComponent(/datum/component/deployable, 5 SECONDS, /obj/machinery/satellite/meteor_shield, delete_on_use = TRUE) diff --git a/monkestation/code/modules/meteor_shield/meteor_shield_coverage.dm b/monkestation/code/modules/meteor_shield/meteor_shield_coverage.dm new file mode 100644 index 000000000000..7036ec71c0d2 --- /dev/null +++ b/monkestation/code/modules/meteor_shield/meteor_shield_coverage.dm @@ -0,0 +1,40 @@ +#define TRAIT_METEOR_SHIELD_FIELD_MONITORED "meteor_shield_field_monitored" + +GLOBAL_LIST_EMPTY(meteor_shielded_turfs) + +/// Stupid element to handle tracking which turfs are in a meteor sat's range, +/// without messing up in situations like with overlapping ranges. +/datum/element/meteor_shield_coverage + // Detach whenever destroyed, so we can ensure there's no hanging references to the turf in GLOB.meteor_shielded_turfs + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + /// Signals to attach to all turfs. + var/static/list/attach_signals = list( + SIGNAL_ADDTRAIT(TRAIT_COVERED_BY_METEOR_SHIELD), + SIGNAL_REMOVETRAIT(TRAIT_COVERED_BY_METEOR_SHIELD) + ) + +/datum/element/meteor_shield_coverage/Attach(turf/open/target) + . = ..() + if(!isgroundlessturf(target)) + return ELEMENT_INCOMPATIBLE + // We use a trait to prevent duplicate assignments. + if(!HAS_TRAIT(target, TRAIT_METEOR_SHIELD_FIELD_MONITORED)) + ADD_TRAIT(target, TRAIT_METEOR_SHIELD_FIELD_MONITORED, ELEMENT_TRAIT(type)) + RegisterSignals(target, attach_signals, PROC_REF(update_global_shield_list)) + GLOB.meteor_shielded_turfs += target + +/datum/element/meteor_shield_coverage/Detach(turf/open/target) + REMOVE_TRAIT(target, TRAIT_METEOR_SHIELD_FIELD_MONITORED, ELEMENT_TRAIT(type)) + UnregisterSignal(target, attach_signals) + GLOB.meteor_shielded_turfs -= target + return ..() + +/datum/element/meteor_shield_coverage/proc/update_global_shield_list(turf/open/source) + SIGNAL_HANDLER + if(!isgroundlessturf(source) || !HAS_TRAIT(source, TRAIT_COVERED_BY_METEOR_SHIELD)) + source.RemoveElement(/datum/element/meteor_shield_coverage) + +/proc/get_meteor_sat_coverage() as num + return length(GLOB.meteor_shielded_turfs) + +#undef TRAIT_METEOR_SHIELD_FIELD_MONITORED diff --git a/monkestation/code/modules/meteor_shield/meteor_shield_field.dm b/monkestation/code/modules/meteor_shield/meteor_shield_field.dm new file mode 100644 index 000000000000..43b6409a3b03 --- /dev/null +++ b/monkestation/code/modules/meteor_shield/meteor_shield_field.dm @@ -0,0 +1,29 @@ +GLOBAL_LIST_EMPTY_TYPED(meteor_shield_fields, /datum/proximity_monitor/advanced/meteor_shield) + +/// A proximity monitor field that marks openspace turfs within as being covered by a meteor shield. +/datum/proximity_monitor/advanced/meteor_shield + edge_is_a_field = TRUE + +/datum/proximity_monitor/advanced/meteor_shield/New(atom/_host, range, _ignore_if_not_on_turf) + . = ..() + GLOB.meteor_shield_fields += src + +/datum/proximity_monitor/advanced/meteor_shield/Destroy() + GLOB.meteor_shield_fields -= src + return ..() + +/datum/proximity_monitor/advanced/meteor_shield/setup_field_turf(turf/open/target) + if(!isgroundlessturf(target)) + return + var/obj/machinery/satellite/meteor_shield/host_sat = host + if(host_sat.check_los(get_turf(host_sat), target)) + ADD_TRAIT(target, TRAIT_COVERED_BY_METEOR_SHIELD, REF(src)) + target.AddElement(/datum/element/meteor_shield_coverage) + +/datum/proximity_monitor/advanced/meteor_shield/cleanup_field_turf(turf/target) + REMOVE_TRAIT(target, TRAIT_COVERED_BY_METEOR_SHIELD, REF(src)) + +/datum/proximity_monitor/advanced/meteor_shield/set_range(range, force_rebuild) + . = ..() + if(.) + recalculate_field(full_recalc = TRUE) diff --git a/monkestation/code/modules/meteor_shield/meteor_shield_zap.dm b/monkestation/code/modules/meteor_shield/meteor_shield_zap.dm new file mode 100644 index 000000000000..43c10464c41d --- /dev/null +++ b/monkestation/code/modules/meteor_shield/meteor_shield_zap.dm @@ -0,0 +1,44 @@ +/obj/machinery/satellite/meteor_shield/HasProximity(obj/effect/meteor/meteor) + if(!active || !istype(meteor) || QDELING(meteor) || (obj_flags & EMAGGED)) + return + var/turf/our_turf = get_turf(src) + var/turf/meteor_turf = get_turf(meteor) + if(!check_los(our_turf, meteor_turf)) + return + our_turf.Beam(meteor_turf, icon_state = "sat_beam", time = 5) + if(meteor.shield_defense(src)) + new /obj/effect/temp_visual/explosion(meteor_turf) + INVOKE_ASYNC(src, PROC_REF(play_zap_sound), meteor_turf) + SSblackbox.record_feedback("tally", "meteors_zapped", 1, "[meteor.type]") + meteors_zapped++ + qdel(meteor) + +/obj/machinery/satellite/meteor_shield/proc/check_los(turf/source, turf/target) as num + // if something goes fucky wucky, let's just assume line-of-sight by default + . = TRUE + if(!check_sight) + return TRUE + for(var/turf/segment as anything in get_line(source, target)) + if(QDELETED(segment)) + continue + if(isclosedturf(segment) && !istransparentturf(segment)) + return FALSE + +/obj/machinery/satellite/meteor_shield/proc/play_zap_sound(turf/epicenter) + if(QDELETED(epicenter)) + return + var/static/near_distance + if(isnull(near_distance)) + var/list/world_view = getviewsize(world.view) + near_distance = max(world_view[1], world_view[2]) + SSexplosions.shake_the_room( + epicenter, + near_distance, + far_distance = near_distance * 8, + quake_factor = 0, + echo_factor = 0, + creaking = FALSE, + near_sound = sound('sound/weapons/lasercannonfire.ogg'), + far_sound = sound('sound/weapons/marauder.ogg'), + pressure_affected = FALSE + ) diff --git a/tgstation.dme b/tgstation.dme index dcefdb7d4606..9680b8da773a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6622,6 +6622,11 @@ #include "monkestation\code\modules\mentor\mentor_pm.dm" #include "monkestation\code\modules\mentor\mentor_say.dm" #include "monkestation\code\modules\mentor\mentor_who.dm" +#include "monkestation\code\modules\meteor_shield\meteor_shield_capsule.dm" +#include "monkestation\code\modules\meteor_shield\meteor_shield.dm" +#include "monkestation\code\modules\meteor_shield\meteor_shield_coverage.dm" +#include "monkestation\code\modules\meteor_shield\meteor_shield_field.dm" +#include "monkestation\code\modules\meteor_shield\meteor_shield_zap.dm" #include "monkestation\code\modules\meteors\meteor_dark_matteor.dm" #include "monkestation\code\modules\metrics\metric_subsystem.dm" #include "monkestation\code\modules\metrics\subsystem_analytics\generics.dm" @@ -7169,7 +7174,6 @@ #include "monkestation\code\modules\spells\spell_types\aoe_spell\mind_swap.dm" #include "monkestation\code\modules\spells\spell_types\conjure_item\summon_mjollnir.dm" #include "monkestation\code\modules\spells\spell_types\pointed\smite.dm" -#include "monkestation\code\modules\station_goals\meteor_shield.dm" #include "monkestation\code\modules\store\admin\admin_coin_modification.dm" #include "monkestation\code\modules\store\atm\_atm.dm" #include "monkestation\code\modules\store\pre_round\_pre_round_store.dm"