- 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
This commit is contained in:
petethegoat@gmail.com
2013-01-08 16:30:45 +00:00
parent 6ae1348790
commit ef8369409e
37 changed files with 567 additions and 121 deletions

View File

@@ -174,8 +174,8 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
if(resistance && !(type in affected_mob.resistances))
var/saved_type = "[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.
affected_mob.status_flags &= ~(XENO_HOST)
/*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.viruses -= src //remove the datum from the list
del(src) //delete the datum to stop it processing
return

View File

@@ -1,5 +1,7 @@
//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
/datum/disease/alien_embryo/process()
if(!holder) return
@@ -97,6 +99,9 @@
gibbed = 1
return
/datum/disease/alien_embryo/stage_change(var/old_stage)
RefreshInfectionImage()
/*----------------------------------------
Proc: RefreshInfectionImage()
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)
if (alien.client)
for(var/image/I in alien.client.images)
if(I.icon_state == "infected")
if(dd_hasprefix_case(I.icon_state, "infected"))
del(I)
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)
if(C)
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
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)
if (alien.client)
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
return
@@ -142,6 +147,6 @@ Des: Removes the alien infection image from all aliens in the world located in p
if (alien.client)
for(var/image/I in alien.client.images)
if(I.loc == C)
if(I.icon_state == "infected")
if(dd_hasprefix_case(I.icon_state, "infected"))
del(I)
return

View File

@@ -358,8 +358,9 @@ Alien plants should do something if theres a lot of poison
*/
/var/const //for the status var
BURST = 0
GROWING = 1
GROWN = 2
BURSTING = 1
GROWING = 2
GROWN = 3
MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
MAX_GROWTH_TIME = 3000
@@ -394,8 +395,7 @@ Alien plants should do something if theres a lot of poison
return
if(GROWN)
user << "\red You retrieve the child."
loc.contents += GetFacehugger()//need to write the code for giving it to the alien later
Burst()
Burst(0)
return
else
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
var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
if(kill && istype(child))
loc.contents += child
child.Die()
icon_state = "egg_hatched"
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
@@ -465,19 +473,9 @@ Alien plants should do something if theres a lot of poison
if(status == GROWN)
if(!CanHug(AM))
return
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
status = BURST
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)

View File

@@ -33,6 +33,36 @@
icon_state = "sheet-lizard"
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
name = "hairless hide"
desc = "This hide was stripped of it's hair, but still needs tanning."

View File

