diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 15eecc697be..c5699769067 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -352,7 +352,7 @@
if(child)
child.loc = get_turf(src)
if(kill && istype(child))
- child.death()
+ child.Die()
else
for(var/mob/M in range(1,src))
if(CanHug(M))
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index d6d110d63de..a1a4ff10d0f 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -653,13 +653,14 @@
/**********************Facehugger toy**********************/
/obj/item/clothing/mask/facehugger/toy
+ item_state = "facehugger_inactive"
desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
throwforce = 0
real = 0
sterile = 1
tint = 3 //Makes it feel more authentic when it latches on
-/obj/item/clothing/mask/facehugger/toy/death()
+/obj/item/clothing/mask/facehugger/toy/Die()
return
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 6e3b6e341b4..60c6c996eae 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -3,11 +3,9 @@
/obj/item/organ/internal/body_egg/alien_embryo
name = "alien embryo"
- desc = "All slimy and yuck."
icon = 'icons/mob/alien.dmi'
icon_state = "larva0_dead"
var/stage = 0
- var/growing = 0
/obj/item/organ/internal/body_egg/alien_embryo/on_find(mob/living/finder)
..()
@@ -58,13 +56,17 @@
RefreshInfectionImage()
if(stage == 5 && prob(50))
+ for(var/datum/surgery/S in owner.surgeries)
+ if(S.location == "chest" && istype(S.get_surgery_step(), /datum/surgery_step/internal/manipulate_organs))
+ AttemptGrow(0)
+ return
AttemptGrow()
-/obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
- if(growing)
- return
- growing = 1
+
+/obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
+ if(!owner)
+ return
spawn()
var/list/candidates = pollCandidates("Do you want to play as an alien?", ROLE_ALIEN, 0)
var/mob/C = null
@@ -77,15 +79,14 @@
if(candidates.len)
C = pick(candidates)
else if(owner.client)
- C = owner
+ C = owner.client
else
stage = 4 // Let's try again later.
return
- if(owner.lying)
- owner.overlays += image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie")
- else
- owner.overlays += image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_stand")
+ var/overlay = image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie")
+ owner.overlays += overlay
+
spawn(6)
var/mob/living/carbon/alien/larva/new_xeno = new(owner.loc)
new_xeno.key = C.key
@@ -97,19 +98,11 @@
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
if(gib_on_success)
owner.gib()
- if(istype(new_xeno.loc,/mob/living/carbon))
- var/mob/living/carbon/digester = new_xeno.loc
- digester.stomach_contents += new_xeno
+ else
+ owner.adjustBruteLoss(40)
+ owner.overlays -= overlay
qdel(src)
-/*----------------------------------------
-Proc: RefreshInfectionImage()
-Des: Removes the current icons located in the infected mob adds the current stage
-----------------------------------------*/
-/obj/item/organ/internal/body_egg/alien_embryo/RefreshInfectionImage()
- RemoveInfectionImages()
- AddInfectionImages()
-
/*----------------------------------------
Proc: AddInfectionImages(C)
Des: Adds the infection image to all aliens for this embryo
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 7711df5d7f6..6f958533515 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -15,8 +15,10 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "facehugger"
item_state = "facehugger"
w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4
- flags = MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT
throw_range = 5
+ tint = 3
+ flags = MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT
+ layer = MOB_LAYER
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
@@ -26,19 +28,17 @@ var/const/MAX_ACTIVE_TIME = 400
var/attached = 0
-/obj/item/clothing/mask/facehugger/attack_alien(user as mob) //can be picked up by aliens
+/obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens
attack_hand(user)
return
-/obj/item/clothing/mask/facehugger/attack_hand(user as mob)
+/obj/item/clothing/mask/facehugger/attack_hand(mob/user)
if((stat == CONSCIOUS && !sterile) && !isalien(user))
- Attach(user)
- return
- else
- ..()
- return
+ if(Attach(user))
+ return
+ ..()
-/obj/item/clothing/mask/facehugger/attack(mob/living/M as mob, mob/user as mob)
+/obj/item/clothing/mask/facehugger/attack(mob/living/M, mob/user)
..()
user.unEquip(src)
Attach(M)
@@ -49,25 +49,25 @@ var/const/MAX_ACTIVE_TIME = 400
return
switch(stat)
if(DEAD,UNCONSCIOUS)
- user << "[src] is not moving."
+ user << "[src] is not moving."
if(CONSCIOUS)
- user << "[src] seems to be active!"
+ user << "[src] seems to be active!"
if (sterile)
- user << "It looks like the proboscis has been removed."
+ user << "It looks like the proboscis has been removed."
-/obj/item/clothing/mask/facehugger/attackby(var/obj/item/O,var/mob/m, params)
+/obj/item/clothing/mask/facehugger/attackby(obj/item/O,mob/m, params)
if(O.force)
- death()
+ Die()
return
-/obj/item/clothing/mask/facehugger/bullet_act(var/obj/item/projectile/P)
+/obj/item/clothing/mask/facehugger/bullet_act(obj/item/projectile/P)
if(P.damage)
- death()
+ Die()
return
/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
- death()
+ Die()
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
@@ -77,13 +77,13 @@ var/const/MAX_ACTIVE_TIME = 400
HasProximity(target)
return
-/obj/item/clothing/mask/facehugger/on_found(mob/finder as mob)
+/obj/item/clothing/mask/facehugger/on_found(mob/finder)
if(stat == CONSCIOUS)
return HasProximity(finder)
return 0
/obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj)
- if(CanHug(AM))
+ if(CanHug(AM) && Adjacent(AM))
return Attach(AM)
return 0
@@ -102,10 +102,10 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "[initial(icon_state)]"
Attach(hit_atom)
-/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M as mob)
+/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M)
if(!isliving(M))
return 0
- if( (!iscorgi(M) && !iscarbon(M)) || isalien(M))
+ if((!iscorgi(M) && !iscarbon(M)) || isalien(M))
return 0
if(attached)
return 0
@@ -113,25 +113,24 @@ var/const/MAX_ACTIVE_TIME = 400
attached++
spawn(MAX_IMPREGNATION_TIME)
attached = 0
-
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0
- if(M.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
- return 0
-
- if(loc == M) return 0
-
+ if(M.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
+ return 0
+ if(loc == M)
+ return 0
+ if(stat != CONSCIOUS)
+ return 0
if(!sterile) M.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
-
- M.visible_message("[src] leaps at [M]'s face!")
-
+ M.visible_message("[src] leaps at [M]'s face!", \
+ "[src] leaps at [M]'s face!")
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.head && H.head.flags & HEADCOVERSMOUTH)
- H.visible_message("[src] smashes against [H]'s [H.head]!")
- death()
+ H.visible_message("[src] smashes against [H]'s [H.head]!", \
+ "[src] smashes against [H]'s [H.head]!")
+ Die()
return 0
-
if(iscarbon(M))
var/mob/living/carbon/target = M
if(target.wear_mask)
@@ -147,8 +146,8 @@ var/const/MAX_ACTIVE_TIME = 400
src.loc = target
target.equip_to_slot(src, slot_wear_mask,,0)
-
- if(!sterile) M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
+ if(!sterile)
+ M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
else if (iscorgi(M))
var/mob/living/simple_animal/pet/corgi/C = M
loc = C
@@ -181,13 +180,12 @@ var/const/MAX_ACTIVE_TIME = 400
target.visible_message("[src] falls limp after violating [target]'s face!", \
"[src] falls limp after violating [target]'s face!")
- death()
+ Die()
icon_state = "[initial(icon_state)]_impregnated"
- if(!(target.status_flags & XENO_HOST))
+ if(!target.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
new /obj/item/organ/internal/body_egg/alien_embryo(target)
-
if(iscorgi(target))
var/mob/living/simple_animal/pet/corgi/C = target
src.loc = get_turf(C)
@@ -195,7 +193,6 @@ var/const/MAX_ACTIVE_TIME = 400
else
target.visible_message("[src] violates [target]'s face!", \
"[src] violates [target]'s face!")
- return
/obj/item/clothing/mask/facehugger/proc/GoActive()
if(stat == DEAD || stat == CONSCIOUS)
@@ -204,20 +201,10 @@ var/const/MAX_ACTIVE_TIME = 400
stat = CONSCIOUS
icon_state = "[initial(icon_state)]"
-/* for(var/mob/living/carbon/alien/alien in world)
- var/image/activeIndicator = image('icons/mob/alien.dmi', loc = src, icon_state = "facehugger_active")
- activeIndicator.override = 1
- if(alien && alien.client)
- alien.client.images += activeIndicator */
-
- return
-
/obj/item/clothing/mask/facehugger/proc/GoIdle()
if(stat == DEAD || stat == UNCONSCIOUS)
return
-/* RemoveActiveIndicators() */
-
stat = UNCONSCIOUS
icon_state = "[initial(icon_state)]_inactive"
@@ -225,32 +212,27 @@ var/const/MAX_ACTIVE_TIME = 400
GoActive()
return
-/obj/item/clothing/mask/facehugger/proc/death()
+/obj/item/clothing/mask/facehugger/proc/Die()
if(stat == DEAD)
return
-/* RemoveActiveIndicators() */
-
icon_state = "[initial(icon_state)]_dead"
+ item_state = "facehugger_inactive"
stat = DEAD
- src.visible_message("[src] curls up into a ball!")
+ visible_message("[src] curls up into a ball!")
- return
-
-/proc/CanHug(var/mob/living/M)
- if(!M || !ismob(M))
+/proc/CanHug(mob/living/M)
+ if(!istype(M))
return 0
-
if(M.stat == DEAD)
return 0
+ if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
+ return 0
if(iscorgi(M))
return 1
- if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
- return 0
-
var/mob/living/carbon/C = M
if(ishuman(C))
var/mob/living/carbon/human/H = C
diff --git a/code/modules/surgery/organs/body_egg.dm b/code/modules/surgery/organs/body_egg.dm
index 4e53f525c4f..7cd53c4319a 100644
--- a/code/modules/surgery/organs/body_egg.dm
+++ b/code/modules/surgery/organs/body_egg.dm
@@ -10,11 +10,6 @@
..()
finder << "You found an unknown alien organism in [owner]'s [parent_organ]!"
-/obj/item/organ/internal/body_egg/New(loc)
- if(iscarbon(loc))
- insert(loc)
- return ..()
-
/obj/item/organ/internal/body_egg/insert(var/mob/living/carbon/M, special = 0)
..()
owner.status_flags |= XENO_HOST
@@ -33,7 +28,8 @@
..()
/obj/item/organ/internal/body_egg/process()
- if(!owner) return
+ if(!owner)
+ return
if(!(src in owner.internal_organs))
remove(owner)
return
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 035a015dd1c..27acdc6a156 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index e0a47cf1b9a..dbc8f19c038 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