Files
Yogstation/code/controllers/subsystem/minor_mapping.dm
John Willard b5718d1994 You can no longer stack machines on one tile (#19683)
* Ports climbable & blocked turf

Adds the climbable element to replace the copy paste code between machines and structures
Ports the code improvements to blocked turf checks, commenting back in its uses that tattax had added but couldnt get functional (fixes ethereal jaunt & hierophant teleporting)
Ports over LADYADDASSOCLIST code improvements, this has no effect in-game and mostly in the codebase, it's only ever used in two other locations total.
Fixes being able to stack several machines on one tile

* fixes climbing on crates

* Update climbable.dm

* merge conflicts r awesome
2023-07-28 22:29:22 +00:00

76 lines
2.4 KiB
Plaintext

#define REGAL_RAT_CHANCE 2
#define PLAGUE_RAT_CHANCE 0
SUBSYSTEM_DEF(minor_mapping)
name = "Minor Mapping"
init_order = INIT_ORDER_MINOR_MAPPING
flags = SS_NO_FIRE
/datum/controller/subsystem/minor_mapping/Initialize(timeofday)
#ifdef UNIT_TESTS // This whole subsystem just introduces a lot of odd confounding variables into unit test situations, so let's just not bother with doing an initialize here.
return SS_INIT_NO_NEED
#else
trigger_migration(CONFIG_GET(number/mice_roundstart))
place_satchels()
return SS_INIT_SUCCESS
#endif // the mice are easily the bigger problem, but let's just avoid anything that could cause some bullshit.
/datum/controller/subsystem/minor_mapping/proc/trigger_migration(num_mice = 10, special = TRUE)
var/list/exposed_wires = find_exposed_wires()
var/mob/living/simple_animal/M
var/turf/proposed_turf
while((num_mice > 0) && exposed_wires.len)
proposed_turf = pick_n_take(exposed_wires)
if(!M)
if(special && prob(REGAL_RAT_CHANCE))
M = new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf)
else if(special && prob(PLAGUE_RAT_CHANCE))
M = new /mob/living/simple_animal/hostile/rat/plaguerat(proposed_turf)
notify_ghosts("A plague \a [M] has migrated into the station!", source = M, action=NOTIFY_ORBIT, header="Something Interesting!")
else
M = new /mob/living/simple_animal/mouse(proposed_turf)
else
M.forceMove(proposed_turf)
if(M.environment_is_safe())
num_mice -= 1
M = null
/datum/controller/subsystem/minor_mapping/proc/place_satchels(amount=10)
var/list/turfs = find_satchel_suitable_turfs()
while(turfs.len && amount > 0)
var/turf/T = pick_n_take(turfs)
var/obj/item/storage/backpack/satchel/flat/S = new(T)
S.hide(intact=TRUE)
amount--
/proc/find_exposed_wires()
var/list/exposed_wires = list()
var/list/all_turfs
for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
all_turfs += block(locate(1,1,z), locate(world.maxx,world.maxy,z))
for(var/turf/open/floor/plating/T in all_turfs)
if(T.is_blocked_turf())
continue
if(locate(/obj/structure/cable) in T)
exposed_wires += T
return shuffle(exposed_wires)
/proc/find_satchel_suitable_turfs()
var/list/suitable = list()
for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
for(var/t in block(locate(1,1,z), locate(world.maxx,world.maxy,z)))
if(isfloorturf(t) && !isplatingturf(t))
suitable += t
return shuffle(suitable)
#undef REGAL_RAT_CHANCE
#undef PLAGUE_RAT_CHANCE