diff --git a/aurorastation.dme b/aurorastation.dme
index 64638cb3df6..5d5eb15abbc 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -1544,7 +1544,6 @@
#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm"
#include "code\modules\mob\living\carbon\alien\larva\larva.dm"
#include "code\modules\mob\living\carbon\alien\larva\life.dm"
-#include "code\modules\mob\living\carbon\alien\larva\powers.dm"
#include "code\modules\mob\living\carbon\alien\larva\progression.dm"
#include "code\modules\mob\living\carbon\brain\brain.dm"
#include "code\modules\mob\living\carbon\brain\brain_item.dm"
@@ -1598,6 +1597,8 @@
#include "code\modules\mob\living\carbon\human\species\station\station.dm"
#include "code\modules\mob\living\carbon\human\species\station\tajaran_subspecies.dm"
#include "code\modules\mob\living\carbon\human\species\station\vaurca_subspecies.dm"
+#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm"
+#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_facehugger.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm"
diff --git a/code/game/objects/structures/alien/egg.dm b/code/game/objects/structures/alien/egg.dm
index af2a9018749..be0ec7b9f0c 100644
--- a/code/game/objects/structures/alien/egg.dm
+++ b/code/game/objects/structures/alien/egg.dm
@@ -1,11 +1,18 @@
+#define BURST 0
+#define BURSTING 1
+#define GROWING 2
+#define GROWN 3
+
#define MAX_PROGRESS 100
+
/obj/structure/alien/egg
desc = "It looks like a weird egg."
name = "egg"
icon_state = "egg_growing"
density = 0
anchored = 1
+ var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
var/progress = 0
/obj/structure/alien/egg/Initialize()
@@ -16,82 +23,74 @@
STOP_PROCESSING(SSprocessing, src)
return ..()
-/obj/structure/alien/egg/CanUseTopic(var/mob/user)
- return isobserver(user) ? STATUS_INTERACTIVE : STATUS_CLOSE
-
-/obj/structure/alien/egg/Topic(href, href_list)
- if(..())
- return 1
-
- if(href_list["spawn"])
- attack_ghost(usr)
-
/obj/structure/alien/egg/process()
progress++
if(progress >= MAX_PROGRESS)
- for(var/mob/M in dead_mob_list)
- if(istype(M,/mob/dead) && M.client && M.client.prefs && (MODE_XENOMORPH in M.client.prefs.be_special_role))
- M << "[ghost_follow_link(src, M)] An alien is ready to hatch! (spawn)"
+ Grow()
STOP_PROCESSING(SSprocessing, src)
update_icon()
-/obj/structure/alien/egg/update_icon()
- if(progress == -1)
+/obj/structure/alien/egg/attack_hand(user as mob)
+ var/mob/living/carbon/M = user
+ if(!istype(M) || !(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs))
+ return
+
+ switch(status)
+ if(BURST)
+ user << "You clear the hatched egg."
+ qdel(src)
+ return
+ if(GROWING)
+ user << "The child is not developed yet."
+ return
+ if(GROWN)
+ user << "You retrieve the child."
+ Burst(0)
+ return
+
+/obj/structure/alien/egg/proc/GetFacehugger()
+ return locate(/obj/item/clothing/mask/facehugger) in contents
+
+/obj/structure/alien/egg/proc/Grow()
+ icon_state = "egg"
+ status = GROWN
+ new /obj/item/clothing/mask/facehugger(src)
+ return
+
+/obj/structure/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
+ if(status == GROWN || status == GROWING)
icon_state = "egg_hatched"
- else if(progress < MAX_PROGRESS)
- icon_state = "egg_growing"
+ flick("egg_opening", src)
+ status = BURSTING
+ addtimer(CALLBACK(src, .proc/givefacehugger, kill), 15)
+
+/obj/structure/alien/egg/proc/givefacehugger(var/kill = 1)
+ var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
+ status = BURST
+ child.loc = get_turf(src)
+
+ if(kill && istype(child))
+ child.Die()
else
- icon_state = "egg"
+ for(var/mob/M in range(1,src))
+ if(CanHug(M))
+ child.Attach(M)
+ break
-/obj/structure/alien/egg/attack_ghost(var/mob/dead/observer/user)
- if(progress == -1) //Egg has been hatched.
- return
+/obj/structure/alien/egg/HasProximity(atom/movable/AM as mob|obj)
+ if(status == GROWN)
+ if(!CanHug(AM))
+ return
- if(progress < MAX_PROGRESS)
- user << "\The [src] has not yet matured."
- return
+ var/mob/living/carbon/C = AM
+ if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST)
+ return
- if(!user.MayRespawn(1))
- return
+ Burst(0)
- // Check for bans properly.
- if(jobban_isbanned(user, "Xenomorph"))
- user << "You are banned from playing a Xenomorph."
- return
-
- var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes")
-
- if(!src || confirm != "Yes")
- return
-
- if(!user || !user.ckey)
- return
-
- if(progress == -1) //Egg has been hatched.
- user << "Too slow..."
- return
-
- flick("egg_opening",src)
- progress = -1 // No harvesting pls.
- sleep(5)
-
- if(!src || !user)
- visible_message("\The [src] writhes with internal motion, but nothing comes out.")
- progress = MAX_PROGRESS // Someone else can have a go.
- return // What a pain.
-
- // Create the mob, transfer over key.
- var/mob/living/carbon/alien/larva/larva = new(get_turf(src))
- larva.ckey = user.ckey
- xenomorphs.add_antagonist(larva.mind, 1)
- spawn(-1)
- if(user) qdel(user) // Remove the keyless ghost if it exists.
-
- visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!")
-
- // Turn us into a hatched egg.
- name = "hatched alien egg"
- desc += " This one has hatched."
- update_icon()
+#undef BURST
+#undef BURSTING
+#undef GROWING
+#undef GROWN
#undef MAX_PROGRESS
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
index 94019494d02..446e1f9d8ca 100644
--- a/code/game/objects/structures/lamarr_cage.dm
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -63,7 +63,8 @@
if (src.destroyed)
return
else
- usr << "You kick the lab cage."
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ user << "You kick the lab cage."
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << "[user] kicks the lab cage."
@@ -74,187 +75,9 @@
/obj/structure/lamarr/proc/Break()
if(occupied)
- new /obj/item/clothing/mask/lamarr(src.loc)
+ new /obj/item/clothing/mask/facehugger/lamarr(src.loc)
occupied = 0
update_icon()
return
-var/const/MIN_ACTIVE_TIME = 200 //time between being dropped and going idle
-var/const/MAX_ACTIVE_TIME = 400
-/obj/item/clothing/mask/lamarr
- name = "Lamarr"
- desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite?
- gender = FEMALE
- icon = 'icons/mob/alien.dmi'
- icon_state = "facehugger"
- item_state = "facehugger"
- w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4
- flags = PROXMOVE
- body_parts_covered = FACE|EYES
- throw_range = 5
-
- var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
- var/strength = 5
- var/attached = 0
- var/sterile = 1
-
-/obj/item/clothing/mask/lamarr/attack_hand(user as mob)
-
- if((stat == CONSCIOUS))
- if(Attach(user))
- return
-
- ..()
-
-/obj/item/clothing/mask/lamarr/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
- . = ..()
- user.drop_from_inventory(src)
- if(hit_zone == "head")
- Attach(target)
-
-
-/obj/item/clothing/mask/lamarr/examine(mob/user)
- ..(user)
- switch(stat)
- if(DEAD,UNCONSCIOUS)
- user << "[src] is not moving."
- if(CONSCIOUS)
- user << "[src] seems to be active."
- if (sterile)
- user << "It looks like the proboscis has been removed."
- return
-
-/obj/item/clothing/mask/lamarr/attackby(obj/item/I, mob/user)
- if(I.force)
- user.do_attack_animation(src)
- Die()
- return
-
-/obj/item/clothing/mask/lamarr/bullet_act()
- Die()
- return
-
-/obj/item/clothing/mask/lamarr/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > T0C+80)
- Die()
- return
-
-/obj/item/clothing/mask/lamarr/equipped(mob/M)
- ..()
- Attach(M)
-
-/obj/item/clothing/mask/lamarr/Crossed(atom/target)
- HasProximity(target)
- return
-
-/obj/item/clothing/mask/lamarr/on_found(mob/finder as mob)
- if(stat == CONSCIOUS)
- HasProximity(finder)
- return 1
- return
-
-/obj/item/clothing/mask/lamarr/HasProximity(atom/movable/AM as mob|obj)
- if(CanHug(AM))
- Attach(AM)
-
-/obj/item/clothing/mask/lamarr/throw_at(atom/target, range, speed)
- ..()
- if(stat == CONSCIOUS)
- icon_state = "[initial(icon_state)]_thrown"
- spawn(15)
- if(icon_state == "[initial(icon_state)]_thrown")
- icon_state = "[initial(icon_state)]"
-
-/obj/item/clothing/mask/lamarr/proc/Attach(M as mob)
-
- if((!iscarbon(M)))
- return
-
- if(attached)
- return
-
- var/mob/living/L = M //just so I don't need to use :
-
- if(loc == L) return
- if(stat != CONSCIOUS) return
- if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
-
- L.visible_message("[src] leaps at [L]'s face!")
-
-
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- if(H.head && H.head.flags & AIRTIGHT)
- H.visible_message("\The [src] smashes against [H]'s [H.head]!")
- Die()
- return
-
-
- if(iscarbon(M))
- var/mob/living/carbon/target = L
-
- if(target.wear_mask)
- if(prob(20)) return
- var/obj/item/clothing/W = target.wear_mask
- if(!W.canremove) return
- target.drop_from_inventory(W)
-
- target.visible_message("\The [src] tears [W] off of [target]'s face!")
-
- target.equip_to_slot(src, slot_wear_mask)
- target.contents += src // Monkey sanity check - Snapshot
-
- GoIdle() //so it doesn't jump the people that tear it off
-
- return
-
-/obj/item/clothing/mask/lamarr/proc/GoActive()
- if(stat == DEAD || stat == CONSCIOUS)
- return
-
- stat = CONSCIOUS
- icon_state = "[initial(icon_state)]"
-
- return
-
-/obj/item/clothing/mask/lamarr/proc/GoIdle(var/min_time=MIN_ACTIVE_TIME, var/max_time=MAX_ACTIVE_TIME)
- if(stat == DEAD || stat == UNCONSCIOUS)
- return
-
-/* RemoveActiveIndicators() */
-
- stat = UNCONSCIOUS
- icon_state = "[initial(icon_state)]_inactive"
-
- spawn(rand(min_time,max_time))
- GoActive()
- return
-
-/obj/item/clothing/mask/lamarr/proc/Die()
- if(stat == DEAD)
- return
-
-/* RemoveActiveIndicators() */
-
- icon_state = "[initial(icon_state)]_dead"
- stat = DEAD
-
- src.visible_message("\The [src] curls up into a ball!")
-
- return
-
-/proc/CanHug(var/mob/M)
-
- if(!iscarbon(M))
- return 0
-
- var/mob/living/carbon/C = M
- if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
- return 0
-
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(H.head && (H.head.body_parts_covered & FACE) && !(H.head.item_flags & FLEXIBLEMATERIAL))
- return 0
- return 1
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index 5ca32e24d0e..79fb5e45376 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -1,5 +1,3 @@
-#define MIN_LARVA_BLOOD_DRINK 0.5
-
//Larvae regenerate health and nutrition from plasma and alien weeds.
/mob/living/carbon/alien/larva/handle_environment(var/datum/gas_mixture/environment)
@@ -13,22 +11,3 @@
adjustFireLoss(-1)
adjustToxLoss(-1)
adjustOxyLoss(-1)
-
-// Maybe not the -best- place but it's semiappropriate and fitting.
-// Drink the blood of your host!
-/mob/living/carbon/alien/larva/handle_chemicals_in_body()
- if(!loc)
- return
- if(!istype(loc, /obj/item/weapon/holder))
- return
- var/mob/living/carbon/human/M = loc.loc //ergh, replace with a flag sometime
- if(!istype(M))
- return
- if(M.vessel.total_volume > 0)
- M.vessel.trans_to(src,min(M.vessel.total_volume,MIN_LARVA_BLOOD_DRINK))
- update_progression()
- else
- src << "This host is depleted of blood..."
- leave_host()
-
-#undef MIN_LARVA_BLOOD_DRINK
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm
new file mode 100644
index 00000000000..fb03d42ba63
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm
@@ -0,0 +1,154 @@
+/obj/item/organ/xenos/alien_embryo
+ name = "alien embryo"
+ desc = "All slimy and yuck."
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "larva0_dead"
+ parent_organ = "chest"
+ organ_tag = "alien embryo"
+ origin_tech = list(TECH_BIO = 5)
+ var/stage = 0
+
+
+/obj/item/organ/xenos/alien_embryo/Destroy()
+ if(owner)
+ owner.status_flags &= ~(XENO_HOST)
+ RemoveInfectionImages(owner)
+ return ..()
+
+
+/obj/item/organ/xenos/alien_embryo/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
+ ..(target, affected)
+ if(owner && ishuman(owner))
+ START_PROCESSING(SSprocessing, src)
+ AddInfectionImages(owner)
+
+/obj/item/organ/xenos/alien_embryo/removed(var/mob/living/user)
+ if(owner)
+ owner.status_flags &= ~(XENO_HOST)
+ RemoveInfectionImages(owner)
+ ..(user)
+
+
+/obj/item/organ/xenos/alien_embryo/process()
+
+ ..()
+
+ if(!owner)
+ return
+
+ if(stage < 5 && prob(3))
+ stage++
+ RefreshInfectionImage(owner)
+
+ switch(stage)
+ if(2, 3)
+ if(prob(1))
+ owner.emote("sneeze")
+ if(prob(1))
+ owner.emote("cough")
+ if(prob(1))
+ owner << "Your throat feels sore."
+ if(prob(1))
+ owner << "Mucous runs down the back of your throat."
+ if(4)
+ if(prob(1))
+ owner.emote("sneeze")
+ if(prob(1))
+ owner.emote("cough")
+ if(prob(2))
+ owner << "Your muscles ache."
+ if(prob(20))
+ owner.take_organ_damage(1)
+ if(prob(2))
+ owner << "Your stomach hurts."
+ if(prob(20))
+ owner.adjustToxLoss(1)
+ owner.updatehealth()
+ if(5)
+ owner << "You feel something tearing its way out of your stomach!"
+ owner.adjustToxLoss(10)
+ owner.updatehealth()
+ if(prob(50))
+ AttemptGrow()
+
+/obj/item/organ/xenos/alien_embryo/proc/AttemptGrow()
+ var/list/candidates = get_alien_candidates()
+ var/picked = null
+
+ // To stop clientless larva, we will check that our host has a client
+ // if we find no ghosts to become the alien. If the host has a client
+ // he will become the alien but if he doesn't then we will set the stage
+ // to 2, so we don't do a process heavy check everytime.
+
+ if(candidates.len)
+ picked = pick(candidates)
+ else if(owner.client)
+ picked = owner.key
+ else
+ stage = 4 // Let's try again later.
+ return
+
+ var/mob/living/carbon/alien/larva/new_xeno = new(owner.loc)
+ new_xeno.key = picked
+ new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
+ owner.apply_damage(500, BRUTE, "chest")
+ STOP_PROCESSING(SSprocessing, src)
+ qdel(src)
+
+/*----------------------------------------
+Proc: RefreshInfectionImage()
+Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens.
+----------------------------------------*/
+/obj/item/organ/xenos/alien_embryo/proc/RefreshInfectionImage()
+
+ for(var/mob/living/carbon/alien in player_list)
+
+ if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
+ continue
+
+ if(alien.client)
+ for(var/image/I in alien.client.images)
+ if(dd_hasprefix_case(I.icon_state, "infected"))
+ alien.client.images -= I
+ for(var/mob/living/L in mob_list)
+ if(iscarbon(L))
+ if(L.status_flags & XENO_HOST)
+ var/image/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[stage]")
+ alien.client.images += I
+
+/*----------------------------------------
+Proc: AddInfectionImages(C)
+Des: Checks if the passed mob (C) is infected with the alien egg, then gives each alien client an infected image at C.
+----------------------------------------*/
+/obj/item/organ/xenos/alien_embryo/proc/AddInfectionImages(var/mob/living/C)
+ if(C)
+
+ for(var/mob/living/carbon/alien in player_list)
+
+ if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
+ continue
+
+ if(alien.client)
+ if(C.status_flags & XENO_HOST)
+ var/image/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
+ alien.client.images += I
+
+/*----------------------------------------
+Proc: RemoveInfectionImage(C)
+Des: Removes the alien infection image from all aliens in the world located in passed mob (C).
+----------------------------------------*/
+
+/obj/item/organ/xenos/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C)
+
+ if(C)
+
+ for(var/mob/living/carbon/alien in player_list)
+
+ if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
+ continue
+
+ if(alien.client)
+ for(var/image/I in alien.client.images)
+ if(I.loc == C)
+ if(dd_hasprefix_case(I.icon_state, "infected"))
+ alien.client.images -= I
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
index d9f38982a67..4a756ddcbd7 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
@@ -35,28 +35,30 @@ var/const/MAX_ACTIVE_TIME = 400
/obj/item/clothing/mask/facehugger/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
. = ..()
user.drop_from_inventory(src)
- if(hit_zone == "head")
- Attach(target)
+ Attach(target)
-/obj/item/clothing/mask/facehugger/Initialize()
- if(config.aliens_allowed)
- . = ..()
- else
- . = INITIALIZE_HINT_QDEL
+
+/obj/item/clothing/mask/facehugger/attack(mob/living/target, mob/living/user, var/target_zone)
+ if(target && user && ishuman(target) && ishuman(user) && !user.stat)
+ user.drop_from_inventory(src)
+ Attach(target)
+ return
+ ..()
/obj/item/clothing/mask/facehugger/examine(mob/user)
..(user)
switch(stat)
if(DEAD,UNCONSCIOUS)
- user << "[src] is not moving."
+ user << "\The [src] is not moving."
if(CONSCIOUS)
- user << "[src] seems to be active."
+ user << "\The [src] seems to be active."
if (sterile)
user << "It looks like the proboscis has been removed."
return
/obj/item/clothing/mask/facehugger/attackby(obj/item/I, mob/user)
if(I.force)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(src)
Die()
return
@@ -103,18 +105,26 @@ var/const/MAX_ACTIVE_TIME = 400
throwing = 0
GoIdle(30,100) //stunned for a few seconds - allows throwing them to be useful for positioning but not as an offensive action (unless you're setting up a trap)
-/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
+/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M as mob)
- if((!iscorgi(M) && !iscarbon(M)))
+ if((!iscarbon(M)))
return
if(attached)
return
- var/mob/living/carbon/C = M
- if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
+ if(M.isSynthetic())
return
+ var/mob/living/carbon/human/C = M
+ if(istype(C) && locate(/obj/item/organ/xenos/alien_embryo) in C.internal_organs)
+ return
+
+ if(locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
+ return
+
+ if(!C.check_has_mouth())
+ return
attached++
spawn(MAX_IMPREGNATION_TIME)
@@ -126,13 +136,13 @@ var/const/MAX_ACTIVE_TIME = 400
if(stat != CONSCIOUS) return
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
- L.visible_message("[src] leaps at [L]'s face!")
+ L.visible_message("\The [src] leaps at \the [L]'s face!")
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(H.head && H.head.flags & HEADCOVERSMOUTH)
- H.visible_message("[src] smashes against [H]'s [H.head]!")
+ if(H.head && H.head.body_parts_covered & FACE)
+ H.visible_message("\The [src] smashes against the [H]'s \the [H.head]!")
Die()
return
@@ -146,18 +156,12 @@ var/const/MAX_ACTIVE_TIME = 400
if(!W.canremove) return
target.drop_from_inventory(W)
- target.visible_message("[src] tears [W] off of [target]'s face!")
+ target.visible_message("\The [src] tears \the [W] off of \the [target]'s face!")
target.equip_to_slot(src, slot_wear_mask)
target.contents += src // Monkey sanity check - Snapshot
if(!sterile) L.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
- else if (iscorgi(M))
- var/mob/living/simple_animal/corgi/corgi = M
- src.loc = corgi
- corgi.facehugger = src
- corgi.wear_mask = src
- //C.regenerate_icons()
GoIdle() //so it doesn't jump the people that tear it off
@@ -166,26 +170,24 @@ var/const/MAX_ACTIVE_TIME = 400
return
-/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob)
+/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/carbon/human/target as mob)
if(!target || target.wear_mask != src || target.stat == DEAD) //was taken off or something
return
if(!sterile)
//target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
- new /obj/item/alien_embryo(target)
+ var/obj/item/organ/affecting = target.get_organ("chest")
+ var/obj/item/organ/xenos/alien_embryo/kid = new(affecting)
+ kid.replaced(target,affecting)
target.status_flags |= XENO_HOST
- target.visible_message("[src] falls limp after violating [target]'s face!")
+ target.visible_message("\The [src] falls limp after violating \the [target]'s face!")
Die()
icon_state = "[initial(icon_state)]_impregnated"
- if(iscorgi(target))
- var/mob/living/simple_animal/corgi/C = target
- src.loc = get_turf(C)
- C.facehugger = null
else
- target.visible_message("[src] violates [target]'s face!")
+ target.visible_message("\The [src] violates \the [target]'s face!")
return
/obj/item/clothing/mask/facehugger/proc/GoActive()
@@ -219,10 +221,17 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "[initial(icon_state)]_dead"
stat = DEAD
- src.visible_message("[src] curls up into a ball!")
+ src.visible_message("\The [src] curls up into a ball!")
return
+
+/obj/item/clothing/mask/facehugger/lamarr
+ name = "Lamarr"
+ desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite?
+ gender = FEMALE
+ sterile = 1
+
/proc/CanHug(var/mob/M)
if(iscorgi(M))
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
index 74756de6a8c..f02bd634ec2 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
@@ -310,8 +310,8 @@
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/corrosive_acid,
/mob/living/carbon/human/proc/neurotoxin,
+ /mob/living/carbon/human/proc/gut,
/mob/living/carbon/human/proc/resin,
- /mob/living/carbon/human/proc/xeno_infest,
/mob/living/carbon/human/proc/darkness_eyes
)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index d1bf8d2465b..dd9d74b2105 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -403,3 +403,4 @@
// can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
// return ..() && target.op_stage.ribcage == 2
+
diff --git a/html/changelogs/alberyk-ayylmao.yml b/html/changelogs/alberyk-ayylmao.yml
new file mode 100644
index 00000000000..eccf5cb0057
--- /dev/null
+++ b/html/changelogs/alberyk-ayylmao.yml
@@ -0,0 +1,4 @@
+author: Alberyk
+delete-after: True
+changes:
+ - rscadd: "Re-added facehuggers to xenomorphs, bringing back all the infection circle."