Divided aliens into castes: drones, hunters, and sentinels. Modified their sprites and abilities to reflect this. Aliens now have a mind variable when not admin-spawned.

Spawning generic alien humanoids is still possible but not recommended.
Alien procs changed to reflect alien castes.
Updated respawn character proc. Should now work right and factor in jobs if specified.
Added Neo's PALADIN core module to AI upload.
Pulse rifles are not spawnable by admins below coder rank.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@770 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
noisomehollow@lycos.com
2011-01-04 07:46:17 +00:00
parent 9d26c0ff56
commit 45d92d09ff
16 changed files with 6587 additions and 6192 deletions

View File

@@ -18,6 +18,28 @@
var/list/body_standing = list( )
var/list/body_lying = list( )
/mob/living/carbon/alien/humanoid/hunter
name = "alien hunter"
health = 150
toxloss = 50
max_plasma = 150
icon_state = "alien_s"
/mob/living/carbon/alien/humanoid/sentinel
name = "alien sentinel"
health = 125
toxloss = 100
max_plasma = 250
icon_state = "alien_s"
/mob/living/carbon/alien/humanoid/drone
name = "alien drone"
health = 100
icon_state = "alien_s"
/mob/living/carbon/alien/humanoid/queen
name = "alien queen"

View File

@@ -849,12 +849,13 @@ var/showadminmessages = 1
removed_paths += dirty_path
else if (!ispath(path, /obj) && !ispath(path, /turf) && !ispath(path, /mob))
removed_paths += dirty_path
else if (ispath(path, /obj/item/weapon/gun/energy/pulse_rifle))
else if (ispath(path, /obj/item/weapon/gun/energy/pulse_rifle) && !(src.rank in list("Coder", "Host")))
removed_paths += dirty_path
else if (ispath(path, /obj/bhole) && !(src.rank in list("Coder", "Host")))
removed_paths += dirty_path
else if (ispath(path, /mob) && !(src.rank in list("Shit Guy", "Coder", "Host")))
removed_paths += dirty_path
else
paths += path

View File

