From 7b80231d6c0a3fd02eed4b19990e7c352418319a Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 23 Jun 2018 16:21:23 +0200 Subject: [PATCH 1/3] Fixes anomaly area selection --- code/controllers/subsystem/events.dm | 19 ---------------- code/modules/events/anomaly.dm | 34 +++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index e70fd1cd7d6..ffc934c0611 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -93,25 +93,6 @@ SUBSYSTEM_DEF(events) else if(. == EVENT_READY) E.runEvent(TRUE) -/datum/round_event/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in! - var/list/safe_areas = list( - /area/ai_monitored/turret_protected/ai, - /area/ai_monitored/turret_protected/ai_upload, - /area/engine, - /area/solar, - /area/holodeck, - /area/shuttle - ) - - //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up. - var/list/danger_areas = list( - /area/engine/break_room, - /area/crew_quarters/heads/chief) - - //Need to locate() as it's just a list of paths. - return locate(pick((GLOB.the_station_areas - safe_areas) + danger_areas)) in GLOB.sortedAreas - - //allows a client to trigger an event //aka Badmin Central // > Not in modules/admin diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index c866dcca0fe..88f6baba650 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -12,17 +12,38 @@ announceWhen = 1 +/datum/round_event/anomaly/proc/findEventArea() + //Places that shouldn't explode + var/static/list/safe_area_types = typecacheof(list( + /area/ai_monitored/turret_protected/ai, + /area/ai_monitored/turret_protected/ai_upload, + /area/engine, + /area/solar, + /area/holodeck, + /area/shuttle) + ) + + //Subtypes from the above that actually should explode. + var/static/list/unsafe_area_subtypes = typecacheof(/area/engine/break_room) + + var/static/list/allowed_areas + if(!allowed_areas) + allowed_areas = list() + for(var/areatype in GLOB.the_station_areas) + if(safe_area_types[areatype] && !unsafe_area_subtypes[areatype]) + continue + else + allowed_areas[areatype] = TRUE + + return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas)) + /datum/round_event/anomaly/setup(loop=0) - var/safety_loop = loop + 1 - if(safety_loop > 50) - kill() - end() impact_area = findEventArea() if(!impact_area) - setup(safety_loop) + CRASH("No valid areas for anomaly found.") var/list/turf_test = get_area_turfs(impact_area) if(!turf_test.len) - setup(safety_loop) + CRASH("Anomaly : No valid turfs found for [impact_area] - [impact_area.type]") /datum/round_event/anomaly/announce(fake) priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert") @@ -31,3 +52,4 @@ var/turf/T = safepick(get_area_turfs(impact_area)) if(T) newAnomaly = new /obj/effect/anomaly/flux(T) + From 99cdc677b385d35e47d2604df2608c40ef80cb63 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 23 Jun 2018 18:06:00 +0200 Subject: [PATCH 2/3] Forgot this --- code/modules/events/anomaly.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index 88f6baba650..e0c03627850 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -37,7 +37,7 @@ return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas)) -/datum/round_event/anomaly/setup(loop=0) +/datum/round_event/anomaly/setup() impact_area = findEventArea() if(!impact_area) CRASH("No valid areas for anomaly found.") From 1572321137422be32aeff79645f91be6e9a39f8c Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 23 Jun 2018 22:22:05 +0200 Subject: [PATCH 3/3] Adds make_associative helper. --- code/__HELPERS/_lists.dm | 5 +++++ code/modules/events/anomaly.dm | 36 ++++++++++++++-------------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index cf8a9df1193..54dd2a982cb 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -488,6 +488,11 @@ for(var/key in key_list) . |= key_list[key] +/proc/make_associative(list/flat_list) + . = list() + for(var/thing in flat_list) + .[thing] = TRUE + //Picks from the list, with some safeties, and returns the "default" arg if it fails #define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default) diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index e0c03627850..bb1df49ca5c 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -13,27 +13,22 @@ /datum/round_event/anomaly/proc/findEventArea() - //Places that shouldn't explode - var/static/list/safe_area_types = typecacheof(list( - /area/ai_monitored/turret_protected/ai, - /area/ai_monitored/turret_protected/ai_upload, - /area/engine, - /area/solar, - /area/holodeck, - /area/shuttle) - ) - - //Subtypes from the above that actually should explode. - var/static/list/unsafe_area_subtypes = typecacheof(/area/engine/break_room) - var/static/list/allowed_areas if(!allowed_areas) - allowed_areas = list() - for(var/areatype in GLOB.the_station_areas) - if(safe_area_types[areatype] && !unsafe_area_subtypes[areatype]) - continue - else - allowed_areas[areatype] = TRUE + //Places that shouldn't explode + var/list/safe_area_types = typecacheof(list( + /area/ai_monitored/turret_protected/ai, + /area/ai_monitored/turret_protected/ai_upload, + /area/engine, + /area/solar, + /area/holodeck, + /area/shuttle) + ) + + //Subtypes from the above that actually should explode. + var/list/unsafe_area_subtypes = typecacheof(list(/area/engine/break_room)) + + allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes return safepick(typecache_filter_list(GLOB.sortedAreas,allowed_areas)) @@ -51,5 +46,4 @@ /datum/round_event/anomaly/start() var/turf/T = safepick(get_area_turfs(impact_area)) if(T) - newAnomaly = new /obj/effect/anomaly/flux(T) - + newAnomaly = new /obj/effect/anomaly/flux(T) \ No newline at end of file