Committed Cael Aislinn's proposed commit: http://forums.nanotrasen.com/viewtopic.php?f=16&t=11641
- Xenos suit and helm (completely obscuring, and almost indistinguishable from drones) (admin spawned only for now). - Facehuggers now have different icon states for being thrown and after impregnation. - New death, unconscious and sleeping icons for aliens. - New icon (and projectile type) for neuroxotin. - New infection overlay images for telling aliens about pregnant humans (3 icons, showing the progression of the infestation). - New system for handling alien impregnation (alien embryos are an object inside the mob, instead of a disease). - Players can be operated surgically to remove the alien embryos (targetting the chest: scalpel, surgical saw, hemostat, retractors. If the embryo is nearly fully developed, it might come out alive though. - Corgis can now get impregnated. - There is a short animated overlay of a chestburster when it comes time to burst chests. - Alien larva now have three different icon sets, depending on their growth (25% they are bloody and pale, 25% - 75% they are pale, 75% onwards they are deep red). Fixed up table smashing, and added rack smashing in the same way. Added new north/south facing for the large alien queen. Updated the changelog. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5493 316c924e-a436-60f5-8080-3fe189b3f50e
@@ -174,8 +174,8 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
|
|||||||
if(resistance && !(type in affected_mob.resistances))
|
if(resistance && !(type in affected_mob.resistances))
|
||||||
var/saved_type = "[type]"
|
var/saved_type = "[type]"
|
||||||
affected_mob.resistances += text2path(saved_type)
|
affected_mob.resistances += text2path(saved_type)
|
||||||
if(istype(src, /datum/disease/alien_embryo)) //Get rid of the infection flag if it's a xeno embryo.
|
/*if(istype(src, /datum/disease/alien_embryo)) //Get rid of the infection flag if it's a xeno embryo.
|
||||||
affected_mob.status_flags &= ~(XENO_HOST)
|
affected_mob.status_flags &= ~(XENO_HOST)*/
|
||||||
affected_mob.viruses -= src //remove the datum from the list
|
affected_mob.viruses -= src //remove the datum from the list
|
||||||
del(src) //delete the datum to stop it processing
|
del(src) //delete the datum to stop it processing
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
//affected_mob.contract_disease(new /datum/disease/alien_embryo)
|
//affected_mob.contract_disease(new /datum/disease/alien_embryo)
|
||||||
|
|
||||||
|
//cael - retained this file for legacy reference, see code\modules\mob\living\carbon\alien\special\alien_embryo.dm for replacement
|
||||||
|
|
||||||
//Our own special process so that dead hosts still chestburst
|
//Our own special process so that dead hosts still chestburst
|
||||||
/datum/disease/alien_embryo/process()
|
/datum/disease/alien_embryo/process()
|
||||||
if(!holder) return
|
if(!holder) return
|
||||||
@@ -97,6 +99,9 @@
|
|||||||
gibbed = 1
|
gibbed = 1
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/datum/disease/alien_embryo/stage_change(var/old_stage)
|
||||||
|
RefreshInfectionImage()
|
||||||
|
|
||||||
/*----------------------------------------
|
/*----------------------------------------
|
||||||
Proc: RefreshInfectionImage()
|
Proc: RefreshInfectionImage()
|
||||||
Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens.
|
Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens.
|
||||||
@@ -106,7 +111,7 @@ Des: Removes all infection images from aliens and places an infection image on a
|
|||||||
for (var/mob/living/carbon/alien/alien in player_list)
|
for (var/mob/living/carbon/alien/alien in player_list)
|
||||||
if (alien.client)
|
if (alien.client)
|
||||||
for(var/image/I in alien.client.images)
|
for(var/image/I in alien.client.images)
|
||||||
if(I.icon_state == "infected")
|
if(dd_hasprefix_case(I.icon_state, "infected"))
|
||||||
del(I)
|
del(I)
|
||||||
|
|
||||||
for (var/mob/living/carbon/alien/alien in player_list)
|
for (var/mob/living/carbon/alien/alien in player_list)
|
||||||
@@ -114,7 +119,7 @@ Des: Removes all infection images from aliens and places an infection image on a
|
|||||||
for (var/mob/living/carbon/C in mob_list)
|
for (var/mob/living/carbon/C in mob_list)
|
||||||
if(C)
|
if(C)
|
||||||
if (C.status_flags & XENO_HOST)
|
if (C.status_flags & XENO_HOST)
|
||||||
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected")
|
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
|
||||||
alien.client.images += I
|
alien.client.images += I
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -127,7 +132,7 @@ Des: Checks if the passed mob (C) is infected with the alien egg, then gives eac
|
|||||||
for (var/mob/living/carbon/alien/alien in player_list)
|
for (var/mob/living/carbon/alien/alien in player_list)
|
||||||
if (alien.client)
|
if (alien.client)
|
||||||
if (C.status_flags & XENO_HOST)
|
if (C.status_flags & XENO_HOST)
|
||||||
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected")
|
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
|
||||||
alien.client.images += I
|
alien.client.images += I
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -142,6 +147,6 @@ Des: Removes the alien infection image from all aliens in the world located in p
|
|||||||
if (alien.client)
|
if (alien.client)
|
||||||
for(var/image/I in alien.client.images)
|
for(var/image/I in alien.client.images)
|
||||||
if(I.loc == C)
|
if(I.loc == C)
|
||||||
if(I.icon_state == "infected")
|
if(dd_hasprefix_case(I.icon_state, "infected"))
|
||||||
del(I)
|
del(I)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -358,8 +358,9 @@ Alien plants should do something if theres a lot of poison
|
|||||||
*/
|
*/
|
||||||
/var/const //for the status var
|
/var/const //for the status var
|
||||||
BURST = 0
|
BURST = 0
|
||||||
GROWING = 1
|
BURSTING = 1
|
||||||
GROWN = 2
|
GROWING = 2
|
||||||
|
GROWN = 3
|
||||||
|
|
||||||
MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
|
MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
|
||||||
MAX_GROWTH_TIME = 3000
|
MAX_GROWTH_TIME = 3000
|
||||||
@@ -394,8 +395,7 @@ Alien plants should do something if theres a lot of poison
|
|||||||
return
|
return
|
||||||
if(GROWN)
|
if(GROWN)
|
||||||
user << "\red You retrieve the child."
|
user << "\red You retrieve the child."
|
||||||
loc.contents += GetFacehugger()//need to write the code for giving it to the alien later
|
Burst(0)
|
||||||
Burst()
|
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
return attack_hand(user)
|
return attack_hand(user)
|
||||||
@@ -416,12 +416,20 @@ Alien plants should do something if theres a lot of poison
|
|||||||
proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
|
proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
|
||||||
var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
|
var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
|
||||||
|
|
||||||
if(kill && istype(child))
|
|
||||||
loc.contents += child
|
|
||||||
child.Die()
|
|
||||||
|
|
||||||
icon_state = "egg_hatched"
|
icon_state = "egg_hatched"
|
||||||
status = BURST
|
flick("egg_opening", src)
|
||||||
|
status = BURSTING
|
||||||
|
spawn(15)
|
||||||
|
status = BURST
|
||||||
|
loc.contents += child//need to write the code for giving it to the alien later
|
||||||
|
if(kill && istype(child))
|
||||||
|
child.Die()
|
||||||
|
else
|
||||||
|
for(var/mob/M in range(1,src))
|
||||||
|
if(CanHug(M))
|
||||||
|
child.Attach(M)
|
||||||
|
break
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -465,19 +473,9 @@ Alien plants should do something if theres a lot of poison
|
|||||||
if(status == GROWN)
|
if(status == GROWN)
|
||||||
if(!CanHug(AM))
|
if(!CanHug(AM))
|
||||||
return
|
return
|
||||||
|
|
||||||
var/mob/living/carbon/C = AM
|
var/mob/living/carbon/C = AM
|
||||||
if(C.stat == CONSCIOUS && C.has_disease(new /datum/disease/alien_embryo(0)))
|
if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST)
|
||||||
return
|
return
|
||||||
|
|
||||||
status = BURST
|
Burst(0)
|
||||||
flick("egg_opening", src) //Play animation
|
|
||||||
var/turf/pos = get_turf(src)
|
|
||||||
spawn(18) // Wait until the animation finishes
|
|
||||||
Burst(0)
|
|
||||||
var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
|
|
||||||
child.loc = pos
|
|
||||||
if(!CanHug(AM))
|
|
||||||
return
|
|
||||||
if(AM && in_range(AM, pos))
|
|
||||||
child.Attach(AM)
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,36 @@
|
|||||||
icon_state = "sheet-lizard"
|
icon_state = "sheet-lizard"
|
||||||
origin_tech = ""
|
origin_tech = ""
|
||||||
|
|
||||||
|
/obj/item/stack/sheet/animalhide/xeno
|
||||||
|
name = "alien hide"
|
||||||
|
desc = "The skin of a terrible creature."
|
||||||
|
singular_name = "alien hide piece"
|
||||||
|
icon_state = "sheet-xeno"
|
||||||
|
origin_tech = ""
|
||||||
|
|
||||||
|
//don't see anywhere else to put these, maybe together they could be used to make the xenos suit?
|
||||||
|
/obj/item/stack/sheet/xenochitin
|
||||||
|
name = "alien chitin"
|
||||||
|
desc = "A piece of the hide of a terrible creature."
|
||||||
|
singular_name = "alien hide piece"
|
||||||
|
icon = 'icons/mob/alien.dmi'
|
||||||
|
icon_state = "chitin"
|
||||||
|
origin_tech = ""
|
||||||
|
|
||||||
|
/obj/item/xenos_claw
|
||||||
|
name = "alien claw"
|
||||||
|
desc = "The claw of a terrible creature."
|
||||||
|
icon = 'icons/mob/alien.dmi'
|
||||||
|
icon_state = "claw"
|
||||||
|
origin_tech = ""
|
||||||
|
|
||||||
|
/obj/item/weed_extract
|
||||||
|
name = "weed extract"
|
||||||
|
desc = "A piece of slimy, purplish weed."
|
||||||
|
icon = 'icons/mob/alien.dmi'
|
||||||
|
icon_state = "weed_extract"
|
||||||
|
origin_tech = ""
|
||||||
|
|
||||||
/obj/item/stack/sheet/hairlesshide
|
/obj/item/stack/sheet/hairlesshide
|
||||||
name = "hairless hide"
|
name = "hairless hide"
|
||||||
desc = "This hide was stripped of it's hair, but still needs tanning."
|
desc = "This hide was stripped of it's hair, but still needs tanning."
|
||||||
|
|||||||
@@ -87,6 +87,45 @@
|
|||||||
|
|
||||||
M:eye_op_stage = 2.0
|
M:eye_op_stage = 2.0
|
||||||
|
|
||||||
|
else if(user.zone_sel.selecting == "chest")
|
||||||
|
switch(M:alien_op_stage)
|
||||||
|
if(3.0)
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
if(!istype(H))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
if(H.wear_suit || H.w_uniform)
|
||||||
|
user << "\red You're going to need to remove that suit/jumpsuit first."
|
||||||
|
return
|
||||||
|
|
||||||
|
var/obj/item/alien_embryo/A = locate() in M.contents
|
||||||
|
if(!A)
|
||||||
|
return ..()
|
||||||
|
user.visible_message("\red [user] begins to pull something out of [M]'s chest.", "\red You begin to pull the alien organism out of [M]'s chest.")
|
||||||
|
|
||||||
|
spawn(20 + rand(0,50))
|
||||||
|
if(!A || A.loc != M)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(M == user && prob(25))
|
||||||
|
user << "\red You mess up!"
|
||||||
|
if(istype(M, /mob/living/carbon/human))
|
||||||
|
var/datum/organ/external/affecting = M:get_organ("chest")
|
||||||
|
if(affecting.take_damage(30))
|
||||||
|
M:UpdateDamageIcon()
|
||||||
|
else
|
||||||
|
M.take_organ_damage(30)
|
||||||
|
|
||||||
|
if(A.stage > 3)
|
||||||
|
var/chance = 15 + max(0, A.stage - 3) * 10
|
||||||
|
if(prob(chance))
|
||||||
|
A.AttemptGrow(0)
|
||||||
|
M:alien_op_stage = 4.0
|
||||||
|
|
||||||
|
if(M)
|
||||||
|
user.visible_message("\red [user] pulls an alien organism out of [M]'s chest.", "\red You pull the alien organism out of [M]'s chest.")
|
||||||
|
A.loc = M.loc //alien embryo handles cleanup
|
||||||
|
|
||||||
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
@@ -184,6 +223,42 @@
|
|||||||
M.take_organ_damage(15)
|
M.take_organ_damage(15)
|
||||||
M:eye_op_stage = 3.0
|
M:eye_op_stage = 3.0
|
||||||
|
|
||||||
|
else if(user.zone_sel.selecting == "chest")
|
||||||
|
if(M:alien_op_stage == 2.0 || M:alien_op_stage == 3.0)
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
if(!istype(H))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
if(H.wear_suit || H.w_uniform)
|
||||||
|
user << "\red You're going to need to remove that suit/jumpsuit first."
|
||||||
|
return
|
||||||
|
|
||||||
|
user.visible_message("\red [user] begins to dig around in [M]'s chest.", "\red You begin to dig around in [M]'s chest.")
|
||||||
|
|
||||||
|
spawn(20 + (M:alien_op_stage == 3 ? 0 : rand(0,50)))
|
||||||
|
if(M == user && prob(25))
|
||||||
|
user << "\red You mess up!"
|
||||||
|
if(istype(M, /mob/living/carbon/human))
|
||||||
|
var/datum/organ/external/affecting = M:get_organ("chest")
|
||||||
|
if(affecting.take_damage(30))
|
||||||
|
M:UpdateDamageIcon()
|
||||||
|
else
|
||||||
|
M.take_organ_damage(30)
|
||||||
|
|
||||||
|
var/obj/item/alien_embryo/A = locate() in M.contents
|
||||||
|
if(A)
|
||||||
|
var/dat = "\blue You found an unknown alien organism in [M]'s chest!"
|
||||||
|
if(A.stage < 4)
|
||||||
|
dat += " It's small and weak, barely the size of a foetus."
|
||||||
|
if(A.stage > 3)
|
||||||
|
dat += " It's grown quite large, and writhes slightly as you look at it."
|
||||||
|
if(prob(10))
|
||||||
|
A.AttemptGrow()
|
||||||
|
user << dat
|
||||||
|
M:alien_op_stage = 3.0
|
||||||
|
else
|
||||||
|
user << "\blue You find nothing of interest."
|
||||||
|
|
||||||
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
@@ -513,6 +588,33 @@
|
|||||||
M.updatehealth()
|
M.updatehealth()
|
||||||
M:eye_op_stage = 1.0
|
M:eye_op_stage = 1.0
|
||||||
user << "\blue So far so good after."
|
user << "\blue So far so good after."
|
||||||
|
|
||||||
|
else if(user.zone_sel.selecting == "chest")
|
||||||
|
switch(M:alien_op_stage)
|
||||||
|
if(0.0)
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
if(!istype(H))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
if(H.wear_suit || H.w_uniform)
|
||||||
|
user << "\red You're going to need to remove that suit/jumpsuit first."
|
||||||
|
return
|
||||||
|
|
||||||
|
user.visible_message("\red [user] begins to slice open [M]'s chest.", "\red You begin to slice open [M]'s chest.")
|
||||||
|
|
||||||
|
spawn(rand(20,50))
|
||||||
|
if(M == user && prob(25))
|
||||||
|
user << "\red You mess up!"
|
||||||
|
if(istype(M, /mob/living/carbon/human))
|
||||||
|
var/datum/organ/external/affecting = M:get_organ("chest")
|
||||||
|
if(affecting.take_damage(15))
|
||||||
|
M:UpdateDamageIcon()
|
||||||
|
else
|
||||||
|
M.take_organ_damage(15)
|
||||||
|
|
||||||
|
M:alien_op_stage = 1.0
|
||||||
|
user << "\blue So far so good."
|
||||||
|
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
/* wat
|
/* wat
|
||||||
@@ -657,6 +759,32 @@
|
|||||||
..()
|
..()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
else if(user.zone_sel.selecting == "chest")
|
||||||
|
switch(M:alien_op_stage)
|
||||||
|
if(1.0)
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
if(!istype(H))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
if(H.wear_suit || H.w_uniform)
|
||||||
|
user << "\red You're going to need to remove that suit/jumpsuit first."
|
||||||
|
return
|
||||||
|
|
||||||
|
user.visible_message("\red [user] begins to slice through the bone of [M]'s chest.", "\red You begin to slice through the bone of [M]'s chest.")
|
||||||
|
|
||||||
|
spawn(20 + rand(0,50))
|
||||||
|
if(M == user && prob(25))
|
||||||
|
user << "\red You mess up!"
|
||||||
|
if(istype(M, /mob/living/carbon/human))
|
||||||
|
var/datum/organ/external/affecting = M:get_organ("chest")
|
||||||
|
if(affecting.take_damage(15))
|
||||||
|
M:UpdateDamageIcon()
|
||||||
|
else
|
||||||
|
M.take_organ_damage(15)
|
||||||
|
|
||||||
|
M:alien_op_stage = 2.0
|
||||||
|
user << "\blue So far so good."
|
||||||
|
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -240,73 +240,59 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/table/attack_paw(mob/user as mob)
|
/obj/structure/table/attack_paw(mob/user)
|
||||||
if ((HULK in usr.mutations))
|
if(HULK in user.mutations)
|
||||||
usr << "\blue You destroy the table."
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||||
usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
visible_message("<span class='danger'>[user] smashes the table apart!</span>")
|
||||||
visible_message("\red [user] smashes the table apart!")
|
|
||||||
if(istype(src, /obj/structure/table/reinforced))
|
if(istype(src, /obj/structure/table/reinforced))
|
||||||
new /obj/item/weapon/table_parts/reinforced( src.loc )
|
new /obj/item/weapon/table_parts/reinforced(loc)
|
||||||
else if(istype(src, /obj/structure/table/woodentable))
|
else if(istype(src, /obj/structure/table/woodentable))
|
||||||
new/obj/item/weapon/table_parts/wood( src.loc )
|
new/obj/item/weapon/table_parts/wood(loc)
|
||||||
else
|
else
|
||||||
new /obj/item/weapon/table_parts( src.loc )
|
new /obj/item/weapon/table_parts(loc)
|
||||||
src.density = 0
|
density = 0
|
||||||
del(src)
|
del(src)
|
||||||
if (!( locate(/obj/structure/table, user.loc) ))
|
|
||||||
step(user, get_dir(user, src))
|
|
||||||
if (user.loc == src.loc)
|
|
||||||
user.layer = TURF_LAYER
|
|
||||||
visible_message("[user] hides under the table!")
|
|
||||||
//Foreach goto(69)
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/table/attack_alien(mob/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
|
/obj/structure/table/attack_alien(mob/user)
|
||||||
usr << "\green You destroy the table."
|
visible_message("<span class='danger'>[user] slices [src] apart!</span>")
|
||||||
visible_message("\red [user] slices the table apart!")
|
|
||||||
if(istype(src, /obj/structure/table/reinforced))
|
if(istype(src, /obj/structure/table/reinforced))
|
||||||
new /obj/item/weapon/table_parts/reinforced( src.loc )
|
new /obj/item/weapon/table_parts/reinforced(loc)
|
||||||
else if(istype(src, /obj/structure/table/woodentable))
|
else if(istype(src, /obj/structure/table/woodentable))
|
||||||
new/obj/item/weapon/table_parts/wood( src.loc )
|
new/obj/item/weapon/table_parts/wood(loc)
|
||||||
else
|
else
|
||||||
new /obj/item/weapon/table_parts( src.loc )
|
new /obj/item/weapon/table_parts(loc)
|
||||||
src.density = 0
|
density = 0
|
||||||
del(src)
|
del(src)
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/table/attack_animal(mob/living/simple_animal/user as mob)
|
/obj/structure/table/attack_animal(mob/living/simple_animal/user)
|
||||||
if(user.wall_smash)
|
if(user.wall_smash)
|
||||||
usr << "\red You destroy the table."
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||||
visible_message("\red [user] smashes the table apart!")
|
|
||||||
if(istype(src, /obj/structure/table/reinforced))
|
if(istype(src, /obj/structure/table/reinforced))
|
||||||
new /obj/item/weapon/table_parts/reinforced( src.loc )
|
new /obj/item/weapon/table_parts/reinforced(loc)
|
||||||
else if(istype(src, /obj/structure/table/woodentable))
|
else if(istype(src, /obj/structure/table/woodentable))
|
||||||
new/obj/item/weapon/table_parts/wood( src.loc )
|
new/obj/item/weapon/table_parts/wood(loc)
|
||||||
else
|
else
|
||||||
new /obj/item/weapon/table_parts( src.loc )
|
new /obj/item/weapon/table_parts(loc)
|
||||||
src.density = 0
|
density = 0
|
||||||
del(src)
|
del(src)
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/table/attack_hand(mob/user as mob)
|
/obj/structure/table/attack_hand(mob/user)
|
||||||
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
if(HULK in user.mutations || SUPRSTR in user.augmentations)
|
||||||
usr << "\blue You destroy the table."
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||||
visible_message("\red [user] smashes the table apart!")
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||||
usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
|
||||||
if(istype(src, /obj/structure/table/reinforced))
|
if(istype(src, /obj/structure/table/reinforced))
|
||||||
new /obj/item/weapon/table_parts/reinforced( src.loc )
|
new /obj/item/weapon/table_parts/reinforced(loc)
|
||||||
else if(istype(src, /obj/structure/table/woodentable))
|
else if(istype(src, /obj/structure/table/woodentable))
|
||||||
new/obj/item/weapon/table_parts/wood( src.loc )
|
new/obj/item/weapon/table_parts/wood(loc)
|
||||||
else
|
else
|
||||||
new /obj/item/weapon/table_parts( src.loc )
|
new /obj/item/weapon/table_parts(loc)
|
||||||
src.density = 0
|
density = 0
|
||||||
del(src)
|
del(src)
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||||
@@ -554,7 +540,6 @@
|
|||||||
if (istype(W, /obj/item/weapon/wrench))
|
if (istype(W, /obj/item/weapon/wrench))
|
||||||
new /obj/item/weapon/rack_parts( src.loc )
|
new /obj/item/weapon/rack_parts( src.loc )
|
||||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||||
//SN src = null
|
|
||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
if(isrobot(user))
|
if(isrobot(user))
|
||||||
@@ -564,4 +549,37 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/obj/structure/rack/meteorhit(obj/O as obj)
|
/obj/structure/rack/meteorhit(obj/O as obj)
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/structure/table/attack_hand(mob/user)
|
||||||
|
if(HULK in user.mutations || SUPRSTR in user.augmentations)
|
||||||
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||||
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||||
|
new /obj/item/weapon/rack_parts(loc)
|
||||||
|
density = 0
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/structure/rack/attack_paw(mob/user)
|
||||||
|
if(HULK in user.mutations)
|
||||||
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||||
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||||
|
new /obj/item/weapon/rack_parts(loc)
|
||||||
|
density = 0
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/structure/rack/attack_alien(mob/user)
|
||||||
|
visible_message("<span class='danger'>[user] slices [src] apart!</span>")
|
||||||
|
new /obj/item/weapon/rack_parts(loc)
|
||||||
|
density = 0
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
|
||||||
|
if(user.wall_smash)
|
||||||
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||||
|
new /obj/item/weapon/rack_parts(loc)
|
||||||
|
density = 0
|
||||||
|
del(src)
|
||||||
@@ -171,3 +171,11 @@
|
|||||||
icon_state = "bearpelt"
|
icon_state = "bearpelt"
|
||||||
item_state = "bearpelt"
|
item_state = "bearpelt"
|
||||||
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||||
|
|
||||||
|
/obj/item/clothing/head/xenos
|
||||||
|
name = "xenos helmet"
|
||||||
|
icon_state = "xenos"
|
||||||
|
item_state = "xenos_helm"
|
||||||
|
desc = "A helmet made out of chitinous alien hide."
|
||||||
|
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||||
|
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||||
|
|||||||
@@ -211,4 +211,12 @@
|
|||||||
else
|
else
|
||||||
usr << "You button-up some imaginary buttons on your [src]."
|
usr << "You button-up some imaginary buttons on your [src]."
|
||||||
return
|
return
|
||||||
usr.update_inv_wear_suit()
|
usr.update_inv_wear_suit()
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/xenos
|
||||||
|
name = "xenos suit"
|
||||||
|
desc = "A suit made out of chitinous alien hide."
|
||||||
|
icon_state = "xenos"
|
||||||
|
item_state = "xenos_helm"
|
||||||
|
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
|
||||||
|
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||||
@@ -185,9 +185,10 @@ Des: Gives the client of the alien an image on each infected mob.
|
|||||||
----------------------------------------*/
|
----------------------------------------*/
|
||||||
/mob/living/carbon/alien/proc/AddInfectionImages()
|
/mob/living/carbon/alien/proc/AddInfectionImages()
|
||||||
if (client)
|
if (client)
|
||||||
for (var/mob/living/carbon/C in mob_list)
|
for (var/mob/living/C in mob_list)
|
||||||
if(C.status_flags & XENO_HOST)
|
if(C.status_flags & XENO_HOST)
|
||||||
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected")
|
var/obj/item/alien_embryo/A = locate() in C
|
||||||
|
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
|
||||||
client.images += I
|
client.images += I
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -199,11 +200,10 @@ Des: Removes all infected images from the alien.
|
|||||||
/mob/living/carbon/alien/proc/RemoveInfectionImages()
|
/mob/living/carbon/alien/proc/RemoveInfectionImages()
|
||||||
if (client)
|
if (client)
|
||||||
for(var/image/I in client.images)
|
for(var/image/I in client.images)
|
||||||
if(I.icon_state == "infected")
|
if(dd_hasprefix_case(I.icon_state, "infected"))
|
||||||
del(I)
|
del(I)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
#undef HEAT_DAMAGE_LEVEL_1
|
#undef HEAT_DAMAGE_LEVEL_1
|
||||||
#undef HEAT_DAMAGE_LEVEL_2
|
#undef HEAT_DAMAGE_LEVEL_2
|
||||||
#undef HEAT_DAMAGE_LEVEL_3
|
#undef HEAT_DAMAGE_LEVEL_3
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ Doesn't work on other aliens/AI.*/
|
|||||||
if(!istype(U, /turf))
|
if(!istype(U, /turf))
|
||||||
return
|
return
|
||||||
|
|
||||||
var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(usr.loc)
|
var/obj/item/projectile/energy/neurotoxin/A = new /obj/item/projectile/energy/neurotoxin(usr.loc)
|
||||||
|
|
||||||
A.current = U
|
A.current = U
|
||||||
A.yo = U.y - T.y
|
A.yo = U.y - T.y
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
O.show_message("<B>[src]</B> lets out a waning guttural screech, green blood bubbling from its maw...", 1)
|
O.show_message("<B>[src]</B> lets out a waning guttural screech, green blood bubbling from its maw...", 1)
|
||||||
update_canmove()
|
update_canmove()
|
||||||
if(client) blind.layer = 0
|
if(client) blind.layer = 0
|
||||||
|
update_icons()
|
||||||
|
|
||||||
tod = worldtime2text() //weasellos time of death patch
|
tod = worldtime2text() //weasellos time of death patch
|
||||||
if(mind) mind.store_memory("Time of death: [tod]", 0)
|
if(mind) mind.store_memory("Time of death: [tod]", 0)
|
||||||
|
|||||||
@@ -359,6 +359,8 @@
|
|||||||
//Other
|
//Other
|
||||||
if(stunned)
|
if(stunned)
|
||||||
AdjustStunned(-1)
|
AdjustStunned(-1)
|
||||||
|
if(!stunned)
|
||||||
|
update_icons()
|
||||||
|
|
||||||
if(weakened)
|
if(weakened)
|
||||||
weakened = max(weakened-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times
|
weakened = max(weakened-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times
|
||||||
|
|||||||
@@ -14,9 +14,21 @@
|
|||||||
lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
|
lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
|
||||||
update_hud() //TODO: remove the need for this to be here
|
update_hud() //TODO: remove the need for this to be here
|
||||||
overlays.Cut()
|
overlays.Cut()
|
||||||
if(lying)
|
if(stat == DEAD)
|
||||||
if(resting) icon_state = "alien[caste]_sleep"
|
//If we mostly took damage from fire
|
||||||
else icon_state = "alien[caste]_l"
|
if(fireloss > 125)
|
||||||
|
icon_state = "alien[caste]_husked"
|
||||||
|
else
|
||||||
|
icon_state = "alien[caste]_dead"
|
||||||
|
for(var/image/I in overlays_lying)
|
||||||
|
overlays += I
|
||||||
|
else if(lying)
|
||||||
|
if(resting)
|
||||||
|
icon_state = "alien[caste]_sleep"
|
||||||
|
else if(stat == UNCONSCIOUS)
|
||||||
|
icon_state = "alien[caste]_unconscious"
|
||||||
|
else
|
||||||
|
icon_state = "alien[caste]_l"
|
||||||
for(var/image/I in overlays_lying)
|
for(var/image/I in overlays_lying)
|
||||||
overlays += I
|
overlays += I
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
if(stat == DEAD) return
|
if(stat == DEAD) return
|
||||||
if(healths) healths.icon_state = "health6"
|
if(healths) healths.icon_state = "health6"
|
||||||
stat = DEAD
|
stat = DEAD
|
||||||
icon_state = "larva_l"
|
icon_state = "larva_dead"
|
||||||
|
|
||||||
if(!gibbed)
|
if(!gibbed)
|
||||||
update_canmove()
|
update_canmove()
|
||||||
|
|||||||
@@ -88,6 +88,9 @@
|
|||||||
if("jump")
|
if("jump")
|
||||||
message = "<B>The [src.name]</B> jumps!"
|
message = "<B>The [src.name]</B> jumps!"
|
||||||
m_type = 1
|
m_type = 1
|
||||||
|
if("hiss_")
|
||||||
|
message = "<B>The [src.name]</B> hisses softly."
|
||||||
|
m_type = 1
|
||||||
if("collapse")
|
if("collapse")
|
||||||
Paralyse(2)
|
Paralyse(2)
|
||||||
message = text("<B>[]</B> collapses!", src)
|
message = text("<B>[]</B> collapses!", src)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/mob/living/carbon/alien/larva
|
/mob/living/carbon/alien/larva
|
||||||
name = "alien larva"
|
name = "alien larva"
|
||||||
real_name = "alien larva"
|
real_name = "alien larva"
|
||||||
icon_state = "larva"
|
icon_state = "larva0"
|
||||||
pass_flags = PASSTABLE
|
pass_flags = PASSTABLE
|
||||||
|
|
||||||
maxHealth = 25
|
maxHealth = 25
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
var/amount_grown = 0
|
var/amount_grown = 0
|
||||||
var/max_grown = 200
|
var/max_grown = 200
|
||||||
|
var/time_of_birth
|
||||||
|
|
||||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||||
/mob/living/carbon/alien/larva/New()
|
/mob/living/carbon/alien/larva/New()
|
||||||
|
|||||||
@@ -55,6 +55,9 @@
|
|||||||
for(var/obj/item/weapon/grab/G in src)
|
for(var/obj/item/weapon/grab/G in src)
|
||||||
G.process()
|
G.process()
|
||||||
|
|
||||||
|
//some kind of bug in canmove() isn't properly calling update_icons, so this is here as a placeholder
|
||||||
|
update_icons()
|
||||||
|
|
||||||
if(client)
|
if(client)
|
||||||
handle_regular_hud_updates()
|
handle_regular_hud_updates()
|
||||||
|
|
||||||
@@ -226,7 +229,7 @@
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
//UNCONSCIOUS. NO-ONE IS HOME
|
//UNCONSCIOUS. NO-ONE IS HOME
|
||||||
if( (getOxyLoss() > 50) || (0 > health) )
|
if( (getOxyLoss() > 25) || (0 > health) )
|
||||||
//if( health <= 20 && prob(1) )
|
//if( health <= 20 && prob(1) )
|
||||||
// spawn(0)
|
// spawn(0)
|
||||||
// emote("gasp")
|
// emote("gasp")
|
||||||
@@ -244,7 +247,7 @@
|
|||||||
stat = UNCONSCIOUS
|
stat = UNCONSCIOUS
|
||||||
if( prob(10) && health )
|
if( prob(10) && health )
|
||||||
spawn(0)
|
spawn(0)
|
||||||
emote("hiss")
|
emote("hiss_")
|
||||||
//CONSCIOUS
|
//CONSCIOUS
|
||||||
else
|
else
|
||||||
stat = CONSCIOUS
|
stat = CONSCIOUS
|
||||||
|
|||||||
@@ -28,12 +28,16 @@
|
|||||||
if(stat != CONSCIOUS)
|
if(stat != CONSCIOUS)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if(handcuffed || legcuffed)
|
||||||
|
src << "\red You cannot evolve when you are cuffed."
|
||||||
|
|
||||||
if(amount_grown >= max_grown) //TODO ~Carn
|
if(amount_grown >= max_grown) //TODO ~Carn
|
||||||
src << "\green You are growing into a beautiful alien! It is time to choose a caste."
|
//green is impossible to read, so i made these blue and changed the formatting slightly
|
||||||
src << "\green There are three to choose from:"
|
src << "\blue <b>You are growing into a beautiful alien! It is time to choose a caste.</b>"
|
||||||
src << "\green <B>Hunters</B> are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
|
src << "\blue There are three to choose from:"
|
||||||
src << "\green <B>Sentinels</B> are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters."
|
src << "<B>Hunters</B> \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
|
||||||
src << "\green <B>Drones</B> are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen."
|
src << "<B>Sentinels</B> \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters."
|
||||||
|
src << "<B>Drones</B> \blue are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen."
|
||||||
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
|
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
|
||||||
|
|
||||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||||
|
|||||||
@@ -1 +1,22 @@
|
|||||||
//No special icons processing
|
|
||||||
|
/mob/living/carbon/alien/larva/regenerate_icons()
|
||||||
|
overlays = list()
|
||||||
|
update_icons()
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/larva/update_icons()
|
||||||
|
var/state = 0
|
||||||
|
if(amount_grown > 150)
|
||||||
|
state = 2
|
||||||
|
else if(amount_grown > 50)
|
||||||
|
state = 1
|
||||||
|
|
||||||
|
if(stat == DEAD)
|
||||||
|
icon_state = "larva[state]_dead"
|
||||||
|
else if (handcuffed || legcuffed)
|
||||||
|
icon_state = "larva[state]_cuff"
|
||||||
|
else if (stunned)
|
||||||
|
icon_state = "larva[state]_stun"
|
||||||
|
else if(lying || resting)
|
||||||
|
icon_state = "larva[state]_sleep"
|
||||||
|
else
|
||||||
|
icon_state = "larva[state]"
|
||||||
|
|||||||
154
code/modules/mob/living/carbon/alien/special/alien_embryo.dm
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability
|
||||||
|
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
|
||||||
|
|
||||||
|
/obj/item/alien_embryo
|
||||||
|
name = "alien embryo"
|
||||||
|
desc = "All slimy and yuck."
|
||||||
|
icon = 'icons/mob/alien.dmi'
|
||||||
|
icon_state = "larva0_dead"
|
||||||
|
var/mob/living/affected_mob
|
||||||
|
var/stage = 0
|
||||||
|
|
||||||
|
/obj/item/alien_embryo/New()
|
||||||
|
if(istype(loc, /mob/living))
|
||||||
|
affected_mob = loc
|
||||||
|
processing_objects.Add(src)
|
||||||
|
spawn(0)
|
||||||
|
AddInfectionImages(affected_mob)
|
||||||
|
else
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
/obj/item/alien_embryo/Del()
|
||||||
|
if(affected_mob)
|
||||||
|
affected_mob.status_flags &= ~(XENO_HOST)
|
||||||
|
spawn(0)
|
||||||
|
RemoveInfectionImages(affected_mob)
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/alien_embryo/process()
|
||||||
|
if(loc != affected_mob)
|
||||||
|
affected_mob.status_flags &= ~(XENO_HOST)
|
||||||
|
processing_objects.Remove(src)
|
||||||
|
affected_mob = null
|
||||||
|
spawn(0)
|
||||||
|
RemoveInfectionImages(affected_mob)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(stage < 5 && prob(3))
|
||||||
|
stage++
|
||||||
|
spawn(0)
|
||||||
|
RefreshInfectionImage(affected_mob)
|
||||||
|
|
||||||
|
switch(stage)
|
||||||
|
if(2, 3)
|
||||||
|
if(prob(1))
|
||||||
|
affected_mob.emote("sneeze")
|
||||||
|
if(prob(1))
|
||||||
|
affected_mob.emote("cough")
|
||||||
|
if(prob(1))
|
||||||
|
affected_mob << "\red Your throat feels sore."
|
||||||
|
if(prob(1))
|
||||||
|
affected_mob << "\red Mucous runs down the back of your throat."
|
||||||
|
if(4)
|
||||||
|
if(prob(1))
|
||||||
|
affected_mob.emote("sneeze")
|
||||||
|
if(prob(1))
|
||||||
|
affected_mob.emote("cough")
|
||||||
|
if(prob(2))
|
||||||
|
affected_mob << "\red Your muscles ache."
|
||||||
|
if(prob(20))
|
||||||
|
affected_mob.take_organ_damage(1)
|
||||||
|
if(prob(2))
|
||||||
|
affected_mob << "\red Your stomach hurts."
|
||||||
|
if(prob(20))
|
||||||
|
affected_mob.adjustToxLoss(1)
|
||||||
|
affected_mob.updatehealth()
|
||||||
|
if(5)
|
||||||
|
affected_mob << "\red You feel something tearing its way out of your stomach..."
|
||||||
|
affected_mob.adjustToxLoss(10)
|
||||||
|
affected_mob.updatehealth()
|
||||||
|
if(prob(50))
|
||||||
|
AttemptGrow()
|
||||||
|
|
||||||
|
/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
|
||||||
|
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(affected_mob.client)
|
||||||
|
picked = affected_mob.key
|
||||||
|
else
|
||||||
|
stage = 4 // Let's try again later.
|
||||||
|
return
|
||||||
|
|
||||||
|
if(affected_mob.lying)
|
||||||
|
affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_lie")
|
||||||
|
else
|
||||||
|
affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_stand")
|
||||||
|
spawn(6)
|
||||||
|
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
|
||||||
|
new_xeno.key = picked
|
||||||
|
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
|
||||||
|
if(gib_on_success)
|
||||||
|
affected_mob.gib()
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
/*----------------------------------------
|
||||||
|
Proc: RefreshInfectionImage()
|
||||||
|
Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens.
|
||||||
|
----------------------------------------*/
|
||||||
|
/obj/item/alien_embryo/proc/RefreshInfectionImage()
|
||||||
|
spawn(0)
|
||||||
|
for (var/mob/living/carbon/alien/alien in player_list)
|
||||||
|
if (alien.client)
|
||||||
|
for(var/image/I in alien.client.images)
|
||||||
|
if(dd_hasprefix_case(I.icon_state, "infected"))
|
||||||
|
del(I)
|
||||||
|
|
||||||
|
for (var/mob/living/carbon/alien/alien in player_list)
|
||||||
|
if (alien.client)
|
||||||
|
for (var/mob/living/carbon/C in mob_list)
|
||||||
|
if(C)
|
||||||
|
if (C.status_flags & XENO_HOST)
|
||||||
|
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
|
||||||
|
alien.client.images += I
|
||||||
|
for (var/mob/living/simple_animal/corgi/C in mob_list)
|
||||||
|
if(C)
|
||||||
|
if (C.status_flags & XENO_HOST)
|
||||||
|
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
|
||||||
|
alien.client.images += I
|
||||||
|
return
|
||||||
|
|
||||||
|
/*----------------------------------------
|
||||||
|
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/alien_embryo/proc/AddInfectionImages(var/mob/living/C)
|
||||||
|
if (C)
|
||||||
|
for (var/mob/living/carbon/alien/alien in player_list)
|
||||||
|
if (alien.client)
|
||||||
|
if (C.status_flags & XENO_HOST)
|
||||||
|
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
|
||||||
|
alien.client.images += I
|
||||||
|
return
|
||||||
|
|
||||||
|
/*----------------------------------------
|
||||||
|
Proc: RemoveInfectionImage(C)
|
||||||
|
Des: Removes the alien infection image from all aliens in the world located in passed mob (C).
|
||||||
|
----------------------------------------*/
|
||||||
|
|
||||||
|
/obj/item/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C)
|
||||||
|
if (C)
|
||||||
|
for (var/mob/living/carbon/alien/alien in player_list)
|
||||||
|
if (alien.client)
|
||||||
|
for(var/image/I in alien.client.images)
|
||||||
|
if(I.loc == C)
|
||||||
|
if(dd_hasprefix_case(I.icon_state, "infected"))
|
||||||
|
del(I)
|
||||||
|
return
|
||||||
@@ -94,12 +94,22 @@ var/const/MAX_ACTIVE_TIME = 400
|
|||||||
if(CanHug(AM))
|
if(CanHug(AM))
|
||||||
Attach(AM)
|
Attach(AM)
|
||||||
|
|
||||||
|
/obj/item/clothing/mask/facehugger/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/facehugger/throw_impact(atom/hit_atom)
|
/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom)
|
||||||
Attach(hit_atom)
|
..()
|
||||||
return
|
if(stat == CONSCIOUS)
|
||||||
|
icon_state = "[initial(icon_state)]"
|
||||||
|
Attach(hit_atom)
|
||||||
|
|
||||||
/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
|
/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
|
||||||
if(!iscarbon(M) || isalien(M))
|
if( (!iscorgi(M) && !iscarbon(M)) || isalien(M))
|
||||||
return
|
return
|
||||||
if(attached)
|
if(attached)
|
||||||
return
|
return
|
||||||
@@ -114,49 +124,61 @@ var/const/MAX_ACTIVE_TIME = 400
|
|||||||
if(stat != CONSCIOUS) 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
|
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
|
||||||
|
|
||||||
var/mob/living/carbon/target = L
|
L.visible_message("\red \b [src] leaps at [L]'s face!")
|
||||||
|
|
||||||
target.visible_message("\red \b [src] leaps at [target]'s face!")
|
if(ishuman(L))
|
||||||
|
var/mob/living/carbon/human/H = L
|
||||||
if(ishuman(target))
|
|
||||||
var/mob/living/carbon/human/H = target
|
|
||||||
if(H.head && H.head.flags & HEADCOVERSMOUTH)
|
if(H.head && H.head.flags & HEADCOVERSMOUTH)
|
||||||
H.visible_message("\red \b [src] smashes against [H]'s [H.head]!")
|
H.visible_message("\red \b [src] smashes against [H]'s [H.head]!")
|
||||||
Die()
|
Die()
|
||||||
return
|
return
|
||||||
|
|
||||||
if(target.wear_mask)
|
if(iscarbon(M))
|
||||||
if(prob(20)) return
|
var/mob/living/carbon/target = L
|
||||||
var/obj/item/clothing/W = target.wear_mask
|
|
||||||
if(!W.canremove) return
|
|
||||||
target.drop_from_inventory(W)
|
|
||||||
|
|
||||||
target.visible_message("\red \b [src] tears [W] off of [target]'s face!")
|
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.equip_to_slot(src, slot_wear_mask)
|
target.visible_message("\red \b [src] tears [W] off of [target]'s face!")
|
||||||
|
|
||||||
|
target.equip_to_slot(src, slot_wear_mask)
|
||||||
|
|
||||||
|
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/C = M
|
||||||
|
src.loc = C
|
||||||
|
C.facehugger = src
|
||||||
|
C.wear_mask = src
|
||||||
|
//C.regenerate_icons()
|
||||||
|
|
||||||
GoIdle() //so it doesn't jump the people that tear it off
|
GoIdle() //so it doesn't jump the people that tear it off
|
||||||
|
|
||||||
if(!sterile) target.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
|
|
||||||
|
|
||||||
spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
|
spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
|
||||||
Impregnate(target)
|
Impregnate(L)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/carbon/target as mob)
|
/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob)
|
||||||
if(!target || target.wear_mask != src || target.stat == DEAD) //was taken off or something
|
if(!target || target.wear_mask != src || target.stat == DEAD) //was taken off or something
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!sterile)
|
if(!sterile)
|
||||||
target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
|
//target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
|
||||||
for(var/datum/disease/alien_embryo/A in target.viruses)
|
new /obj/item/alien_embryo(target)
|
||||||
target.status_flags |= XENO_HOST
|
target.status_flags |= XENO_HOST
|
||||||
break
|
|
||||||
|
|
||||||
target.visible_message("\red \b [src] falls limp after violating [target]'s face!")
|
target.visible_message("\red \b [src] falls limp after violating [target]'s face!")
|
||||||
|
|
||||||
Die()
|
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
|
else
|
||||||
target.visible_message("\red \b [src] violates [target]'s face!")
|
target.visible_message("\red \b [src] violates [target]'s face!")
|
||||||
return
|
return
|
||||||
@@ -204,6 +226,9 @@ var/const/MAX_ACTIVE_TIME = 400
|
|||||||
|
|
||||||
/proc/CanHug(var/mob/M)
|
/proc/CanHug(var/mob/M)
|
||||||
|
|
||||||
|
if(iscorgi(M))
|
||||||
|
return 1
|
||||||
|
|
||||||
if(!iscarbon(M) || isalien(M))
|
if(!iscarbon(M) || isalien(M))
|
||||||
return 0
|
return 0
|
||||||
var/mob/living/carbon/C = M
|
var/mob/living/carbon/C = M
|
||||||
@@ -211,4 +236,4 @@ var/const/MAX_ACTIVE_TIME = 400
|
|||||||
var/mob/living/carbon/human/H = C
|
var/mob/living/carbon/human/H = C
|
||||||
if(H.head && H.head.flags & HEADCOVERSMOUTH)
|
if(H.head && H.head.flags & HEADCOVERSMOUTH)
|
||||||
return 0
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
var/brain_op_stage = 0.0
|
var/brain_op_stage = 0.0
|
||||||
var/eye_op_stage = 0.0
|
var/eye_op_stage = 0.0
|
||||||
var/appendix_op_stage = 0.0
|
var/appendix_op_stage = 0.0
|
||||||
|
var/alien_op_stage = 0.0
|
||||||
|
|
||||||
var/antibodies = 0
|
var/antibodies = 0
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
see_in_dark = 5
|
see_in_dark = 5
|
||||||
var/obj/item/inventory_head
|
var/obj/item/inventory_head
|
||||||
var/obj/item/inventory_back
|
var/obj/item/inventory_back
|
||||||
|
var/facehugger
|
||||||
|
|
||||||
/mob/living/simple_animal/corgi/Life()
|
/mob/living/simple_animal/corgi/Life()
|
||||||
..()
|
..()
|
||||||
@@ -375,7 +376,7 @@
|
|||||||
if(health <= 0)
|
if(health <= 0)
|
||||||
head_icon_state += "2"
|
head_icon_state += "2"
|
||||||
|
|
||||||
var/icon/head_icon = icon('icons/mob/corgi_head.dmi',head_icon_state)
|
var/icon/head_icon = image('icons/mob/corgi_head.dmi',head_icon_state)
|
||||||
if(head_icon)
|
if(head_icon)
|
||||||
overlays += head_icon
|
overlays += head_icon
|
||||||
|
|
||||||
@@ -384,9 +385,16 @@
|
|||||||
if(health <= 0)
|
if(health <= 0)
|
||||||
back_icon_state += "2"
|
back_icon_state += "2"
|
||||||
|
|
||||||
var/icon/back_icon = icon('icons/mob/corgi_back.dmi',back_icon_state)
|
var/icon/back_icon = image('icons/mob/corgi_back.dmi',back_icon_state)
|
||||||
if(back_icon)
|
if(back_icon)
|
||||||
overlays += back_icon
|
overlays += back_icon
|
||||||
|
|
||||||
|
if(facehugger)
|
||||||
|
if(istype(src, /mob/living/simple_animal/corgi/puppy))
|
||||||
|
overlays += image('icons/mob/mask.dmi',"facehugger_corgipuppy")
|
||||||
|
else
|
||||||
|
overlays += image('icons/mob/mask.dmi',"facehugger_corgi")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,12 @@
|
|||||||
damage = 20
|
damage = 20
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/projectile/energy/neurotoxin
|
||||||
|
name = "neuro"
|
||||||
|
icon_state = "neurotoxin"
|
||||||
|
damage = 5
|
||||||
|
damage_type = TOX
|
||||||
|
weaken = 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,10 +49,20 @@ should be listed in the changelog upon commit tho. Thanks. -->
|
|||||||
|
|
||||||
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
|
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
|
||||||
<div class="commit sansserif">
|
<div class="commit sansserif">
|
||||||
<h2 class="date">31 December 2012</h2>
|
<h2 class="date">08 January 2013</h2>
|
||||||
|
<h3 class="author">Cael Aislinn & WJohnston updated:</h3>
|
||||||
|
<ul class="changes bgimages16">
|
||||||
|
<li class="imageadd">Many new icons for aliens (death, sleeping, unconscious, neurotox, thrown/impregnated facehugger etc)</li>
|
||||||
|
<li class="rscadd">Alien larva can now be removed by dangerous and unnecessary surgery (and actually chestburst if they aren't).</li>
|
||||||
|
<li class="imageadd">Alien larva now have sprites to represent their growth: bloody at 0%, pale at 25% and 75% the normal deep red.</li>
|
||||||
|
<li class="rscadd">New icon overlays for representing alien embryo progression.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="commit sansserif">
|
||||||
|
<h2 class="date">07 January 2013</h2>
|
||||||
<h3 class="author">Kor updated:</h3>
|
<h3 class="author">Kor updated:</h3>
|
||||||
<ul class="changes bgimages16">
|
<ul class="changes bgimages16">
|
||||||
<li class="add">Four new slime types with their own extract reactions have been added. Sprites this time were created by Reisyn, SuperElement, and LePinkyFace.</li>
|
<li class="rscadd">Four new slime types with their own extract reactions have been added. Sprites this time were created by Reisyn, SuperElement, and LePinkyFace.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div class="commit sansserif">
|
<div class="commit sansserif">
|
||||||
@@ -60,7 +70,7 @@ should be listed in the changelog upon commit tho. Thanks. -->
|
|||||||
|
|
||||||
<h3 class="author">Kor updated:</h3>
|
<h3 class="author">Kor updated:</h3>
|
||||||
<ul class="changes bgimages16">
|
<ul class="changes bgimages16">
|
||||||
<li class="add">Slime breeding! There are now 13 varities of slime, each with its own extract reaction (inject five units of plasma). Some of these reactions are reused from the old cores, some are new. As to breeding, each colour of slime has a series of other slimes it may mutate into when it reproduces.</li>
|
<li class="rscadd">Slime breeding! There are now 13 varities of slime, each with its own extract reaction (inject five units of plasma). Some of these reactions are reused from the old cores, some are new. As to breeding, each colour of slime has a series of other slimes it may mutate into when it reproduces.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h3 class="author">Giacom updated:</h3>
|
<h3 class="author">Giacom updated:</h3>
|
||||||
<ul class="changes bgimages16">
|
<ul class="changes bgimages16">
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 233 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 28 KiB |
@@ -79,7 +79,6 @@
|
|||||||
#include "code\datums\spell.dm"
|
#include "code\datums\spell.dm"
|
||||||
#include "code\datums\sun.dm"
|
#include "code\datums\sun.dm"
|
||||||
#include "code\datums\supplypacks.dm"
|
#include "code\datums\supplypacks.dm"
|
||||||
#include "code\datums\diseases\alien_embryo.dm"
|
|
||||||
#include "code\datums\diseases\appendicitis.dm"
|
#include "code\datums\diseases\appendicitis.dm"
|
||||||
#include "code\datums\diseases\beesease.dm"
|
#include "code\datums\diseases\beesease.dm"
|
||||||
#include "code\datums\diseases\brainrot.dm"
|
#include "code\datums\diseases\brainrot.dm"
|
||||||
@@ -801,6 +800,7 @@
|
|||||||
#include "code\modules\mob\living\carbon\alien\larva\life.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\powers.dm"
|
||||||
#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm"
|
#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm"
|
||||||
|
#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm"
|
||||||
#include "code\modules\mob\living\carbon\alien\special\facehugger.dm"
|
#include "code\modules\mob\living\carbon\alien\special\facehugger.dm"
|
||||||
#include "code\modules\mob\living\carbon\brain\brain.dm"
|
#include "code\modules\mob\living\carbon\brain\brain.dm"
|
||||||
#include "code\modules\mob\living\carbon\brain\brain_item.dm"
|
#include "code\modules\mob\living\carbon\brain\brain_item.dm"
|
||||||
|
|||||||