From e85b6a490bbbf950f5f27dbe1fd5310936a1692b Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Mon, 3 Aug 2020 14:45:07 -0500 Subject: [PATCH] minimum spawns subsystem - squashed --- code/controllers/subsystem/minimum_spawns.dm | 124 ++++++++++++++++++ code/datums/ruins/lavaland.dm | 5 +- .../turfs/simulated/floor/plating/asteroid.dm | 1 + tgstation.dme | 1 + 4 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 code/controllers/subsystem/minimum_spawns.dm diff --git a/code/controllers/subsystem/minimum_spawns.dm b/code/controllers/subsystem/minimum_spawns.dm new file mode 100644 index 0000000000..e45c05d88f --- /dev/null +++ b/code/controllers/subsystem/minimum_spawns.dm @@ -0,0 +1,124 @@ +SUBSYSTEM_DEF(min_spawns) + name = "Minimum Spawns" + init_order = INIT_ORDER_DEFAULT + flags = SS_BACKGROUND + wait = 2 + var/snaxi_snowflake_check = FALSE + var/list/active_spawns = list() // lavaland, snaxi, etc. primary spawn list + var/list/active_spawns_2 = list() // snaxi underground, etc. secondary spawn list + var/list/valid_mining_turfs = list() // lavaland/snaxi turfs + var/list/valid_mining_turfs_2 = list() // snaxi underground turfs + +GLOBAL_LIST_INIT(minimum_lavaland_spawns, list( + /obj/structure/spawner/lavaland, + /obj/structure/spawner/lavaland/goliath, + /obj/structure/spawner/lavaland/legion, + /mob/living/simple_animal/hostile/megafauna/dragon, + /mob/living/simple_animal/hostile/megafauna/colossus, + /mob/living/simple_animal/hostile/megafauna/bubblegum +)) + +GLOBAL_LIST_INIT(minimum_snow_spawns, list( + /obj/structure/spawner/ice_moon, + /obj/structure/spawner/ice_moon/polarbear +)) +GLOBAL_LIST_INIT(minimum_snow_under_spawns, list( + /obj/structure/spawner/ice_moon/demonic_portal, + /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp, + /obj/structure/spawner/ice_moon/demonic_portal/snowlegion +)) + +// step 1: check for which list(s) to use - done +// step 2: check for caves - done +// step 3: check for mobs - done +// step 4: start throwing shit down - done +// step 5: snaxi support - done? + +/datum/controller/subsystem/min_spawns/Initialize(start_timeofday) + if(SSmapping.config.map_name == "Snow Taxi") //todo: recognizing maps that aren't lavaland mining but are also not snaxi + active_spawns = GLOB.minimum_snow_spawns + active_spawns_2 = GLOB.minimum_snow_under_spawns + snaxi_snowflake_check = TRUE + else + active_spawns = GLOB.minimum_lavaland_spawns + if(!active_spawns) + flags = SS_NO_FIRE + return + // borrowing this from auxbase code - see code\modules\mining\aux_base.dm + if(snaxi_snowflake_check) + for(var/z_level in SSmapping.levels_by_trait(ZTRAIT_ICE_RUINS)) + for(var/turf/TT in Z_TURFS(z_level)) + if(!isarea(TT.loc)) + continue + var/area/A = TT.loc + if(!A.mob_spawn_allowed) + continue + if(!istype(TT, /turf/open/floor/plating/asteroid)) + continue + valid_mining_turfs.Add(TT) + for(var/z_level in SSmapping.levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND)) + for(var/turf/TT in Z_TURFS(z_level)) + if(!isarea(TT.loc)) + continue + var/area/A = TT.loc + if(!A.mob_spawn_allowed) + continue + if(!istype(TT, /turf/open/floor/plating/asteroid)) + continue + valid_mining_turfs_2.Add(TT) + else + for(var/z_level in SSmapping.levels_by_trait(ZTRAIT_MINING)) + for(var/turf/TT in Z_TURFS(z_level)) + if(!isarea(TT.loc)) + continue + var/area/A = TT.loc + if(!A.mob_spawn_allowed) + continue + if(!istype(TT, /turf/open/floor/plating/asteroid)) + continue + valid_mining_turfs.Add(TT) + if(!valid_mining_turfs) + flags = SS_NO_FIRE + return + +/datum/controller/subsystem/min_spawns/fire(resumed) + if(active_spawns.len) + var/turf/RT = pick_n_take(valid_mining_turfs) //Pick a random mining Z-level turf + var/MS_tospawn = pick_n_take(active_spawns) + for(var/mob/living/simple_animal/hostile/H in urange(36,RT)) //prevents mob clumps + if((ispath(MS_tospawn, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 40) + active_spawns.Add(MS_tospawn) + return //let's try not to dump megas too close to each other? + if((ispath(MS_tospawn, /obj/structure/spawner) || istype(H, /obj/structure/spawner)) && get_dist(src, H) <= 24) + active_spawns.Add(MS_tospawn) + return //let's at least /try/ to space these out? + for(var/obj/structure/spawner/LT in urange(36,RT)) //prevents tendril/mega clumps + if((ispath(MS_tospawn, /mob/living/simple_animal/hostile/megafauna)) && get_dist(src, LT) <= 40) + active_spawns.Add(MS_tospawn) + return //let's try not to dump megas too close to each other? + if((ispath(MS_tospawn, /obj/structure/spawner)) && get_dist(src, LT) <= 24) + active_spawns.Add(MS_tospawn) + return //let's at least /try/ to space these out? + // man the overhead on this is gonna SUCK + new MS_tospawn(RT) + if(active_spawns_2.len) + var/turf/RT = pick_n_take(valid_mining_turfs_2) //Pick a random mining Z-level turf + var/MS2_tospawn = pick_n_take(active_spawns_2) + for(var/mob/living/simple_animal/hostile/H in urange(36,RT)) //prevents mob clumps + if((ispath(MS2_tospawn, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 40) + active_spawns_2.Add(MS2_tospawn) + return //let's try not to dump megas too close to each other? + if((ispath(MS2_tospawn, /obj/structure/spawner) || istype(H, /obj/structure/spawner)) && get_dist(src, H) <= 24) + active_spawns_2.Add(MS2_tospawn) + return //let's at least /try/ to space these out? + for(var/obj/structure/spawner/LT in urange(36,RT)) //prevents tendril/mega clumps + if((ispath(MS2_tospawn, /mob/living/simple_animal/hostile/megafauna)) && get_dist(src, LT) <= 40) + active_spawns_2.Add(MS2_tospawn) + return //let's try not to dump megas too close to each other? + if((ispath(MS2_tospawn, /obj/structure/spawner)) && get_dist(src, LT) <= 24) + active_spawns.Add(MS2_tospawn) + return //let's at least /try/ to space these out? + // man the overhead on this is gonna SUCK + new MS2_tospawn(RT) + if(!active_spawns.len && !active_spawns_2.len) + flags = SS_NO_FIRE diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 933eaf082e..3fa500b748 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -114,14 +114,12 @@ description = "..." suffix = "lavaland_surface_sloth.dmm" // Generates nothing but atmos runtimes and salt - cost = 0 /datum/map_template/ruin/lavaland/ratvar name = "Dead God" id = "ratvar" - description = "Ratvars final resting place." + description = "Ratvar's final resting place." suffix = "lavaland_surface_dead_ratvar.dmm" - cost = 0 allow_duplicates = FALSE /datum/map_template/ruin/lavaland/hierophant @@ -137,7 +135,6 @@ id = "blooddrunk" description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them." suffix = "lavaland_surface_blooddrunk1.dmm" - cost = 0 allow_duplicates = FALSE //will only spawn one variant of the ruin /datum/map_template/ruin/lavaland/blood_drunk_miner/guidance diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 1fbeee7523..07e7d70e5a 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -337,6 +337,7 @@ T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) /// Spawns a random mob or megafauna in the tunnel + /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T) if(!isarea(loc)) return diff --git a/tgstation.dme b/tgstation.dme index f6cc9ea78f..402e8ae513 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -313,6 +313,7 @@ #include "code\controllers\subsystem\materials.dm" #include "code\controllers\subsystem\medals.dm" #include "code\controllers\subsystem\minimaps.dm" +#include "code\controllers\subsystem\minimum_spawns.dm" #include "code\controllers\subsystem\minor_mapping.dm" #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\nightshift.dm"