@@ -252,9 +252,18 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
alert("There are no available spots to spawn the xeno. Aborting command.")
return
var/CASTE = alert(src, "Please choose which caste to spawn.",,"Hunter","Sentinel","Drone")
var/obj/landmark/spawn_here = pick(xeno_list)
var/mob/living/carbon/alien/humanoid/new_xeno = new(spawn_here.loc)
new_xeno.plasma = 250
var/mob/new_xeno
switch(CASTE)
if("Hunter")
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (spawn_here.loc)
if("Sentinel")
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (spawn_here.loc)
if("Drone")
new_xeno = new /mob/living/carbon/alien/humanoid/drone (spawn_here.loc)
var/list/candidates = list() // Picks a random ghost for the role. Mostly a copy of alien burst code. Doesn't spawn the one using the command.
for(var/mob/dead/observer/G in world)
@@ -264,19 +273,26 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
if(candidates.len)
var/mob/dead/observer/G = pick(candidates)
message_admins("\blue [key_name_admin(usr)] has spawned [G.key] as a filthy xeno.", 1)
new_xeno.client = G.client
new_xeno.mind = new//Mind initialize stuff.
new_xeno.mind.current = new_xeno
new_xeno.mind.assigned_role = "Alien"
new_xeno.mind.special_role = CASTE
new_xeno.mind.key = G.key
if(G.client)
G.client.mob = new_xeno
del(G)
else
alert("There are no available ghosts to throw into the xeno. Aborting command.")
del(new_xeno)
return
/*Current project. Currently trying to get preferences save to work for characteristics. That and randomized characteristics.
Will probably check for admin status at some point or with possible other spawn options other than Assistant.
Re-spawning traitors or traitor targets is more tricky.
/*
If a guy was gibbed and you want to revive him, this is a good way to do so.
Works kind of like entering the game with a new character. Character receives a new mind.
They spawn as an assistant but there is no announcement. /N */
Since gibbed traitors retain their mind through their ghost, I might add some functionality to bring them back.
/N */
/client/proc/respawn_character()
set category = "Special Verbs"
set name = "Respawn Character"
@@ -284,26 +300,55 @@ They spawn as an assistant but there is no announcement. /N */
if(!src.authenticated || !src.holder)
src << "Only administrators may use this command."
return
var/input = input(usr, "Please specify which key/client will be respawned. That person will not retain their traitor/other status when respawned.", "What?", "")
var/input = input(src, "Please specify which key will be respawned. Make sure their key is properly capitalized. That person will not retain their traitor/other status when respawned.", "Key", "")
if(!input)
return
var/GKEY = input
var/GNAME = "none"
var/mob/dead/observer/GDEL //To properly delete the mob later on.
var/GNAME //To auto-copy the mob's name.
var/GDEL //To properly delete the mob later on.
var/GKEY = "null"//To later check if a person was found or not.
for(var/mob/dead/observer/G in world)
if(G.key==input||GKEY)
GDEL = G
if(G.client)
if(G.key==input)
GNAME = G.real_name
else
alert("There is no such key in the game or the person is not currently a ghost. Aborting command.")
GDEL = G
GKEY = input
goto NEXT//Stops processing once it finds a match.
NEXT
if(GKEY == "null")
alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
return
var/new_character_gender = MALE //to determine character's gender for few of the other procs.
var/mob/living/carbon/human/new_character = new(src)
var/new_character_gender = MALE //to determine character's gender for few of the other lines.
// if(!preferences.preferences.savefile_load(GDEL, 0))
// if(alert("Please specify the character's gender.",,"Male","Female")=="Female")
// new_character_gender = FEMALE
if(alert("Please specify the character's gender.",,"Male","Female")=="Female")
new_character_gender = FEMALE
// else
// GDEL.preferences.preferences.savefile_load()
// GDEL.preferences.preferences.copy_to(new_character)
var/RANK
var/list/JOBLIST
JOBLIST = list("Virologist","Chief Medical Officer","Research Director","Chief Engineer","Chief Engineer","Cargo Technician","Quartermaster","Lawyer","Librarian","Botanist","Roboticist","Chef","Barman","Atmospheric Technician","Head of Personnel","Head of Security","Scientist","Warden","Security Officer","Captain","Medical Doctor","Detective","Assistant","Station Engineer","Mime","Clown","Janitor","Chemist","Geneticist","Chaplain")
TRYAGAIN
var/input2 = input(src, "Please specify which job the character will be respawned as. Start with a capital, such as Assistant or Research Director. Leaving the box as blank will default to Assistant.", "Rank", "")
if(!input2)
RANK = "Assistant"
else
if(JOBLIST.Find(input2)==0)
src << "That job is not valid. Check your spelling or leave the box as blank."
goto TRYAGAIN
else
RANK = input2
var/spawn_here = pick(latejoin)//"JoinLate" is a landmark which is deleted on round start. So, latejoin has to be used instead.
var/mob/living/carbon/human/new_character = new(src)
new_character.gender = new_character_gender
// var/datum/preferences/preferences
@@ -322,16 +367,17 @@ They spawn as an assistant but there is no announcement. /N */
new_character.real_name = GNAME
message_admins("\blue [key_name_admin(usr)] has respawned [GKEY] as [new_character.name].", 1) //Here so it doesn't null client if an admin re-spawns themselves.
new_character.key = GKEY
// preferences.copy_to(new_character)
// preferences.copy_to(new_character)//Can't copy preferences as they are created on round start. Or loaded.
new_character.dna.ready_dna(new_character)
// new_character:ManifestLateSpawn()
// new_character:ManifestLateSpawn()//That announces the character on all the systems.
new_character.mind = new
new_character.mind.key = GKEY
new_character.mind.current = new_character
new_character.mind.assigned_role = "Assistant"
new_character.Equip_Rank("Assistant", joined_late=1)
new_character.mind.assigned_role = RANK
new_character.Equip_Rank(RANK, joined_late=1)
del(GDEL)
/client/proc/cmd_admin_add_freeform_ai_law()
set category = "Fun"
set name = "Add Custom AI law"

View File

