diff --git a/hyperstation/code/mobs/mimic.dm b/hyperstation/code/mobs/mimic.dm index 2f553cde..3128cbd3 100644 --- a/hyperstation/code/mobs/mimic.dm +++ b/hyperstation/code/mobs/mimic.dm @@ -10,7 +10,7 @@ maxHealth = 38 health = 38 turns_per_move = 5 - move_to_delay = 3 + move_to_delay = 2 speed = 0 see_in_dark = 6 pass_flags = PASSTABLE @@ -30,7 +30,7 @@ vision_range = 2 aggro_vision_range = 9 wander = TRUE - minbodytemp = 250 //VERY weak to cold + minbodytemp = 250 //weak to cold maxbodytemp = 1500 pressure_resistance = 600 var/unstealth = FALSE @@ -40,7 +40,7 @@ . = ..() // When initialized, make sure they take the form of something. unstealth = FALSE - Mimictransform() + trytftorandomobject() /mob/living/simple_animal/hostile/hs13mimic/attack_hand(mob/living/carbon/human/M) . = ..() @@ -196,6 +196,10 @@ else Mimictransform() + +//Event control + + /datum/round_event_control/mimic_infestation name = "Mimic Infestation" typepath = /datum/round_event/mimic_infestation @@ -208,23 +212,23 @@ var/static/list/station_areas_blacklist = typecacheof(/area/space, /area/mine, /area/ruin, + /area/hallway, /area/engine/supermatter, /area/engine/atmospherics_engine, /area/engine/engineering/reactor_core, /area/engine/engineering/reactor_control, /area/ai_monitored/turret_protected/ai, /area/layenia/cloudlayer, - /area/asteroid/nearstation, - /area/science/server, - /area/science/explab - /area/security/labor, + /area/asteroid/nearstation, + /area/science/server, + /area/science/explab, /area/security/processing) var/spawncount = 1 fakeable = FALSE /datum/round_event/mimic_infestation/setup() announceWhen = rand(announceWhen, announceWhen + 50) - spawncount = rand(5, 8) + spawncount = rand(4, 7) /datum/round_event/mimic_infestation/announce(fake) priority_announce("Unidentified lifesigns detected aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg') @@ -247,22 +251,35 @@ var/numOfPeople for(var/mob/living/carbon/H in place) numOfPeople++ - message_admins("Found [H] in [place]!") + break if(numOfPeople > 0) - message_admins("Area [place] is ineligible as there are [numOfPeople] there.") eligible_areas -= place - var/area/pickedArea = pick(eligible_areas) - message_admins("The area that has been picked is [pickedArea]") - var/list/turf/t = get_area_turfs(pickedArea, SSmapping.station_start) - for(var/turf/thisTurf in t) // now we check if it's a closed turf and yeet it from the list - if(isclosedturf(thisTurf)) - t -= thisTurf - - while(spawncount >= 1 && t.len) - var/turf/pickedTurf = pick(t) + var/validFound = FALSE + var/list/turf/validTurfs = list() + var/area/pickedArea + while(!validFound || !eligible_areas.len) + pickedArea = pick_n_take(eligible_areas) + var/list/turf/t = get_area_turfs(pickedArea, SSmapping.station_start) + for(var/turf/thisTurf in t) // now we check if it's a closed turf, cold turf or occupied turf and yeet it + if(isclosedturf(thisTurf) || thisTurf.temperature <= T0C) + t -= thisTurf + else + for(var/obj/O in thisTurf) + if(O.density && !(istype(O, /obj/structure/table))) + t -= thisTurf + break + if(t.len >= spawncount) //Is the number of available turfs equal or bigger than spawncount? + validFound = TRUE + validTurfs = t + + if(!eligible_areas.len) + message_admins("No eligible areas for spawning mimics.") + return FALSE + + notify_ghosts("A mimic has spawned in [pickedArea]!", enter_link="(Click to orbit)", source=pickedArea, action=NOTIFY_ORBIT) + while(spawncount >= 1 && validTurfs.len) + var/turf/pickedTurf = pick_n_take(validTurfs) var/spawn_type = /mob/living/simple_animal/hostile/hs13mimic spawn_atom_to_turf(spawn_type, pickedTurf, 1, FALSE) - t -= pickedTurf //So we don't spawn them on top of eachother spawncount-- - notify_ghosts("A mimic has spawned in [pickedTurf]!", enter_link="(Click to orbit)", source=pickedTurf, action=NOTIFY_ORBIT)