@@ -87,6 +87,45 @@
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))))
return ..()
@@ -184,6 +223,42 @@
M.take_organ_damage(15)
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))))
return ..()
@@ -513,6 +588,33 @@
M.updatehealth()
M:eye_op_stage = 1.0
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
return ..()
/* wat
@@ -657,6 +759,32 @@
..()
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
return ..()
/*

View File

@@ -240,73 +240,59 @@
return
/obj/structure/table/attack_paw(mob/user as mob)
if ((HULK in usr.mutations))
usr << "\blue You destroy the table."
usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
visible_message("\red [user] smashes the table apart!")
/obj/structure/table/attack_paw(mob/user)
if(HULK in user.mutations)
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
visible_message("<span class='danger'>[user] smashes the table apart!</span>")
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))
new/obj/item/weapon/table_parts/wood( src.loc )
new/obj/item/weapon/table_parts/wood(loc)
else
new /obj/item/weapon/table_parts( src.loc )
src.density = 0
new /obj/item/weapon/table_parts(loc)
density = 0
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
usr << "\green You destroy the table."
visible_message("\red [user] slices the table apart!")
/obj/structure/table/attack_alien(mob/user)
visible_message("<span class='danger'>[user] slices [src] apart!</span>")
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))
new/obj/item/weapon/table_parts/wood( src.loc )
new/obj/item/weapon/table_parts/wood(loc)
else
new /obj/item/weapon/table_parts( src.loc )
src.density = 0
new /obj/item/weapon/table_parts(loc)
density = 0
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)
usr << "\red You destroy the table."
visible_message("\red [user] smashes the table apart!")
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
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))
new/obj/item/weapon/table_parts/wood( src.loc )
new/obj/item/weapon/table_parts/wood(loc)
else
new /obj/item/weapon/table_parts( src.loc )
src.density = 0
new /obj/item/weapon/table_parts(loc)
density = 0
del(src)
return
/obj/structure/table/attack_hand(mob/user as mob)
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
usr << "\blue You destroy the table."
visible_message("\red [user] smashes the table apart!")
usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
/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!" ))
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))
new/obj/item/weapon/table_parts/wood( src.loc )
new/obj/item/weapon/table_parts/wood(loc)
else
new /obj/item/weapon/table_parts( src.loc )
src.density = 0
new /obj/item/weapon/table_parts(loc)
density = 0
del(src)
return
/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))
new /obj/item/weapon/rack_parts( src.loc )
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
//SN src = null
del(src)
return
if(isrobot(user))
@@ -565,3 +550,36 @@
/obj/structure/rack/meteorhit(obj/O as obj)
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)

View File

@@ -171,3 +171,11 @@
icon_state = "bearpelt"
item_state = "bearpelt"
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

View File

@@ -212,3 +212,11 @@
usr << "You button-up some imaginary buttons on your [src]."
return
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

View File

@@ -185,9 +185,10 @@ Des: Gives the client of the alien an image on each infected mob.
----------------------------------------*/
/mob/living/carbon/alien/proc/AddInfectionImages()
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)
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
return
@@ -199,11 +200,10 @@ Des: Removes all infected images from the alien.
/mob/living/carbon/alien/proc/RemoveInfectionImages()
if (client)
for(var/image/I in client.images)
if(I.icon_state == "infected")
if(dd_hasprefix_case(I.icon_state, "infected"))
del(I)
return
#undef HEAT_DAMAGE_LEVEL_1
#undef HEAT_DAMAGE_LEVEL_2
#undef HEAT_DAMAGE_LEVEL_3

View File

@@ -142,7 +142,7 @@ Doesn't work on other aliens/AI.*/
if(!istype(U, /turf))
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.yo = U.y - T.y

View File

@@ -9,6 +9,7 @@
O.show_message("<B>[src]</B> lets out a waning guttural screech, green blood bubbling from its maw...", 1)
update_canmove()
if(client) blind.layer = 0
update_icons()
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)

View File

@@ -359,6 +359,8 @@
//Other
if(stunned)
AdjustStunned(-1)
if(!stunned)
update_icons()
if(weakened)
weakened = max(weakened-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times

View File

@@ -14,9 +14,21 @@
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
overlays.Cut()
if(lying)
if(resting) icon_state = "alien[caste]_sleep"
else icon_state = "alien[caste]_l"
if(stat == DEAD)
//If we mostly took damage from fire
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)
overlays += I
else

View File

@@ -2,7 +2,7 @@
if(stat == DEAD) return
if(healths) healths.icon_state = "health6"
stat = DEAD
icon_state = "larva_l"
icon_state = "larva_dead"
if(!gibbed)
update_canmove()

View File

@@ -88,6 +88,9 @@
if("jump")
message = "<B>The [src.name]</B> jumps!"
m_type = 1
if("hiss_")
message = "<B>The [src.name]</B> hisses softly."
m_type = 1
if("collapse")
Paralyse(2)
message = text("<B>[]</B> collapses!", src)

View File

@@ -1,7 +1,7 @@
/mob/living/carbon/alien/larva
name = "alien larva"
real_name = "alien larva"
icon_state = "larva"
icon_state = "larva0"
pass_flags = PASSTABLE
maxHealth = 25
@@ -11,6 +11,7 @@
var/amount_grown = 0
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
/mob/living/carbon/alien/larva/New()

View File

@@ -55,6 +55,9 @@
for(var/obj/item/weapon/grab/G in src)
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)
handle_regular_hud_updates()
@@ -226,7 +229,7 @@
return 1
//UNCONSCIOUS. NO-ONE IS HOME
if( (getOxyLoss() > 50) || (0 > health) )
if( (getOxyLoss() > 25) || (0 > health) )
//if( health <= 20 && prob(1) )
// spawn(0)
// emote("gasp")
@@ -244,7 +247,7 @@
stat = UNCONSCIOUS
if( prob(10) && health )
spawn(0)
emote("hiss")
emote("hiss_")
//CONSCIOUS
else
stat = CONSCIOUS

View File

@@ -28,12 +28,16 @@
if(stat != CONSCIOUS)
return
if(handcuffed || legcuffed)
src << "\red You cannot evolve when you are cuffed."
if(amount_grown >= max_grown) //TODO ~Carn
src << "\green You are growing into a beautiful alien! It is time to choose a caste."
src << "\green There are three to choose from:"
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 << "\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 << "\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."
//green is impossible to read, so i made these blue and changed the formatting slightly
src << "\blue <b>You are growing into a beautiful alien! It is time to choose a caste.</b>"
src << "\blue There are three to choose from:"
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 << "<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/mob/living/carbon/alien/humanoid/new_xeno

View File

@@ -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]"

View 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

View File

@@ -94,12 +94,22 @@ var/const/MAX_ACTIVE_TIME = 400
if(CanHug(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)
..()
if(stat == CONSCIOUS)
icon_state = "[initial(icon_state)]"
Attach(hit_atom)
return
/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
if(!iscarbon(M) || isalien(M))
if( (!iscorgi(M) && !iscarbon(M)) || isalien(M))
return
if(attached)
return
@@ -114,17 +124,18 @@ 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
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(target))
var/mob/living/carbon/human/H = target
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.head && H.head.flags & HEADCOVERSMOUTH)
H.visible_message("\red \b [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
@@ -135,28 +146,39 @@ var/const/MAX_ACTIVE_TIME = 400
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
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))
Impregnate(target)
Impregnate(L)
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
return
if(!sterile)
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)
//target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
new /obj/item/alien_embryo(target)
target.status_flags |= XENO_HOST
break
target.visible_message("\red \b [src] falls limp after violating [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("\red \b [src] violates [target]'s face!")
return
@@ -204,6 +226,9 @@ var/const/MAX_ACTIVE_TIME = 400
/proc/CanHug(var/mob/M)
if(iscorgi(M))
return 1
if(!iscarbon(M) || isalien(M))
return 0
var/mob/living/carbon/C = M

View File

@@ -5,6 +5,7 @@
var/brain_op_stage = 0.0
var/eye_op_stage = 0.0
var/appendix_op_stage = 0.0
var/alien_op_stage = 0.0
var/antibodies = 0

View File

@@ -20,6 +20,7 @@
see_in_dark = 5
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
/mob/living/simple_animal/corgi/Life()
..()
@@ -375,7 +376,7 @@
if(health <= 0)
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)
overlays += head_icon
@@ -384,9 +385,16 @@
if(health <= 0)
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)
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

View File

@@ -46,6 +46,12 @@
damage = 20
/obj/item/projectile/energy/neurotoxin
name = "neuro"
icon_state = "neurotoxin"
damage = 5
damage_type = TOX
weaken = 5

View File

@@ -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 -->
<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>
<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>
<div class="commit sansserif">
@@ -60,7 +70,7 @@ should be listed in the changelog upon commit tho. Thanks. -->
<h3 class="author">Kor updated:</h3>
<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>
<h3 class="author">Giacom updated:</h3>
<ul class="changes bgimages16">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -79,7 +79,6 @@
#include "code\datums\spell.dm"
#include "code\datums\sun.dm"
#include "code\datums\supplypacks.dm"
#include "code\datums\diseases\alien_embryo.dm"
#include "code\datums\diseases\appendicitis.dm"
#include "code\datums\diseases\beesease.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\powers.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\brain\brain.dm"
#include "code\modules\mob\living\carbon\brain\brain_item.dm"