@@ -1,73 +1,9 @@
/*NOTES:
These are being worked on.
These are general powers. Specific powers are stored under the appropriate alien creature type.
*/
/mob/living/carbon/alien/humanoid/verb/invis()
set name = "Invisibility (50)"
set desc = "Makes you invisible for 15 seconds"
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this"
return
if(src.toxloss >= 50)
src.toxloss -= 50
src.alien_invis = 1.0
src << "\green You are now invisible."
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] fades into the surroundings!</B>"), 1)
spawn(150)
src.alien_invis = 0.0
src << "\green You are no longer invisible."
else
src << "\green Not enough plasma stored"
return
/*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit.
Doesn't work on other aliens/AI.*/
/mob/living/carbon/alien/humanoid/verb/spit(mob/target as mob in oview())
set name = "Spit Neurotoxin (50)"
set desc = "Spits neurotoxin at someone, paralyzing them for a short time."
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this."
return
if(istype(target, /mob/living/carbon/alien))
src << "\green Your allies are not a valid target."
return
if(src.toxloss >= 50)
src << "\green You spit neurotoxin at [target]."
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << "\red [src] spits neurotoxin at [target]!"
src.toxloss -= 50
var/turf/T = usr.loc
var/turf/U = (istype(target, /atom/movable) ? target.loc : target)
if(!U || !T)
return
while(U && !istype(U,/turf))
U = U.loc
if(!istype(T, /turf))
return
if (U == T)
usr.bullet_act(PROJECTILE_DART)
return
if(!istype(U, /turf))
return
var/obj/bullet/neurodart/A = new /obj/bullet/neurodart(usr.loc)
A.current = U
A.yo = U.y - T.y
A.xo = U.x - T.x
A.process()
else
src << "\green Not enough plasma stored."
return
/mob/living/carbon/alien/humanoid/verb/plant()
set name = "Plant Weeds (100)"
@@ -165,116 +101,6 @@ Doesn't work on other aliens/AI.*/
src << "\green You need to be closer."
return
/mob/living/carbon/alien/humanoid/verb/evolve() // -- TLE
set name = "Evolve (500)"
set desc = "Produce an interal egg sac capable of spawning children"
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this."
return
if(!src.toxloss)
src << "\green You don't have any plasma."
return
if(src.toxloss >= 500)
src.toxloss -= 500
src << "\green You begin to evolve."
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
var/mob/living/carbon/alien/humanoid/queen/Q = new (src.loc)
Q.key = src.key
del(src)
else
src << "\green Not enough plasma."
/mob/living/carbon/alien/humanoid/verb/resinwall() // -- TLE
set name = "Shape Resin Wall (100)"
set desc = "Produce a wall of resin that blocks entry and line of sight"
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this."
return
if(!src.toxloss)
src << "\green You don't have any plasma."
if(src.toxloss >= 100)
src.toxloss -= 100
src << "\green You begin to shape a wall of resin."
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[src] vomits up a thick purple substance and begins to shape it!</B>"), 1)
//var/obj/alien/resin/R = new(src.loc)
new /obj/alien/resin(src.loc)
else
src << "\green Not enough plasma."
/mob/living/carbon/alien/humanoid/proc/ventcrawl() // -- TLE
set name = "Crawl through Vent"
set desc = "Enter an air vent and appear at a random one"
set category = "Alien"
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
// return
if(src.stat)
src << "\green You must be conscious to do this."
return
var/vent_found = 0
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
if(!v.welded)
vent_found = v
if(!vent_found)
src << "\green You must be standing on or beside an open air vent to enter it."
return
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
if(temp_vent.loc == src.loc)
continue
if(temp_vent.welded)
continue
vents.Add(temp_vent)
var/list/choices = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != src.loc.z)
continue
if(vent.welded)
continue
var/atom/a = get_turf_loc(vent)
choices.Add(a.loc)
var/turf/startloc = src.loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
var/selection_position = choices.Find(selection)
if(src.loc != startloc)
src << "\green You need to remain still while entering a vent."
return
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection_position]
if(target_vent)
for(var/mob/O in viewers(src, null))
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
var/list/huggers = list()
for(var/obj/alien/facehugger/F in view(3, src))
if(istype(F, /obj/alien/facehugger))
huggers.Add(F)
src.loc = vent_found
for(var/obj/alien/facehugger/F in huggers)
F.loc = vent_found
var/travel_time = get_dist(src.loc, target_vent.loc)
spawn(round(travel_time/2))//give sound warning to anyone near the target vent
if(!target_vent.welded)
for(var/mob/O in hearers(target_vent, null))
O.show_message("You hear something crawling trough the ventilation pipes.")
spawn(travel_time)
if(target_vent.welded)//the vent can be welded while alien scrolled through the list or travelled.
target_vent = vent_found //travel back. No additional time required.
src << "\red The vent you were heading to appears to be welded."
src.loc = target_vent.loc
for(var/obj/alien/facehugger/F in huggers)
F.loc = src.loc
/*Xenos now have a proc and a verb for drenching stuff in acid. I couldn't get them to work right when combined so this was the next best solution.
The first proc defines the acid throw function while the other two work in the game itself. Probably a good idea to revise this later.

View File

@@ -0,0 +1,69 @@
/mob/living/carbon/alien/humanoid/drone/New()
spawn (1)
src.verbs += /mob/living/carbon/alien/humanoid/proc/corrode_target
src.verbs -= /mob/living/carbon/alien/humanoid/verb/call_to
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
src.stand_icon = new /icon('alien.dmi', "aliend_s")
src.lying_icon = new /icon('alien.dmi', "aliend_l")
src.icon = src.stand_icon
if(src.name == "alien drone") src.name = text("alien drone ([rand(1, 1000)])")
src.real_name = src.name
src << "\blue Your icons have been generated!"
update_clothing()
//Drones use the same base as generic humanoids.
//Drone verbs
/mob/living/carbon/alien/humanoid/drone/verb/evolve() // -- TLE
set name = "Evolve (500)"
set desc = "Produce an interal egg sac capable of spawning children"
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this."
return
if(!src.toxloss)
src << "\green You don't have any plasma."
return
if(src.toxloss >= 500)
src.toxloss -= 500
src << "\green You begin to evolve."
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
var/mob/living/carbon/alien/humanoid/queen/Q = new (src.loc)
Q.mind = new//Mind initialize stuff.
Q.mind.current = Q
Q.mind.assigned_role = "Alien"
Q.mind.special_role = "Queen"
Q.mind.key = src.key
if(src.client)
src.client.mob = Q
del(src)
else
src << "\green Not enough plasma."
/mob/living/carbon/alien/humanoid/drone/verb/resinwall() // -- TLE
set name = "Shape Resin Wall (100)"
set desc = "Produce a wall of resin that blocks entry and line of sight"
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this."
return
if(!src.toxloss)
src << "\green You don't have any plasma."
if(src.toxloss >= 100)
src.toxloss -= 100
src << "\green You begin to shape a wall of resin."
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[src] vomits up a thick purple substance and begins to shape it!</B>"), 1)
//var/obj/alien/resin/R = new(src.loc)
new /obj/alien/resin(src.loc)
else
src << "\green Not enough plasma."

View File

@@ -0,0 +1,248 @@
/mob/living/carbon/alien/humanoid/hunter/New()
spawn (1)
src.verbs -= /mob/living/carbon/alien/humanoid/verb/corrode
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
src.stand_icon = new /icon('alien.dmi', "alienh_s")
src.lying_icon = new /icon('alien.dmi', "alienh_l")
src.icon = src.stand_icon
if(src.name == "alien hunter") src.name = text("alien hunter ([rand(1, 1000)])")
src.real_name = src.name
src << "\blue Your icons have been generated!"
update_clothing()
/mob/living/carbon/alien/humanoid/hunter
updatehealth()
if (src.nodamage == 0)
//oxyloss is only used for suicide
//toxloss isn't used for aliens, its actually used as alien powers!!
src.health = 150 - src.oxyloss - src.fireloss - src.bruteloss
else
src.health = 150
src.stat = 0
handle_regular_hud_updates()
if (src.stat == 2 || src.mutations & 4)
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = 2
else if (src.stat != 2)
src.sight |= SEE_MOBS
src.sight |= SEE_TURFS
src.sight &= ~SEE_OBJS
src.see_in_dark = 5
src.see_invisible = 2
if (src.sleep) src.sleep.icon_state = text("sleep[]", src.sleeping)
if (src.rest) src.rest.icon_state = text("rest[]", src.resting)
if (src.healths)
if (src.stat != 2)
switch(health)
if(150 to INFINITY)
src.healths.icon_state = "health0"
if(100 to 150)
src.healths.icon_state = "health1"
if(50 to 100)
src.healths.icon_state = "health2"
if(25 to 50)
src.healths.icon_state = "health3"
if(0 to 25)
src.healths.icon_state = "health4"
else
src.healths.icon_state = "health5"
else
src.healths.icon_state = "health6"
handle_environment()
//If there are alien weeds on the ground then heal if needed or give some toxins
if(locate(/obj/alien/weeds) in loc)
if(health >= 150)
toxloss += 5
if(toxloss > max_plasma)
toxloss = max_plasma
else
bruteloss -= 5
fireloss -= 5
handle_regular_status_updates()
health = 150 - (oxyloss + fireloss + bruteloss)
if(oxyloss > 50) paralysis = max(paralysis, 3)
if(src.sleeping)
src.paralysis = max(src.paralysis, 3)
if (prob(10) && health) spawn(0) emote("snore")
src.sleeping--
if(src.resting)
src.weakened = max(src.weakened, 5)
if(health < -100 || src.brain_op_stage == 4.0)
death()
else if(src.health < 0)
if(src.health <= 20 && prob(1)) spawn(0) emote("gasp")
//if(!src.rejuv) src.oxyloss++
if(!src.reagents.has_reagent("inaprovaline")) src.oxyloss++
if(src.stat != 2) src.stat = 1
src.paralysis = max(src.paralysis, 5)
if (src.stat != 2) //Alive.
if (src.paralysis || src.stunned || src.weakened) //Stunned etc.
if (src.stunned > 0)
src.stunned--
src.stat = 0
if (src.weakened > 0)
src.weakened--
src.lying = 1
src.stat = 0
if (src.paralysis > 0)
src.paralysis--
src.blinded = 1
src.lying = 1
src.stat = 1
var/h = src.hand
src.hand = 0
drop_item()
src.hand = 1
drop_item()
src.hand = h
else //Not stunned.
src.lying = 0
src.stat = 0
else //Dead.
src.lying = 1
src.blinded = 1
src.stat = 2
if (src.stuttering) src.stuttering--
if (src.eye_blind)
src.eye_blind--
src.blinded = 1
if (src.ear_deaf > 0) src.ear_deaf--
if (src.ear_damage < 25)
src.ear_damage -= 0.05
src.ear_damage = max(src.ear_damage, 0)
src.density = !( src.lying )
if ((src.sdisabilities & 1))
src.blinded = 1
if ((src.sdisabilities & 4))
src.ear_deaf = 1
if (src.eye_blurry > 0)
src.eye_blurry--
src.eye_blurry = max(0, src.eye_blurry)
if (src.druggy > 0)
src.druggy--
src.druggy = max(0, src.druggy)
return 1
//Hunter verbs
/mob/living/carbon/alien/humanoid/hunter/verb/invis()
set name = "Invisibility (50)"
set desc = "Makes you invisible for 15 seconds"
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this"
return
if(src.toxloss >= 50)
src.toxloss -= 50
src.alien_invis = 1.0
src << "\green You are now invisible."
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] fades into the surroundings!</B>"), 1)
spawn(150)
src.alien_invis = 0.0
src << "\green You are no longer invisible."
else
src << "\green Not enough plasma stored"
return
/mob/living/carbon/alien/humanoid/hunter/verb/ventcrawl() // -- TLE
set name = "Crawl through Vent"
set desc = "Enter an air vent and appear at a random one"
set category = "Alien"
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
// return
if(src.stat)
src << "\green You must be conscious to do this."
return
var/vent_found = 0
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
if(!v.welded)
vent_found = v
if(!vent_found)
src << "\green You must be standing on or beside an open air vent to enter it."
return
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
if(temp_vent.loc == src.loc)
continue
if(temp_vent.welded)
continue
vents.Add(temp_vent)
var/list/choices = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != src.loc.z)
continue
if(vent.welded)
continue
var/atom/a = get_turf_loc(vent)
choices.Add(a.loc)
var/turf/startloc = src.loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
var/selection_position = choices.Find(selection)
if(src.loc != startloc)
src << "\green You need to remain still while entering a vent."
return
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection_position]
if(target_vent)
for(var/mob/O in viewers(src, null))
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
var/list/huggers = list()
for(var/obj/alien/facehugger/F in view(3, src))
if(istype(F, /obj/alien/facehugger))
huggers.Add(F)
src.loc = vent_found
for(var/obj/alien/facehugger/F in huggers)
F.loc = vent_found
var/travel_time = get_dist(src.loc, target_vent.loc)
spawn(round(travel_time/2))//give sound warning to anyone near the target vent
if(!target_vent.welded)
for(var/mob/O in hearers(target_vent, null))
O.show_message("You hear something crawling trough the ventilation pipes.")
spawn(travel_time)
if(target_vent.welded)//the vent can be welded while alien scrolled through the list or travelled.
target_vent = vent_found //travel back. No additional time required.
src << "\red The vent you were heading to appears to be welded."
src.loc = target_vent.loc
for(var/obj/alien/facehugger/F in huggers)
F.loc = src.loc

View File

@@ -0,0 +1,206 @@
/mob/living/carbon/alien/humanoid/sentinel/New()
spawn (1)
src.verbs += /mob/living/carbon/alien/humanoid/proc/corrode_target
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
src.stand_icon = new /icon('alien.dmi', "aliens_s")
src.lying_icon = new /icon('alien.dmi', "aliens_l")
src.icon = src.stand_icon
if(src.name == "alien sentinel") src.name = text("alien sentinel ([rand(1, 1000)])")
src.real_name = src.name
src << "\blue Your icons have been generated!"
update_clothing()
/mob/living/carbon/alien/humanoid/sentinel
updatehealth()
if (src.nodamage == 0)
//oxyloss is only used for suicide
//toxloss isn't used for aliens, its actually used as alien powers!!
src.health = 125 - src.oxyloss - src.fireloss - src.bruteloss
else
src.health = 125
src.stat = 0
handle_regular_hud_updates()
if (src.stat == 2 || src.mutations & 4)
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = 2
else if (src.stat != 2)
src.sight |= SEE_MOBS
src.sight &= SEE_TURFS
src.sight &= ~SEE_OBJS
src.see_in_dark = 7
src.see_invisible = 3
if (src.sleep) src.sleep.icon_state = text("sleep[]", src.sleeping)
if (src.rest) src.rest.icon_state = text("rest[]", src.resting)
if (src.healths)
if (src.stat != 2)
switch(health)
if(125 to INFINITY)
src.healths.icon_state = "health0"
if(100 to 125)
src.healths.icon_state = "health1"
if(75 to 100)
src.healths.icon_state = "health2"
if(25 to 75)
src.healths.icon_state = "health3"
if(0 to 25)
src.healths.icon_state = "health4"
else
src.healths.icon_state = "health5"
else
src.healths.icon_state = "health6"
handle_environment()
//If there are alien weeds on the ground then heal if needed or give some toxins
if(locate(/obj/alien/weeds) in loc)
if(health >= 125)
toxloss += 10
if(toxloss > max_plasma)
toxloss = max_plasma
else
bruteloss -= 10
fireloss -= 10
handle_regular_status_updates()
health = 150 - (oxyloss + fireloss + bruteloss)
if(oxyloss > 50) paralysis = max(paralysis, 3)
if(src.sleeping)
src.paralysis = max(src.paralysis, 3)
if (prob(10) && health) spawn(0) emote("snore")
src.sleeping--
if(src.resting)
src.weakened = max(src.weakened, 5)
if(health < -100 || src.brain_op_stage == 4.0)
death()
else if(src.health < 0)
if(src.health <= 20 && prob(1)) spawn(0) emote("gasp")
//if(!src.rejuv) src.oxyloss++
if(!src.reagents.has_reagent("inaprovaline")) src.oxyloss++
if(src.stat != 2) src.stat = 1
src.paralysis = max(src.paralysis, 5)
if (src.stat != 2) //Alive.
if (src.paralysis || src.stunned || src.weakened) //Stunned etc.
if (src.stunned > 0)
src.stunned--
src.stat = 0
if (src.weakened > 0)
src.weakened--
src.lying = 1
src.stat = 0
if (src.paralysis > 0)
src.paralysis--
src.blinded = 1
src.lying = 1
src.stat = 1
var/h = src.hand
src.hand = 0
drop_item()
src.hand = 1
drop_item()
src.hand = h
else //Not stunned.
src.lying = 0
src.stat = 0
else //Dead.
src.lying = 1
src.blinded = 1
src.stat = 2
if (src.stuttering) src.stuttering--
if (src.eye_blind)
src.eye_blind--
src.blinded = 1
if (src.ear_deaf > 0) src.ear_deaf--
if (src.ear_damage < 25)
src.ear_damage -= 0.05
src.ear_damage = max(src.ear_damage, 0)
src.density = !( src.lying )
if ((src.sdisabilities & 1))
src.blinded = 1
if ((src.sdisabilities & 4))
src.ear_deaf = 1
if (src.eye_blurry > 0)
src.eye_blurry--
src.eye_blurry = max(0, src.eye_blurry)
if (src.druggy > 0)
src.druggy--
src.druggy = max(0, src.druggy)
return 1
//Sentinel verbs
/mob/living/carbon/alien/humanoid/sentinel/verb/spit(mob/target as mob in oview())
set name = "Spit Neurotoxin (50)"
set desc = "Spits neurotoxin at someone, paralyzing them for a short time."
set category = "Alien"
if(src.stat)
src << "\green You must be conscious to do this."
return
if(istype(target, /mob/living/carbon/alien))
src << "\green Your allies are not a valid target."
return
if(src.toxloss >= 50)
src << "\green You spit neurotoxin at [target]."
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << "\red [src] spits neurotoxin at [target]!"
src.toxloss -= 50
var/turf/T = usr.loc
var/turf/U = (istype(target, /atom/movable) ? target.loc : target)
if(!U || !T)
return
while(U && !istype(U,/turf))
U = U.loc
if(!istype(T, /turf))
return
if (U == T)
usr.bullet_act(PROJECTILE_DART)
return
if(!istype(U, /turf))
return
var/obj/bullet/neurodart/A = new /obj/bullet/neurodart(usr.loc)
A.current = U
A.yo = U.y - T.y
A.xo = U.x - T.x
A.process()
else
src << "\green Not enough plasma stored."
return

View File

@@ -1,64 +1,6 @@
/*
Maybe you could combine elements from the Blob mode into a new Alien mode since Blob rarely seems to get much
play these days, is hard as fuck to actually win, and gets more use as a random event these days.
The main Alien's objective is to corrupt, infest, whatever you want to call it to a certain % of the station.
Give it an ability which, every so often allows it to drop a bunch of slime which infests floors and walls. The
main alien would be poor at actually killing anyone, but very difficult to bring down - maybe it is immune to
brute and toxic damage, and fire kills it but takes a long exposure time to do so. Suffocation/exposure would
be the only reliable way to off it.
Like the Wizard, the Alien can select from a few abilities, though they center around building things in the
slime rather than being straight up attacks or spells. For instance, it might be able to build tunnels which
take it instantly from one slime patch to another, or pods which huff poison gas at anyone that gets too close.
It can only build in areas it slimed, and the abilities have long cooldowns. The structures can also be destroyed
by anyone determined enough.
Anyone who stays in the slime for too long will end up becoming a mutant which serves the main alien. This would
give the alien an incentive to try and incapacitate or find incapacitated people to drag back into its
territory to gain more slaves. The mutants are basically just monkeys - crippled with only a few equipment
slots, but share some of the alien's durability.
To get rid of the slime, you can weld it, taze/laser it, set it on fire, blow it up or get the janitor
to clean it up, or just beat the shit out of it (which takes ages).
[11:32] <&Rick> nah dont let it wear clothing
[11:32] <&Rick> but have alien items that replace suit functions
[11:32] <&Rick> like an item that lets them walk around in space with no penalty
[11:32] <&Nannek> yeah cool
[11:33] <&Nannek> thinking making it breathe plasma or would that make the aliens life too hard
[11:33] <&Rick> hmm
[11:33] <&Rick> maybe breathing plasma benefit it
[11:33] <&Rick> but not required
[11:33] <&Nannek> yeah makes them stronger/faster or something
[11:33] <&Rick> like have stamina or something that recharges when the alien is breathing plasma
[11:33] <&Nannek> which in turn lets it uses special alien abilities
[11:34] <&Rick> if theres something the alien should be able to wear
[11:34] <&Rick> is a full human skin body suit
[11:34] <&Nannek> oh
[11:34] <&Rick> make it so you can skin dead people
[11:34] <&Nannek> that could be fun
[11:34] <&Rick> 8)
[11:34] <&Rick> but no clothing even if wearing a human suit
[11:34] <&Nannek> then they can pretend to be the human for a limited time before the suit rips apart
[11:35] <&Rick> yeah
[11:35] <&Nannek> thinking not letting aliens understand humans and vice versa
[11:35] <&Rick> that would be hilarious
[11:35] <&Rick> have a universal translator item
[11:35] <&Rick> so if the alien loses it
[11:35] <&Rick> they lose being able to communicate
[11:35] <&Nannek> kk
This is all very silly and I will probably remove it in the future. /N
*/
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
spawn (1)
src.verbs += /mob/living/carbon/alien/humanoid/proc/ventcrawl // Give only normal aliens ventcrawling -- TLE
src.verbs += /mob/living/carbon/alien/humanoid/proc/corrode_target //So aliens propely get two acid verbs. /N
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
@@ -113,6 +55,10 @@ This is all very silly and I will probably remove it in the future. /N
var/tally = 0
if (istype(src, /mob/living/carbon/alien/humanoid/queen))
tally += 5
if (istype(src, /mob/living/carbon/alien/humanoid/drone))
tally += 2
if (istype(src, /mob/living/carbon/alien/humanoid/sentinel))
tally += 1
return tally
//This needs to be fixed

