mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-24 21:40:55 +01:00
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:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
@@ -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())))
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
author: Alberyk
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- rscdel: "Removed playable xenomorphs."
|
||||
@@ -46706,7 +46706,6 @@
|
||||
dir = 6
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/hatch/yellow,
|
||||
/obj/structure/lamarr,
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/rnd/rdoffice)
|
||||
"bAF" = (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user