Files
Bubberstation/code/controllers/subsystem/minor_mapping.dm
Ben10OmintrixandGitHub fc55a930a9 Baby stoats can become adults (#96491)
## About The Pull Request
Baby stoats can now grow into adult stoats. ive also included kits into
the spawn pool of maints, (the overall chance of running into a stoat
whether adult/baby remains the same), and you can also now find baby
stoats rummaging through bins. since baby stoats are cute ive made their
growth rates slow so people can enjoy them at their youths for longer.

## Why It's Good For The Game
fixes an oversight.

## Changelog
🆑
fix: baby stoats can now become adults
add: baby stoats are added to the spawn pool of maints, (the overall
chance of running into a stoat whether adult/baby remains the same)
/🆑
2026-06-15 15:41:27 +12:00

135 lines
4.6 KiB
Plaintext

#define PROB_SPIDER_REPLACEMENT 50
SUBSYSTEM_DEF(minor_mapping)
name = "Minor Mapping"
dependencies = list(
/datum/controller/subsystem/mapping,
/datum/controller/subsystem/atoms,
)
ss_flags = SS_NO_FIRE
///a list of vermin we pick from to spawn.
var/list/vermin_chances = list(
/mob/living/basic/mouse = 72,
/mob/living/basic/snail = 16,
/mob/living/basic/stoat = 7,
/mob/living/basic/stoat/kit = 3,
/mob/living/basic/regal_rat/controlled = 2,
)
/datum/controller/subsystem/minor_mapping/Initialize()
// 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.
#if defined(MAP_TEST) || defined(UNIT_TESTS)
return SS_INIT_NO_NEED
#else
trigger_migration(CONFIG_GET(number/mice_roundstart))
place_satchels(satchel_amount = 2)
var/weakpoint_spawns = 3
if(HAS_TRAIT(SSstation, STATION_TRAIT_SPAWN_WEAKPOINTS))
weakpoint_spawns = rand(4,8)
weakpoint_spawns += SSmapping.current_map.bonus_weakpoints //This will add 0 by default, or additional on large maps where it's included in the config.
place_weakpoints(weakpoint_spawns)
return SS_INIT_SUCCESS
#endif
/// Spawns some critters on exposed wires, usually but not always mice
/datum/controller/subsystem/minor_mapping/proc/trigger_migration(to_spawn=10)
var/list/exposed_wires = find_exposed_wires()
var/turf/open/proposed_turf
while((to_spawn > 0) && exposed_wires.len)
proposed_turf = pick_n_take(exposed_wires)
if (!valid_mouse_turf(proposed_turf))
continue
to_spawn--
var/picked_path
if(HAS_TRAIT(SSstation, STATION_TRAIT_SPIDER_INFESTATION) && prob(PROB_SPIDER_REPLACEMENT))
picked_path = /mob/living/basic/spider/maintenance
else
picked_path = pick_weight(vermin_chances)
new picked_path(proposed_turf)
/// Returns true if a mouse won't die if spawned on this turf
/datum/controller/subsystem/minor_mapping/proc/valid_mouse_turf(turf/open/proposed_turf)
if(!istype(proposed_turf))
return FALSE
var/datum/gas_mixture/turf/turf_gasmix = proposed_turf.air
var/turf_temperature = proposed_turf.temperature
return turf_gasmix.has_gas(/datum/gas/oxygen, 5) && turf_temperature < NPC_DEFAULT_MAX_TEMP && turf_temperature > NPC_DEFAULT_MIN_TEMP
/datum/controller/subsystem/minor_mapping/proc/place_satchels(satchel_amount)
var/list/turfs = find_satchel_suitable_turfs()
///List of areas where satchels should not be placed.
var/list/blacklisted_area_types = list(
/area/station/holodeck,
/area/space/nearstation,
/area/station/solars,
)
while(turfs.len && satchel_amount > 0)
var/turf/turf = pick_n_take(turfs)
if(is_type_in_list(get_area(turf), blacklisted_area_types))
continue
var/obj/item/storage/backpack/satchel/flat/flat_satchel = new(turf)
SEND_SIGNAL(flat_satchel, COMSIG_OBJ_HIDE, turf.underfloor_accessibility)
satchel_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 += Z_TURFS(z)
for(var/turf/open/floor/plating/T in all_turfs)
if(T.is_blocked_turf())
continue
//dont include multiz cables in the list because repairing them sucks
var/cable = locate(/obj/structure/cable) in T
if(cable && !istype(cable, /obj/structure/cable/multilayer/multiz))
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/turf/detected_turf as anything in Z_TURFS(z))
if(isfloorturf(detected_turf) && detected_turf.underfloor_accessibility == UNDERFLOOR_HIDDEN)
suitable += detected_turf
return shuffle(suitable)
/// This behaves nearly the same as spawning underfloot satchels, but instead spawns weakpoints.
/datum/controller/subsystem/minor_mapping/proc/place_weakpoints(weakpoint_amount)
if(weakpoint_amount == 0)
return
var/list/turfs = find_satchel_suitable_turfs()
///List of areas where weakpoints should not be placed.
var/list/blacklisted_area_types = get_blacklist_areas() + /area/station/maintenance
while(turfs.len && weakpoint_amount > 0)
var/turf/turf = pick_n_take(turfs)
if(is_type_in_list(get_area(turf), blacklisted_area_types))
continue
var/obj/effect/weakpoint/new_point = new(turf)
SEND_SIGNAL(new_point, COMSIG_OBJ_HIDE, turf.underfloor_accessibility)
weakpoint_amount--
/**
* Areas for minor_mapping procs to avoid. Mutate or adjust based on use case.
*/
/datum/controller/subsystem/minor_mapping/proc/get_blacklist_areas()
var/list/blacklist_areas = list(
/area/station/holodeck,
/area/space/nearstation,
/area/station/solars,
)
return blacklist_areas
#undef PROB_SPIDER_REPLACEMENT