Removes xenomorphs (#6686)

Xenomorphs are pretty much badly done and don't really fit at all. This pr fully removes the human type ones, alongside with the infection, eggs and facehuggers.
This commit is contained in:
Alberyk
2019-07-24 21:34:44 +03:00
committed by Erki
parent 74eff393ba
commit d0dff4c370
48 changed files with 34 additions and 1831 deletions
-14
View File
@@ -267,7 +267,6 @@
#include "code\datums\diseases\rhumba_beat.dm"
#include "code\datums\diseases\robotic_transformation.dm"
#include "code\datums\diseases\wizarditis.dm"
#include "code\datums\diseases\xeno_transformation.dm"
#include "code\datums\diseases\advance\advance.dm"
#include "code\datums\diseases\advance\presets.dm"
#include "code\datums\diseases\advance\symptoms\confusion.dm"
@@ -386,7 +385,6 @@
#include "code\game\antagonist\antagonist_print.dm"
#include "code\game\antagonist\antagonist_update.dm"
#include "code\game\antagonist\alien\borer.dm"
#include "code\game\antagonist\alien\xenomorph.dm"
#include "code\game\antagonist\outsider\commando.dm"
#include "code\game\antagonist\outsider\deathsquad.dm"
#include "code\game\antagonist\outsider\ert.dm"
@@ -464,7 +462,6 @@
#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_synthetic.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
#include "code\game\gamemodes\meteor\meteors.dm"
#include "code\game\gamemodes\mixed\bughunt.dm"
#include "code\game\gamemodes\mixed\conflux.dm"
#include "code\game\gamemodes\mixed\crossfire.dm"
#include "code\game\gamemodes\mixed\feeding.dm"
@@ -964,7 +961,6 @@
#include "code\game\objects\structures\inflatable.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\lamarr_cage.dm"
#include "code\game\objects\structures\lattice.dm"
#include "code\game\objects\structures\mirror.dm"
#include "code\game\objects\structures\mop_bucket.dm"
@@ -989,7 +985,6 @@
#include "code\game\objects\structures\window.dm"
#include "code\game\objects\structures\window_spawner.dm"
#include "code\game\objects\structures\alien\alien.dm"
#include "code\game\objects\structures\alien\egg.dm"
#include "code\game\objects\structures\alien\node.dm"
#include "code\game\objects\structures\alien\resin.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
@@ -1119,7 +1114,6 @@
#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm"
#include "code\modules\admin\secrets\random_events\gravity.dm"
#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm"
#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm"
#include "code\modules\admin\verbs\access_control.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
@@ -1715,9 +1709,6 @@
#include "code\modules\mob\living\carbon\alien\diona\life.dm"
#include "code\modules\mob\living\carbon\alien\diona\progression.dm"
#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm"
#include "code\modules\mob\living\carbon\alien\larva\larva.dm"
#include "code\modules\mob\living\carbon\alien\larva\life.dm"
#include "code\modules\mob\living\carbon\alien\larva\progression.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\death.dm"
@@ -1776,11 +1767,6 @@
#include "code\modules\mob\living\carbon\human\species\station\unathi\unathi_subspecies.dm"
#include "code\modules\mob\living\carbon\human\species\station\vaurca\vaurca.dm"
#include "code\modules\mob\living\carbon\human\species\station\vaurca\vaurca_subspecies.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_facehugger.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm"
#include "code\modules\mob\living\carbon\metroid\death.dm"
#include "code\modules\mob\living\carbon\metroid\emote.dm"
#include "code\modules\mob\living\carbon\metroid\examine.dm"
-1
View File
@@ -35,7 +35,6 @@
// Mode/antag template macros.
#define MODE_BORER "borer"
#define MODE_XENOMORPH "xeno"
#define MODE_LOYALIST "loyalist"
#define MODE_MUTINEER "mutineer"
#define MODE_COMMANDO "commando"
-12
View File
@@ -351,18 +351,6 @@ proc/isInSight(var/atom/A, var/atom/B)
// Same as above but for alien candidates.
/proc/get_alien_candidates()
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
var/i = 0
while(candidates.len <= 0 && i < 5)
for(var/mob/abstract/observer/G in player_list)
if(MODE_XENOMORPH in G.client.prefs.be_special_role)
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
i++
return candidates
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
if(!isobj(O)) O = new /obj/screen/text()
O.maptext = maptext
@@ -1,64 +0,0 @@
//Xenomicrobes
/datum/disease/xeno_transformation
name = "Xenomorph Transformation"
max_stages = 5
spread = "Syringe"
spread_type = SPECIAL
cure = "Spaceacillin & Glycerol"
cure_id = list("spaceacillin", "glycerol")
cure_chance = 5
agent = "Rip-LEY Alien Microbes"
affected_species = list("Human")
var/gibbed = 0
/datum/disease/xeno_transformation/stage_act()
..()
switch(stage)
if(2)
if (prob(8))
to_chat(affected_mob, "<span class='warning'>Your throat feels scratchy.</span>")
affected_mob.take_organ_damage(1)
if (prob(9))
to_chat(affected_mob, "<span class='warning'>Kill...</span>")
if (prob(9))
to_chat(affected_mob, "<span class='warning'>Kill...</span>")
if(3)
if (prob(8))
to_chat(affected_mob, "<span class='warning'>Your throat feels very scratchy.</span>")
affected_mob.take_organ_damage(1)
/*
if (prob(8))
affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"))
*/
if (prob(10))
to_chat(affected_mob, "<span class='warning'>Your skin feels tight.</span>")
affected_mob.take_organ_damage(5)
if (prob(4))
to_chat(affected_mob, "<span class='warning'>You feel a stabbing pain in your head.</span>")
affected_mob.Paralyse(2)
if (prob(4))
to_chat(affected_mob, "<span class='warning'>You can feel something move...inside.</span>")
if(4)
if (prob(10))
to_chat(affected_mob, pick("<span class='warning'>Your skin feels very tight.</span>", "<span class='warning'>Your blood boils!</span>"))
affected_mob.take_organ_damage(8)
if (prob(20))
affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"))
if (prob(8))
to_chat(affected_mob, "<span class='warning'>You can feel... something...inside you.</span>")
if(5)
to_chat(affected_mob, "<span class='warning'>Your skin feels impossibly calloused...</span>")
affected_mob.adjustToxLoss(10)
affected_mob.updatehealth()
if(prob(40))
if(gibbed != 0) return 0
src.cure(0)
gibbed = 1
var/mob/living/carbon/human/H = affected_mob
if(istype(H))
var/turf/origin = find_loc(affected_mob)
gibs(origin)
H.set_species("Xenomorph [pick(list("Hunter","Sentinel","Drone"))]")
return
affected_mob.gib()
-55
View File
@@ -1,55 +0,0 @@
var/datum/antagonist/xenos/xenomorphs
/datum/antagonist/xenos
id = MODE_XENOMORPH
role_text = "Xenomorph"
role_text_plural = "Xenomorphs"
mob_path = /mob/living/carbon/alien/larva
bantype = "Xenomorph"
flags = ANTAG_OVERRIDE_MOB | ANTAG_RANDSPAWN | ANTAG_OVERRIDE_JOB | ANTAG_VOTABLE
welcome_text = "Hiss! You are a larval alien. Hide and bide your time until you are ready to evolve."
antaghud_indicator = "hudalien"
antag_indicator = "alien"
faction_role_text = "Xenomorph Thrall"
faction_descriptor = "Hive"
faction_welcome = "Your will is ripped away as your humanity merges with the xenomorph overmind. You are now \
a thrall to the queen and her brood. Obey their instructions without question. Serve the hive."
faction = "xenomorph"
faction_indicator = "hudalien"
hard_cap = 5
hard_cap_round = 8
initial_spawn_req = 4
initial_spawn_target = 6
spawn_announcement = "Unidentified lifesigns detected coming aboard the station. Secure any exterior access, including ducting and ventilation."
spawn_announcement_title = "Lifesign Alert"
spawn_announcement_sound = 'sound/AI/aliens.ogg'
spawn_announcement_delay = 5000
/datum/antagonist/xenos/New(var/no_reference)
..()
if(!no_reference)
xenomorphs = src
/datum/antagonist/xenos/attempt_random_spawn()
if(config.aliens_allowed) ..()
/datum/antagonist/xenos/proc/get_vents()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSmachinery.processing_machines)
if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in current_map.station_levels)
if(temp_vent.network.normal_members.len > 50)
vents += temp_vent
return vents
/datum/antagonist/xenos/create_objectives(var/datum/mind/player)
if(!..())
return
player.objectives += new /datum/objective/survive()
player.objectives += new /datum/objective/escape()
/datum/antagonist/xenos/place_mob(var/mob/living/player)
player.forceMove(get_turf(pick(get_vents())))
-25
View File
@@ -74,31 +74,6 @@ var/hadevent = 0
spawn(rand(1500, 3000)) //Delayed announcements to keep the crew on their toes.
command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
/proc/alien_infestation(var/spawncount = 1) // -- TLE
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in SSmachinery.processing_machines)
if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in current_map.station_levels)
if(temp_vent.network.normal_members.len > 50) // Stops Aliens getting stuck in small networks. See: Security, Virology
vents += temp_vent
var/list/candidates = get_alien_candidates()
if(prob(40)) spawncount++ //sometimes, have two larvae spawn instead of one
while((spawncount >= 1) && vents.len && candidates.len)
var/obj/vent = pick(vents)
var/candidate = pick(candidates)
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
new_xeno.key = candidate
candidates -= candidate
vents -= vent
spawncount--
spawn(rand(5000, 6000)) //Delayed announcements to keep the crew on their toes.
command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
/proc/high_radiation_event()
for(var/mob/living/carbon/human/H in living_mob_list)
-13
View File
@@ -1,13 +0,0 @@
/datum/game_mode/bughunt
name = "Bughunt (Xenos+Merc)"
round_description = "A mercenary strike force is approaching the station to eradicate a xenomorph infestation!"
extended_round_description = "Mercenaries and xenomorphs spawn in this game mode."
config_tag = "bughunt"
required_players = 15
required_enemies = 1
end_on_antag_death = 1
antag_tags = list(MODE_XENOMORPH, MODE_DEATHSQUAD)
auto_recall_shuttle = 1
ert_disabled = 1
require_all_templates = 1
votable = 0
+3 -3
View File
@@ -1,12 +1,12 @@
/datum/game_mode/infestation
name = "Infestation (Xenos/Borers/Lings)"
name = "Infestation (Borers/Lings)"
round_description = "There's something in the walls!"
extended_round_description = "Two alien antagonists (Xenomorphs, Cortical Borers or Changelings) may spawn during this round."
extended_round_description = "Two alien antagonists (Cortical Borers or Changelings) may spawn during this round."
config_tag = "infestation"
required_players = 15
required_enemies = 5
end_on_antag_death = 1
antag_tags = list(MODE_BORER, MODE_XENOMORPH, MODE_CHANGELING)
antag_tags = list(MODE_BORER, MODE_CHANGELING)
require_all_templates = 1
votable = 0
+5 -5
View File
@@ -83,7 +83,7 @@
else if(health / maxhealth < 0.6)
msg += span("warning", "\The [src] is badly damaged!")
else if(health / maxhealth < 1)
msg += span("notice", "\The [src] is slightly damaged!")
msg += span("notice", "\The [src] is slightly damaged!")
else
msg += span("good", "\The [src] is not damaged!")
to_chat(user, msg)
@@ -156,7 +156,7 @@
STOP_PROCESSING(SSfast_process, src)
else
STOP_PROCESSING(SSprocessing, src)
. = ..()
@@ -356,7 +356,7 @@
updateUsrDialog()
else
to_chat(user, "<span class='notice'>Access denied.</span>")
else if(I.iswelder())
var/obj/item/weapon/weldingtool/WT = I
if (!WT.welding)
@@ -499,7 +499,7 @@
if(!tryToShootAt(secondarytargets) && !resetting) // if no valid targets, go for secondary targets
resetting = TRUE
addtimer(CALLBACK(src, .proc/reset), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) // no valid targets, close the cover
if(targets.len || secondarytargets.len)
if(!fast_processing)
STOP_PROCESSING(SSprocessing, src)
@@ -570,7 +570,7 @@
if(isanimal(L) || issmall(L)) // Animals are not so dangerous
return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
if(isxenomorph(L) || isalien(L)) // Xenos are dangerous
if(isalien(L)) // Xenos are dangerous
return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
if(ishuman(L)) //if the target is a human, analyze threat level
-96
View File
@@ -1,96 +0,0 @@
#define BURST 0
#define BURSTING 1
#define GROWING 2
#define GROWN 3
#define MAX_PROGRESS 100
/obj/structure/alien/egg
desc = "It looks like a weird egg."
name = "egg"
icon_state = "egg_growing"
density = 0
anchored = 1
var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
var/progress = 0
/obj/structure/alien/egg/Initialize()
. = ..()
START_PROCESSING(SSprocessing, src)
/obj/structure/alien/egg/Destroy()
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/structure/alien/egg/process()
progress++
if(progress >= MAX_PROGRESS)
Grow()
STOP_PROCESSING(SSprocessing, src)
update_icon()
/obj/structure/alien/egg/attack_hand(user as mob)
var/mob/living/carbon/M = user
if(!istype(M) || !(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs))
return
switch(status)
if(BURST)
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/structure/alien/egg/proc/GetFacehugger()
return locate(/obj/item/clothing/mask/facehugger) in contents
/obj/structure/alien/egg/proc/Grow()
icon_state = "egg"
status = GROWN
new /obj/item/clothing/mask/facehugger(src)
return
/obj/structure/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
if(status == GROWN || status == GROWING)
icon_state = "egg_hatched"
flick("egg_opening", src)
status = BURSTING
addtimer(CALLBACK(src, .proc/givefacehugger, kill), 15)
/obj/structure/alien/egg/proc/givefacehugger(var/kill = 1)
var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
status = BURST
child.forceMove(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/structure/alien/egg/HasProximity(atom/movable/AM as mob|obj)
if(status == GROWN)
if(!CanHug(AM))
return
var/mob/living/carbon/C = AM
if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST)
return
Burst(0)
#undef BURST
#undef BURSTING
#undef GROWING
#undef GROWN
#undef MAX_PROGRESS
@@ -35,14 +35,6 @@
visible_message("<span class='danger'>\The [user] destroys \the [name]!</span>")
health = 0
else
// Aliens can get straight through these.
if(istype(user,/mob/living/carbon))
var/mob/living/carbon/M = user
if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
visible_message("<span class='alium'>\The [user] strokes \the [name] and it melts away!</span>")
health = 0
healthcheck()
return
visible_message("<span class='danger'>\The [user] claws at \the [src]!</span>")
// Todo check attack datums.
health -= rand(5,10)
@@ -1,83 +0,0 @@
/obj/structure/lamarr
name = "lab cage"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "labcage1"
desc = "A glass lab container for storing interesting creatures."
density = 1
anchored = 1
unacidable = 1//Dissolving the case would also delete Lamarr
var/health = 30
var/occupied = 1
var/destroyed = 0
/obj/structure/lamarr/ex_act(severity)
switch(severity)
if (1)
new /obj/item/weapon/material/shard( src.loc )
Break()
qdel(src)
if (2)
if (prob(50))
src.health -= 15
src.healthcheck()
if (3)
if (prob(50))
src.health -= 5
src.healthcheck()
/obj/structure/lamarr/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
src.healthcheck()
return
/obj/structure/lamarr/proc/healthcheck()
if (src.health <= 0)
if (!( src.destroyed ))
src.density = 0
src.destroyed = 1
new /obj/item/weapon/material/shard( src.loc )
playsound(src, "shatter", 70, 1)
Break()
else
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
return
/obj/structure/lamarr/update_icon()
if(src.destroyed)
src.icon_state = "labcageb[src.occupied]"
else
src.icon_state = "labcage[src.occupied]"
return
/obj/structure/lamarr/attackby(obj/item/weapon/W as obj, mob/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
src.health -= W.force
src.healthcheck()
..()
return
/obj/structure/lamarr/attack_hand(mob/user as mob)
if (src.destroyed)
return
else
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
to_chat(user, "<span class='warning'>You kick the lab cage.</span>")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
to_chat(O, "<span class='warning'>[user] kicks the lab cage.</span>")
src.health -= 2
healthcheck()
return
/obj/structure/lamarr/proc/Break()
if(occupied)
new /obj/item/clothing/mask/facehugger/lamarr(src.loc)
occupied = 0
update_icon()
return
@@ -39,38 +39,6 @@
src.add_fingerprint(user)
return
/obj/structure/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob)
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
return
unbuckle_mob()
var/mob/living/carbon/xenos = user
var/mob/living/carbon/victim = M
if(istype(victim) && locate(/obj/item/organ/xenos/hivenode) in victim.internal_organs)
return
if(istype(xenos) && !(locate(/obj/item/organ/xenos/hivenode) in xenos.internal_organs))
return
if(M == usr)
return
else
M.visible_message(\
"<span class='notice'>[user.name] secretes a thick vile goo, securing [M.name] into [src]!</span>",\
"<span class='warning'>[user.name] drenches you in a foul-smelling resin, trapping you in the [src]!</span>",\
"<span class='notice'>You hear squelching...</span>")
M.buckled = src
M.forceMove(src.loc)
M.set_dir(src.dir)
M.update_canmove()
M.pixel_y = 6
M.old_y = 6
src.buckled_mob = M
src.add_fingerprint(user)
return
/obj/structure/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/aforce = W.force
health = max(0, health - aforce)
-1
View File
@@ -117,7 +117,6 @@ proc/admin_notice(var/message, var/rights)
else if(ishuman(M))
body += {"<A href='?src=\ref[src];makeai=\ref[M]'>Make AI</A> |
<A href='?src=\ref[src];makerobot=\ref[M]'>Make Robot</A> |
<A href='?src=\ref[src];makealien=\ref[M]'>Make Alien</A> |
<A href='?src=\ref[src];makeslime=\ref[M]'>Make slime</A>
"}
@@ -1,7 +0,0 @@
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation
name = "Trigger a Xenomorph Infestation"
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation/execute(var/mob/user)
. = ..()
if(.)
return xenomorphs.attempt_random_spawn()
@@ -113,7 +113,6 @@
bst.add_language(LANGUAGE_EAL)
// Antagonist languages
bst.add_language(LANGUAGE_VOX)
bst.add_language(LANGUAGE_XENOMORPH)
bst.add_language(LANGUAGE_HIVEMIND)
bst.add_language(LANGUAGE_CHANGELING)
bst.add_language(LANGUAGE_BORER)
+3 -20
View File
@@ -74,23 +74,6 @@
M.Animalize()
/client/proc/cmd_admin_alienize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make Alien"
if(!ROUND_IS_STARTED)
alert("Wait until the game starts")
return
if(ishuman(M))
log_admin("[key_name(src)] has alienized [M.key].",admin_key=key_name(usr),ckey=key_name(M))
spawn(10)
M:Alienize()
feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into an alien.",admin_key=key_name(usr),ckey=key_name(M))
message_admins("<span class='notice'>[key_name_admin(usr)] made [key_name(M)] into an alien.</span>", 1)
else
alert("Invalid mob")
/client/proc/cmd_admin_slimeize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make slime"
@@ -409,7 +392,7 @@
return
feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(dostrip)
for (var/obj/item/I in M)
if (istype(I, /obj/item/weapon/implant))
@@ -421,7 +404,7 @@
switch(dresscode)
if("strip")
//do nothing
if("as job...")
var/datum/job/jobdatum
var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs()
@@ -430,7 +413,7 @@
dresscode = "[jobdatum.title]"
M.job = jobdatum.title
jobdatum.equip(M)
if("emergency response team")
ert.equip(M)
@@ -67,7 +67,6 @@
<option value='?_src_=vars;makeai=\ref[src]'>Make AI</option>
<option value='?_src_=vars;makerobot=\ref[src]'>Make cyborg</option>
<option value='?_src_=vars;makemonkey=\ref[src]'>Make monkey</option>
<option value='?_src_=vars;makealien=\ref[src]'>Make alien</option>
<option value='?_src_=vars;makeslime=\ref[src]'>Make slime</option>
"}
@@ -74,7 +74,7 @@ STOCK_ITEM_UNCOMMON(mediumcell, 3)
STOCK_ITEM_UNCOMMON(chempack, 5)
var/list/chems = SSchemistry.chemical_reagents.Copy()
var/list/exclusion = list("drink", "reagent", "adminordrazine", "beer2", "azoth", "elixir_life", "liquid_fire", "philosopher_stone", "undead_ichor", "love", "shapesand", "usolve",\
"sglue", "black_matter", "lightning", "trioxin", "phoron_salt", "xenomicrobes", "nanites")
"sglue", "black_matter", "lightning", "trioxin", "phoron_salt", "nanites")
chems -= exclusion
for (var/i in 1 to rand(2, 6))
var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = new /obj/item/weapon/reagent_containers/chem_disp_cartridge(L)
+1 -1
View File
@@ -85,7 +85,7 @@
var/datum/effect_system/sparks/spark_system
var/allowed_module_types = MODULE_GENERAL // All rigs by default should have access to general
var/list/species_restricted = list("exclude","Diona","Xenomorph","Vaurca","Golem", "Vox")
var/list/species_restricted = list("exclude","Diona","Vaurca","Golem", "Vox")
/obj/item/weapon/rig/examine()
to_chat(usr, "This is \icon[src][src.name].")
@@ -87,7 +87,7 @@
/obj/item/weapon/handcuffs
)
species_restricted = list("exclude","Diona","Xenomorph", "Golem")
species_restricted = list("exclude","Diona", "Golem")
allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_SPECIAL | MODULE_MEDICAL | MODULE_UTILITY
@@ -82,7 +82,7 @@
emp_protection = 40
slowdown = 0
species_restricted = list("exclude","Diona","Xenomorph", "Golem")
species_restricted = list("exclude","Diona", "Golem")
chest_type = /obj/item/clothing/suit/space/rig/light/ninja
glove_type = /obj/item/clothing/gloves/rig/light/ninja
@@ -19,7 +19,7 @@
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona","Xenomorph","Vox","Golem")
species_restricted = list("exclude","Diona","Vox","Golem")
flash_protection = FLASH_PROTECTION_MAJOR
allow_hair_covering = FALSE
@@ -76,7 +76,7 @@
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona","Xenomorph","Vox","Golem")
species_restricted = list("exclude","Diona","Vox","Golem")
var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit.
-20
View File
@@ -1185,26 +1185,6 @@
set_trait(TRAIT_IDEAL_HEAT, 283)
set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15)
// Alien weeds.
/datum/seed/xenomorph
name = "xenomorph"
seed_name = "alien weed"
display_name = "alien weeds"
force_layer = 3
chems = list("phoron" = list(1,3))
/datum/seed/xenomorph/setup_traits()
..()
set_trait(TRAIT_PLANT_ICON,"vine2")
set_trait(TRAIT_IMMUTABLE,1)
set_trait(TRAIT_PRODUCT_COLOUR,"#3D1934")
set_trait(TRAIT_FLESH_COLOUR,"#3D1934")
set_trait(TRAIT_PLANT_COLOUR,"#3D1934")
set_trait(TRAIT_PRODUCTION,1)
set_trait(TRAIT_YIELD,-1)
set_trait(TRAIT_SPREAD,2)
set_trait(TRAIT_POTENCY,50)
/datum/seed/earthenroot
name = "earthenroot"
seed_name = "earthen-root"
+8 -11
View File
@@ -572,28 +572,28 @@
/datum/reagent/mental/sertraline
value = 6
/datum/reagent/mental/fluvoxamine
value = 6
/datum/reagent/mental/escitalopram
value = 6
/datum/reagent/mental/paroxetine
value = 3.5
/datum/reagent/mental/duloxetine
value = 6
/datum/reagent/mental/venlafaxine
value = 6
/datum/reagent/mental/risperidone
value = 6
/datum/reagent/mental/olanzapine
value = 6
/datum/reagent/mental/truthserum
value = 8
@@ -620,7 +620,7 @@
/datum/reagent/uranium
value = 9
/datum/reagent/platinum
value = 3
@@ -738,9 +738,6 @@
/datum/reagent/nanites
value = 9
/datum/reagent/xenomicrobes
value = 5
/datum/reagent/estus
value = 50
-6
View File
@@ -785,12 +785,6 @@ var/list/name_to_material
sheet_singular_name = "blob"
sheet_plural_name = "blobs"
/material/resin/can_open_material_door(var/mob/living/user)
var/mob/living/carbon/M = user
if(istype(M) && locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
return 1
return 0
//TODO PLACEHOLDERS:
/material/leather
name = "leather"
+1 -1
View File
@@ -110,7 +110,7 @@
new/obj/item/clothing/under/soviet(src)
new/obj/item/clothing/head/ushanka/grey(src)
if(89)
new/obj/item/organ/xenos/plasmavessel(src)
new/obj/item/stack/material/animalhide/xeno(src)
if(90)
new/obj/item/organ/heart(src)
if(91)
-32
View File
@@ -1,35 +1,3 @@
/datum/language/xenocommon
name = LANGUAGE_XENOMORPH
colour = "alien"
desc = "The common tongue of the xenomorphs."
speech_verb = "hisses"
ask_verb = "hisses"
exclaim_verb = "hisses"
key = "z"
flags = RESTRICTED
syllables = list("sss","sSs","SSS")
machine_understands = FALSE
/datum/language/xenos
name = LANGUAGE_HIVEMIND
desc = "Xenomorphs have the strange ability to commune over a psychic hivemind."
speech_verb = "hisses"
ask_verb = "hisses"
exclaim_verb = "hisses"
colour = "alien"
key = "a"
flags = RESTRICTED | HIVEMIND
/datum/language/xenos/check_special_condition(var/mob/other)
var/mob/living/carbon/M = other
if(!istype(M))
return 1
if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
return 1
return 0
/datum/language/ling
name = LANGUAGE_CHANGELING
desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance."
@@ -1,15 +0,0 @@
/mob/living/carbon/alien/larva
name = "alien larva"
real_name = "alien larva"
adult_form = /mob/living/carbon/human
speak_emote = list("hisses")
icon_state = "larva"
language = "Hivemind"
maxHealth = 25
health = 25
/mob/living/carbon/alien/larva/Initialize()
. = ..()
add_language("Xenomorph") //Bonus language.
internal_organs |= new /obj/item/organ/xenos/hivenode(src)
create_reagents(100)
@@ -1,13 +0,0 @@
//Larvae regenerate health and nutrition from plasma and alien weeds.
/mob/living/carbon/alien/larva/handle_environment(var/datum/gas_mixture/environment)
if(!environment) return
var/turf/T = get_turf(src)
var/obj/effect/plant/plant = locate() in T
if(environment.gas["phoron"] > 0 || (plant && plant.seed.type == /datum/seed/xenomorph))
update_progression()
adjustBruteLoss(-1)
adjustFireLoss(-1)
adjustToxLoss(-1)
adjustOxyLoss(-1)
@@ -1,111 +0,0 @@
/mob/living/carbon/alien/larva/proc/check_can_infest(var/mob/living/M)
if(!src)
return 0
if(!istype(loc, /turf))
to_chat(src, "<span class='danger'>You cannot infest a target in your current position.</span>")
return 0
if(incapacitated())
to_chat(src, "<span class='danger'>You cannot infest a target in your current state.</span>")
return 0
if(!M)
return 1
if(!M.lying)
to_chat(src, "<span class='danger'>\The [M] is not prone.</span>")
return 0
if(!(src.Adjacent(M)))
to_chat(src, "<span class='danger'>\The [M] is not in range.</span>")
return 0
return 1
/mob/living/carbon/alien/larva/verb/attach_host()
set name = "Attach to host"
set desc = "Burrow into a prone victim and begin drinking their blood."
set category = "Abilities"
if(!check_can_infest())
return
var/list/choices = list()
for(var/mob/living/carbon/human/H in view(1,src))
if(isxenomorph(H))
continue
if(src.Adjacent(H) && H.lying)
choices += H
if(!choices.len)
to_chat(src, "<span class='danger'>There are no viable hosts within range.</span>")
return
var/mob/living/carbon/human/H = input(src,"Who do you wish to infest?") as null|anything in choices
if(!H || !src || !H.lying) return
visible_message("<span class='danger'>\The [src] begins questing blindly towards \the [H]'s warm flesh...</span>")
if(!do_after(src,30))
return
if(!check_can_infest(H))
return
var/obj/item/organ/external/E = pick(H.organs)
to_chat(src, "<span class='danger'>You burrow deeply into \the [H]'s [E.name]!</span>")
var/obj/item/weapon/holder/holder = new (loc)
src.forceMove(holder)
holder.name = src.name
E.embed(holder,0,"\The [src] burrows deeply into \the [H]'s [E.name]!")
/mob/living/carbon/alien/larva/verb/release_host()
set category = "Abilities"
set name = "Release Host"
set desc = "Release your host."
if(incapacitated())
to_chat(src, "You cannot leave your host in your current state.")
return
if(!loc || !loc.loc)
to_chat(src, "You are not inside a host.")
return
var/mob/living/carbon/human/H = loc.loc
if(!istype(H))
to_chat(src, "You are not inside a host.")
return
to_chat(src, "<span class='danger'>You begin writhing your way free of \the [H]'s flesh...</span>")
if(!do_after(src, 30))
return
if(!H || !src)
return
leave_host()
/mob/living/carbon/alien/larva/proc/leave_host()
if(!loc || !loc.loc)
to_chat(src, "You are not inside a host.")
return
var/mob/living/carbon/human/H = loc.loc
if(!istype(H))
to_chat(src, "You are not inside a host.")
return
var/obj/item/weapon/holder/holder = loc
var/obj/item/organ/external/affected
if(istype(holder))
for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant.
for(var/obj/item/O in organ.implants)
if(O == holder)
affected = organ
break
affected.implants -= holder
holder.forceMove(get_turf(holder))
else
src.forceMove(get_turf(src))
if(affected)
to_chat(src, "<span class='danger'>You crawl out of \the [H]'s [affected.name] and plop to the ground.</span>")
else
to_chat(src, "<span class='danger'>You plop to the ground.</span>")
@@ -1,12 +0,0 @@
/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>")
to_chat(src, "<span class='notice'>There are three to choose from:</span>")
to_chat(src, "<B>Hunters</B> <span class='notice'>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.</span>")
to_chat(src, "<B>Sentinels</B> <span class='notice'>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.</span>")
to_chat(src, "<B>Drones</B> <span class='notice'>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.</span>")
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
return alien_caste ? "Xenomorph [alien_caste]" : null
/mob/living/carbon/alien/larva/show_evolution_blurb()
return
@@ -130,10 +130,6 @@
stat("Tank Pressure", internal.air_contents.return_pressure())
stat("Distribution Pressure", internal.distribute_pressure)
var/obj/item/organ/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
if(P)
stat(null, "Phoron Stored: [P.stored_plasma]/[P.max_plasma]")
if(back && istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/suit = back
var/cell_status = "ERROR"
@@ -1,154 +0,0 @@
/obj/item/organ/parasite/alien_embryo
name = "alien embryo"
desc = "All slimy and yuck."
icon = 'icons/mob/npc/alien.dmi'
icon_state = "larva0_dead"
parent_organ = "chest"
organ_tag = "alien embryo"
origin_tech = list(TECH_BIO = 5)
stage_interval = 200
/obj/item/organ/parasite/alien_embryo/Destroy()
if(owner)
owner.status_flags &= ~(XENO_HOST)
RemoveInfectionImages(owner)
return ..()
/obj/item/organ/parasite/alien_embryo/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
..(target, affected)
if(owner && ishuman(owner))
START_PROCESSING(SSprocessing, src)
AddInfectionImages(owner)
/obj/item/organ/parasite/alien_embryo/removed(var/mob/living/user)
if(owner)
owner.status_flags &= ~(XENO_HOST)
RemoveInfectionImages(owner)
..(user)
/obj/item/organ/parasite/alien_embryo/stage_effect()
RefreshInfectionImage(owner)
return
/obj/item/organ/parasite/alien_embryo/process()
..()
if(!owner)
return
if(stage >= 2)
if(prob(1))
owner.emote("sneeze")
if(prob(1))
owner.emote("cough")
if(prob(1))
to_chat(owner, "<span class='danger'>Your throat feels sore.</span>")
if(prob(1))
to_chat(owner, "<span class='danger'>Mucous runs down the back of your throat.</span>")
if(stage >= 3)
if(prob(1))
owner.emote("sneeze")
if(prob(1))
owner.emote("cough")
if(prob(2))
to_chat(owner, "<span class='danger'>Your muscles ache.</span>")
if(prob(20))
owner.take_organ_damage(1)
if(prob(2))
to_chat(owner, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20))
owner.adjustToxLoss(1)
owner.updatehealth()
if(stage >= 4)
to_chat(owner, "<span class='danger'>You feel something tearing its way out of your stomach!</span>")
owner.adjustToxLoss(10)
owner.updatehealth()
if(prob(50))
AttemptGrow()
/obj/item/organ/parasite/alien_embryo/proc/AttemptGrow()
var/list/candidates = get_alien_candidates()
var/picked = null
// To stop clientless larva, we will check that our host has a client
// if we find no ghosts to become the alien. If the host has a client
// he will become the alien but if he doesn't then we will set the stage
// to 2, so we don't do a process heavy check everytime.
if(candidates.len)
picked = pick(candidates)
else if(owner.client)
picked = owner.key
else
stage = 4 // Let's try again later.
return
var/mob/living/carbon/alien/larva/new_xeno = new(owner.loc)
new_xeno.key = picked
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
owner.apply_damage(500, BRUTE, "chest")
STOP_PROCESSING(SSprocessing, src)
qdel(src)
/*----------------------------------------
Proc: RefreshInfectionImage()
Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens.
----------------------------------------*/
/obj/item/organ/parasite/alien_embryo/proc/RefreshInfectionImage()
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
for(var/image/I in alien.client.images)
if(dd_hasprefix_case(I.icon_state, "infected"))
alien.client.images -= I
for(var/mob/living/L in mob_list)
if(iscarbon(L))
if(L.status_flags & XENO_HOST)
var/image/I = image('icons/mob/npc/alien.dmi', loc = L, icon_state = "infected[stage]")
alien.client.images += I
/*----------------------------------------
Proc: AddInfectionImages(C)
Des: Checks if the passed mob (C) is infected with the alien egg, then gives each alien client an infected image at C.
----------------------------------------*/
/obj/item/organ/parasite/alien_embryo/proc/AddInfectionImages(var/mob/living/C)
if(C)
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
if(C.status_flags & XENO_HOST)
var/image/I = image('icons/mob/npc/alien.dmi', loc = C, icon_state = "infected[stage]")
alien.client.images += I
/*----------------------------------------
Proc: RemoveInfectionImage(C)
Des: Removes the alien infection image from all aliens in the world located in passed mob (C).
----------------------------------------*/
/obj/item/organ/parasite/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C)
if(C)
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
for(var/image/I in alien.client.images)
if(I.loc == C)
if(dd_hasprefix_case(I.icon_state, "infected"))
alien.client.images -= I
@@ -1,251 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
//TODO: Make these simple_animals
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/npc/alien.dmi'
icon_state = "facehugger"
item_state = "facehugger"
w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4
flags = PROXMOVE
body_parts_covered = FACE|EYES
throw_range = 5
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
var/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/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
. = ..()
user.drop_from_inventory(src)
Attach(target)
/obj/item/clothing/mask/facehugger/attack(mob/living/target, mob/living/user, var/target_zone)
if(target && user && ishuman(target) && ishuman(user) && !user.stat)
user.drop_from_inventory(src)
Attach(target)
return
..()
/obj/item/clothing/mask/facehugger/examine(mob/user)
..(user)
switch(stat)
if(DEAD,UNCONSCIOUS)
to_chat(user, "<span class='danger'>\The [src] is not moving.</span>")
if(CONSCIOUS)
to_chat(user, "<span class='danger'>\The [src] seems to be active.</span>")
if (sterile)
to_chat(user, "<span class='danger'>It looks like the proboscis has been removed.</span>")
return
/obj/item/clothing/mask/facehugger/attackby(obj/item/I, mob/user)
if(I.force)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(src)
Die()
return
/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(mob/living/M as mob)
if((!iscarbon(M)))
return
if(attached)
return
if(M.isSynthetic())
return
var/mob/living/carbon/human/C = M
if(istype(C) && locate(/obj/item/organ/parasite/alien_embryo) in C.internal_organs)
return
if(locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
return
if(!C.check_has_mouth())
return
attached++
spawn(MAX_IMPREGNATION_TIME)
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'>\The [src] leaps at \the [L]'s face!</span>")
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.head && H.head.body_parts_covered & FACE)
H.visible_message("<span class='danger'>\The [src] smashes against the [H]'s \the [H.head]!</span>")
Die()
return
if(iscarbon(M))
var/mob/living/carbon/target = L
if(target.wear_mask)
if(prob(20)) return
var/obj/item/clothing/W = target.wear_mask
if(!W.canremove) return
target.drop_from_inventory(W)
target.visible_message("<span class='danger'>\The [src] tears \the [W] off of \the [target]'s face!</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/carbon/human/target as mob)
if(!target || target.wear_mask != src || target.stat == DEAD) //was taken off or something
return
if(!sterile)
//target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
var/obj/item/organ/affecting = target.get_organ("chest")
var/obj/item/organ/parasite/alien_embryo/kid = new(affecting)
kid.replaced(target,affecting)
target.status_flags |= XENO_HOST
target.visible_message("<span class='danger'>\The [src] falls limp after violating \the [target]'s face!</span>")
Die()
icon_state = "[initial(icon_state)]_impregnated"
else
target.visible_message("<span class='danger'>\The [src] violates \the [target]'s face!</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'>\The [src] curls up into a ball!</span>")
return
/obj/item/clothing/mask/facehugger/lamarr
name = "Lamarr"
desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite?
gender = FEMALE
sterile = 1
/proc/CanHug(var/mob/M)
if(iscorgi(M))
return 1
if(!iscarbon(M))
return 0
var/mob/living/carbon/C = M
if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
return 0
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(H.head && (H.head.body_parts_covered & FACE) && !(H.head.item_flags & FLEXIBLEMATERIAL))
return 0
return 1
@@ -1,244 +0,0 @@
/proc/alien_queen_exists(var/ignore_self,var/mob/living/carbon/human/self)
for(var/mob/living/carbon/human/Q in living_mob_list)
if(self && ignore_self && self == Q)
continue
if(Q.species.name != "Xenomorph Queen")
continue
if(!Q.key || !Q.client || Q.stat)
continue
return 1
return 0
/mob/living/carbon/human/proc/gain_plasma(var/amount)
var/obj/item/organ/xenos/plasmavessel/I = internal_organs_by_name["plasma vessel"]
if(!istype(I)) return
if(amount)
I.stored_plasma += amount
I.stored_plasma = max(0,min(I.stored_plasma,I.max_plasma))
/mob/living/carbon/human/proc/check_alien_ability(var/cost,var/needs_foundation,var/needs_organ)
var/obj/item/organ/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
if(!istype(P))
to_chat(src, "<span class='danger'>Your plasma vessel has been removed!</span>")
return
if(needs_organ)
var/obj/item/organ/I = internal_organs_by_name[needs_organ]
if(!I)
to_chat(src, "<span class='danger'>Your [needs_organ] has been removed!</span>")
return
else if((I.status & ORGAN_CUT_AWAY) || I.is_broken())
to_chat(src, "<span class='danger'>Your [needs_organ] is too damaged to function!</span>")
return
if(P.stored_plasma < cost)
to_chat(src, "<span class='warning'>You don't have enough phoron stored to do that.</span>")
return 0
if(needs_foundation)
var/turf/T = get_turf(src)
var/has_foundation
if(T)
//TODO: Work out the actual conditions this needs.
if(!(istype(T,/turf/space)))
has_foundation = 1
if(!has_foundation)
to_chat(src, "<span class='warning'>You need a solid foundation to do that on.</span>")
return 0
P.stored_plasma -= cost
return 1
// Free abilities.
/mob/living/carbon/human/proc/transfer_plasma(mob/living/carbon/human/M as mob in oview())
set name = "Transfer Plasma"
set desc = "Transfer Plasma to another alien"
set category = "Abilities"
if (get_dist(src,M) <= 1)
to_chat(src, "<span class='alium'>You need to be closer.</span>")
return
var/obj/item/organ/xenos/plasmavessel/I = M.internal_organs_by_name["plasma vessel"]
if(!istype(I))
to_chat(src, "<span class='alium'>Their plasma vessel is missing.</span>")
return
var/amount = input("Amount:", "Transfer Plasma to [M]") as num
if (amount)
amount = abs(round(amount))
if(check_alien_ability(amount,0,"plasma vessel"))
M.gain_plasma(amount)
to_chat(M, "<span class='alium'>[src] has transfered [amount] plasma to you.</span>")
to_chat(src, "<span class='alium'>You have transferred [amount] plasma to [M].</span>")
return
// Queen verbs.
/mob/living/carbon/human/proc/lay_egg()
set name = "Lay Egg (75)"
set desc = "Lay an egg to produce huggers to impregnate prey with."
set category = "Abilities"
if(!config.aliens_allowed)
to_chat(src, "You begin to lay an egg, but hesitate. You suspect it isn't allowed.")
verbs -= /mob/living/carbon/human/proc/lay_egg
return
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,"egg sac"))
visible_message("<span class='alium'><B>[src] has laid an egg!</B></span>")
new /obj/structure/alien/egg(loc)
return
// Drone verbs.
/mob/living/carbon/human/proc/evolve()
set name = "Evolve (500)"
set desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time."
set category = "Abilities"
if(alien_queen_exists())
to_chat(src, "<span class='notice'>We already have an active queen.</span>")
return
if(check_alien_ability(500))
visible_message("<span class='alium'><B>[src] begins to twist and contort!</B></span>", "<span class='alium'>You begin to evolve!</span>")
src.set_species("Xenomorph Queen")
return
/mob/living/carbon/human/proc/plant()
set name = "Plant Weeds (50)"
set desc = "Plants some alien weeds"
set category = "Abilities"
if(check_alien_ability(50,1,"resin spinner"))
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
var/obj/structure/alien/weeds/node/new_node = new(get_turf(src))
new_node.linked_node = new_node
return
/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)"
set desc = "Drench an object in acid, destroying it over time."
set category = "Abilities"
if(!O in oview(1))
to_chat(src, "<span class='alium'>[O] is too far away.</span>")
return
// OBJ CHECK
var/cannot_melt
if(isobj(O))
var/obj/I = O
if(I.unacidable)
cannot_melt = 1
else
if(istype(O, /turf/simulated/wall))
var/turf/simulated/wall/W = O
if(W.material.flags & MATERIAL_UNMELTABLE)
cannot_melt = 1
else if(istype(O, /turf/simulated/floor))
var/turf/simulated/floor/F = O
if(F.flooring && (F.flooring.flags & TURF_ACID_IMMUNE))
cannot_melt = 1
if(cannot_melt)
to_chat(src, "<span class='alium'>You cannot dissolve this object.</span>")
return
if(check_alien_ability(200,0,"acid gland"))
new /obj/effect/acid(get_turf(O), O)
visible_message("<span class='alium'><B>[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!</B></span>")
return
/mob/living/carbon/human/proc/neurotoxin(mob/target as mob in oview())
set name = "Spit Neurotoxin (50)"
set desc = "Spits neurotoxin at someone, paralyzing them for a short time if they are not wearing protective gear."
set category = "Abilities"
if(!check_alien_ability(50,0,"acid gland"))
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
to_chat(src, "You cannot spit neurotoxin in your current state.")
return
visible_message("<span class='warning'>[src] spits neurotoxin at [target]!</span>", "<span class='alium'>You spit neurotoxin at [target].</span>")
var/obj/item/projectile/energy/neurotoxin/A = new /obj/item/projectile/energy/neurotoxin(usr.loc)
A.launch_projectile(target,get_organ_target())
/mob/living/carbon/human/proc/resin() // -- TLE
set name = "Secrete Resin (75)"
set desc = "Secrete tough, malleable resin."
set category = "Abilities"
var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist
if(!choice)
return
if(!check_alien_ability(75,1,"resin spinner"))
return
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
switch(choice)
if("resin door")
new /obj/structure/simple_door/resin(loc)
if("resin wall")
new /obj/structure/alien/resin/wall(loc)
if("resin membrane")
new /obj/structure/alien/resin/membrane(loc)
if("resin nest")
new /obj/structure/bed/nest(loc)
return
mob/living/carbon/human/proc/xeno_infest(mob/living/carbon/human/M as mob in oview())
set name = "Infest (500)"
set desc = "Link a victim to the hivemind."
set category = "Abilities"
if(!M.Adjacent(src))
to_chat(src, "<span class='warning'>They are too far away.</span>")
return
if(!M.mind)
to_chat(src, "<span class='warning'>This mindless flesh adds nothing to the hive.</span>")
return
if(M.species.get_bodytype() == "Xenomorph" || !isnull(M.internal_organs_by_name["hive node"]))
to_chat(src, "<span class='warning'>They are already part of the hive.</span>")
return
var/obj/item/organ/affecting = M.get_organ("chest")
if(!affecting || (affecting.status & ORGAN_ROBOT))
to_chat(src, "<span class='warning'>This form is not compatible with our physiology.</span>")
return
src.visible_message("<span class='danger'>\The [src] crouches over \the [M], extending a hideous protuberance from its head!</span>")
if(!do_after(src, 150))
return
if(!M || !M.Adjacent(src))
to_chat(src, "<span class='warning'>They are too far away.</span>")
return
if(M.species.get_bodytype() == "Xenomorph" || !isnull(M.internal_organs_by_name["hive node"]) || !affecting || (affecting.status & ORGAN_ROBOT))
return
if(!check_alien_ability(500,1,"egg sac"))
return
src.visible_message("<span class='danger'>\The [src] regurgitates something into \the [M]'s torso!</span>")
to_chat(M, "<span class='danger'>A hideous lump of alien mass strains your ribcage as it settles within!</span>")
var/obj/item/organ/xenos/hivenode/node = new(affecting)
node.replaced(M,affecting)
@@ -1,357 +0,0 @@
//Stand-in until this is made more lore-friendly.
/datum/species/xenos
name = "Xenomorph"
name_plural = "Xenomorphs"
default_language = "Xenomorph"
language = "Hivemind"
unarmed_types = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong)
hud_type = /datum/hud_data/alien
rarity_value = 10
has_fine_manipulation = 0
siemens_coefficient = 0
gluttonous = TRUE
mouth_size = 15 // Should be larger than any human-type.
allowed_eat_types = TYPE_ORGANIC | TYPE_SYNTHETIC | TYPE_HUMANOID
mob_size = 14
fall_mod = 0
grab_mod = 4
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/unbreakable),
"groin" = list("path" = /obj/item/organ/external/groin/unbreakable),
"head" = list("path" = /obj/item/organ/external/head/unbreakable),
"l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable),
"r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable),
"l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable),
"r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable),
"l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable),
"r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable),
"l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable)
)
eyes = "blank_eyes"
stamina = 175
sprint_speed_factor = 2
sprint_cost_factor = 0.80
stamina_recovery = 5
natural_climbing = 1
climb_coeff = 0.1
virus_immune = 1
brute_mod = 0.25 // Hardened carapace.
burn_mod = 1.75 // Weak to fire.
warning_low_pressure = 50
hazard_low_pressure = -1
cold_level_1 = 50
cold_level_2 = -1
cold_level_3 = -1
flags = NO_BREATHE | NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_EMBED
spawn_flags = IS_RESTRICTED
reagent_tag = IS_XENOS
blood_color = "#05EE05"
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_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
breath_type = null
poison_type = null
vision_flags = DEFAULT_SIGHT | SEE_MOBS
darksight = 8
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel,
"hive node" = /obj/item/organ/xenos/hivenode,
"nutrient channel" = /obj/item/organ/diona/nutrients
)
bump_flag = ALIEN
swap_flags = ~HEAVY
push_flags = (~HEAVY) ^ ROBOT
move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
max_nutrition_factor = -1
max_hydration_factor = -1
var/alien_number = 0
var/caste_name = "creature" // Used to update alien name.
var/weeds_heal_rate = 1 // Health regen on weeds.
var/weeds_plasma_rate = 5 // Plasma regen on weeds.
/datum/species/xenos/get_bodytype()
return "Xenomorph"
/datum/species/xenos/get_random_name()
return "alien [caste_name] ([alien_number])"
/datum/species/xenos/can_understand(var/mob/other)
if(istype(other,/mob/living/carbon/alien/larva))
return 1
return 0
/datum/species/xenos/tap(var/mob/living/carbon/human/H,var/mob/living/target)
H.visible_message("<span class='notice'>[H] caresses [target] with its scythe-like arm.</span>", \
"<span class='notice'>You caress [target] with your scythe-like arm.</span>")
/datum/species/xenos/handle_post_spawn(var/mob/living/carbon/human/H)
if(H.mind)
H.mind.assigned_role = "Alien"
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.name = H.real_name
..()
/datum/species/xenos/handle_environment_special(var/mob/living/carbon/human/H)
var/turf/T = H.loc
if(!T) return
var/datum/gas_mixture/environment = T.return_air()
if(!environment) return
if(environment.gas["phoron"] > 0 || locate(/obj/structure/alien/weeds) in T)
if(!regenerate(H))
var/obj/item/organ/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"]
P.stored_plasma += weeds_plasma_rate
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
..()
/datum/species/xenos/proc/regenerate(var/mob/living/carbon/human/H)
var/heal_rate = weeds_heal_rate
var/mend_prob = 10
if (!H.resting)
heal_rate = weeds_heal_rate / 3
mend_prob = 1
//first heal damages
if (H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
if (prob(5))
to_chat(H, "<span class='alium'>You feel a soothing sensation come over you...</span>")
return 1
//next internal organs
for(var/obj/item/organ/I in H.internal_organs)
if(I.damage > 0)
I.damage = max(I.damage - heal_rate, 0)
if (prob(5))
to_chat(H, "<span class='alium'>You feel a soothing sensation within your [I.parent_organ]...</span>")
return 1
//next mend broken bones, approx 10 ticks each
for(var/obj/item/organ/external/E in H.bad_external_organs)
if (E.status & ORGAN_BROKEN)
if (prob(mend_prob))
if (E.mend_fracture())
to_chat(H, "<span class='alium'>You feel something mend itself inside your [E.name].</span>")
return 1
return 0
/datum/species/xenos/drone
name = "Xenomorph Drone"
caste_name = "drone"
weeds_plasma_rate = 15
slowdown = 1
tail = "xenos_drone_tail"
rarity_value = 5
icobase = 'icons/mob/human_races/xenos/r_xenos_drone.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_drone.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/queen,
"acid gland" = /obj/item/organ/xenos/acidgland,
"hive node" = /obj/item/organ/xenos/hivenode,
"resin spinner" = /obj/item/organ/xenos/resinspinner,
"nutrient channel" = /obj/item/organ/diona/nutrients
)
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/proc/devour,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/plant,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/evolve,
/mob/living/carbon/human/proc/resin,
/mob/living/carbon/human/proc/corrosive_acid,
/mob/living/carbon/human/proc/darkness_eyes
)
/datum/species/xenos/drone/handle_post_spawn(var/mob/living/carbon/human/H)
var/mob/living/carbon/human/A = H
if(!istype(A))
return ..()
..()
/datum/species/xenos/hunter
name = "Xenomorph Hunter"
weeds_plasma_rate = 5
caste_name = "hunter"
slowdown = -2
total_health = 150
tail = "xenos_hunter_tail"
icobase = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/hunter,
"hive node" = /obj/item/organ/xenos/hivenode,
"nutrient channel" = /obj/item/organ/diona/nutrients
)
stamina = 200
sprint_speed_factor = 2.25
sprint_cost_factor = 1
stamina_recovery = 4
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/tackle,
/mob/living/carbon/human/proc/gut,
/mob/living/carbon/human/proc/leap,
/mob/living/carbon/human/proc/psychic_whisper,
/mob/living/proc/devour,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/darkness_eyes
)
/datum/species/xenos/sentinel
name = "Xenomorph Sentinel"
weeds_plasma_rate = 10
caste_name = "sentinel"
slowdown = 0
total_health = 125
tail = "xenos_sentinel_tail"
icobase = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/sentinel,
"acid gland" = /obj/item/organ/xenos/acidgland,
"hive node" = /obj/item/organ/xenos/hivenode,
"nutrient channel" = /obj/item/organ/diona/nutrients
)
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/tackle,
/mob/living/proc/devour,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/corrosive_acid,
/mob/living/carbon/human/proc/neurotoxin,
/mob/living/carbon/human/proc/darkness_eyes
)
/datum/species/xenos/queen
name = "Xenomorph Queen"
total_health = 250
weeds_heal_rate = 5
weeds_plasma_rate = 20
caste_name = "queen"
slowdown = 4
tail = "xenos_queen_tail"
rarity_value = 10
icobase = 'icons/mob/human_races/xenos/r_xenos_queen.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_queen.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"egg sac" = /obj/item/organ/xenos/eggsac,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/queen,
"acid gland" = /obj/item/organ/xenos/acidgland,
"hive node" = /obj/item/organ/xenos/hivenode,
"resin spinner" = /obj/item/organ/xenos/resinspinner,
"nutrient channel" = /obj/item/organ/diona/nutrients
)
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/psychic_whisper,
/mob/living/proc/devour,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/lay_egg,
/mob/living/carbon/human/proc/plant,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/corrosive_acid,
/mob/living/carbon/human/proc/neurotoxin,
/mob/living/carbon/human/proc/gut,
/mob/living/carbon/human/proc/resin,
/mob/living/carbon/human/proc/darkness_eyes
)
/datum/species/xenos/queen/handle_login_special(var/mob/living/carbon/human/H)
..()
// Make sure only one official queen exists at any point.
if(!alien_queen_exists(1,H))
H.real_name = "alien queen ([alien_number])"
H.name = H.real_name
else
H.real_name = "alien princess ([alien_number])"
H.name = H.real_name
/datum/hud_data/alien
icon = 'icons/mob/screen/alien.dmi'
has_a_intent = 1
has_m_intent = 1
has_warnings = 1
has_hands = 1
has_drop = 1
has_throw = 1
has_resist = 1
has_pressure = 0
has_nutrition = 0
has_hydration = 0
has_bodytemp = 0
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")
)
@@ -1,24 +0,0 @@
proc/create_new_xenomorph(var/alien_caste,var/target)
target = get_turf(target)
if(!target || !alien_caste) return
var/mob/living/carbon/human/new_alien = new(target)
new_alien.set_species("Xenomorph [alien_caste]")
return new_alien
/mob/living/carbon/human/xdrone/Initialize(mapload)
h_style = "Bald"
. = ..(mapload, "Xenomorph Drone")
/mob/living/carbon/human/xsentinel/Initialize(mapload)
h_style = "Bald"
. = ..(mapload, "Xenomorph Sentinel")
/mob/living/carbon/human/xhunter/Initialize(mapload)
h_style = "Bald"
. = ..(mapload, "Xenomorph Hunter")
/mob/living/carbon/human/xqueen/Initialize(mapload)
h_style = "Bald"
. = ..(mapload, "Xenomorph Queen")
@@ -1038,7 +1038,6 @@ var/global/list/robot_modules = list(
LANGUAGE_DRONE = 1,
LANGUAGE_EAL = 1,
LANGUAGE_VOX = 1,
LANGUAGE_XENOMORPH = 1,
LANGUAGE_HIVEMIND = 1,
LANGUAGE_CHANGELING = 1,
LANGUAGE_BORER = 1
-5
View File
@@ -1,9 +1,4 @@
// fun if you want to typecast humans/monkeys/etc without writing long path-filled lines.
/proc/isxenomorph(A)
if(istype(A, /mob/living/carbon/human))
var/mob/living/carbon/human/H = A
return istype(H.species, /datum/species/xenos)
return 0
/proc/issmall(A)
if(A && istype(A, /mob/living))
-19
View File
@@ -201,25 +201,6 @@
return O
//human -> alien
/mob/living/carbon/human/proc/Alienize()
for(var/obj/item/W in src)
drop_from_inventory(W)
regenerate_icons()
canmove = 0
icon = null
invisibility = 101
for(var/t in organs)
qdel(t)
var/alien_caste = pick("Hunter","Sentinel","Drone")
var/mob/living/carbon/human/new_xeno = create_new_xenomorph(alien_caste,loc)
new_xeno.a_intent = I_HURT
new_xeno.key = key
to_chat(new_xeno, "<B>You are now an alien.</B>")
qdel(src)
return
/mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num)
if (transforming)
-70
View File
@@ -1,73 +1,3 @@
//XENOMORPH ORGANS
/obj/item/organ/xenos
name = "xeno organ"
icon = 'icons/effects/blood.dmi'
desc = "It smells like an accident in a chemical factory."
/obj/item/organ/xenos/eggsac
name = "egg sac"
parent_organ = "groin"
icon_state = "xgibmid1"
organ_tag = "egg sac"
/obj/item/organ/xenos/plasmavessel
name = "plasma vessel"
parent_organ = "chest"
icon_state = "xgibdown1"
organ_tag = "plasma vessel"
var/stored_plasma = 0
var/max_plasma = 500
/obj/item/organ/xenos/plasmavessel/queen
name = "bloated plasma vessel"
stored_plasma = 200
max_plasma = 500
/obj/item/organ/xenos/plasmavessel/sentinel
stored_plasma = 100
max_plasma = 250
/obj/item/organ/xenos/plasmavessel/hunter
name = "tiny plasma vessel"
stored_plasma = 100
max_plasma = 150
/obj/item/organ/xenos/acidgland
name = "acid gland"
parent_organ = "head"
icon_state = "xgibtorso"
organ_tag = "acid gland"
/obj/item/organ/xenos/resinspinner
name = "resin spinner"
parent_organ = "head"
icon_state = "xgibmid2"
organ_tag = "resin spinner"
/obj/item/organ/xenos/hivenode
name = "hive node"
parent_organ = "chest"
icon_state = "xgibmid2"
organ_tag = "hive node"
/obj/item/organ/xenos/hivenode/removed(var/mob/living/user)
if(owner && ishuman(owner))
var/mob/living/carbon/human/H = owner
to_chat(H, "<span class='alium'>You feel your connection to the hivemind fray and fade away...</span>")
H.remove_language("Hivemind")
if(H.mind && H.species.get_bodytype() != "Xenomorph")
xenomorphs.remove_antagonist(H.mind)
..(user)
/obj/item/organ/xenos/hivenode/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
..(target, affected)
if(owner && ishuman(owner))
var/mob/living/carbon/human/H = owner
H.add_language("Hivemind")
if(H.mind && H.species.get_bodytype() != "Xenomorph")
to_chat(H, "<span class='alium'>You feel a sense of pressure as a vast intelligence meshes with your thoughts...</span>")
xenomorphs.add_antagonist_mind(H.mind,1, xenomorphs.faction_role_text, xenomorphs.faction_welcome)
// Skeleton limbs.
/obj/item/organ/external/chest/skeleton
name = "rib cage"
@@ -36,8 +36,6 @@
var/options = list("robot", "slime")
for(var/t in all_species)
options += t
options -= "Xenomorph Queen"
options -= "Xenomorph"
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species)
@@ -704,22 +704,6 @@
/datum/reagent/nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.contract_disease(new /datum/disease/robotic_transformation(0), 1)
/datum/reagent/xenomicrobes
name = "Xenomicrobes"
id = "xenomicrobes"
description = "Microbes with an entirely alien cellular structure."
reagent_state = LIQUID
color = "#535E66"
taste_description = "sludge"
fallback_specific_heat = 2
/datum/reagent/xenomicrobes/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
if(prob(10))
M.contract_disease(new /datum/disease/xeno_transformation(0), 1)
/datum/reagent/xenomicrobes/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.contract_disease(new /datum/disease/xeno_transformation(0), 1)
/datum/reagent/toxin/undead
name = "Undead Ichor"
id = "undead_ichor"
+6
View File
@@ -0,0 +1,6 @@
author: Alberyk
delete-after: True
changes:
- rscdel: "Removed playable xenomorphs."
-1
View File
@@ -46706,7 +46706,6 @@
dir = 6
},
/obj/effect/floor_decal/industrial/hatch/yellow,
/obj/structure/lamarr,
/turf/simulated/floor/tiled,
/area/rnd/rdoffice)
"bAF" = (
+1 -6
View File
@@ -21,11 +21,6 @@
/obj/structure/alien/weeds/node,
/turf/simulated/floor/cult,
/area/mine/unexplored)
"g" = (
/obj/structure/alien/weeds,
/obj/structure/alien/egg,
/turf/simulated/floor/cult,
/area/mine/unexplored)
"h" = (
/obj/structure/simple_door/gold,
/turf/unsimulated/chasm_mask,
@@ -576,7 +571,7 @@ d
i
d
e
g
e
c
e
b
+1 -9
View File
@@ -4359,14 +4359,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/tiled/white,
/area/derelict/hallway/southeast)
"nw" = (
/obj/structure/lamarr{
destroyed = 1;
icon_state = "labcageb0";
occupied = 0
},
/turf/simulated/floor/tiled/white,
/area/derelict/hallway/southeast)
"nx" = (
/obj/machinery/conveyor{
dir = 4;
@@ -54599,7 +54591,7 @@ mr
jS
jl
in
nw
jW
jW
aa
og