Merge pull request #11112 from MisterGrimm/XenomorphOverhaul

Xenomorph Overhaul and fixes from Gurgstation
This commit is contained in:
Aronai Sieyes
2021-07-19 21:06:21 -04:00
committed by GitHub
27 changed files with 217 additions and 631 deletions
+1 -1
View File
@@ -231,7 +231,7 @@ var/list/gamemode_cache = list()
// 15, 45, 70 minutes respectively
var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000)
var/static/aliens_allowed = 0
var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs.
var/static/ninjas_allowed = 0
var/static/abandon_allowed = 1
var/static/ooc_allowed = 1
+5 -5
View File
@@ -86,17 +86,17 @@
var/mob/living/carbon/human/X = user
if(istype(X.species, /datum/species/xenos))
if(src.locked || src.welded)
visible_message("<span class='alium'>\The [user] begins digging into \the [src] internals!</span>")
visible_message("<span class='alium'>\The [user] begins tearing into \the [src] internals!</span>")
src.do_animate("deny")
if(do_after(user,5 SECONDS,src))
visible_message("<span class='danger'>\The [user] forces \the [src] open, sparks flying from its electronics!</span>")
if(do_after(user,15 SECONDS,src))
visible_message("<span class='danger'>\The [user] tears \the [src] open, sparks flying from its electronics!</span>")
src.do_animate("spark")
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS)
playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS)
src.locked = 0
src.welded = 0
update_icon()
open(1)
src.emag_act()
src.set_broken() //These aren't emags, these be CLAWS
else if(src.density)
visible_message("<span class='alium'>\The [user] begins forcing \the [src] open!</span>")
if(do_after(user, 5 SECONDS,src))
+2 -127
View File
@@ -4,7 +4,6 @@
* Resin
* Weeds
* Acid
* Egg
*/
/*
@@ -204,6 +203,7 @@
layer = ABOVE_TURF_LAYER+0.01
light_range = NODERANGE
light_on = TRUE
light_color = "#673972"
var/node_range = NODERANGE
var/set_color = "#321D37"
@@ -422,129 +422,4 @@
visible_message("<span class='alium'>[src.target] begins to crumble under the acid!</span>")
spawn(rand(150, 200)) tick()
/*
* Egg
*/
/var/const //for the status var
BURST = 0
BURSTING = 1
GROWING = 2
GROWN = 3
MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
MAX_GROWTH_TIME = 3000
/obj/effect/alien/egg
desc = "It looks like a weird egg"
name = "egg"
// icon_state = "egg_growing" // So the egg looks 'grown', even though it's not.
icon_state = "egg"
density = FALSE
anchored = TRUE
var/health = 100
var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive
/obj/effect/alien/egg/New()
/*
if(config.aliens_allowed)
..()
spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME))
Grow()
else
qdel(src)
*/
/obj/effect/alien/egg/attack_hand(user as mob)
var/mob/living/carbon/M = user
if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs))
return attack_hand(user)
switch(status)
if(BURST)
to_chat(user, "<span class='warning'>You clear the hatched egg.</span>")
qdel(src)
return
/* if(GROWING)
to_chat(user, "<span class='warning'>The child is not developed yet.</span>")
return
if(GROWN)
to_chat(user, "<span class='warning'>You retrieve the child.</span>")
Burst(0)
return
/obj/effect/alien/egg/proc/GetFacehugger() // Commented out for future edit.
return locate(/obj/item/clothing/mask/facehugger) in contents
/obj/effect/alien/egg/proc/Grow()
icon_state = "egg"
// status = GROWN
status = BURST
// new /obj/item/clothing/mask/facehugger(src)
return
*/
/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
if(status == GROWN || status == GROWING)
// var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
icon_state = "egg_hatched"
/* flick("egg_opening", src)
status = BURSTING
spawn(15)
status = BURST
child.loc = get_turf(src)
if(kill && istype(child))
child.Die()
else
for(var/mob/M in range(1,src))
if(CanHug(M))
child.Attach(M)
break
*/
/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
healthcheck()
return
/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb)
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
user.do_attack_animation(src)
health -= damage
healthcheck()
return
/obj/effect/alien/egg/take_damage(var/damage)
health -= damage
healthcheck()
return
/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
if(health <= 0)
return
if(LAZYLEN(W.attack_verb))
src.visible_message("<span class='danger'>\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
else
src.visible_message("<span class='danger'>\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
var/damage = W.force / 4.0
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
damage = 15
playsound(src, 'sound/items/Welder.ogg', 100, 1)
src.health -= damage
src.healthcheck()
/obj/effect/alien/egg/proc/healthcheck()
if(health <= 0)
Burst()
/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 500 + T0C)
health -= 5
healthcheck()
//Xenomorph Effect egg removed, replaced with Structure Egg.
@@ -0,0 +1,96 @@
#define MAX_PROGRESS 100
/obj/structure/alien/egg //Gurg Addition, working alien egg structure.
desc = "It looks like a weird egg."
name = "egg"
icon_state = "egg_growing"
density = 0
anchored = 1
var/progress = 0
/obj/structure/alien/egg/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/structure/alien/egg/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/structure/alien/egg/CanUseTopic(var/mob/user)
return isobserver(user) ? STATUS_INTERACTIVE : STATUS_CLOSE
/obj/structure/alien/egg/Topic(href, href_list)
if(..())
return 1
if(href_list["spawn"])
attack_ghost(usr)
/obj/structure/alien/egg/process()
progress++
if(progress >= MAX_PROGRESS)
for(var/mob/observer/dead/O in observer_mob_list)
if(O.client)
to_chat(O, "<span class='notice'>An alien is ready to hatch at [get_area(src.loc)]! (<a href='byond://?src=\ref[src];spawn=1'>spawn</a>)</span>")
STOP_PROCESSING(SSobj, src)
update_icon()
/obj/structure/alien/egg/update_icon()
if(progress == -1)
icon_state = "egg_hatched"
else if(progress < MAX_PROGRESS)
icon_state = "egg_growing"
else
icon_state = "egg"
/obj/structure/alien/egg/attack_ghost(var/mob/observer/ghost/user)
if(progress == -1) //Egg has been hatched.
return
if(progress < MAX_PROGRESS)
to_chat(user, "\The [src] has not yet matured.")
return
if(!user.MayRespawn(1))
return
// Check for bans properly.
if(jobban_isbanned(user, "Xenomorph"))
to_chat(user, "<span class='danger'>You are banned from playing a Xenomorph.</span>")
return
var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes")
if(!src || confirm != "Yes")
return
if(!user || !user.ckey)
return
if(progress == -1) //Egg has been hatched.
to_chat(user, "Too slow...")
return
flick("egg_opening",src)
progress = -1 // No harvesting pls.
sleep(5)
if(!src || !user)
visible_message("<span class='alium'>\The [src] writhes with internal motion, but nothing comes out.</span>")
progress = MAX_PROGRESS // Someone else can have a go.
return // What a pain.
// Create the mob, transfer over key.
var/mob/living/carbon/alien/larva/larva = new(get_turf(src))
larva.ckey = user.ckey
spawn(-1)
if(user) qdel(user) // Remove the keyless ghost if it exists.
visible_message("<span class='alium'>\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!</span>")
// Turn us into a hatched egg.
name = "hatched alien egg"
desc += " This one has hatched."
update_icon()
#undef MAX_PROGRESS
@@ -0,0 +1,62 @@
/obj/structure/alien //Gurg Addition, framework for alien eggs.
name = "alien thing"
desc = "There's something alien about this."
icon = 'icons/mob/alien.dmi'
layer = ABOVE_JUNK_LAYER
var/health = 50
/obj/structure/alien/proc/healthcheck()
if(health <=0)
set_density(0)
qdel(src)
return
/obj/structure/alien/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
healthcheck()
return
/obj/structure/alien/ex_act(severity)
switch(severity)
if(1.0)
health-=50
if(2.0)
health-=50
if(3.0)
if (prob(50))
health-=50
else
health-=25
healthcheck()
return
/obj/structure/alien/hitby(AM as mob|obj)
..()
visible_message("<span class='danger'>\The [src] was hit by \the [AM].</span>")
var/tforce = 0
if(ismob(AM))
tforce = 10
else
tforce = AM:throwforce
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
health = max(0, health - tforce)
healthcheck()
..()
return
/obj/structure/alien/attack_generic()
attack_hand(usr)
/obj/structure/alien/attackby(var/obj/item/weapon/W, var/mob/user)
health = max(0, health - W.force)
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
healthcheck()
..()
return
/obj/structure/alien/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group) return 0
if(istype(mover) && mover.checkpass(PASSGLASS))
return !opacity
return !density
@@ -43,10 +43,6 @@
/mob/living/carbon/alien/u_equip(obj/item/W as obj)
return
/mob/living/carbon/alien/Stat()
..()
stat(null, "Progress: [amount_grown]/[max_grown]")
/mob/living/carbon/alien/restrained()
return 0
@@ -1,3 +1,8 @@
/mob/living/carbon/alien/diona/Stat() //Specified where progression is at, doesn't work right for some things in carbon/alien
. = ..()
if(. && statpanel("Status"))
stat("Growth", "[round(amount_grown)]/[max_grown]")
/mob/living/carbon/alien/diona/confirm_evolution()
if(!is_alien_whitelisted(src, GLOB.all_species[SPECIES_DIONA]))
@@ -5,9 +5,10 @@
speak_emote = list("hisses")
icon_state = "larva"
language = "Hivemind"
maxHealth = 25
health = 25
maxHealth = 50
health = 50
faction = "xeno"
max_grown = 325 //Increase larva growth time due to not needing hosts.
/mob/living/carbon/alien/larva/Initialize()
. = ..()
@@ -1,3 +1,8 @@
/mob/living/carbon/alien/larva/Stat() //Specified where progression stats come from, because for some reason it doesn't work right in carbon/alien
. = ..()
if(. && statpanel("Status"))
stat("Growth", "[round(amount_grown)]/[max_grown]")
/mob/living/carbon/alien/larva/confirm_evolution()
to_chat(src, "<span class='notice'><b>You are growing into a beautiful alien! It is time to choose a caste.</b></span>")
+1 -1
View File
@@ -28,7 +28,7 @@
var/rads = radiation/25
radiation -= rads
adjust_nutrition(rads)
//adjust_nutrition(rads) //Commented out to prevent alien obesity.
heal_overall_damage(rads,rads)
adjustOxyLoss(-(rads))
adjustToxLoss(-(rads))
@@ -64,11 +64,11 @@
/datum/unarmed_attack/claws/strong/xeno
attack_verb = list("slashed", "gouged", "stabbed")
damage = 10
damage = 15
/datum/unarmed_attack/claws/strong/xeno/queen
attack_verb = list("slashed", "gouged", "stabbed", "gored")
damage = 15
damage = 20
/datum/unarmed_attack/bite/strong
attack_name = "strong bite"
@@ -77,7 +77,7 @@
shredding = 1
/datum/unarmed_attack/bite/strong/xeno
damage = 10
damage = 15
/datum/unarmed_attack/slime_glomp
attack_name = "glomp"
@@ -1,161 +0,0 @@
// 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 //Commented out as reference for future reproduction methods, or addition later.
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
START_PROCESSING(SSobj, src)
spawn(0)
AddInfectionImages(affected_mob)
else
qdel(src)
/obj/item/alien_embryo/Destroy()
if(affected_mob)
affected_mob.status_flags &= ~(XENO_HOST)
spawn(0)
RemoveInfectionImages(affected_mob)
..()
/obj/item/alien_embryo/process()
if(!affected_mob) return
if(loc != affected_mob)
affected_mob.status_flags &= ~(XENO_HOST)
STOP_PROCESSING(SSobj, src)
spawn(0)
RemoveInfectionImages(affected_mob)
affected_mob = null
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))
to_chat(affected_mob, "<span class='danger'>Your throat feels sore.</span>")
if(prob(1))
to_chat(affected_mob, "<span class='danger'>Mucous runs down the back of your throat.</span>")
if(4)
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(2))
to_chat(affected_mob, "<span class='danger'> Your muscles ache.</span>")
if(prob(20))
affected_mob.take_organ_damage(1)
if(prob(2))
to_chat(affected_mob, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20))
affected_mob.adjustToxLoss(1)
affected_mob.updatehealth()
if(5)
to_chat(affected_mob, "<span class='danger'>You feel something tearing its way out of your stomach...</span>")
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.add_overlay("burst_lie")
else
affected_mob.add_overlay("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()
qdel(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()
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
for(var/image/I in alien.client.images)
if(dd_hasprefix_case(I.icon_state, "infected"))
qdel(I)
for(var/mob/living/L in mob_list)
if(iscorgi(L) || iscarbon(L))
if(L.status_flags & XENO_HOST)
var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[stage]")
alien.client.images += I
/*----------------------------------------
Proc: AddInfectionImages(C)
Des: Checks if the passed mob (C) is infected with the alien egg, then gives each alien client an infected image at C.
----------------------------------------*/
/obj/item/alien_embryo/proc/AddInfectionImages(var/mob/living/C)
if(C)
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
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
/*----------------------------------------
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 in player_list)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
for(var/image/I in alien.client.images)
if(I.loc == C)
if(dd_hasprefix_case(I.icon_state, "infected"))
qdel(I)
*/
@@ -1,221 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
//TODO: Make these simple_mobs
/* //Commented out as reference for future reproduction methods, or addition later if needed. - Mech
var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone
var/const/MAX_IMPREGNATION_TIME = 150
var/const/MIN_ACTIVE_TIME = 200 //time between being dropped and going idle
var/const/MAX_ACTIVE_TIME = 400
/obj/item/clothing/mask/facehugger
name = "alien"
desc = "It has some sort of a tube at the end of its tail."
icon = 'icons/mob/alien.dmi'
icon_state = "facehugger"
item_state = "facehugger"
w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4
body_parts_covered = FACE|EYES
throw_range = 5
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
var/sterile = 0
var/strength = 5
var/attached = 0
/obj/item/clothing/mask/facehugger/attack_hand(user as mob)
if((stat == CONSCIOUS && !sterile))
if(Attach(user))
return
..()
/obj/item/clothing/mask/facehugger/attack(mob/living/M as mob, mob/user as mob)
..()
user.drop_from_inventory(src)
Attach(M)
/obj/item/clothing/mask/facehugger/New()
if(config.aliens_allowed)
..()
else
qdel(src)
/obj/item/clothing/mask/facehugger/examine(mob/user)
..(user)
switch(stat)
if(DEAD,UNCONSCIOUS)
to_chat(user, "<span class='danger'><b>[src] is not moving.</b></span>")
if(CONSCIOUS)
to_chat(user, "<span class='danger'><b>[src] seems to be active.</b></span>")
if (sterile)
to_chat(user, "<span class='danger'><b>It looks like the proboscis has been removed.</b></span>")
return
/obj/item/clothing/mask/facehugger/attackby(obj/item/I, mob/user)
if(I.force)
user.do_attack_animation(src)
Die()
return
/obj/item/clothing/mask/facehugger/bullet_act()
Die()
return
/obj/item/clothing/mask/facehugger/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > T0C+80)
Die()
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
..()
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
HasProximity(target)
return
/obj/item/clothing/mask/facehugger/on_found(mob/finder as mob)
if(stat == CONSCIOUS)
HasProximity(finder)
return 1
return
/obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj)
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)]"
throwing = 0
GoIdle(30,100) //stunned for a few seconds - allows throwing them to be useful for positioning but not as an offensive action (unless you're setting up a trap)
/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
if((!iscorgi(M) && !iscarbon(M)))
return
if(attached)
return
var/mob/living/carbon/C = M
if(istype(C) && locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs)
return
attached++
spawn(MAX_IMPREGNATION_TIME)
attached = 0
var/mob/living/L = M //just so I don't need to use :
if(loc == L) return
if(stat != CONSCIOUS) return
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
L.visible_message("<span class='danger'><b> [src] leaps at [L]'s face!</b></span>")
if(iscarbon(M))
var/mob/living/carbon/target = L
if(target.wear_mask)
if(prob(20)) return
var/obj/item/clothing/W = target.wear_mask
if(!W.canremove) return
target.drop_from_inventory(W)
target.visible_message("<span class='danger'><b> [src] tears [W] off of [target]'s face!"</b></span>)
target.equip_to_slot(src, slot_wear_mask)
target.contents += src // Monkey sanity check - Snapshot
if(!sterile) L.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
GoIdle() //so it doesn't jump the people that tear it off
spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
Impregnate(L)
return
/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)
new /obj/item/alien_embryo(target)
target.status_flags |= XENO_HOST
target.visible_message("<span class='danger'><b> [src] falls limp after violating [target]'s face!</b></span>")
Die()
icon_state = "[initial(icon_state)]_impregnated"
else
target.visible_message("<span class='danger'><b> [src] violates [target]'s face!</b></span>")
return
/obj/item/clothing/mask/facehugger/proc/GoActive()
if(stat == DEAD || stat == CONSCIOUS)
return
stat = CONSCIOUS
icon_state = "[initial(icon_state)]"
return
/obj/item/clothing/mask/facehugger/proc/GoIdle(var/min_time=MIN_ACTIVE_TIME, var/max_time=MAX_ACTIVE_TIME)
if(stat == DEAD || stat == UNCONSCIOUS)
return
/* RemoveActiveIndicators() */
stat = UNCONSCIOUS
icon_state = "[initial(icon_state)]_inactive"
spawn(rand(min_time,max_time))
GoActive()
return
/obj/item/clothing/mask/facehugger/proc/Die()
if(stat == DEAD)
return
/* RemoveActiveIndicators() */
icon_state = "[initial(icon_state)]_dead"
stat = DEAD
src.visible_message("<span class='danger'><b>[src] curls up into a ball!</b></span>")
return
/proc/CanHug(var/mob/M)
if(iscorgi(M))
return 1
if(!iscarbon(M))
return 0
var/mob/living/carbon/C = M
if(istype(C) && locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs)
return 0
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(H.head && (H.head.body_parts_covered & FACE) && !(H.head.item_flags & FLEXIBLEMATERIAL))
return 0
return 1
*/
@@ -79,7 +79,7 @@
// Queen verbs.
/mob/living/carbon/human/proc/lay_egg()
set name = "Lay Egg (75)"
set name = "Lay Egg (200)"
set desc = "Lay an egg to produce huggers to impregnate prey with."
set category = "Abilities"
@@ -88,13 +88,13 @@
verbs -= /mob/living/carbon/human/proc/lay_egg
return
if(locate(/obj/effect/alien/egg) in get_turf(src))
if(locate(/obj/structure/alien/egg) in get_turf(src))
to_chat(src, "There's already an egg here.")
return
if(check_alien_ability(75,1,O_EGG))
if(check_alien_ability(200,1,O_EGG))
visible_message("<span class='alium'><B>[src] has laid an egg!</B></span>")
new /obj/effect/alien/egg(loc)
new /obj/structure/alien/egg(loc)
return
@@ -144,7 +144,7 @@
P.firer = src
P.old_style_target(A)
P.fire()
playsound(src, 'sound/weapons/pierce.ogg', 25, 0)
playsound(src, 'sound/weapons/alien_spitacid.ogg', 25, 0)
/mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N
set name = "Corrosive Acid (200)"
@@ -329,7 +329,7 @@
/mob/living/carbon/human/proc/gut()
set category = "Abilities"
set name = "Gut"
set name = "Slaughter"
set desc = "While grabbing someone aggressively, rip their guts out or tear them apart."
if(last_special > world.time)
@@ -345,7 +345,7 @@
return
if(G.state < GRAB_AGGRESSIVE)
to_chat(src, "<span class='danger'>You must have an aggressive grab to gut your prey!</span>")
to_chat(src, "<span class='danger'>You must have an aggressive grab to slaughter your prey!</span>")
return
last_special = world.time + 50
@@ -14,8 +14,8 @@
siemens_coefficient = 0
gluttonous = 2
brute_mod = 0.5 // Hardened carapace.
burn_mod = 2 // Weak to fire.
brute_mod = 0.6 // Hardened carapace.
burn_mod = 1.75 // Weak to fire.
warning_low_pressure = 50
hazard_low_pressure = -1
@@ -33,18 +33,19 @@
flesh_color = "#282846"
gibbed_anim = "gibbed-a"
dusted_anim = "dust-a"
death_message = "lets out a waning guttural screech, green blood bubbling from its maw."
death_message = "lets out a guttural screech, green blood bubbling from its maw."
death_sound = 'sound/voice/hiss6.ogg'
speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
speech_chance = 100
speech_chance = 75
virus_immune = 1
breath_type = null
poison_type = null
vision_flags = SEE_SELF|SEE_MOBS
vision_flags = SEE_SELF|SEE_MOBS|SEE_TURFS
darksight = 10
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
@@ -83,7 +84,7 @@
return SPECIES_XENO
/datum/species/xenos/get_random_name()
return "alien [caste_name] ([alien_number])"
return "xenomorph [caste_name] ([alien_number])"
/datum/species/xenos/can_understand(var/mob/other)
if(istype(other, /mob/living/carbon/alien/larva))
@@ -101,7 +102,7 @@
H.mind.special_role = "Alien"
alien_number++ //Keep track of how many aliens we've had so far.
H.real_name = "alien [caste_name] ([alien_number])"
H.real_name = "xenomorph [caste_name] ([alien_number])"
H.name = H.real_name
..()
@@ -154,15 +155,6 @@
return 1
return 0
/*
/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H)
H.AddInfectionImages()
..()
/datum/species/xenos/handle_logout_special(var/mob/living/carbon/human/H)
H.RemoveInfectionImages()
..()
*/
/datum/species/xenos/drone
name = SPECIES_XENO_DRONE
@@ -208,7 +200,7 @@
name = SPECIES_XENO_HUNTER
weeds_plasma_rate = 5
caste_name = "hunter"
slowdown = -2
slowdown = -1
total_health = 150
tail = "xenos_hunter_tail"
@@ -269,11 +261,11 @@
/datum/species/xenos/queen
name = SPECIES_XENO_QUEEN
total_health = 250
total_health = 300
weeds_heal_rate = 5
weeds_plasma_rate = 20
caste_name = "queen"
slowdown = 4
slowdown = 3
tail = "xenos_queen_tail"
rarity_value = 10
@@ -312,10 +304,10 @@
..()
// Make sure only one official queen exists at any point.
if(!alien_queen_exists(1,H))
H.real_name = "alien queen ([alien_number])"
H.real_name = "xenomorph queen ([alien_number])"
H.name = H.real_name
else
H.real_name = "alien princess ([alien_number])"
H.real_name = "xenomorph princess ([alien_number])"
H.name = H.real_name
/datum/hud_data/alien
@@ -334,8 +326,6 @@
has_internals = 0
gear = list(
"o_clothing" = list("loc" = ui_belt, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "dir" = SOUTH),
"head" = list("loc" = ui_id, "name" = "Hat", "slot" = slot_head, "state" = "hair"),
"storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"),
"storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"),
)
) //Removed hat and outer slots, it caused too many problems that required admin intervention.
@@ -27,30 +27,4 @@
faction = "xeno"
..(new_loc, SPECIES_XENO_QUEEN)
// I feel like we should generalize/condense down all the various icon-rendering antag procs.
/*----------------------------------------
Proc: AddInfectionImages()
Des: Gives the client of the alien an image on each infected mob.
----------------------------------------*/
/*
/mob/living/carbon/human/proc/AddInfectionImages()
if (client)
for (var/mob/living/C in mob_list)
if(C.status_flags & XENO_HOST)
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
*/
/*----------------------------------------
Proc: RemoveInfectionImages()
Des: Removes all infected images from the alien.
----------------------------------------*/
/*
/mob/living/carbon/human/proc/RemoveInfectionImages()
if (client)
for(var/image/I in client.images)
if(dd_hasprefix_case(I.icon_state, "infected"))
qdel(I)
return
*/
//Removed AddInfectionImages, no longer required.
@@ -144,17 +144,21 @@
agony = 10
check_armour = "bio"
armor_penetration = 25 // It's acid
hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg'
hitsound = 'sound/weapons/effects/alien_spit_wall.ogg'
combustion = FALSE
/obj/item/projectile/energy/neurotoxin
name = "neurotoxic spit"
icon_state = "neurotoxin"
damage = 5
damage = 0
damage_type = BIOACID
agony = 80
check_armour = "bio"
armor_penetration = 25 // It's acid-based
hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg'
hitsound = 'sound/weapons/effects/alien_spit_wall.ogg'
combustion = FALSE
+1 -41
View File
@@ -14,48 +14,8 @@
return 0
return affected && affected.open == (affected.encased ? 3 : 2)
//Removed unused Embryo Surgery, derelict and broken.
//////////////////////////////////////////////////////////////////
// ALIEN EMBRYO SURGERY //
////////////////////////////////////////////////////////////////// // Here for future reference incase it's needed. See: Alien_embryo.dm and Alien_facehugger.dm
/*
/datum/surgery_step/internal/remove_embryo
allowed_tools = list(
/obj/item/weapon/surgical/hemostat = 100, \
/obj/item/weapon/material/kitchen/utensil/fork = 20
)
allowed_procs = list(IS_WIRECUTTER = 75)
blood_level = 2
min_duration = 80
max_duration = 100
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/embryo = 0
for(var/obj/item/alien_embryo/A in target)
embryo = 1
break
if (!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && embryo && affected.open == 3 && target_zone == BP_TORSO
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]."
var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your chest!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("<span class='warning'>[user] rips the larva out of [target]'s ribcage!</span>",
"You rip the larva out of [target]'s ribcage!")
for(var/obj/item/alien_embryo/A in target)
A.loc = A.loc.loc
*/
//////////////////////////////////////////////////////////////////
// CHEST INTERNAL ORGAN SURGERY //
//////////////////////////////////////////////////////////////////
@@ -870,7 +870,6 @@
/turf/simulated/floor/tiled/dark,
/area/submap/debrisfield/derelict/interior)
"cF" = (
/obj/effect/alien/egg,
/obj/effect/alien/weeds,
/turf/simulated/floor/tiled/dark,
/area/submap/debrisfield/derelict/interior)
@@ -66,7 +66,6 @@
/area/submap/debrisfield/misc_debris)
"W" = (
/obj/effect/alien/weeds,
/obj/effect/alien/egg,
/turf/simulated/floor/airless,
/area/submap/debrisfield/misc_debris)
"X" = (
@@ -2,7 +2,7 @@
"ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate)
"ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"ad" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop)
"ae" = (/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"ae" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"af" = (/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"ag" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate)
"ah" = (/obj/structure/table/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate)
@@ -11,7 +11,7 @@
"ak" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"al" = (/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate)
"am" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"an" = (/obj/structure/window/phoronreinforced,/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"an" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"ao" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate)
"ap" = (/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate)
"aq" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate)
@@ -7,7 +7,7 @@
"g" = (/obj/effect/alien/weeds/node,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4)
"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4)
"i" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4)
"j" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4)
"j" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4)
(1,1,1) = {"
aaaaaaaaa
@@ -6,7 +6,7 @@
"f" = (/obj/effect/alien/weeds,/obj/item/clothing/suit/storage/vest/tactical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5)
"g" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5)
"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5)
"i" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5)
"i" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5)
"j" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/queen/empress,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5)
"k" = (/obj/effect/alien/weeds,/obj/item/clothing/head/helmet/tac,/obj/item/weapon/gun/projectile/SVD,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5)
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2
View File
@@ -1485,6 +1485,8 @@
#include "code\game\objects\structures\window.dm"
#include "code\game\objects\structures\window_spawner.dm"
#include "code\game\objects\structures\window_vr.dm"
#include "code\game\objects\structures\alien\alien egg.dm"
#include "code\game\objects\structures\alien\alien.dm"
#include "code\game\objects\structures\crates_lockers\__closets.dm"
#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm"
#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm"