diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index ada9482cfd6..1eb2e4129c9 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -1,9 +1,9 @@
-/* Alien shit!
+/* Alien structures!
* Contains:
* structure/alien
* Resin
* Weeds
- * Egg
+ * Eggs
*/
#define WEED_NORTH_EDGING "north"
@@ -80,7 +80,7 @@
canSmoothWith = list(SMOOTH_GROUP_ALIEN_WALLS)
/obj/structure/alien/resin/wall/BlockSuperconductivity()
- return 1
+ return TRUE
/obj/structure/alien/resin/membrane
name = "resin membrane"
@@ -186,13 +186,14 @@
* Egg
*/
-//for the status var
+///Used in the /status var
#define BURST 0
#define BURSTING 1
#define GROWING 2
#define GROWN 3
-#define MIN_GROWTH_TIME 1800 //time it takes to grow a hugger
-#define MAX_GROWTH_TIME 3000
+///time it takes to grow a hugger
+#define MIN_GROWTH_TIME 3 MINUTES
+#define MAX_GROWTH_TIME 5 MINUTES
/obj/structure/alien/egg
name = "egg"
@@ -202,9 +203,13 @@
anchored = TRUE
max_integrity = 100
integrity_failure = 5
- var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
layer = MOB_LAYER
flags_2 = CRITICAL_ATOM_2
+ /*can be GROWING, GROWN or BURST; all mutually exclusive. GROWING has the egg in the grown state, and it will take 180-300 seconds for it to advance to the hatched state
+ *In the GROWN state, an alien egg can be destroyed or attacked by a xenomorph to force it to be burst, going near an egg in this state will also cause it to burst if you can be infected by a face hugger
+ *In the BURST/BURSTING state, the alien egg can be removed by being attacked by a alien or any other weapon
+ **/
+ var/status = GROWING
/obj/structure/alien/egg/grown
status = GROWN
@@ -214,14 +219,13 @@
status = BURST
icon_state = "egg_hatched"
-/obj/structure/alien/egg/New()
+/obj/structure/alien/egg/Initialize(mapload)
+ . = ..()
new /obj/item/clothing/mask/facehugger(src)
- ..()
if(status == BURST)
obj_integrity = integrity_failure
else if(status != GROWN)
- spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME))
- Grow()
+ addtimer(CALLBACK(src, PROC_REF(grow)), rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME))
/obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user)
return attack_hand(user)
@@ -239,44 +243,46 @@
return
if(GROWN)
to_chat(user, "You retrieve the child.")
- Burst(0)
+ burst(FALSE)
return
else
to_chat(user, "It feels slimy.")
user.changeNext_move(CLICK_CD_MELEE)
-/obj/structure/alien/egg/proc/GetFacehugger()
+/obj/structure/alien/egg/proc/getFacehugger()
return locate(/obj/item/clothing/mask/facehugger) in contents
-/obj/structure/alien/egg/proc/Grow()
+/obj/structure/alien/egg/proc/grow()
icon_state = "egg"
status = GROWN
AddComponent(/datum/component/proximity_monitor)
-/obj/structure/alien/egg/proc/Burst(kill = TRUE) //drops and kills the hugger if any is remaining
+///Need to carry the kill from Burst() to Hatch(), this section handles the alien opening the egg
+/obj/structure/alien/egg/proc/burst(kill)
if(status == GROWN || status == GROWING)
icon_state = "egg_hatched"
flick("egg_opening", src)
status = BURSTING
qdel(GetComponent(/datum/component/proximity_monitor))
- spawn(15)
- status = BURST
- var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
- if(child)
- child.loc = get_turf(src)
- if(kill && istype(child))
- child.Die()
- else
- for(var/mob/M in range(1,src))
- if(CanHug(M))
- child.Attach(M)
- break
+ addtimer(CALLBACK(src, PROC_REF(hatch)), 1.5 SECONDS)
+
+///We now check HOW the hugger is hatching, kill carried from Burst() and obj_break()
+/obj/structure/alien/egg/proc/hatch(kill)
+ status = BURST
+ var/obj/item/clothing/mask/facehugger/child = getFacehugger()
+ child.forceMove(get_turf(src))
+ if(kill)
+ child.Die()
+ for(var/mob/M in range(1, src))
+ if(CanHug(M))
+ child.Attach(M)
+ break
/obj/structure/alien/egg/obj_break(damage_flag)
if(!(flags & NODECONSTRUCT))
if(status != BURST)
- Burst(kill = TRUE)
+ burst(kill = TRUE)
/obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
@@ -292,7 +298,7 @@
if(C.stat == CONSCIOUS && C.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
return
- Burst(0)
+ burst(FALSE)
#undef BURST
#undef BURSTING