View File

@@ -275,13 +275,13 @@
//If there are alien weeds on the ground then heal if needed or give some toxins
if(locate(/obj/alien/weeds) in loc)
if(health >= 100)
toxloss += 5
toxloss += 15
if(toxloss > max_plasma)
toxloss = max_plasma
else
bruteloss -= 5
fireloss -= 5
bruteloss -= 15
fireloss -= 15

View File

@@ -1,6 +1,7 @@
/mob/living/carbon/alien/humanoid/queen/New()
spawn (1)
src.verbs -= /mob/living/carbon/alien/humanoid/proc/ventcrawl // Queens lose the ability to ventcrawl -- TLE
src.verbs += /mob/living/carbon/alien/humanoid/proc/corrode_target
src.verbs += /mob/living/carbon/alien/humanoid/sentinel/verb/spit
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
@@ -159,15 +160,6 @@
return 1
//Queen verbs
/mob/living/carbon/alien/humanoid/queen/verb/lay_egg()

View File

@@ -86,15 +86,31 @@
handle_mutations_and_radiation()
if(src.amount_grown >= 200)
src << "\green You are growing into a beautiful alien!"
var/mob/living/carbon/alien/humanoid/H = new /mob/living/carbon/alien/humanoid( src.loc )
H.toxloss = src.toxloss
if(src.amount_grown == 200)
src << "\green You are growing into a beautiful alien! It is time to choose a caste."
src << "\green There are three to choose from:"
src << "\green <B>Hunters</B> are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
src << "\green <B>Sentinels</B> are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters."
src << "\green <B>Drones</B> are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen."
var/CASTE = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
var/mob/H
switch(CASTE)
if("Hunter")
H = new /mob/living/carbon/alien/humanoid/hunter (src.loc)
if("Sentinel")
H = new /mob/living/carbon/alien/humanoid/sentinel (src.loc)
if("Drone")
H = new /mob/living/carbon/alien/humanoid/drone (src.loc)
H.mind = new//Mind initialize stuff.
H.mind.current = src
H.mind.assigned_role = "Alien"
H.mind.special_role = CASTE
H.mind.key = src.key
if(src.client)
src.client.mob = H
spawn(10)
del(src)
return
//grow!! but not if metroid or dead

View File

@@ -231,14 +231,31 @@
// flick("h2alien", animation)
// sleep(48)
// del(animation)
var/mob/living/carbon/alien/humanoid/O = new /mob/living/carbon/alien/humanoid( src.loc )
O.name = "alien"
var/CASTE = pick("Hunter","Sentinel","Drone")
var/mob/O
switch(CASTE)
if("Hunter")
O = new /mob/living/carbon/alien/humanoid/hunter (src.loc)
if("Sentinel")
O = new /mob/living/carbon/alien/humanoid/sentinel (src.loc)
if("Drone")
O = new /mob/living/carbon/alien/humanoid/drone (src.loc)
O.dna = src.dna
src.dna = null
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
if (src.client)
O.mind = new//Mind initialize stuff.
O.mind.current = O
O.mind.assigned_role = "Alien"
O.mind.special_role = CASTE
O.mind.key = src.key
if(src.client)
src.client.mob = O
O.loc = src.loc
O << "<B>You are now an alien.</B>"
del(src)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -84,9 +84,11 @@
#define FILE_DIR "code/modules/mob/living/carbon"
#define FILE_DIR "code/modules/mob/living/carbon/alien"
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid"
#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste"
#define FILE_DIR "code/modules/mob/living/carbon/alien/larva"
#define FILE_DIR "code/modules/mob/living/carbon/beast"
#define FILE_DIR "code/modules/mob/living/carbon/human"
#define FILE_DIR "code/modules/mob/living/carbon/human/Vampire"
#define FILE_DIR "code/modules/mob/living/carbon/monkey"
#define FILE_DIR "code/modules/mob/living/silicon"
#define FILE_DIR "code/modules/mob/living/silicon/ai"
@@ -610,6 +612,9 @@
#include "code\modules\mob\living\carbon\alien\humanoid\life_new.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\login.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm"
#include "code\modules\mob\living\carbon\alien\larva\death.dm"
#include "code\modules\mob\living\carbon\alien\larva\emote.dm"
#include "code\modules\mob\living\carbon\alien\larva\hud.dm"