mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Important!
Minds part2 - Carn loses her mind. The way datum/mind stuff works has been changed a lot. I really can't explain everything. If you have any questions it'd just be easier if you leave a comment or ask me in coderbus. Generally, minds now represent IC characters rather than following a client around constantly. Minds can change owners, mobs, (names WIP). Technical babble: The var/current and var/original variables of the mind datum must always be of type mob/living (or null). Please do not mind.transfer_to(ghost_mob). If you want to ghost somebody use ghostize()! It will do all the technical stuff for you. mob/dead/observer/var/corpse was removed. mob/dead/observer/var/mind is now used as a reference to the last mind the player had (so respawning code has something to reference), but also because mind.current is a far more useful way of tracking a corpse. If somebody triggers a mind.transfer_to() call on your corpse, your mind will be tranfered to another mob/living or something...that will then be considered your corpse. This could allow for more interesting mind_transfers. For instance, the "raise corpse" rune ghostizes any player in the corpse to be raised and selectes a random dead player to take possesion of their character! The person possesing them will have all of their memories, objectives, etc. The poor guy who was originally the owner cannot re-enter body if there is another player in his body...but if that player is ghosted he can once again return. Exorcisms anybody? Changes to cloning and hydroponics. I will likely have to rework these later as they're hacky as hell right now. A lot of stuff is now handled by Login/Logout rather than in hundreds of different places. One such example, mind datums get their variables updated at Login and Logout. Fixed a few minor bugs. I'll update the issues manually in a bit because I literally cannot think atm. TL;DR guide: -If you want to make somebody a ghost use ghostize(). Or you will need to find a doctor to stitch your bits back on. :) -You don't have to worry about making minds. Simply doing key="carnwennan" or whatever will either: A) make a new mind and initialise it if there isn't one or B) take possession of the mind currently attached to the mob. -It's safe to transfer a mind even if a key isn't in-body (e.g. they are ghosted/admin-observing etc!) Minds have an active variable which tracks whether they are currently synced with a key. This is to avoid dragging ghosts back into their bodies when say, a wizard mind_transfers them. -Transferring a mind whilst var/active=1 will cause the following: mob.key = mind.key. So no need to do that separately (in fact you'll lag things if you do, so don't) -If you do want to initialize a mind manually, say if you don't have a client to login to the mob yet, simply do new_mob.mind_initialize(). Simple! When someody is logged into that mob they will take ownership of the mind and it will sync up. NOTE: a lot is probably broken since this is a pretty massive change. Please let me know asap (with actual info! Shouting at me, "IT BORKED HALP", doesn't help) git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4342 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -419,7 +419,8 @@ client
|
|||||||
break
|
break
|
||||||
M.real_name = new_name
|
M.real_name = new_name
|
||||||
M.name = new_name
|
M.name = new_name
|
||||||
M.original_name = new_name
|
if(M.mind)
|
||||||
|
M.mind.name = new_name
|
||||||
href_list["datumrefresh"] = href_list["rename"]
|
href_list["datumrefresh"] = href_list["rename"]
|
||||||
|
|
||||||
else if (href_list["varnameedit"])
|
else if (href_list["varnameedit"])
|
||||||
|
|||||||
@@ -69,26 +69,19 @@
|
|||||||
affected_mob.updatehealth()
|
affected_mob.updatehealth()
|
||||||
if(prob(40))
|
if(prob(40))
|
||||||
if(gibbed != 0) return 0
|
if(gibbed != 0) return 0
|
||||||
var/list/candidates = list() // Picks a random ghost in the world to shove in the larva -- TLE
|
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
|
||||||
for(var/mob/dead/observer/G in player_list)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
if(G.client)
|
if(G.client.be_alien)
|
||||||
if(G.client.be_alien)
|
if(((G.client.inactivity/10)/60) <= 5)
|
||||||
if(((G.client.inactivity/10)/60) <= 5)
|
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||||
if(G.corpse)
|
candidates += G.key
|
||||||
if(G.corpse.stat==DEAD)
|
|
||||||
candidates.Add(G)
|
|
||||||
else
|
|
||||||
candidates.Add(G)
|
|
||||||
|
|
||||||
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
|
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
|
||||||
if(candidates.len)
|
if(candidates.len)
|
||||||
var/mob/dead/observer/G = pick(candidates)
|
new_xeno.key = pick(candidates)
|
||||||
new_xeno.mind_initialize(G,"Larva")
|
|
||||||
new_xeno.key = G.key
|
|
||||||
del(G)
|
|
||||||
else
|
else
|
||||||
if(affected_mob.client)
|
new_xeno.key = affected_mob.key
|
||||||
affected_mob.client.mob = new_xeno
|
|
||||||
new_xeno << sound('hiss5.ogg',0,0,0,100) //To get the player's attention
|
new_xeno << sound('hiss5.ogg',0,0,0,100) //To get the player's attention
|
||||||
affected_mob.gib()
|
affected_mob.gib()
|
||||||
src.cure(0)
|
src.cure(0)
|
||||||
|
|||||||
@@ -642,7 +642,7 @@ var/global/datum/tension/tension_master
|
|||||||
sleep(300)
|
sleep(300)
|
||||||
|
|
||||||
for(var/mob/dead/observer/G in candidates)
|
for(var/mob/dead/observer/G in candidates)
|
||||||
if(!G.client || !G.key)
|
if(!G.key)
|
||||||
candidates.Remove(G)
|
candidates.Remove(G)
|
||||||
|
|
||||||
if(candidates.len)
|
if(candidates.len)
|
||||||
@@ -657,7 +657,6 @@ var/global/datum/tension/tension_master
|
|||||||
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
|
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while((!theghost || !theghost.client) && candidates.len)
|
while((!theghost || !theghost.client) && candidates.len)
|
||||||
theghost = pick(candidates)
|
theghost = pick(candidates)
|
||||||
candidates.Remove(theghost)
|
candidates.Remove(theghost)
|
||||||
@@ -666,7 +665,6 @@ var/global/datum/tension/tension_master
|
|||||||
del(new_syndicate_commando)
|
del(new_syndicate_commando)
|
||||||
break
|
break
|
||||||
|
|
||||||
new_syndicate_commando.mind.key = theghost.key//For mind stuff.
|
|
||||||
new_syndicate_commando.key = theghost.key
|
new_syndicate_commando.key = theghost.key
|
||||||
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
||||||
new_syndicate_commando.internals.icon_state = "internal1"
|
new_syndicate_commando.internals.icon_state = "internal1"
|
||||||
@@ -741,7 +739,6 @@ var/global/datum/tension/tension_master
|
|||||||
del(new_borg_deathsquad)
|
del(new_borg_deathsquad)
|
||||||
break
|
break
|
||||||
|
|
||||||
new_borg_deathsquad.mind.key = theghost.key//For mind stuff.
|
|
||||||
new_borg_deathsquad.key = theghost.key
|
new_borg_deathsquad.key = theghost.key
|
||||||
|
|
||||||
//So they don't forget their code or mission.
|
//So they don't forget their code or mission.
|
||||||
@@ -762,148 +759,26 @@ var/global/datum/tension/tension_master
|
|||||||
return 1 // Has to return one before it knows if there's a wizard to prevent the parent from automatically selecting another game mode.
|
return 1 // Has to return one before it knows if there's a wizard to prevent the parent from automatically selecting another game mode.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character
|
proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character
|
||||||
|
if(!G_found || !G_found.key) return
|
||||||
if(!G_found)
|
|
||||||
return
|
|
||||||
|
|
||||||
//First we spawn a dude.
|
//First we spawn a dude.
|
||||||
var/mob/living/carbon/human/new_character = new(src)//The mob being spawned.
|
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
|
||||||
|
|
||||||
//Second, we check if they are an alien or monkey.
|
new_character.gender = pick(MALE,FEMALE)
|
||||||
G_found.mind=null//Null their mind so we don't screw things up ahead.
|
|
||||||
G_found.real_name="[pick(pick(first_names_male,first_names_female))] [pick(last_names)]"//Give them a random real name.
|
|
||||||
|
|
||||||
new_character.mind = new()
|
|
||||||
ticker.minds += new_character.mind//And we'll add it to the minds database.
|
|
||||||
new_character.mind.original = new_character//If they are respawning with a new character.
|
|
||||||
new_character.mind.assigned_role = "Assistant"//Defaults to assistant.
|
|
||||||
new_character.mind.key = G_found.key//In case it's someone else playing as that character.
|
|
||||||
new_character.mind.current = new_character//So that it can properly reference later if needed.
|
|
||||||
new_character.mind.memory = ""//Memory erased so it doesn't get clunkered up with useless info. This means they may forget their previous mission--this is usually handled through objective code and recalling memory.
|
|
||||||
|
|
||||||
var/datum/data/record/record_found//Referenced to later to either randomize or not randomize the character.
|
|
||||||
if(G_found.mind)//They must have a mind to reference the record. Here we also double check for aliens.
|
|
||||||
var/id = md5("[G_found.real_name][G_found.mind.assigned_role]")
|
|
||||||
for(var/datum/data/record/t in data_core.locked)
|
|
||||||
if(t.fields["id"]==id)
|
|
||||||
record_found = t//We shall now reference the record.
|
|
||||||
break
|
|
||||||
|
|
||||||
//Here we either load their saved appearance or randomize it.
|
|
||||||
var/datum/preferences/A = new()
|
var/datum/preferences/A = new()
|
||||||
if(A.savefile_load(G_found))//If they have a save file. This will automatically load their parameters.
|
A.randomize_appearance_for(new_character)
|
||||||
//Note: savefile appearances are overwritten later on if the character has a data_core entry. By appearance, I mean the physical appearance.
|
if(new_character.gender == MALE)
|
||||||
var/name_safety = G_found.real_name//Their saved parameters may include a random name. Also a safety in case they are playing a character that got their name after round start.
|
new_character.real_name = "[pick(first_names_male)] [pick(last_names)]"
|
||||||
A.copy_to(new_character)
|
|
||||||
new_character.real_name = name_safety
|
|
||||||
new_character.name = name_safety
|
|
||||||
else
|
else
|
||||||
if(record_found)//If they have a record we can determine a few things.
|
new_character.real_name = "[pick(first_names_female)] [pick(last_names)]"
|
||||||
new_character.real_name = record_found.fields["name"]//Not necessary to reference the record but I like to keep things uniform.
|
new_character.name = new_character.real_name
|
||||||
new_character.name = record_found.fields["name"]
|
new_character.age = rand(17,45)
|
||||||
new_character.gender = record_found.fields["sex"]//Sex
|
|
||||||
new_character.age = record_found.fields["age"]//Age
|
|
||||||
new_character.b_type = record_found.fields["b_type"]//Blood type
|
|
||||||
//We will update their appearance when determining DNA.
|
|
||||||
else
|
|
||||||
new_character.gender = FEMALE
|
|
||||||
var/name_safety = G_found.real_name//Default is a random name so we want to save this.
|
|
||||||
A.randomize_appearance_for(new_character)//Now we will randomize their appearance since we have no way of knowing what they look/looked like.
|
|
||||||
new_character.real_name = name_safety
|
|
||||||
new_character.name = name_safety
|
|
||||||
|
|
||||||
//After everything above, it's time to initialize their DNA.
|
new_character.dna.ready_dna(new_character)
|
||||||
if(record_found)//Pull up their name from database records if they did have a mind.
|
new_character.key = G_found.key
|
||||||
new_character.dna = new()//Let's first give them a new DNA.
|
|
||||||
new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity.
|
|
||||||
new_character.dna.struc_enzymes = record_found.fields["enzymes"]//This is the default of enzymes so I think it's safe to go with.
|
|
||||||
new_character.dna.uni_identity = record_found.fields["identity"]//DNA identity is carried over.
|
|
||||||
updateappearance(new_character,new_character.dna.uni_identity)//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch.
|
|
||||||
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
|
|
||||||
new_character.dna.ready_dna(new_character)
|
|
||||||
|
|
||||||
|
|
||||||
var/player_key = G_found.key
|
|
||||||
|
|
||||||
//Here we need to find where to spawn them.
|
|
||||||
var/spawn_here = pick(latejoin)//"JoinLate" is a landmark which is deleted on round start. So, latejoin has to be used instead.
|
|
||||||
new_character.loc = spawn_here
|
|
||||||
//If they need to spawn elsewhere, they will be transferred there momentarily.
|
|
||||||
|
|
||||||
/*
|
|
||||||
The code below functions with the assumption that the mob is already a traitor if they have a special role.
|
|
||||||
So all it does is re-equip the mob with powers and/or items. Or not, if they have no special role.
|
|
||||||
If they don't have a mind, they obviously don't have a special role.
|
|
||||||
*/
|
|
||||||
|
|
||||||
new_character.key = player_key//Throw them into the mob.
|
|
||||||
/*
|
|
||||||
//Now for special roles and equipment.
|
|
||||||
switch(new_character.mind.special_role)
|
|
||||||
if("Changeling")
|
|
||||||
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
|
|
||||||
new_character.make_changeling()
|
|
||||||
if("traitor")
|
|
||||||
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
|
|
||||||
ticker.mode.equip_traitor(new_character)
|
|
||||||
if("Wizard")
|
|
||||||
new_character.loc = pick(wizardstart)
|
|
||||||
//ticker.mode.learn_basic_spells(new_character)
|
|
||||||
ticker.mode.equip_wizard(new_character)
|
|
||||||
if("Syndicate")
|
|
||||||
var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn")
|
|
||||||
if(synd_spawn)
|
|
||||||
new_character.loc = get_turf(synd_spawn)
|
|
||||||
call(/datum/game_mode/proc/equip_syndicate)(new_character)
|
|
||||||
if("Space Ninja")
|
|
||||||
var/ninja_spawn[] = list()
|
|
||||||
for(var/obj/effect/landmark/L in world)
|
|
||||||
if(L.name=="carpspawn")
|
|
||||||
ninja_spawn += L
|
|
||||||
new_character.equip_space_ninja()
|
|
||||||
new_character.internal = new_character.s_store
|
|
||||||
new_character.internals.icon_state = "internal1"
|
|
||||||
if(ninja_spawn.len)
|
|
||||||
var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn)
|
|
||||||
new_character.loc = ninja_spawn_here.loc
|
|
||||||
if("Death Commando")//Leaves them at late-join spawn.
|
|
||||||
new_character.equip_death_commando()
|
|
||||||
new_character.internal = new_character.s_store
|
|
||||||
new_character.internals.icon_state = "internal1"
|
|
||||||
else//They may also be a cyborg or AI.
|
|
||||||
switch(new_character.mind.assigned_role)
|
|
||||||
if("Cyborg")//More rigging to make em' work and check if they're traitor.
|
|
||||||
new_character = new_character.Robotize()
|
|
||||||
if(new_character.mind.special_role=="traitor")
|
|
||||||
call(/datum/game_mode/proc/add_law_zero)(new_character)
|
|
||||||
if("AI")
|
|
||||||
new_character = new_character.AIize()
|
|
||||||
if(new_character.mind.special_role=="traitor")
|
|
||||||
call(/datum/game_mode/proc/add_law_zero)(new_character)
|
|
||||||
//Add aliens.
|
|
||||||
else
|
|
||||||
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them.
|
|
||||||
|
|
||||||
//Announces the character on all the systems, based on the record.
|
|
||||||
if(!issilicon(new_character))//If they are not a cyborg/AI.
|
|
||||||
if(!record_found&&new_character.mind.assigned_role!="MODE")//If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway.
|
|
||||||
//Power to the user!
|
|
||||||
if(alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,"No","Yes")=="Yes")
|
|
||||||
call(/mob/new_player/proc/ManifestLateSpawn)(new_character)
|
|
||||||
|
|
||||||
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
|
|
||||||
call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
|
|
||||||
*/
|
|
||||||
del(G_found)//Don't want to leave ghosts around.
|
|
||||||
return new_character
|
return new_character
|
||||||
|
|
||||||
/proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0)
|
/proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0)
|
||||||
@@ -918,22 +793,20 @@ var/global/datum/tension/tension_master
|
|||||||
A.randomize_appearance_for(new_syndicate_commando)
|
A.randomize_appearance_for(new_syndicate_commando)
|
||||||
|
|
||||||
new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]"
|
new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]"
|
||||||
|
new_syndicate_commando.name = new_syndicate_commando.real_name
|
||||||
new_syndicate_commando.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45)
|
new_syndicate_commando.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45)
|
||||||
|
|
||||||
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
|
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
|
||||||
|
|
||||||
//Creates mind stuff.
|
//Creates mind stuff.
|
||||||
new_syndicate_commando.mind = new
|
new_syndicate_commando.mind_initialize()
|
||||||
new_syndicate_commando.mind.current = new_syndicate_commando
|
|
||||||
new_syndicate_commando.mind.original = new_syndicate_commando
|
|
||||||
new_syndicate_commando.mind.assigned_role = "MODE"
|
new_syndicate_commando.mind.assigned_role = "MODE"
|
||||||
new_syndicate_commando.mind.special_role = "Syndicate Commando"
|
new_syndicate_commando.mind.special_role = "Syndicate Commando"
|
||||||
if(!(new_syndicate_commando.mind in ticker.minds))
|
|
||||||
ticker.minds += new_syndicate_commando.mind//Adds them to regular mind list.
|
//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||||
if(!(new_syndicate_commando.mind in ticker.mode.traitors))//If they weren't already an extra traitor.
|
ticker.mode.traitors += new_syndicate_commando.mind
|
||||||
ticker.mode.traitors += new_syndicate_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
|
||||||
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
|
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
|
||||||
//del(spawn_location) // Commenting this out for multiple commando teams.
|
|
||||||
return new_syndicate_commando
|
return new_syndicate_commando
|
||||||
|
|
||||||
|
|
||||||
@@ -948,15 +821,12 @@ var/global/datum/tension/tension_master
|
|||||||
new_borg_deathsquad.name = name
|
new_borg_deathsquad.name = name
|
||||||
|
|
||||||
//Creates mind stuff.
|
//Creates mind stuff.
|
||||||
new_borg_deathsquad.mind = new
|
new_borg_deathsquad.mind_initialize()
|
||||||
new_borg_deathsquad.mind.current = new_borg_deathsquad
|
|
||||||
new_borg_deathsquad.mind.original = new_borg_deathsquad
|
|
||||||
new_borg_deathsquad.mind.assigned_role = "MODE"
|
new_borg_deathsquad.mind.assigned_role = "MODE"
|
||||||
new_borg_deathsquad.mind.special_role = "Borg Commando"
|
new_borg_deathsquad.mind.special_role = "Borg Commando"
|
||||||
if(!(new_borg_deathsquad.mind in ticker.minds))
|
|
||||||
ticker.minds += new_borg_deathsquad.mind//Adds them to regular mind list.
|
//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||||
if(!(new_borg_deathsquad.mind in ticker.mode.traitors))//If they weren't already an extra traitor.
|
ticker.mode.traitors += new_borg_deathsquad.mind
|
||||||
ticker.mode.traitors += new_borg_deathsquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
|
||||||
//del(spawn_location) // Commenting this out for multiple commando teams.
|
//del(spawn_location) // Commenting this out for multiple commando teams.
|
||||||
return new_borg_deathsquad
|
return new_borg_deathsquad
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,40 @@
|
|||||||
|
/* Note from Carnie:
|
||||||
|
The way datum/mind stuff works has been changed a lot.
|
||||||
|
Minds now represent IC characters rather than following a client around constantly.
|
||||||
|
|
||||||
|
Guidelines for using minds properly:
|
||||||
|
|
||||||
|
- Never mind.transfer_to(ghost). The var/current and var/original of a mind must always be of type mob/living!
|
||||||
|
ghost.mind is however used as a reference to the ghost's corpse
|
||||||
|
|
||||||
|
- When creating a new mob for an existing IC character (e.g. cloning a dead guy or borging a brain of a human)
|
||||||
|
the existing mind of the old mob should be transfered to the new mob like so:
|
||||||
|
|
||||||
|
mind.transfer_to(new_mob)
|
||||||
|
|
||||||
|
- You must not assign key= or ckey= after transfer_to() since the transfer_to transfers the client for you.
|
||||||
|
By setting key or ckey explicitly after transfering the mind with transfer_to you will cause bugs like DCing
|
||||||
|
the player.
|
||||||
|
|
||||||
|
- IMPORTANT NOTE 2, if you want a player to become a ghost, use mob.ghostize() It does all the hard work for you.
|
||||||
|
|
||||||
|
- When creating a new mob which will be a new IC character (e.g. putting a shade in a construct or randomly selecting
|
||||||
|
a ghost to become a xeno during an event). Simply assign the key or ckey like you've always done.
|
||||||
|
|
||||||
|
new_mob.key = key
|
||||||
|
|
||||||
|
The Login proc will handle making a new mob for that mobtype (including setting up stuff like mind.name). Simple!
|
||||||
|
However if you want that mind to have any special properties like being a traitor etc you will have to do that
|
||||||
|
yourself.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
datum/mind
|
datum/mind
|
||||||
var/key
|
var/key
|
||||||
|
var/name //TODO: this will replace mob.original_name
|
||||||
var/mob/living/current
|
var/mob/living/current
|
||||||
var/mob/living/original
|
var/mob/living/original
|
||||||
|
var/active = 0
|
||||||
|
|
||||||
var/memory
|
var/memory
|
||||||
//TODO: store original name --rastaf0
|
//TODO: store original name --rastaf0
|
||||||
@@ -18,14 +51,23 @@ datum/mind
|
|||||||
|
|
||||||
var/datum/faction/faction // associated faction
|
var/datum/faction/faction // associated faction
|
||||||
|
|
||||||
proc/transfer_to(mob/new_character)
|
New(var/key)
|
||||||
if(current)
|
src.key = key
|
||||||
|
|
||||||
|
|
||||||
|
proc/transfer_to(mob/living/new_character)
|
||||||
|
if(!istype(new_character))
|
||||||
|
world.log << "## Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn"
|
||||||
|
if(current) //remove ourself from our old body's mind variable
|
||||||
current.mind = null
|
current.mind = null
|
||||||
|
if(new_character.mind) //remove any mind currently in our new body's mind variable
|
||||||
|
new_character.mind.current = null
|
||||||
|
|
||||||
new_character.mind = src
|
current = new_character //link ourself to our new body
|
||||||
current = new_character
|
new_character.mind = src //and link our new body to ourself
|
||||||
|
|
||||||
new_character.key = key
|
if(active)
|
||||||
|
new_character.key = key //now transfer the key to link the client to our new body
|
||||||
|
|
||||||
proc/store_memory(new_text)
|
proc/store_memory(new_text)
|
||||||
memory += "[new_text]<BR>"
|
memory += "[new_text]<BR>"
|
||||||
@@ -1046,3 +1088,104 @@ datum/mind
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Initialisation procs
|
||||||
|
/mob/living/proc/mind_initialize()
|
||||||
|
if(mind)
|
||||||
|
if(mind.key != key)
|
||||||
|
world.log << "## DEBUG: mind_initialize(): [key] took possession of [mind.key]'s mind"
|
||||||
|
mind.key = key
|
||||||
|
else
|
||||||
|
mind = new /datum/mind(key)
|
||||||
|
mind.original = src
|
||||||
|
if(ticker)
|
||||||
|
ticker.minds += mind
|
||||||
|
else
|
||||||
|
world.log << "## No ticker ready yet! Please inform Carn"
|
||||||
|
mind.name = real_name
|
||||||
|
mind.current = src
|
||||||
|
|
||||||
|
//HUMAN
|
||||||
|
/mob/living/carbon/human/mind_initialize()
|
||||||
|
..()
|
||||||
|
if(!mind.assigned_role) mind.assigned_role = "Assistant" //defualt
|
||||||
|
|
||||||
|
//MONKEY
|
||||||
|
/mob/living/carbon/monkey/mind_initialize()
|
||||||
|
..()
|
||||||
|
|
||||||
|
//METROID
|
||||||
|
/mob/living/carbon/metroid/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Metroid"
|
||||||
|
|
||||||
|
//XENO
|
||||||
|
/mob/living/carbon/alien/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Alien"
|
||||||
|
//XENO HUMANOID
|
||||||
|
/mob/living/carbon/alien/humanoid/queen/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.special_role = "Queen"
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/humanoid/hunter/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.special_role = "Hunter"
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/humanoid/drone/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.special_role = "Drone"
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/humanoid/sentinel/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.special_role = "Sentinel"
|
||||||
|
//XENO LARVA
|
||||||
|
/mob/living/carbon/alien/larva/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.special_role = "Larva"
|
||||||
|
|
||||||
|
//AI
|
||||||
|
/mob/living/silicon/ai/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "AI"
|
||||||
|
|
||||||
|
//BORG
|
||||||
|
/mob/living/silicon/robot/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Cyborg"
|
||||||
|
|
||||||
|
//PAI
|
||||||
|
/mob/living/silicon/pai/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "pAI"
|
||||||
|
mind.special_role = ""
|
||||||
|
|
||||||
|
//Animals
|
||||||
|
/mob/living/simple_animal/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Animal"
|
||||||
|
|
||||||
|
/mob/living/simple_animal/corgi/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Corgi"
|
||||||
|
|
||||||
|
/mob/living/simple_animal/shade/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Shade"
|
||||||
|
|
||||||
|
/mob/living/simple_animal/constructbuilder/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Artificer"
|
||||||
|
mind.special_role = "Cultist"
|
||||||
|
|
||||||
|
/mob/living/simple_animal/constructwraith/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Wraith"
|
||||||
|
mind.special_role = "Cultist"
|
||||||
|
|
||||||
|
/mob/living/simple_animal/constructarmoured/mind_initialize()
|
||||||
|
..()
|
||||||
|
mind.assigned_role = "Juggernaut"
|
||||||
|
mind.special_role = "Cultist"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,13 +41,12 @@ Also, you never added distance checking after target is selected. I've went ahea
|
|||||||
user << "Their mind isn't compatible with yours."
|
user << "Their mind isn't compatible with yours."
|
||||||
return
|
return
|
||||||
|
|
||||||
if(target.stat == 2)
|
if(target.stat == DEAD)
|
||||||
user << "You didn't study necromancy back at the Space Wizard Federation academy."
|
user << "You didn't study necromancy back at the Space Wizard Federation academy."
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!target.client || !target.mind)
|
if(!target.key || !target.mind)
|
||||||
//if(!target.mind)//Good for testing.
|
user << "They appear to be catatonic. Not even magic can affect their vacant mind."
|
||||||
user << "They appear to be brain-dead."
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if(target.mind.special_role in protected_roles)
|
if(target.mind.special_role in protected_roles)
|
||||||
@@ -56,8 +55,6 @@ Also, you never added distance checking after target is selected. I've went ahea
|
|||||||
|
|
||||||
var/mob/victim = target//The target of the spell whos body will be transferred to.
|
var/mob/victim = target//The target of the spell whos body will be transferred to.
|
||||||
var/mob/caster = user//The wizard/whomever doing the body transferring.
|
var/mob/caster = user//The wizard/whomever doing the body transferring.
|
||||||
//To properly transfer clients so no-one gets kicked off the game, we need a host mob.
|
|
||||||
var/mob/dead/observer/temp_ghost = new(victim)
|
|
||||||
|
|
||||||
//SPELL LOSS BEGIN
|
//SPELL LOSS BEGIN
|
||||||
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
|
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
|
||||||
@@ -89,31 +86,25 @@ Also, you never added distance checking after target is selected. I've went ahea
|
|||||||
for(var/V in victim.mind.special_verbs)
|
for(var/V in victim.mind.special_verbs)
|
||||||
victim.verbs -= V
|
victim.verbs -= V
|
||||||
|
|
||||||
temp_ghost.key = victim.key//Throw the victim into the ghost temporarily.
|
var/mob/dead/observer/ghost = victim.ghostize(0)
|
||||||
temp_ghost.mind = victim.mind//Tranfer the victim's mind into the ghost.
|
ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
|
||||||
temp_ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
|
|
||||||
|
|
||||||
victim.key = caster.key//Now we throw the caste into the victim's body.
|
caster.mind.transfer_to(victim)
|
||||||
victim.mind = caster.mind//Do the same for their mind and spell list.
|
|
||||||
victim.spell_list = caster.spell_list//Now they are inside the victim's body.
|
victim.spell_list = caster.spell_list//Now they are inside the victim's body.
|
||||||
|
|
||||||
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
|
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
|
||||||
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
|
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
|
||||||
caster.verbs += V
|
caster.verbs += V
|
||||||
|
|
||||||
caster.key = temp_ghost.key//Tranfer the original victim, now in a ghost, into the caster's body.
|
ghost.mind.transfer_to(caster)
|
||||||
caster.mind = temp_ghost.mind//Along with their mind and spell list.
|
caster.key = ghost.key //have to transfer the key since the mind was not active
|
||||||
caster.spell_list = temp_ghost.spell_list
|
caster.spell_list = ghost.spell_list
|
||||||
|
|
||||||
if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
|
if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
|
||||||
for(var/V in caster.mind.special_verbs)
|
for(var/V in caster.mind.special_verbs)
|
||||||
caster.verbs += V
|
caster.verbs += V
|
||||||
//MIND TRANSFER END
|
//MIND TRANSFER END
|
||||||
|
|
||||||
//Now we update mind current mob so we know what body they are in for end round reporting.
|
|
||||||
caster.mind.current = caster
|
|
||||||
victim.mind.current = victim
|
|
||||||
|
|
||||||
//Here we paralyze both mobs and knock them out for a time.
|
//Here we paralyze both mobs and knock them out for a time.
|
||||||
caster.Paralyse(paralysis_amount_caster)
|
caster.Paralyse(paralysis_amount_caster)
|
||||||
victim.Paralyse(paralysis_amount_victim)
|
victim.Paralyse(paralysis_amount_victim)
|
||||||
@@ -121,5 +112,3 @@ Also, you never added distance checking after target is selected. I've went ahea
|
|||||||
//After a certain amount of time the victim gets a message about being in a different body.
|
//After a certain amount of time the victim gets a message about being in a different body.
|
||||||
spawn(msg_wait)
|
spawn(msg_wait)
|
||||||
caster << "\red You feel woozy and lightheaded. <b>Your body doesn't seem like your own.</b>"
|
caster << "\red You feel woozy and lightheaded. <b>Your body doesn't seem like your own.</b>"
|
||||||
|
|
||||||
del(temp_ghost)
|
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
canmove = 0
|
canmove = 0
|
||||||
blinded = 0
|
blinded = 0
|
||||||
anchored = 1 // don't get pushed around
|
anchored = 1 // don't get pushed around
|
||||||
var/mob/corpse = null // observer mode
|
// var/mob/corpse = null // observer mode //we use mind.current as the 'corpse' now
|
||||||
|
var/can_reenter_corpse
|
||||||
var/datum/hud/living/carbon/hud = null // hud
|
var/datum/hud/living/carbon/hud = null // hud
|
||||||
var/bootime = 0
|
var/bootime = 0
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
/mob/living/carbon/alien/larva
|
/mob/living/carbon/alien/larva
|
||||||
name = "alien larva"
|
name = "alien larva"
|
||||||
|
real_name = "alien larva"
|
||||||
icon_state = "larva"
|
icon_state = "larva"
|
||||||
pass_flags = PASSTABLE
|
pass_flags = PASSTABLE
|
||||||
|
|
||||||
|
|||||||
@@ -297,6 +297,7 @@ proc
|
|||||||
if(T.opacity)
|
if(T.opacity)
|
||||||
return 0
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
#undef SIGN
|
||||||
|
|
||||||
proc/isInSight(var/atom/A, var/atom/B)
|
proc/isInSight(var/atom/A, var/atom/B)
|
||||||
var/turf/Aturf = get_turf(A)
|
var/turf/Aturf = get_turf(A)
|
||||||
|
|||||||
@@ -509,7 +509,7 @@
|
|||||||
O.loc = M.loc
|
O.loc = M.loc
|
||||||
|
|
||||||
if(M.mind)
|
if(M.mind)
|
||||||
M.mind.transfer_to(O)
|
M.mind.transfer_to(O) //transfer our mind to the cute little monkey
|
||||||
|
|
||||||
if (connected) //inside dna thing
|
if (connected) //inside dna thing
|
||||||
var/obj/machinery/dna_scannernew/C = connected
|
var/obj/machinery/dna_scannernew/C = connected
|
||||||
@@ -578,7 +578,7 @@
|
|||||||
O.loc = M.loc
|
O.loc = M.loc
|
||||||
|
|
||||||
if(M.mind)
|
if(M.mind)
|
||||||
M.mind.transfer_to(O)
|
M.mind.transfer_to(O) //transfer our mind to the human
|
||||||
|
|
||||||
if (connected) //inside dna thing
|
if (connected) //inside dna thing
|
||||||
var/obj/machinery/dna_scannernew/C = connected
|
var/obj/machinery/dna_scannernew/C = connected
|
||||||
@@ -696,19 +696,14 @@
|
|||||||
user << "\blue <B>Subject cannot have abiotic items on.</B>"
|
user << "\blue <B>Subject cannot have abiotic items on.</B>"
|
||||||
return
|
return
|
||||||
var/mob/M = G.affecting
|
var/mob/M = G.affecting
|
||||||
if (M.client)
|
if(M.client)
|
||||||
M.client.perspective = EYE_PERSPECTIVE
|
M.client.perspective = EYE_PERSPECTIVE
|
||||||
M.client.eye = src
|
M.client.eye = src
|
||||||
M.loc = src
|
M.loc = src
|
||||||
src.occupant = M
|
src.occupant = M
|
||||||
src.icon_state = "scanner_1"
|
src.icon_state = "scanner_1"
|
||||||
/*
|
|
||||||
for(var/obj/O in src) // this is stupid too
|
|
||||||
O.loc = src.loc
|
|
||||||
//Foreach goto(154)
|
|
||||||
*/
|
|
||||||
src.add_fingerprint(user)
|
src.add_fingerprint(user)
|
||||||
//G = null
|
|
||||||
|
|
||||||
// search for ghosts, if the corpse is empty and the scanner is connected to a cloner
|
// search for ghosts, if the corpse is empty and the scanner is connected to a cloner
|
||||||
if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \
|
if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \
|
||||||
@@ -716,9 +711,9 @@
|
|||||||
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|
||||||
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
|
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
|
||||||
|
|
||||||
if (!M.client)
|
if(!M.client && M.mind)
|
||||||
for(var/mob/dead/observer/ghost in player_list)
|
for(var/mob/dead/observer/ghost in player_list)
|
||||||
if(ghost.corpse == M && ghost.client)
|
if(ghost.mind == M.mind)
|
||||||
ghost << "<b><font color = #330033><font size = 3>Your corpse has been placed into a cloning scanner. Return to your body if you want to be resurrected/cloned!</b> (Verbs -> Ghost -> Re-enter corpse)</font color>"
|
ghost << "<b><font color = #330033><font size = 3>Your corpse has been placed into a cloning scanner. Return to your body if you want to be resurrected/cloned!</b> (Verbs -> Ghost -> Re-enter corpse)</font color>"
|
||||||
break
|
break
|
||||||
del(G)
|
del(G)
|
||||||
|
|||||||
@@ -42,20 +42,14 @@
|
|||||||
var/list/candidates = list()
|
var/list/candidates = list()
|
||||||
for(var/mob/dead/observer/G in player_list)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
if(G.client.be_alien)
|
if(G.client.be_alien)
|
||||||
if(G.corpse)
|
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||||
if(G.corpse.stat==2)
|
candidates += G.key
|
||||||
candidates.Add(G)
|
|
||||||
else
|
|
||||||
candidates.Add(G)
|
|
||||||
|
|
||||||
for(var/i = 0 to wave_size)
|
if(candidates.len)
|
||||||
if(!candidates.len) break
|
for(var/i = 0 to wave_size)
|
||||||
var/mob/dead/observer/G = pick(candidates)
|
var/mob/living/blob/B = new/mob/living/blob(src.loc)
|
||||||
var/mob/living/blob/B = new/mob/living/blob(src.loc)
|
B.key = pick(candidates)
|
||||||
if(G.client)
|
candidates -= B.key
|
||||||
G.client.screen.len = null
|
|
||||||
B.ghost_name = G.real_name
|
|
||||||
B.key = G.key
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
|
Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
|
||||||
|
|||||||
@@ -480,17 +480,12 @@
|
|||||||
for(var/mob/dead/observer/G in player_list)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
candidates += G
|
candidates += G
|
||||||
|
|
||||||
for(var/mob/dead/observer/G in candidates)
|
|
||||||
if(!G.client || !G.key)
|
|
||||||
candidates.Remove(G)
|
|
||||||
|
|
||||||
for(var/obj/structure/stool/bed/chair/C in locate(/area/shuttle/escape/transit))
|
for(var/obj/structure/stool/bed/chair/C in locate(/area/shuttle/escape/transit))
|
||||||
|
|
||||||
var/mob/living/carbon/human/new_commando = create_death_commando(C, 0)
|
var/mob/living/carbon/human/new_commando = create_death_commando(C, 0)
|
||||||
|
|
||||||
if(candidates.len)
|
if(candidates.len)
|
||||||
var/mob/dead/observer/G = pick(candidates)
|
var/mob/dead/observer/G = pick(candidates)
|
||||||
new_commando.mind.key = G.key//For mind stuff.
|
|
||||||
new_commando.key = G.key
|
new_commando.key = G.key
|
||||||
new_commando.internal = new_commando.s_store
|
new_commando.internal = new_commando.s_store
|
||||||
new_commando.internals.icon_state = "internal1"
|
new_commando.internals.icon_state = "internal1"
|
||||||
|
|||||||
@@ -241,32 +241,26 @@
|
|||||||
var/list/vents = list()
|
var/list/vents = list()
|
||||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
||||||
if(temp_vent.loc.z == 1 && !temp_vent.welded)
|
if(temp_vent.loc.z == 1 && !temp_vent.welded)
|
||||||
vents.Add(temp_vent)
|
vents += temp_vent
|
||||||
|
|
||||||
if(prob(10)) spawncount++ //rarely, have two larvae spawn instead of one
|
var/list/candidates = list() //List of candidate KEYs to control the new larvae. ~Carn
|
||||||
while(spawncount >= 1)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
|
if(G.client.be_alien)
|
||||||
|
if(((G.client.inactivity/10)/60) <= 5)
|
||||||
|
if(!(G.mind && G.mind.current && G.mind.current != DEAD))
|
||||||
|
candidates += G.key
|
||||||
|
|
||||||
|
if(prob(33)) spawncount++ //sometimes, have two larvae spawn instead of one
|
||||||
|
while((spawncount >= 1) && vents.len && candidates.len)
|
||||||
var/obj/vent = pick(vents)
|
var/obj/vent = pick(vents)
|
||||||
|
var/candidate = pick(candidates)
|
||||||
|
|
||||||
var/list/candidates = list() // Picks a random ghost in the world to shove in the larva -- TLE; If there's no ghost... well, sucks. Wasted event. -- Urist
|
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
|
||||||
|
new_xeno.key = candidate
|
||||||
|
|
||||||
for(var/mob/dead/observer/G in player_list)
|
candidates -= candidate
|
||||||
if(G.client)
|
vents -= vent
|
||||||
if(G.client.be_alien)
|
spawncount--
|
||||||
if(((G.client.inactivity/10)/60) <= 5)
|
|
||||||
if(G.corpse)
|
|
||||||
if(G.corpse.stat==2)
|
|
||||||
candidates.Add(G)
|
|
||||||
if(!G.corpse)
|
|
||||||
candidates.Add(G)
|
|
||||||
|
|
||||||
if(candidates.len)
|
|
||||||
var/mob/dead/observer/G = pick(candidates)
|
|
||||||
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
|
|
||||||
new_xeno.mind_initialize(G,"Larva")
|
|
||||||
new_xeno.key = G.key
|
|
||||||
|
|
||||||
vents.Remove(vent)
|
|
||||||
spawncount -= 1
|
|
||||||
|
|
||||||
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
|
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
|
||||||
command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
|
command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
|
||||||
|
|||||||
@@ -134,28 +134,25 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
|
|||||||
//Here we pick a location and spawn the ninja.
|
//Here we pick a location and spawn the ninja.
|
||||||
var/list/spawn_list = list()
|
var/list/spawn_list = list()
|
||||||
for(var/obj/effect/landmark/L in world)
|
for(var/obj/effect/landmark/L in world)
|
||||||
if (L.name == "carpspawn")
|
if(L.name == "carpspawn")
|
||||||
spawn_list.Add(L)
|
spawn_list.Add(L)
|
||||||
|
|
||||||
var/mob/dead/observer/G
|
|
||||||
var/list/candidates = list()
|
var/list/candidates = list() //list of candidate keys
|
||||||
for(G in player_list)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
if(((G.client.inactivity/10)/60) <= 5)
|
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
|
||||||
candidates.Add(G)
|
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||||
|
candidates += G.key
|
||||||
|
if(!candidates.len) return
|
||||||
|
|
||||||
|
|
||||||
//The ninja will be created on the right spawn point or at late join.
|
//The ninja will be created on the right spawn point or at late join.
|
||||||
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
||||||
|
new_ninja.key = pick(candidates)
|
||||||
|
new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters.
|
||||||
|
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
|
||||||
|
new_ninja.internals.icon_state = "internal1"
|
||||||
|
|
||||||
if(candidates.len)
|
|
||||||
G = pick(candidates)
|
|
||||||
new_ninja.key = G.key
|
|
||||||
new_ninja.mind.key = new_ninja.key
|
|
||||||
new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters.
|
|
||||||
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
|
|
||||||
new_ninja.internals.icon_state = "internal1"
|
|
||||||
else
|
|
||||||
del(new_ninja)
|
|
||||||
return
|
|
||||||
//Now for the rest of the stuff.
|
//Now for the rest of the stuff.
|
||||||
|
|
||||||
var/datum/mind/ninja_mind = new_ninja.mind//For easier reference.
|
var/datum/mind/ninja_mind = new_ninja.mind//For easier reference.
|
||||||
@@ -437,7 +434,6 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
|||||||
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
||||||
new_ninja.wear_suit:randomize_param()
|
new_ninja.wear_suit:randomize_param()
|
||||||
|
|
||||||
new_ninja.mind.key = G.key
|
|
||||||
new_ninja.key = G.key
|
new_ninja.key = G.key
|
||||||
new_ninja.mind.store_memory("<B>Mission:</B> \red [mission].<br>")
|
new_ninja.mind.store_memory("<B>Mission:</B> \red [mission].<br>")
|
||||||
|
|
||||||
@@ -471,19 +467,12 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
|||||||
return new_ninja
|
return new_ninja
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/create_mind_space_ninja()
|
/mob/living/carbon/human/proc/create_mind_space_ninja()
|
||||||
if(mind)
|
mind_initialize()
|
||||||
mind.assigned_role = "MODE"
|
mind.assigned_role = "MODE"
|
||||||
mind.special_role = "Space Ninja"
|
mind.special_role = "Space Ninja"
|
||||||
else
|
|
||||||
mind = new
|
//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||||
mind.current = src
|
ticker.mode.traitors |= mind
|
||||||
mind.original = src
|
|
||||||
mind.assigned_role = "MODE"
|
|
||||||
mind.special_role = "Space Ninja"
|
|
||||||
if(!(mind in ticker.minds))
|
|
||||||
ticker.minds += mind//Adds them to regular mind list.
|
|
||||||
if(!(mind in ticker.mode.traitors))//If they weren't already an extra traitor.
|
|
||||||
ticker.mode.traitors += mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
|
/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
|
||||||
|
|||||||
@@ -167,18 +167,13 @@
|
|||||||
switch(construct_class)
|
switch(construct_class)
|
||||||
if("Juggernaut")
|
if("Juggernaut")
|
||||||
var/mob/living/simple_animal/constructarmoured/Z = new /mob/living/simple_animal/constructarmoured (get_turf(T.loc))
|
var/mob/living/simple_animal/constructarmoured/Z = new /mob/living/simple_animal/constructarmoured (get_turf(T.loc))
|
||||||
if (A.client)
|
Z.key = A.key
|
||||||
A.client.mob = Z
|
if(iscultist(U))
|
||||||
Z.mind_initialize(Z)
|
if(ticker.mode.name == "cult")
|
||||||
if(iscultist(U))
|
ticker.mode:add_cultist(Z.mind)
|
||||||
if (ticker.mode.name == "cult")
|
else
|
||||||
ticker.mode:add_cultist(Z.mind)
|
ticker.mode.cult+=Z.mind
|
||||||
Z.mind.special_role = "Cultist"
|
ticker.mode.update_cult_icons_added(Z.mind)
|
||||||
ticker.mode.update_cult_icons_added(Z.mind)
|
|
||||||
else
|
|
||||||
ticker.mode.cult+=Z.mind
|
|
||||||
Z.mind.special_role = "Cultist"
|
|
||||||
ticker.mode.update_cult_icons_added(Z.mind)
|
|
||||||
del(T)
|
del(T)
|
||||||
Z << "<B>You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike.</B>"
|
Z << "<B>You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike.</B>"
|
||||||
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
||||||
@@ -188,18 +183,13 @@
|
|||||||
|
|
||||||
if("Wraith")
|
if("Wraith")
|
||||||
var/mob/living/simple_animal/constructwraith/Z = new /mob/living/simple_animal/constructwraith (get_turf(T.loc))
|
var/mob/living/simple_animal/constructwraith/Z = new /mob/living/simple_animal/constructwraith (get_turf(T.loc))
|
||||||
if (A.client)
|
Z.key = A.key
|
||||||
A.client.mob = Z
|
if(iscultist(U))
|
||||||
Z.mind_initialize(Z)
|
if(ticker.mode.name == "cult")
|
||||||
if(iscultist(U))
|
ticker.mode:add_cultist(Z.mind)
|
||||||
if (ticker.mode.name == "cult")
|
else
|
||||||
ticker.mode:add_cultist(Z.mind)
|
ticker.mode.cult+=Z.mind
|
||||||
Z.mind.special_role = "Cultist"
|
ticker.mode.update_cult_icons_added(Z.mind)
|
||||||
ticker.mode.update_cult_icons_added(Z.mind)
|
|
||||||
else
|
|
||||||
ticker.mode.cult+=Z.mind
|
|
||||||
Z.mind.special_role = "Cultist"
|
|
||||||
ticker.mode.update_cult_icons_added(Z.mind)
|
|
||||||
del(T)
|
del(T)
|
||||||
Z << "<B>You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.</B>"
|
Z << "<B>You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.</B>"
|
||||||
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
||||||
@@ -209,18 +199,13 @@
|
|||||||
|
|
||||||
if("Artificer")
|
if("Artificer")
|
||||||
var/mob/living/simple_animal/constructbuilder/Z = new /mob/living/simple_animal/constructbuilder (get_turf(T.loc))
|
var/mob/living/simple_animal/constructbuilder/Z = new /mob/living/simple_animal/constructbuilder (get_turf(T.loc))
|
||||||
if (A.client)
|
Z.key = A.key
|
||||||
A.client.mob = Z
|
if(iscultist(U))
|
||||||
Z.mind_initialize(Z)
|
if(ticker.mode.name == "cult")
|
||||||
if(iscultist(U))
|
ticker.mode:add_cultist(Z.mind)
|
||||||
if (ticker.mode.name == "cult")
|
else
|
||||||
ticker.mode:add_cultist(Z.mind)
|
ticker.mode.cult+=Z.mind
|
||||||
Z.mind.special_role = "Cultist"
|
ticker.mode.update_cult_icons_added(Z.mind)
|
||||||
ticker.mode.update_cult_icons_added(Z.mind)
|
|
||||||
else
|
|
||||||
ticker.mode.cult+=Z.mind
|
|
||||||
Z.mind.special_role = "Cultist"
|
|
||||||
ticker.mode.update_cult_icons_added(Z.mind)
|
|
||||||
del(T)
|
del(T)
|
||||||
Z << "<B>You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs</B>"
|
Z << "<B>You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs</B>"
|
||||||
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
||||||
|
|||||||
@@ -549,21 +549,17 @@
|
|||||||
U.verbs -= V
|
U.verbs -= V
|
||||||
if(H.mind.special_verbs.len)
|
if(H.mind.special_verbs.len)
|
||||||
for(var/V in H.mind.special_verbs)
|
for(var/V in H.mind.special_verbs)
|
||||||
H.verbs -= V
|
H.verbs -= V
|
||||||
|
|
||||||
//empty out H
|
//empty out H
|
||||||
var/mob/dead/observer/G = new /mob/dead/observer(H) //Temp-mob
|
var/mob/dead/observer/G = H.ghostize(0) //Transfers H to a temporary mob
|
||||||
G.key = H.key //Stops H.key getting kicked
|
|
||||||
var/datum/mind/temp_mind = H.mind //ghosts shouldn't hold minds
|
|
||||||
temp_mind.current = null
|
|
||||||
H.mind = null
|
|
||||||
|
|
||||||
|
|
||||||
//Start the Transfer
|
//Start the Transfer
|
||||||
U.mind.transfer_to(H)
|
U.mind.transfer_to(H)
|
||||||
temp_mind.transfer_to(U)
|
G.mind.transfer_to(U)
|
||||||
|
U.key = G.key //has to be called explicitly since ghostize() set the datum/mind/var/active = 0
|
||||||
//Re-add those special verbs and stuff
|
|
||||||
|
//Re-add those special verbs and stuff
|
||||||
if(H.mind.special_verbs.len)
|
if(H.mind.special_verbs.len)
|
||||||
var/spell_loss = 1//Can lose only one spell during transfer.
|
var/spell_loss = 1//Can lose only one spell during transfer.
|
||||||
var/probability = 95 //To determine the chance of wizard losing their spell.
|
var/probability = 95 //To determine the chance of wizard losing their spell.
|
||||||
|
|||||||
@@ -113,13 +113,25 @@
|
|||||||
//Clonepod
|
//Clonepod
|
||||||
|
|
||||||
//Start growing a human clone in the pod!
|
//Start growing a human clone in the pod!
|
||||||
/obj/machinery/clonepod/proc/growclone(mob/ghost as mob, var/clonename, var/ui, var/se, var/mindref, var/mrace, var/UI, var/datum/changeling/changelingClone)
|
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/mrace, var/UI, var/datum/changeling/changelingClone)
|
||||||
if(!(ghost && ghost.client) || src.mess || src.attempting)
|
if(mess || attempting)
|
||||||
return 0
|
return 0
|
||||||
|
var/datum/mind/clonemind = locate(mindref)
|
||||||
|
if(!istype(clonemind,/datum/mind)) //not a mind
|
||||||
|
return 0
|
||||||
|
if( clonemind.current && clonemind.current.stat != DEAD ) //mind is associated with a non-dead body
|
||||||
|
return 0
|
||||||
|
if(clonemind.active) //somebody is using that mind
|
||||||
|
if( ckey(clonemind.key)!=ckey )
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
for(var/mob/dead/observer/G in player_list)
|
||||||
|
if(G.ckey == ckey)
|
||||||
|
if(G.can_reenter_corpse)
|
||||||
|
break
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
|
||||||
var/datum/mind/clonemind = locate(mindref) in ticker.minds
|
|
||||||
if( !(istype(clonemind,/datum/mind) && (!clonemind.current || clonemind.current.stat==DEAD)) )
|
|
||||||
return 0
|
|
||||||
|
|
||||||
src.heal_level = rand(75,100) //Randomizes what health the clone is when ejected
|
src.heal_level = rand(75,100) //Randomizes what health the clone is when ejected
|
||||||
|
|
||||||
@@ -149,9 +161,9 @@
|
|||||||
H.updatehealth()
|
H.updatehealth()
|
||||||
|
|
||||||
clonemind.transfer_to(H)
|
clonemind.transfer_to(H)
|
||||||
|
H.ckey = ckey
|
||||||
H << "<span class='notice'><b>Consciousness slowly creeps over you as your body regenerates.</b><br><i>So this is what cloning feels like. I wonder what happened to the old me... My memories are kinda fuzzy.</i></span>"
|
H << "<span class='notice'><b>Consciousness slowly creeps over you as your body regenerates.</b><br><i>So this is what cloning feels like. I wonder what happened to the old me... My memories are kinda fuzzy.</i></span>"
|
||||||
|
|
||||||
|
|
||||||
// -- Mode/mind specific stuff goes here
|
// -- Mode/mind specific stuff goes here
|
||||||
|
|
||||||
switch(ticker.mode.name)
|
switch(ticker.mode.name)
|
||||||
|
|||||||
@@ -369,16 +369,25 @@
|
|||||||
var/datum/data/record/C = locate(href_list["clone"])
|
var/datum/data/record/C = locate(href_list["clone"])
|
||||||
//Look for that player! They better be dead!
|
//Look for that player! They better be dead!
|
||||||
if(istype(C))
|
if(istype(C))
|
||||||
var/mob/selected = find_dead_player("[C.fields["ckey"]]")
|
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
|
||||||
|
if(!pod1)
|
||||||
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
|
temp = "Error: No Clonepod detected."
|
||||||
if ((!selected) || (!src.pod1) || (src.pod1.occupant) || (src.pod1.mess) || !config.revival_cloning)
|
else if(pod1.occupant)
|
||||||
src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD
|
temp = "Error: Clonepod is currently occupied."
|
||||||
else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"]))
|
else if(pod1.mess)
|
||||||
src.temp = "Cloning cycle activated."
|
temp = "Error: Clonepod malfunction."
|
||||||
src.records.Remove(C)
|
else if(!config.revival_cloning)
|
||||||
|
temp = "Error: Unable to initiate cloning cycle."
|
||||||
|
else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"]))
|
||||||
|
temp = "Initiating cloning cycle..."
|
||||||
|
records.Remove(C)
|
||||||
del(C)
|
del(C)
|
||||||
src.menu = 1
|
menu = 1
|
||||||
|
else
|
||||||
|
temp = "Initiating cloning cycle...<br>Error: Post-initialisation failed. Cloning cycle aborted."
|
||||||
|
|
||||||
|
else
|
||||||
|
temp = "Error: Data corruption."
|
||||||
|
|
||||||
else if (href_list["menu"])
|
else if (href_list["menu"])
|
||||||
src.menu = text2num(href_list["menu"])
|
src.menu = text2num(href_list["menu"])
|
||||||
|
|||||||
@@ -890,7 +890,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
|||||||
else
|
else
|
||||||
podman.real_name = "Pod Person [rand(0,999)]"
|
podman.real_name = "Pod Person [rand(0,999)]"
|
||||||
podman.original_name = podman.real_name
|
podman.original_name = podman.real_name
|
||||||
|
|
||||||
mind.transfer_to(podman)
|
mind.transfer_to(podman)
|
||||||
// -- Mode/mind specific stuff goes here. TODO! Broken :( Should be merged into mob/living/Login
|
// -- Mode/mind specific stuff goes here. TODO! Broken :( Should be merged into mob/living/Login
|
||||||
switch(ticker.mode.name)
|
switch(ticker.mode.name)
|
||||||
|
|||||||
@@ -216,60 +216,53 @@ var/list/sacrificed = list()
|
|||||||
raise()
|
raise()
|
||||||
var/mob/living/carbon/human/corpse_to_raise
|
var/mob/living/carbon/human/corpse_to_raise
|
||||||
var/mob/living/carbon/human/body_to_sacrifice
|
var/mob/living/carbon/human/body_to_sacrifice
|
||||||
var/mob/living/carbon/human/ghost
|
|
||||||
var/unsuitable_corpse_found = 0
|
var/is_sacrifice_target = 0
|
||||||
var/corpse_is_target = 0
|
|
||||||
for(var/mob/living/carbon/human/M in src.loc)
|
for(var/mob/living/carbon/human/M in src.loc)
|
||||||
if (M.stat>=2)
|
if(M.stat == DEAD)
|
||||||
if (M.key)
|
if(ticker.mode.name == "cult" && M.mind == ticker.mode:sacrifice_target)
|
||||||
unsuitable_corpse_found = 1
|
is_sacrifice_target = 1
|
||||||
else if (ticker.mode.name == "cult" && M.mind == ticker.mode:sacrifice_target)
|
|
||||||
corpse_is_target = 1
|
|
||||||
else
|
else
|
||||||
corpse_to_raise = M
|
corpse_to_raise = M
|
||||||
|
if(M.key)
|
||||||
|
M.ghostize(1) //kick them out of their body
|
||||||
break
|
break
|
||||||
if (!corpse_to_raise)
|
if(!corpse_to_raise)
|
||||||
if (unsuitable_corpse_found)
|
if(is_sacrifice_target)
|
||||||
usr << "\red The body still has some earthly ties. It must sever them, if only for them to grow again later."
|
|
||||||
if (corpse_is_target)
|
|
||||||
usr << "\red The Geometer of blood wants this mortal for himself."
|
usr << "\red The Geometer of blood wants this mortal for himself."
|
||||||
return fizzle()
|
return fizzle()
|
||||||
|
|
||||||
|
|
||||||
var/sacrifice_is_target = 0
|
is_sacrifice_target = 0
|
||||||
find_sacrifice:
|
find_sacrifice:
|
||||||
for(var/obj/effect/rune/R in world)
|
for(var/obj/effect/rune/R in world)
|
||||||
if(R.word1==wordblood && R.word2==wordjoin && R.word3==wordhell)
|
if(R.word1==wordblood && R.word2==wordjoin && R.word3==wordhell)
|
||||||
for(var/mob/living/carbon/human/N in R.loc)
|
for(var/mob/living/carbon/human/N in R.loc)
|
||||||
if (ticker.mode.name == "cult" && N.mind && N.mind == ticker.mode:sacrifice_target)
|
if(ticker.mode.name == "cult" && N.mind && N.mind == ticker.mode:sacrifice_target)
|
||||||
sacrifice_is_target = 1
|
is_sacrifice_target = 1
|
||||||
else
|
else
|
||||||
if(N.stat<2)
|
if(N.stat!= DEAD)
|
||||||
body_to_sacrifice = N
|
body_to_sacrifice = N
|
||||||
break find_sacrifice
|
break find_sacrifice
|
||||||
|
|
||||||
if (!body_to_sacrifice)
|
if(!body_to_sacrifice)
|
||||||
if (sacrifice_is_target)
|
if (is_sacrifice_target)
|
||||||
usr << "\red The Geometer of blood wants that corpse for himself."
|
usr << "\red The Geometer of blood wants that corpse for himself."
|
||||||
else
|
else
|
||||||
usr << "\red You need a dead corpse as source of energy to put soul in new body."
|
usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
|
||||||
return fizzle()
|
return fizzle()
|
||||||
|
|
||||||
for(var/mob/dead/observer/O in src.loc)
|
var/mob/dead/observer/ghost
|
||||||
if(!O.client)
|
for(var/mob/dead/observer/O in loc)
|
||||||
continue
|
if(!O.client) continue
|
||||||
|
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||||
ghost = O
|
ghost = O
|
||||||
|
break
|
||||||
|
|
||||||
if (!ghost)
|
if(!ghost)
|
||||||
usr << "\red You do not feel an ethernal immaterial soul here."
|
usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
|
||||||
return fizzle()
|
return fizzle()
|
||||||
|
|
||||||
// rejuvenatedheal(M)
|
|
||||||
corpse_to_raise.mind = new//Mind initialize stuff.
|
|
||||||
corpse_to_raise.mind.current = corpse_to_raise
|
|
||||||
corpse_to_raise.mind.original = corpse_to_raise
|
|
||||||
corpse_to_raise.mind.key = ghost.key
|
|
||||||
corpse_to_raise.key = ghost.key
|
|
||||||
for(var/datum/organ/external/affecting in corpse_to_raise.organs)
|
for(var/datum/organ/external/affecting in corpse_to_raise.organs)
|
||||||
affecting.heal_damage(1000, 1000)
|
affecting.heal_damage(1000, 1000)
|
||||||
corpse_to_raise.setToxLoss(0)
|
corpse_to_raise.setToxLoss(0)
|
||||||
@@ -278,15 +271,16 @@ var/list/sacrificed = list()
|
|||||||
corpse_to_raise.SetStunned(0)
|
corpse_to_raise.SetStunned(0)
|
||||||
corpse_to_raise.SetWeakened(0)
|
corpse_to_raise.SetWeakened(0)
|
||||||
corpse_to_raise.radiation = 0
|
corpse_to_raise.radiation = 0
|
||||||
corpse_to_raise.buckled = null
|
// corpse_to_raise.buckled = null
|
||||||
if (corpse_to_raise.handcuffed)
|
// if(corpse_to_raise.handcuffed)
|
||||||
del(corpse_to_raise.handcuffed)
|
// del(corpse_to_raise.handcuffed)
|
||||||
corpse_to_raise.update_inv_handcuffed(0)
|
// corpse_to_raise.update_inv_handcuffed(0)
|
||||||
corpse_to_raise.stat=0
|
corpse_to_raise.stat = CONSCIOUS
|
||||||
corpse_to_raise.updatehealth()
|
corpse_to_raise.updatehealth()
|
||||||
corpse_to_raise.UpdateDamageIcon()
|
corpse_to_raise.UpdateDamageIcon()
|
||||||
|
|
||||||
|
corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
|
||||||
|
//This means, should that player leave the body, the original may re-enter
|
||||||
usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
|
usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
|
||||||
corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
|
corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
|
||||||
"\red Life... I'm alive again...", \
|
"\red Life... I'm alive again...", \
|
||||||
@@ -295,10 +289,12 @@ var/list/sacrificed = list()
|
|||||||
"\red You feel as your blood boils, tearing you apart.", \
|
"\red You feel as your blood boils, tearing you apart.", \
|
||||||
"\red You hear a thousand voices, all crying in pain.")
|
"\red You hear a thousand voices, all crying in pain.")
|
||||||
body_to_sacrifice.gib()
|
body_to_sacrifice.gib()
|
||||||
if (ticker.mode.name == "cult")
|
|
||||||
ticker.mode:add_cultist(body_to_sacrifice.mind)
|
// if(ticker.mode.name == "cult")
|
||||||
else
|
// ticker.mode:add_cultist(corpse_to_raise.mind)
|
||||||
ticker.mode.cult+=body_to_sacrifice.mind
|
// else
|
||||||
|
// ticker.mode.cult |= corpse_to_raise.mind
|
||||||
|
|
||||||
corpse_to_raise << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
corpse_to_raise << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||||
corpse_to_raise << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
corpse_to_raise << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||||
return
|
return
|
||||||
@@ -344,14 +340,15 @@ var/list/sacrificed = list()
|
|||||||
usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
|
usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
|
||||||
"\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
|
"\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
|
||||||
"\red You hear only complete silence for a moment.")
|
"\red You hear only complete silence for a moment.")
|
||||||
usr.ghostize()
|
usr.ghostize(1)
|
||||||
for(L.ajourn=1,L.ajourn)
|
L.ajourn = 1
|
||||||
sleep(10)
|
while(L)
|
||||||
if(L.key)
|
if(L.key)
|
||||||
L.ajourn=0
|
L.ajourn=0
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
L.take_organ_damage(1, 0)
|
L.take_organ_damage(10, 0)
|
||||||
|
sleep(100)
|
||||||
return fizzle()
|
return fizzle()
|
||||||
|
|
||||||
|
|
||||||
@@ -366,8 +363,8 @@ var/list/sacrificed = list()
|
|||||||
return this_rune.fizzle()
|
return this_rune.fizzle()
|
||||||
var/mob/dead/observer/ghost
|
var/mob/dead/observer/ghost
|
||||||
for(var/mob/dead/observer/O in this_rune.loc)
|
for(var/mob/dead/observer/O in this_rune.loc)
|
||||||
if (!O.client)
|
if(!O.client) continue
|
||||||
continue
|
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||||
ghost = O
|
ghost = O
|
||||||
break
|
break
|
||||||
if(!ghost)
|
if(!ghost)
|
||||||
@@ -380,38 +377,30 @@ var/list/sacrificed = list()
|
|||||||
"\red You hear liquid flowing.")
|
"\red You hear liquid flowing.")
|
||||||
D.real_name = "Unknown"
|
D.real_name = "Unknown"
|
||||||
for(var/obj/item/weapon/paper/P in this_rune.loc)
|
for(var/obj/item/weapon/paper/P in this_rune.loc)
|
||||||
/*
|
|
||||||
if(length(P.info)<=24)
|
|
||||||
D.real_name = P.info
|
|
||||||
break
|
|
||||||
*/
|
|
||||||
if(length(P.name)<=24)
|
if(length(P.name)<=24)
|
||||||
D.real_name = P.name
|
D.real_name = P.name
|
||||||
break
|
break
|
||||||
D.universal_speak = 1
|
D.universal_speak = 1
|
||||||
D.nodamage = 0
|
D.nodamage = 0
|
||||||
D.mind = new//Mind initialize stuff.
|
|
||||||
D.mind.current = D
|
|
||||||
D.mind.original = D
|
|
||||||
D.mind.key = ghost.key
|
|
||||||
D.key = ghost.key
|
D.key = ghost.key
|
||||||
ghost.invisibility = 101
|
|
||||||
if (ticker.mode.name == "cult")
|
if(ticker.mode.name == "cult")
|
||||||
ticker.mode:add_cultist(D.mind)
|
ticker.mode:add_cultist(D.mind)
|
||||||
else
|
else
|
||||||
ticker.mode.cult+=D.mind
|
ticker.mode.cult+=D.mind
|
||||||
|
|
||||||
D << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
D << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||||
D << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
D << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||||
|
|
||||||
var/mob/living/user = usr
|
var/mob/living/user = usr
|
||||||
while(this_rune && user && user.stat==0 && user.client && user.loc==this_rune.loc)
|
while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
|
||||||
user.take_organ_damage(1, 0)
|
user.take_organ_damage(1, 0)
|
||||||
sleep(30)
|
sleep(30)
|
||||||
if(D)
|
if(D)
|
||||||
D.visible_message("\red [D] slowly dissipates into dust and bones.", \
|
D.visible_message("\red [D] slowly dissipates into dust and bones.", \
|
||||||
"\red You feel pain, as bonds formed between your soul and this homunculus break.", \
|
"\red You feel pain, as bonds formed between your soul and this homunculus break.", \
|
||||||
"\red You hear faint rustle.")
|
"\red You hear faint rustle.")
|
||||||
ghost.invisibility = INVISIBILITY_OBSERVER
|
|
||||||
ghost.key = D.key
|
|
||||||
D.dust()
|
D.dust()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -77,17 +77,16 @@
|
|||||||
if(L && L.implanted)
|
if(L && L.implanted)
|
||||||
revsafe = 1
|
revsafe = 1
|
||||||
break
|
break
|
||||||
M:update_mind() //give them a mind datum if they don't have one. won't work if they are logged out/ghosted or something.
|
M.mind_initialize() //give them a mind datum if they don't have one.
|
||||||
if(M.mind)
|
if(M.mind.has_been_rev)
|
||||||
if(M.mind.has_been_rev)
|
revsafe = 2
|
||||||
revsafe = 2
|
if(!revsafe)
|
||||||
if(!revsafe)
|
M.mind.has_been_rev = 1
|
||||||
M.mind.has_been_rev = 1
|
ticker.mode.add_revolutionary(M.mind)
|
||||||
ticker.mode.add_revolutionary(M.mind)
|
else if(revsafe == 1)
|
||||||
else if(revsafe == 1)
|
user << "<span class='warning'>Something seems to be blocking the flash!</span>"
|
||||||
user << "<span class='warning'>Something seems to be blocking the flash!</span>"
|
else
|
||||||
else
|
user << "<span class='warning'>This mind seems resistant to the flash!</span>"
|
||||||
user << "<span class='warning'>This mind seems resistant to the flash!</span>"
|
|
||||||
user << "<span class='warning'>This mind is so vacant that it is not susceptible to influence!</span>"
|
user << "<span class='warning'>This mind is so vacant that it is not susceptible to influence!</span>"
|
||||||
else
|
else
|
||||||
flashfail = 1
|
flashfail = 1
|
||||||
|
|||||||
@@ -167,10 +167,11 @@
|
|||||||
return
|
return
|
||||||
if(!M.brainmob.key)
|
if(!M.brainmob.key)
|
||||||
var/ghost_can_reenter = 0
|
var/ghost_can_reenter = 0
|
||||||
for(var/mob/dead/observer/G in dead_mob_list)
|
if(M.brainmob.mind)
|
||||||
if(G.corpse == M.brainmob)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
ghost_can_reenter = 1
|
if(G.can_reenter_corpse && G.mind == M.brainmob.mind)
|
||||||
break
|
ghost_can_reenter = 1
|
||||||
|
break
|
||||||
if(!ghost_can_reenter)
|
if(!ghost_can_reenter)
|
||||||
user << "<span class='notice'>The mmi indicates that their mind is completely unresponsive; there's no point.</span>"
|
user << "<span class='notice'>The mmi indicates that their mind is completely unresponsive; there's no point.</span>"
|
||||||
return
|
return
|
||||||
@@ -198,13 +199,9 @@
|
|||||||
|
|
||||||
M.brainmob.mind.transfer_to(O)
|
M.brainmob.mind.transfer_to(O)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(O.mind && O.mind.special_role)
|
if(O.mind && O.mind.special_role)
|
||||||
O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
|
O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
|
||||||
|
|
||||||
|
|
||||||
O.job = "Cyborg"
|
O.job = "Cyborg"
|
||||||
|
|
||||||
O.cell = chest.cell
|
O.cell = chest.cell
|
||||||
|
|||||||
@@ -49,16 +49,16 @@
|
|||||||
|
|
||||||
|
|
||||||
/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
|
/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
|
||||||
if(!R.key)
|
|
||||||
for(var/mob/dead/observer/ghost in player_list)
|
|
||||||
if(ghost.corpse == R)
|
|
||||||
ghost.client.mob = ghost.corpse
|
|
||||||
|
|
||||||
if(R.health < 0)
|
if(R.health < 0)
|
||||||
usr << "You have to repair the borg before using this module!"
|
usr << "You have to repair the borg before using this module!"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
R.stat = 0
|
if(!R.key)
|
||||||
|
for(var/mob/dead/observer/ghost in player_list)
|
||||||
|
if(ghost.mind && ghost.mind.current == R)
|
||||||
|
R.key = ghost.key
|
||||||
|
|
||||||
|
R.stat = CONSCIOUS
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -246,34 +246,28 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
|
|||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
// Picks a random ghost for the role if none is specified. Mostly a copy of alien burst code.
|
var/selected_key
|
||||||
var/candidates_list[] = list()
|
if(G && G.key)
|
||||||
if(G)//If G exists through a passed argument.
|
selected_key = G.key
|
||||||
candidates_list += G.client
|
else
|
||||||
else//Else we need to find them.
|
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
|
||||||
for(G in player_list)
|
for(G in player_list)
|
||||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
|
if(G.client.be_alien)
|
||||||
candidates_list += G.client//We want their client, not their ghost.
|
if(((G.client.inactivity/10)/60) <= 5)
|
||||||
if(candidates_list.len)//If there are people to spawn.
|
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||||
if(!G)//If G was not passed through an argument.
|
candidates += G.key
|
||||||
var/client/G_client = input("Pick the client you want to respawn as a xeno.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
|
if(candidates.len)
|
||||||
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
|
selected_key = input("Pick the client you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates
|
||||||
G = G_client.mob
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
|
|
||||||
if(G)//If G exists.
|
|
||||||
message_admins("\blue [key_name_admin(usr)] has spawned [G.key] as a filthy xeno.", 1)
|
|
||||||
new_xeno.mind_initialize(G, alien_caste)
|
|
||||||
new_xeno.key = G.key
|
|
||||||
else//We won't be reporting duds.
|
|
||||||
del(new_xeno)
|
|
||||||
|
|
||||||
|
if(selected_key)
|
||||||
|
new_xeno.key = selected_key
|
||||||
|
message_admins("\blue [key_name_admin(usr)] has spawned [selected_key] as a filthy xeno.", 1)
|
||||||
return 1
|
return 1
|
||||||
|
else
|
||||||
alert("There are no available ghosts to throw into the xeno. Aborting command.")
|
//we couldn't find a candidate
|
||||||
del(new_xeno)
|
usr << "<font color='red'>Error: create_xeno(): no suitable players.</font>"
|
||||||
return 0
|
del(new_xeno)
|
||||||
|
return 0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If a guy was gibbed and you want to revive him, this is a good way to do so.
|
If a guy was gibbed and you want to revive him, this is a good way to do so.
|
||||||
@@ -287,130 +281,96 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
|||||||
if(!holder)
|
if(!holder)
|
||||||
src << "Only administrators may use this command."
|
src << "Only administrators may use this command."
|
||||||
return
|
return
|
||||||
var/input = input(src, "Please specify which key will be respawned.", "Key", "")
|
var/input = ckey(input(src, "Please specify which key will be respawned.", "Key", ""))
|
||||||
if(!input)
|
if(!input)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/mob/dead/observer/G_found
|
var/mob/dead/observer/G_found
|
||||||
for(var/mob/dead/observer/G in player_list)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
if(G.client&&G.ckey==ckey(input))
|
if(G.ckey == input)
|
||||||
G_found = G
|
G_found = G
|
||||||
break
|
break
|
||||||
|
|
||||||
if(!G_found)//If a ghost was not found.
|
if(!G_found)//If a ghost was not found.
|
||||||
alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
|
usr << "<font color='red'>There is no active key like that in the game or the person is not currently a ghost.</font>"
|
||||||
return
|
return
|
||||||
|
|
||||||
//First we spawn a dude.
|
if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
|
||||||
var/mob/living/carbon/human/new_character = new(src)//The mob being spawned.
|
//Check if they were an alien
|
||||||
|
if(G_found.mind.assigned_role=="Alien")
|
||||||
|
if(alert("This character appears to have been an alien. Would you like to respawn them as such?",,"Yes","No")=="Yes")
|
||||||
|
var/turf/T
|
||||||
|
if(xeno_spawn.len) T = pick(xeno_spawn)
|
||||||
|
else T = pick(latejoin)
|
||||||
|
|
||||||
//Second, we check if they are an alien or monkey.
|
var/mob/living/carbon/alien/new_xeno
|
||||||
var/adj_name = copytext(G_found.real_name,1,7)//What is their name?
|
switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were.
|
||||||
if(G_found.mind&&G_found.mind.special_role=="Alien")//If they have a mind, are they an alien?
|
if("Hunter") new_xeno = new /mob/living/carbon/alien/humanoid/hunter(T)
|
||||||
adj_name="alien "
|
if("Sentinel") new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(T)
|
||||||
if( adj_name==("alien "||"monkey"))
|
if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(T)
|
||||||
if(alert("This character appears to either be an an alien or monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")//If you do.
|
if("Queen") new_xeno = new /mob/living/carbon/alien/humanoid/queen(T)
|
||||||
switch(adj_name)//Let's check based on adjusted name.
|
else//If we don't know what special role they have, for whatever reason, or they're a larva.
|
||||||
if("monkey")//A monkey. Monkeys don't have a mind, so we can safely spawn them here if needed.
|
create_xeno(G_found)
|
||||||
//TO DO: Monkeys may have a mind now. May need retooling.
|
|
||||||
var/mob/living/carbon/monkey/M = new(pick(latejoin))//Spawn a monkey at latejoin.
|
|
||||||
M.mind = G_found.mind
|
|
||||||
if(M.mind)//If the mind is not null.
|
|
||||||
M.mind.current = M
|
|
||||||
M.key = G_found.key//They are now a monkey. Nothing else needs doing.
|
|
||||||
if("alien ")//An alien. Aliens can have a mind which can be used to determine a few things.
|
|
||||||
if(G_found.mind)
|
|
||||||
var/turf/location = xeno_spawn.len ? pick(xeno_spawn) : pick(latejoin)//Location where they will be spawned.
|
|
||||||
var/mob/living/carbon/alien/new_xeno//Null alien mob first.
|
|
||||||
switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were.
|
|
||||||
if("Hunter")
|
|
||||||
new_xeno = new/mob/living/carbon/alien/humanoid/hunter(location)
|
|
||||||
if("Sentinel")
|
|
||||||
new_xeno = new/mob/living/carbon/alien/humanoid/sentinel(location)
|
|
||||||
if("Drone")
|
|
||||||
new_xeno = new/mob/living/carbon/alien/humanoid/drone(location)
|
|
||||||
if("Queen")
|
|
||||||
new_xeno = new/mob/living/carbon/alien/humanoid/queen(location)
|
|
||||||
else//If we don't know what special role they have, for whatever reason, or they're a larva.
|
|
||||||
create_xeno(G_found)
|
|
||||||
return
|
|
||||||
//Now to give them a new mind.
|
|
||||||
new_xeno.mind = new
|
|
||||||
new_xeno.mind.assigned_role = "Alien"
|
|
||||||
new_xeno.mind.special_role = G_found.mind.special_role
|
|
||||||
new_xeno.mind.key = G_found.key
|
|
||||||
new_xeno.mind.current = new_xeno
|
|
||||||
new_xeno.key = G_found.key
|
|
||||||
new_xeno << "You have been fully respawned. Enjoy the game."
|
|
||||||
message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1)
|
|
||||||
//And we're done. Announcing other stuff is handled by spawn_xeno.
|
|
||||||
else
|
|
||||||
create_xeno(G_found)//Else we default to the standard command for spawning a xenomorph.
|
|
||||||
return
|
return
|
||||||
del(G_found)
|
|
||||||
return
|
|
||||||
//Monkeys aren't terribly important so we won't be announcing them. The proc basically ends here.
|
|
||||||
else//Or not.
|
|
||||||
G_found.mind=null//Null their mind so we don't screw things up ahead.
|
|
||||||
G_found.real_name="[pick(pick(first_names_male,first_names_female))] [pick(last_names)]"//Give them a random real name.
|
|
||||||
|
|
||||||
/*Third, we try and locate a record for the person being respawned through data_core.
|
//Now to give them their mind back.
|
||||||
This isn't an exact science but it does the trick more often than not.*/
|
G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use
|
||||||
var/datum/data/record/record_found//Referenced to later to either randomize or not randomize the character.
|
new_xeno.key = G_found.key
|
||||||
if(G_found.mind)//They must have a mind to reference the record. Here we also double check for aliens.
|
new_xeno << "You have been fully respawned. Enjoy the game."
|
||||||
|
message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1)
|
||||||
|
return //all done. The ghost is auto-deleted
|
||||||
|
|
||||||
|
//check if they were a monkey
|
||||||
|
else if(findtext(G_found.real_name,"monkey"))
|
||||||
|
if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")
|
||||||
|
var/mob/living/carbon/monkey/new_monkey = new(pick(latejoin))
|
||||||
|
G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
|
||||||
|
new_monkey.key = G_found.key
|
||||||
|
new_monkey << "You have been fully respawned. Enjoy the game."
|
||||||
|
message_admins("\blue [key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1)
|
||||||
|
return //all done. The ghost is auto-deleted
|
||||||
|
|
||||||
|
|
||||||
|
//Ok, it's not a xeno or a monkey. So, spawn a human.
|
||||||
|
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
|
||||||
|
|
||||||
|
var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character.
|
||||||
|
if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
|
||||||
|
/*Try and locate a record for the person being respawned through data_core.
|
||||||
|
This isn't an exact science but it does the trick more often than not.*/
|
||||||
var/id = md5("[G_found.real_name][G_found.mind.assigned_role]")
|
var/id = md5("[G_found.real_name][G_found.mind.assigned_role]")
|
||||||
for(var/datum/data/record/t in data_core.locked)
|
for(var/datum/data/record/t in data_core.locked)
|
||||||
if(t.fields["id"]==id)
|
if(t.fields["id"]==id)
|
||||||
record_found = t//We shall now reference the record.
|
record_found = t//We shall now reference the record.
|
||||||
break
|
break
|
||||||
|
|
||||||
//Now we do some mind locating to see how to set up the rest of the character.
|
if(record_found)//If they have a record we can determine a few things.
|
||||||
if(G_found.mind)//If they had a previous mind.
|
new_character.real_name = record_found.fields["name"]
|
||||||
new_character.mind = G_found.mind
|
new_character.gender = record_found.fields["sex"]
|
||||||
new_character.mind.special_verbs = list()//New list because they will receive them again.
|
new_character.age = record_found.fields["age"]
|
||||||
|
new_character.b_type = record_found.fields["b_type"]
|
||||||
else
|
else
|
||||||
new_character.mind = new()
|
new_character.gender = pick(MALE,FEMALE)
|
||||||
ticker.minds += new_character.mind//And we'll add it to the minds database.
|
var/datum/preferences/A = new()
|
||||||
new_character.mind.original = new_character//If they are respawning with a new character.
|
A.randomize_appearance_for(new_character)
|
||||||
if(!record_found)//We have to pick their role if they have no record.
|
new_character.real_name = G_found.real_name
|
||||||
if(G_found.mind&&G_found.mind.assigned_role)//But they may have an assigned role already.
|
|
||||||
new_character.mind.assigned_role = G_found.mind.assigned_role//Also makes sure our MODE people are equipped right later on.
|
|
||||||
else
|
|
||||||
var/assigned_role = input("Please specify which job the character will be respawned as.", "Assigned role") as null|anything in get_all_jobs()
|
|
||||||
if(!assigned_role) new_character.mind.assigned_role = "Assistant"//Defaults to assistant.
|
|
||||||
else new_character.mind.assigned_role = assigned_role
|
|
||||||
|
|
||||||
|
if(!new_character.real_name)
|
||||||
|
if(new_character.gender == MALE)
|
||||||
|
new_character.real_name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||||
|
else
|
||||||
|
new_character.real_name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
||||||
|
new_character.name = new_character.real_name
|
||||||
|
new_character.original_name = new_character.real_name
|
||||||
|
|
||||||
|
if(G_found.mind && !G_found.mind.active)
|
||||||
|
G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use
|
||||||
|
new_character.mind.special_verbs = list()
|
||||||
|
else
|
||||||
|
new_character.mind_initialize()
|
||||||
if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
|
if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
|
||||||
new_character.mind.key = G_found.key//In case it's someone else playing as that character.
|
|
||||||
new_character.mind.current = new_character//So that it can properly reference later if needed.
|
|
||||||
new_character.mind.memory = ""//Memory erased so it doesn't get clunkered up with useless info. This means they may forget their previous mission--this is usually handled through objective code and recalling memory.
|
|
||||||
|
|
||||||
//Here we either load their saved appearance or randomize it.
|
//DNA
|
||||||
var/datum/preferences/A = new()
|
|
||||||
if(A.savefile_load(G_found))//If they have a save file. This will automatically load their parameters.
|
|
||||||
//Note: savefile appearances are overwritten later on if the character has a data_core entry. By appearance, I mean the physical appearance.
|
|
||||||
var/name_safety = G_found.real_name//Their saved parameters may include a random name. Also a safety in case they are playing a character that got their name after round start.
|
|
||||||
A.copy_to(new_character)
|
|
||||||
new_character.real_name = name_safety
|
|
||||||
new_character.name = name_safety
|
|
||||||
else
|
|
||||||
if(record_found)//If they have a record we can determine a few things.
|
|
||||||
new_character.real_name = record_found.fields["name"]//Not necessary to reference the record but I like to keep things uniform.
|
|
||||||
new_character.name = record_found.fields["name"]
|
|
||||||
new_character.gender = record_found.fields["sex"]//Sex
|
|
||||||
new_character.age = record_found.fields["age"]//Age
|
|
||||||
new_character.b_type = record_found.fields["b_type"]//Blood type
|
|
||||||
//We will update their appearance when determining DNA.
|
|
||||||
else
|
|
||||||
new_character.gender = MALE
|
|
||||||
if(alert("Save file not detected. Record data not detected. Please specify [G_found.real_name]'s gender.",,"Male","Female")=="Female")
|
|
||||||
new_character.gender = FEMALE
|
|
||||||
var/name_safety = G_found.real_name//Default is a random name so we want to save this.
|
|
||||||
A.randomize_appearance_for(new_character)//Now we will randomize their appearance since we have no way of knowing what they look/looked like.
|
|
||||||
new_character.real_name = name_safety
|
|
||||||
new_character.name = name_safety
|
|
||||||
|
|
||||||
//After everything above, it's time to initialize their DNA.
|
|
||||||
if(record_found)//Pull up their name from database records if they did have a mind.
|
if(record_found)//Pull up their name from database records if they did have a mind.
|
||||||
new_character.dna = new()//Let's first give them a new DNA.
|
new_character.dna = new()//Let's first give them a new DNA.
|
||||||
new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity.
|
new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity.
|
||||||
@@ -420,10 +380,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
|||||||
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
|
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
|
||||||
new_character.dna.ready_dna(new_character)
|
new_character.dna.ready_dna(new_character)
|
||||||
|
|
||||||
//Here we need to find where to spawn them.
|
new_character.key = G_found.key
|
||||||
var/spawn_here = pick(latejoin)//"JoinLate" is a landmark which is deleted on round start. So, latejoin has to be used instead.
|
|
||||||
new_character.loc = spawn_here
|
|
||||||
//If they need to spawn elsewhere, they will be transferred there momentarily.
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The code below functions with the assumption that the mob is already a traitor if they have a special role.
|
The code below functions with the assumption that the mob is already a traitor if they have a special role.
|
||||||
@@ -435,8 +392,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
|||||||
var/admin = key_name_admin(src)
|
var/admin = key_name_admin(src)
|
||||||
var/player_key = G_found.key
|
var/player_key = G_found.key
|
||||||
|
|
||||||
new_character.key = player_key//Throw them into the mob.
|
|
||||||
|
|
||||||
//Now for special roles and equipment.
|
//Now for special roles and equipment.
|
||||||
switch(new_character.mind.special_role)
|
switch(new_character.mind.special_role)
|
||||||
if("Changeling")
|
if("Changeling")
|
||||||
@@ -497,7 +452,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
|||||||
|
|
||||||
new_character << "You have been fully respawned. Enjoy the game."
|
new_character << "You have been fully respawned. Enjoy the game."
|
||||||
|
|
||||||
del(G_found)//Don't want to leave ghosts around.
|
|
||||||
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||||
return new_character
|
return new_character
|
||||||
|
|
||||||
|
|||||||
@@ -51,32 +51,28 @@ var/global/sent_strike_team = 0
|
|||||||
break
|
break
|
||||||
|
|
||||||
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
|
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
|
||||||
var/mob/dead/observer/G//Basic variable to search for later.
|
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
|
||||||
var/candidates_list[] = list()//candidates for being a commando out of all the active ghosts in world.
|
var/list/commandos = list() //actual commando ghosts as picked by the user.
|
||||||
var/commandos_list[] = list()//actual commando ghosts as picked by the user.
|
for(var/mob/dead/observer/G in player_list)
|
||||||
for(G in dead_mob_list)
|
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
|
||||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
|
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||||
// if(((G.client.inactivity/10)/60) <= 5) //Removing it allows even the caller to jump in. Good for testing.
|
candidates += G.key
|
||||||
candidates_list += G//Add their client to list.
|
for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected.
|
||||||
for(var/i=commandos_possible,(i>0&&candidates_list.len),i--)//Decrease with every commando selected.
|
var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
|
||||||
var/client/G_client = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
|
candidates -= candidate //Subtract from candidates.
|
||||||
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
|
commandos += candidate//Add their ghost to commandos.
|
||||||
candidates_list -= G_client//Subtract from candidates.
|
|
||||||
commandos_list += G_client.mob//Add their ghost to commandos.
|
|
||||||
|
|
||||||
//Spawns commandos and equips them.
|
//Spawns commandos and equips them.
|
||||||
for (var/obj/effect/landmark/L in world)
|
for(var/obj/effect/landmark/L in world)
|
||||||
if(commando_number<=0) break
|
if(commando_number<=0) break
|
||||||
if (L.name == "Commando")
|
if (L.name == "Commando")
|
||||||
leader_selected = commando_number == 1?1:0
|
leader_selected = commando_number == 1?1:0
|
||||||
|
|
||||||
var/mob/living/carbon/human/new_commando = create_death_commando(L, leader_selected)
|
var/mob/living/carbon/human/new_commando = create_death_commando(L, leader_selected)
|
||||||
|
|
||||||
if(commandos_list.len)
|
if(commandos.len)
|
||||||
G = pick(commandos_list)
|
new_commando.key = pick(commandos)
|
||||||
commandos_list -= G
|
commandos -= new_commando.key
|
||||||
new_commando.mind.key = G.key//For mind stuff.
|
|
||||||
new_commando.key = G.key
|
|
||||||
new_commando.internal = new_commando.s_store
|
new_commando.internal = new_commando.s_store
|
||||||
new_commando.internals.icon_state = "internal1"
|
new_commando.internals.icon_state = "internal1"
|
||||||
|
|
||||||
@@ -123,17 +119,11 @@ var/global/sent_strike_team = 0
|
|||||||
new_commando.dna.ready_dna(new_commando)//Creates DNA.
|
new_commando.dna.ready_dna(new_commando)//Creates DNA.
|
||||||
|
|
||||||
//Creates mind stuff.
|
//Creates mind stuff.
|
||||||
new_commando.mind = new
|
new_commando.mind_initialize()
|
||||||
new_commando.mind.current = new_commando
|
|
||||||
new_commando.mind.original = new_commando
|
|
||||||
new_commando.mind.assigned_role = "MODE"
|
new_commando.mind.assigned_role = "MODE"
|
||||||
new_commando.mind.special_role = "Death Commando"
|
new_commando.mind.special_role = "Death Commando"
|
||||||
if(!(new_commando.mind in ticker.minds))
|
ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||||
ticker.minds += new_commando.mind//Adds them to regular mind list.
|
|
||||||
if(!(new_commando.mind in ticker.mode.traitors))//If they weren't already an extra traitor.
|
|
||||||
ticker.mode.traitors += new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
|
||||||
new_commando.equip_death_commando(leader_selected)
|
new_commando.equip_death_commando(leader_selected)
|
||||||
// del(spawn_location)
|
|
||||||
return new_commando
|
return new_commando
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/equip_death_commando(leader_selected = 0)
|
/mob/living/carbon/human/proc/equip_death_commando(leader_selected = 0)
|
||||||
|
|||||||
@@ -51,35 +51,30 @@ var/global/sent_syndicate_strike_team = 0
|
|||||||
break
|
break
|
||||||
|
|
||||||
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
|
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
|
||||||
var/mob/dead/observer/G//Basic variable to search for later.
|
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
|
||||||
var/candidates_list[] = list()//candidates for being a commando out of all the active ghosts in world.
|
var/list/commandos = list() //actual commando ghosts as picked by the user.
|
||||||
var/syndicate_commandos_list[] = list()//actual commando ghosts as picked by the user.
|
for(var/mob/dead/observer/G in player_list)
|
||||||
for(G in dead_mob_list)
|
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
|
||||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
|
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||||
// if(((G.client.inactivity/10)/60) <= 5) //Removing it allows even the caller to jump in. Good for testing.
|
candidates += G.key
|
||||||
candidates_list += G//Add their client to list.
|
for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected.
|
||||||
for(var/i=syndicate_commandos_possible,(i>0&&candidates_list.len),i--)//Decrease with every commando selected.
|
var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
|
||||||
var/client/G_client = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
|
candidates -= candidate //Subtract from candidates.
|
||||||
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
|
commandos += candidate//Add their ghost to commandos.
|
||||||
candidates_list -= G_client//Subtract from candidates.
|
|
||||||
syndicate_commandos_list += G_client.mob//Add their ghost to commandos.
|
|
||||||
|
|
||||||
//Spawns commandos and equips them.
|
//Spawns commandos and equips them.
|
||||||
for (var/obj/effect/landmark/L in world)
|
for(var/obj/effect/landmark/L in world)
|
||||||
if(syndicate_commando_number<=0) break
|
if(syndicate_commando_number<=0) break
|
||||||
if (L.name == "Syndicate-Commando")
|
if (L.name == "Syndicate-Commando")
|
||||||
syndicate_leader_selected = syndicate_commando_number == 1?1:0
|
syndicate_leader_selected = syndicate_commando_number == 1?1:0
|
||||||
|
|
||||||
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
|
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
|
||||||
|
|
||||||
if(syndicate_commandos_list.len)
|
if(commandos.len)
|
||||||
G = pick(syndicate_commandos_list)
|
new_syndicate_commando.key = pick(commandos)
|
||||||
new_syndicate_commando.mind.key = G.key//For mind stuff.
|
commandos -= new_syndicate_commando.key
|
||||||
new_syndicate_commando.key = G.key
|
|
||||||
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
||||||
new_syndicate_commando.internals.icon_state = "internal1"
|
new_syndicate_commando.internals.icon_state = "internal1"
|
||||||
syndicate_commandos_list -= G
|
|
||||||
del(G)
|
|
||||||
|
|
||||||
//So they don't forget their code or mission.
|
//So they don't forget their code or mission.
|
||||||
if(nuke_code)
|
if(nuke_code)
|
||||||
@@ -124,15 +119,10 @@ var/global/sent_syndicate_strike_team = 0
|
|||||||
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
|
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
|
||||||
|
|
||||||
//Creates mind stuff.
|
//Creates mind stuff.
|
||||||
new_syndicate_commando.mind = new
|
new_syndicate_commando.mind_initialize()
|
||||||
new_syndicate_commando.mind.current = new_syndicate_commando
|
|
||||||
new_syndicate_commando.mind.original = new_syndicate_commando
|
|
||||||
new_syndicate_commando.mind.assigned_role = "MODE"
|
new_syndicate_commando.mind.assigned_role = "MODE"
|
||||||
new_syndicate_commando.mind.special_role = "Syndicate Commando"
|
new_syndicate_commando.mind.special_role = "Syndicate Commando"
|
||||||
if(!(new_syndicate_commando.mind in ticker.minds))
|
ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list.
|
||||||
ticker.minds += new_syndicate_commando.mind//Adds them to regular mind list.
|
|
||||||
if(!(new_syndicate_commando.mind in ticker.mode.traitors))//If they weren't already an extra traitor.
|
|
||||||
ticker.mode.traitors += new_syndicate_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
|
||||||
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
|
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
|
||||||
del(spawn_location)
|
del(spawn_location)
|
||||||
return new_syndicate_commando
|
return new_syndicate_commando
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/mob/dead/observer/New(mob/body, var/can_reenter_corpse = 1)
|
/mob/dead/observer/New(mob/body)
|
||||||
invisibility = INVISIBILITY_OBSERVER
|
invisibility = INVISIBILITY_OBSERVER
|
||||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||||
@@ -14,26 +14,27 @@
|
|||||||
T = get_turf(body) //Where is the body located?
|
T = get_turf(body) //Where is the body located?
|
||||||
attack_log = body.attack_log //preserve our attack logs by copying them to our ghost
|
attack_log = body.attack_log //preserve our attack logs by copying them to our ghost
|
||||||
|
|
||||||
|
gender = body.gender
|
||||||
if(body.original_name)
|
if(body.original_name)
|
||||||
original_name = body.original_name
|
name = body.original_name
|
||||||
else
|
else
|
||||||
if(body.real_name)
|
if(body.real_name)
|
||||||
original_name = body.real_name
|
name = body.real_name
|
||||||
else
|
else
|
||||||
original_name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
if(gender == MALE)
|
||||||
|
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||||
|
else
|
||||||
|
name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
||||||
|
|
||||||
name = original_name
|
mind = body.mind //we don't transfer the mind but we keep a reference to it.
|
||||||
|
|
||||||
if(can_reenter_corpse)
|
|
||||||
corpse = body
|
|
||||||
|
|
||||||
if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position
|
if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position
|
||||||
loc = T
|
loc = T
|
||||||
|
|
||||||
if(!name) //To prevent nameless ghosts
|
if(!name) //To prevent nameless ghosts
|
||||||
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||||
real_name = name
|
real_name = name
|
||||||
original_name = name
|
original_name = name
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||||
@@ -45,9 +46,10 @@ Works together with spawning an observer, noted above.
|
|||||||
|
|
||||||
/mob/proc/ghostize(var/can_reenter_corpse = 1)
|
/mob/proc/ghostize(var/can_reenter_corpse = 1)
|
||||||
if(key)
|
if(key)
|
||||||
var/mob/dead/observer/ghost = new(src,can_reenter_corpse) //Transfer safety to observer spawning proc.
|
var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc.
|
||||||
|
ghost.can_reenter_corpse = can_reenter_corpse
|
||||||
ghost.key = key
|
ghost.key = key
|
||||||
return
|
return ghost
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues.
|
This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues.
|
||||||
@@ -119,25 +121,25 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
set category = "Ghost"
|
set category = "Ghost"
|
||||||
set name = "Re-enter Corpse"
|
set name = "Re-enter Corpse"
|
||||||
if(!client) return
|
if(!client) return
|
||||||
if(!corpse)
|
if(!(mind && mind.current && can_reenter_corpse))
|
||||||
src << "<span class='warning'>You have no body.</span>"
|
src << "<span class='warning'>You have no body.</span>"
|
||||||
return
|
return
|
||||||
if(client.holder && client.holder.state == 2)
|
if(mind.current.key) //makes sure we don't accidentally kick any clients
|
||||||
|
usr << "<span class='warning'>Another consciousness is in your body...It is resisting you.</span>"
|
||||||
|
return
|
||||||
|
if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune).
|
||||||
|
var/obj/effect/rune/R = locate() in mind.current.loc //whilst corpse is alive, we can only reenter the body if it's on the rune
|
||||||
|
if(!(R && R.word1 == wordhell && R.word2 == wordtravel && R.word3 == wordself)) //astral journeying rune
|
||||||
|
usr << "<span class='warning'>The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.</span>"
|
||||||
|
return
|
||||||
|
mind.current.ajourn=0
|
||||||
|
if(client.holder && client.holder.state == 2) //TODO: should be handled by Login/Logout ~Carn
|
||||||
var/rank = client.holder.rank
|
var/rank = client.holder.rank
|
||||||
client.clear_admin_verbs()
|
client.clear_admin_verbs()
|
||||||
client.holder.state = 1
|
client.holder.state = 1
|
||||||
client.update_admins(rank)
|
client.update_admins(rank)
|
||||||
|
|
||||||
if(corpse.ajourn && corpse.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune).
|
mind.current.key = key
|
||||||
var/obj/effect/rune/R = locate() in corpse.loc //whilst corpse is alive, we can only reenter the body if it's on the rune
|
|
||||||
if(!(R.word1 == wordhell && R.word2 == wordtravel && R.word3 == wordself)) //astral journeying rune
|
|
||||||
usr << "<span class='warning'>The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.</span>"
|
|
||||||
return
|
|
||||||
corpse.ajourn=0
|
|
||||||
if(corpse.key) //makes sure we don't accidentally kick any clients
|
|
||||||
usr << "<span class='warning'>Another consciousness is in your body...It is resisting you.</span>"
|
|
||||||
return
|
|
||||||
corpse.key = key
|
|
||||||
|
|
||||||
/mob/dead/observer/proc/dead_tele()
|
/mob/dead/observer/proc/dead_tele()
|
||||||
set category = "Ghost"
|
set category = "Ghost"
|
||||||
|
|||||||
@@ -22,8 +22,7 @@
|
|||||||
for(var/mob/O in viewers(src, null))
|
for(var/mob/O in viewers(src, null))
|
||||||
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
|
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
|
||||||
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc)
|
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc)
|
||||||
|
new_xeno.UI = UI
|
||||||
new_xeno.mind_initialize(src, "Queen")
|
mind.transfer_to(new_xeno)
|
||||||
new_xeno.key = key
|
|
||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
@@ -8,13 +8,6 @@
|
|||||||
real_name = name
|
real_name = name
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/mob/living/carbon/alien/humanoid/proc/mind_initialize(mob/G, alien_caste)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Alien"
|
|
||||||
mind.special_role = alien_caste
|
|
||||||
mind.key = G.key
|
|
||||||
|
|
||||||
//This is fine, works the same as a human
|
//This is fine, works the same as a human
|
||||||
/mob/living/carbon/alien/humanoid/Bump(atom/movable/AM as mob|obj, yes)
|
/mob/living/carbon/alien/humanoid/Bump(atom/movable/AM as mob|obj, yes)
|
||||||
spawn( 0 )
|
spawn( 0 )
|
||||||
|
|||||||
@@ -36,9 +36,6 @@
|
|||||||
//Disease Check
|
//Disease Check
|
||||||
//handle_virus_updates() There is no disease that affects aliens
|
//handle_virus_updates() There is no disease that affects aliens
|
||||||
|
|
||||||
//Update mind
|
|
||||||
update_mind()
|
|
||||||
|
|
||||||
//Handle temperature/pressure differences between body and environment
|
//Handle temperature/pressure differences between body and environment
|
||||||
handle_environment()
|
handle_environment()
|
||||||
|
|
||||||
@@ -60,13 +57,6 @@
|
|||||||
|
|
||||||
/mob/living/carbon/alien/humanoid
|
/mob/living/carbon/alien/humanoid
|
||||||
|
|
||||||
proc/update_mind()
|
|
||||||
if(!mind && client)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Hunter"
|
|
||||||
mind.key = key
|
|
||||||
|
|
||||||
proc/breathe()
|
proc/breathe()
|
||||||
if(reagents)
|
if(reagents)
|
||||||
if(reagents.has_reagent("lexorin")) return
|
if(reagents.has_reagent("lexorin")) return
|
||||||
|
|||||||
@@ -4,18 +4,11 @@
|
|||||||
reagents = R
|
reagents = R
|
||||||
R.my_atom = src
|
R.my_atom = src
|
||||||
if(name == "alien larva")
|
if(name == "alien larva")
|
||||||
name = text("alien larva ([rand(1, 1000)])")
|
name = "alien larva ([rand(1, 1000)])"
|
||||||
real_name = name
|
real_name = name
|
||||||
regenerate_icons()
|
regenerate_icons()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/mob/living/carbon/alien/larva/proc/mind_initialize(mob/G, alien_caste)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Alien"
|
|
||||||
mind.special_role = alien_caste
|
|
||||||
mind.key = G.key
|
|
||||||
|
|
||||||
//This is fine, works the same as a human
|
//This is fine, works the same as a human
|
||||||
/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes)
|
/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes)
|
||||||
|
|
||||||
|
|||||||
@@ -39,9 +39,6 @@
|
|||||||
//to find it.
|
//to find it.
|
||||||
blinded = null
|
blinded = null
|
||||||
|
|
||||||
//Mind update
|
|
||||||
update_mind()
|
|
||||||
|
|
||||||
//Disease Check
|
//Disease Check
|
||||||
//handle_virus_updates() There is no disease that affects larva
|
//handle_virus_updates() There is no disease that affects larva
|
||||||
|
|
||||||
@@ -66,7 +63,7 @@
|
|||||||
/mob/living/carbon/alien/larva
|
/mob/living/carbon/alien/larva
|
||||||
proc/handle_mutations_and_radiation()
|
proc/handle_mutations_and_radiation()
|
||||||
|
|
||||||
if(amount_grown == 200)
|
if(amount_grown == 200) //TODO ~Carn
|
||||||
src << "\green You are growing into a beautiful alien! It is time to choose a caste."
|
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 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>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."
|
||||||
@@ -77,20 +74,19 @@
|
|||||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||||
switch(alien_caste)
|
switch(alien_caste)
|
||||||
if("Hunter")
|
if("Hunter")
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (loc)
|
new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc)
|
||||||
if("Sentinel")
|
if("Sentinel")
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (loc)
|
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc)
|
||||||
if("Drone")
|
if("Drone")
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone (loc)
|
new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc)
|
||||||
|
new_xeno.UI = UI
|
||||||
new_xeno.mind_initialize(src, alien_caste)
|
if(mind) mind.transfer_to(new_xeno)
|
||||||
new_xeno.key = key
|
|
||||||
|
|
||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
//grow!! but not if metroid or dead
|
else
|
||||||
if(health>-100)
|
//grow!! but not if metroid or dead
|
||||||
amount_grown++
|
if(health>-100)
|
||||||
|
amount_grown++
|
||||||
|
|
||||||
if (radiation)
|
if (radiation)
|
||||||
if (radiation > 100)
|
if (radiation > 100)
|
||||||
@@ -124,13 +120,6 @@
|
|||||||
adjustToxLoss(3)
|
adjustToxLoss(3)
|
||||||
updatehealth()
|
updatehealth()
|
||||||
|
|
||||||
proc/update_mind()
|
|
||||||
if(!mind && client)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Larva"
|
|
||||||
mind.key = key
|
|
||||||
|
|
||||||
proc/breathe()
|
proc/breathe()
|
||||||
|
|
||||||
if(reagents.has_reagent("lexorin")) return
|
if(reagents.has_reagent("lexorin")) return
|
||||||
|
|||||||
@@ -189,12 +189,13 @@
|
|||||||
if(stat == DEAD || (changeling && (changeling.changeling_fakedeath == 1)))
|
if(stat == DEAD || (changeling && (changeling.changeling_fakedeath == 1)))
|
||||||
msg += "<span class='deadsay'>[t_He] [t_is] limp and unresponsive; there are no signs of life"
|
msg += "<span class='deadsay'>[t_He] [t_is] limp and unresponsive; there are no signs of life"
|
||||||
|
|
||||||
if(!client)
|
if(!key)
|
||||||
var/foundghost = 0
|
var/foundghost = 0
|
||||||
for(var/mob/dead/observer/G in player_list)
|
if(mind)
|
||||||
if(G.corpse == src)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
foundghost++
|
if(G.mind == mind)
|
||||||
break
|
foundghost = 1
|
||||||
|
break
|
||||||
if(!foundghost)
|
if(!foundghost)
|
||||||
msg += " and [t_his] soul has departed"
|
msg += " and [t_his] soul has departed"
|
||||||
msg += "...</span>\n"
|
msg += "...</span>\n"
|
||||||
|
|||||||
@@ -58,9 +58,6 @@
|
|||||||
//Random events (vomiting etc)
|
//Random events (vomiting etc)
|
||||||
handle_random_events()
|
handle_random_events()
|
||||||
|
|
||||||
//Update Mind
|
|
||||||
update_mind()
|
|
||||||
|
|
||||||
//Handle temperature/pressure differences between body and environment
|
//Handle temperature/pressure differences between body and environment
|
||||||
handle_environment(environment)
|
handle_environment(environment)
|
||||||
|
|
||||||
@@ -101,15 +98,6 @@
|
|||||||
return ONE_ATMOSPHERE - pressure_difference
|
return ONE_ATMOSPHERE - pressure_difference
|
||||||
|
|
||||||
/mob/living/carbon/human
|
/mob/living/carbon/human
|
||||||
proc/update_mind()
|
|
||||||
if(!mind && client)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = job
|
|
||||||
if(!mind.assigned_role)
|
|
||||||
mind.assigned_role = "Assistant"
|
|
||||||
mind.key = key
|
|
||||||
|
|
||||||
|
|
||||||
proc/handle_disabilities()
|
proc/handle_disabilities()
|
||||||
if (disabilities & EPILEPSY)
|
if (disabilities & EPILEPSY)
|
||||||
|
|||||||
@@ -143,14 +143,6 @@
|
|||||||
|
|
||||||
AIproc = 0
|
AIproc = 0
|
||||||
|
|
||||||
|
|
||||||
update_mind()
|
|
||||||
if(!mind && client)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Metroid"
|
|
||||||
mind.key = key
|
|
||||||
|
|
||||||
handle_environment(datum/gas_mixture/environment)
|
handle_environment(datum/gas_mixture/environment)
|
||||||
if(!environment)
|
if(!environment)
|
||||||
adjustFireLoss(rand(10,20))
|
adjustFireLoss(rand(10,20))
|
||||||
|
|||||||
@@ -16,13 +16,6 @@
|
|||||||
verbs.Remove(/mob/living/carbon/metroid/verb/ventcrawl)
|
verbs.Remove(/mob/living/carbon/metroid/verb/ventcrawl)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/mob/living/carbon/metroid/proc/mind_initialize(mob/G)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Metroid"
|
|
||||||
//mind.special_role = alien_caste
|
|
||||||
mind.key = G.key
|
|
||||||
|
|
||||||
/mob/living/carbon/metroid/movement_delay()
|
/mob/living/carbon/metroid/movement_delay()
|
||||||
var/tally = 0
|
var/tally = 0
|
||||||
|
|
||||||
|
|||||||
@@ -172,13 +172,12 @@
|
|||||||
return
|
return
|
||||||
if(!istype(src, /mob/living/carbon/metroid/adult))
|
if(!istype(src, /mob/living/carbon/metroid/adult))
|
||||||
if(amount_grown >= 10)
|
if(amount_grown >= 10)
|
||||||
var/mob/living/carbon/metroid/adult/new_metroid = new /mob/living/carbon/metroid/adult (loc)
|
var/mob/living/carbon/metroid/adult/new_metroid = new /mob/living/carbon/metroid/adult(loc)
|
||||||
new_metroid.mind_initialize(src)
|
|
||||||
new_metroid.key = key
|
|
||||||
new_metroid.nutrition = nutrition
|
new_metroid.nutrition = nutrition
|
||||||
new_metroid.powerlevel = max(0, powerlevel-1)
|
new_metroid.powerlevel = max(0, powerlevel-1)
|
||||||
|
|
||||||
new_metroid.a_intent = "hurt"
|
new_metroid.a_intent = "hurt"
|
||||||
|
new_metroid.key = key
|
||||||
|
|
||||||
new_metroid << "<B>You are now an adult Metroid.</B>"
|
new_metroid << "<B>You are now an adult Metroid.</B>"
|
||||||
del(src)
|
del(src)
|
||||||
else
|
else
|
||||||
@@ -196,31 +195,28 @@
|
|||||||
|
|
||||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||||
if(amount_grown >= 10)
|
if(amount_grown >= 10)
|
||||||
switch(input("Are you absolutely sure you want to reproduce? Your current body will cease to be, but your consciousness will be transferred into a produced metroid.") in list("Yes","No"))
|
if(input("Are you absolutely sure you want to reproduce? Your current body will cease to be, but your consciousness will be transferred into a produced metroid.") in list("Yes","No")=="Yes")
|
||||||
if("Yes")
|
if(stat)
|
||||||
|
src << "<i>I must be conscious to do this...</i>"
|
||||||
|
return
|
||||||
|
|
||||||
if(stat)
|
var/list/babies = list()
|
||||||
src << "<i>I must be conscious to do this...</i>"
|
var/number = pick(14;2,3,4)
|
||||||
return
|
var/new_nutrition = round(nutrition * 0.9)
|
||||||
|
var/new_powerlevel = round(powerlevel / number)
|
||||||
|
for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring)
|
||||||
|
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
|
||||||
|
M.nutrition = new_nutrition
|
||||||
|
M.powerlevel = new_powerlevel
|
||||||
|
if(i != 1) step_away(M,src)
|
||||||
|
babies += M
|
||||||
|
|
||||||
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
|
var/mob/living/carbon/metroid/new_metroid = pick(babies)
|
||||||
var/list/babies = list()
|
new_metroid.a_intent = "hurt"
|
||||||
for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring)
|
new_metroid.key = key
|
||||||
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
|
|
||||||
M.nutrition = round(nutrition * 0.9)
|
|
||||||
M.powerlevel = round(powerlevel / number)
|
|
||||||
if(i != 1) step_away(M,src)
|
|
||||||
babies += M
|
|
||||||
|
|
||||||
|
new_metroid << "<B>You are now a Metroid. Skree!</B>"
|
||||||
var/mob/living/carbon/metroid/new_metroid = pick(babies)
|
del(src)
|
||||||
|
|
||||||
new_metroid.mind_initialize(src)
|
|
||||||
new_metroid.key = key
|
|
||||||
|
|
||||||
new_metroid.a_intent = "hurt"
|
|
||||||
new_metroid << "<B>You are now a baby Metroid.</B>"
|
|
||||||
del(src)
|
|
||||||
else
|
else
|
||||||
src << "<i>I am not ready to reproduce yet...</i>"
|
src << "<i>I am not ready to reproduce yet...</i>"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -101,12 +101,6 @@
|
|||||||
if (prob(10))
|
if (prob(10))
|
||||||
stuttering = max(10, stuttering)
|
stuttering = max(10, stuttering)
|
||||||
|
|
||||||
proc/update_mind()
|
|
||||||
if(!mind && client)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.key = key
|
|
||||||
|
|
||||||
proc/handle_mutations_and_radiation()
|
proc/handle_mutations_and_radiation()
|
||||||
|
|
||||||
if(getFireLoss())
|
if(getFireLoss())
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
/mob/living/Login()
|
/mob/living/Login()
|
||||||
ticker.minds |= mind //failsafe whilst I track down all the inconsistencies ~Carn.
|
|
||||||
..()
|
..()
|
||||||
|
//Mind updates
|
||||||
|
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
|
||||||
|
mind.active = 1 //indicates that the mind is currently synced with a client
|
||||||
|
|
||||||
|
//Round specific stuff like hud updates
|
||||||
if(ticker && ticker.mode)
|
if(ticker && ticker.mode)
|
||||||
switch(ticker.mode.name)
|
switch(ticker.mode.name)
|
||||||
if("sandbox")
|
if("sandbox")
|
||||||
@@ -11,6 +15,9 @@
|
|||||||
if("cult")
|
if("cult")
|
||||||
if(mind in ticker.mode:cult)
|
if(mind in ticker.mode:cult)
|
||||||
ticker.mode.update_cult_icons_added(src.mind)
|
ticker.mode.update_cult_icons_added(src.mind)
|
||||||
|
if("nuclear emergency")
|
||||||
|
if(mind in ticker.mode:syndicates)
|
||||||
|
ticker.mode.update_all_synd_icons()
|
||||||
|
|
||||||
//This stuff needs to be merged from cloning.dm but I'm not in the mood to be shouted at for breaking all the things :< ~Carn
|
//This stuff needs to be merged from cloning.dm but I'm not in the mood to be shouted at for breaking all the things :< ~Carn
|
||||||
/* clones
|
/* clones
|
||||||
@@ -31,16 +38,20 @@
|
|||||||
|
|
||||||
/* Plantpeople
|
/* Plantpeople
|
||||||
switch(ticker.mode.name)
|
switch(ticker.mode.name)
|
||||||
if("revolution")
|
if ("revolution")
|
||||||
if(src.occupant.mind in ticker.mode:revolutionaries)
|
if (podman.mind in ticker.mode:revolutionaries)
|
||||||
|
ticker.mode:add_revolutionary(podman.mind)
|
||||||
ticker.mode:update_all_rev_icons() //So the icon actually appears
|
ticker.mode:update_all_rev_icons() //So the icon actually appears
|
||||||
if(src.occupant.mind in ticker.mode:head_revolutionaries)
|
if (podman.mind in ticker.mode:head_revolutionaries)
|
||||||
ticker.mode:update_all_rev_icons()
|
ticker.mode:update_all_rev_icons()
|
||||||
if("nuclear emergency")
|
if ("nuclear emergency")
|
||||||
if (src.occupant.mind in ticker.mode:syndicates)
|
if (podman.mind in ticker.mode:syndicates)
|
||||||
ticker.mode:update_all_synd_icons()
|
ticker.mode:update_all_synd_icons()
|
||||||
if("cult")
|
if ("cult")
|
||||||
if (src.occupant.mind in ticker.mode:cult)
|
if (podman.mind in ticker.mode:cult)
|
||||||
ticker.mode:add_cultist(src.occupant.mind)
|
ticker.mode:add_cultist(podman.mind)
|
||||||
ticker.mode:update_all_cult_icons() //So the icon actually appears
|
ticker.mode:update_all_cult_icons() //So the icon actually appears
|
||||||
|
if ("changeling")
|
||||||
|
if (podman.mind in ticker.mode:changelings)
|
||||||
|
podman.make_changeling()
|
||||||
*/
|
*/
|
||||||
4
code/modules/mob/living/logout.dm
Normal file
4
code/modules/mob/living/logout.dm
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
/mob/living/Logout()
|
||||||
|
..()
|
||||||
|
if(!key && mind) //key and mind have become seperated.
|
||||||
|
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
|
||||||
@@ -12,8 +12,6 @@
|
|||||||
|
|
||||||
src.updatehealth()
|
src.updatehealth()
|
||||||
|
|
||||||
src.update_mind()
|
|
||||||
|
|
||||||
if(aiPDA && aiPDA.name != name)
|
if(aiPDA && aiPDA.name != name)
|
||||||
aiPDA.owner = name
|
aiPDA.owner = name
|
||||||
aiPDA.name = name + " (" + aiPDA.ownjob + ")"
|
aiPDA.name = name + " (" + aiPDA.ownjob + ")"
|
||||||
@@ -185,10 +183,3 @@
|
|||||||
else
|
else
|
||||||
src.health = 100
|
src.health = 100
|
||||||
src.stat = 0
|
src.stat = 0
|
||||||
|
|
||||||
/mob/living/silicon/ai/proc/update_mind()
|
|
||||||
if(!mind && client)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "AI"
|
|
||||||
mind.key = key
|
|
||||||
@@ -35,17 +35,13 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
|||||||
pai.real_name = pai.name
|
pai.real_name = pai.name
|
||||||
pai.key = candidate.key
|
pai.key = candidate.key
|
||||||
|
|
||||||
pai.mind = new()//Make a new mind for the pai
|
|
||||||
pai.mind.current = pai
|
|
||||||
pai.mind.assigned_role = "Assistant"//Default to an assistant.
|
|
||||||
|
|
||||||
card.setPersonality(pai)
|
card.setPersonality(pai)
|
||||||
card.looking_for_personality = 0
|
card.looking_for_personality = 0
|
||||||
|
|
||||||
ticker.mode.update_cult_icons_removed(card.pai.mind)
|
ticker.mode.update_cult_icons_removed(card.pai.mind)
|
||||||
ticker.mode.update_rev_icons_removed(card.pai.mind)
|
ticker.mode.update_rev_icons_removed(card.pai.mind)
|
||||||
|
|
||||||
pai_candidates.Remove(candidate)
|
pai_candidates -= candidate
|
||||||
usr << browse(null, "window=findPai")
|
usr << browse(null, "window=findPai")
|
||||||
|
|
||||||
if(href_list["new"])
|
if(href_list["new"])
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
process_locks()
|
process_locks()
|
||||||
update_canmove()
|
update_canmove()
|
||||||
|
|
||||||
update_mind()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -66,13 +65,6 @@
|
|||||||
uneq_all()
|
uneq_all()
|
||||||
src.stat = 1
|
src.stat = 1
|
||||||
|
|
||||||
update_mind()
|
|
||||||
if(!mind && client)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Hunter"
|
|
||||||
mind.key = key
|
|
||||||
|
|
||||||
|
|
||||||
handle_regular_status_updates()
|
handle_regular_status_updates()
|
||||||
|
|
||||||
|
|||||||
@@ -21,18 +21,7 @@
|
|||||||
add_to_mob_list(mmi.brainmob)
|
add_to_mob_list(mmi.brainmob)
|
||||||
var/turf/T = get_turf(loc)//To hopefully prevent run time errors.
|
var/turf/T = get_turf(loc)//To hopefully prevent run time errors.
|
||||||
if(T) mmi.loc = T
|
if(T) mmi.loc = T
|
||||||
|
if(mind) mind.transfer_to(mmi.brainmob)
|
||||||
if(key && !mind) //failsafe in case we've somehow lost our mind! (code will do that to you!)
|
|
||||||
if(mmi.brainmob.mind)
|
|
||||||
mind = mmi.brainmob.mind
|
|
||||||
else
|
|
||||||
mind = new /datum/mind()
|
|
||||||
mind.assigned_role = "Cyborg"
|
|
||||||
mind.key = key
|
|
||||||
|
|
||||||
if(mind)
|
|
||||||
mind.transfer_to(mmi.brainmob)
|
|
||||||
|
|
||||||
mmi = null
|
mmi = null
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
|||||||
@@ -133,11 +133,7 @@
|
|||||||
usr << msg
|
usr << msg
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/simple_animal/constructarmoured/proc/mind_initialize(mob/G)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Juggernaut"
|
|
||||||
mind.key = G.key
|
|
||||||
|
|
||||||
////////////////////////Wraith/////////////////////////////////////////////
|
////////////////////////Wraith/////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -267,12 +263,6 @@
|
|||||||
usr << msg
|
usr << msg
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/simple_animal/constructwraith/proc/mind_initialize(mob/G)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Wraith"
|
|
||||||
mind.key = G.key
|
|
||||||
|
|
||||||
/////////////////////////////Artificer/////////////////////////
|
/////////////////////////////Artificer/////////////////////////
|
||||||
|
|
||||||
/mob/living/simple_animal/constructbuilder
|
/mob/living/simple_animal/constructbuilder
|
||||||
@@ -348,10 +338,4 @@
|
|||||||
msg += "*---------*</span>"
|
msg += "*---------*</span>"
|
||||||
|
|
||||||
usr << msg
|
usr << msg
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/simple_animal/constructbuilder/proc/mind_initialize(mob/G)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Artificer"
|
|
||||||
mind.key = G.key
|
|
||||||
@@ -354,13 +354,6 @@
|
|||||||
return
|
return
|
||||||
//PC stuff-Sieve
|
//PC stuff-Sieve
|
||||||
|
|
||||||
/mob/living/simple_animal/corgi/proc/mind_initialize(mob/G)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Corgi"
|
|
||||||
mind.key = G.key
|
|
||||||
|
|
||||||
|
|
||||||
/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||||
if(istype(O, /obj/item/weapon/newspaper))
|
if(istype(O, /obj/item/weapon/newspaper))
|
||||||
if(!stat)
|
if(!stat)
|
||||||
|
|||||||
@@ -54,9 +54,3 @@
|
|||||||
if ((M.client && !( M.blinded )))
|
if ((M.client && !( M.blinded )))
|
||||||
M.show_message("\red [user] gently taps [src] with the [O]. ")
|
M.show_message("\red [user] gently taps [src] with the [O]. ")
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/simple_animal/shade/proc/mind_initialize(mob/G)
|
|
||||||
mind = new
|
|
||||||
mind.current = src
|
|
||||||
mind.assigned_role = "Shade"
|
|
||||||
mind.key = G.key
|
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
/mob/Logout()
|
/mob/Logout()
|
||||||
player_list -= src
|
player_list -= src
|
||||||
log_access("Logout: [key_name(src)]")
|
log_access("Logout: [key_name(src)]")
|
||||||
if (admins[src.ckey])
|
if(admins[src.ckey])
|
||||||
if (ticker && ticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
|
if (ticker && ticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
|
||||||
var/admins_number = 0
|
var/admins_number = admin_list.len
|
||||||
for(var/client/C)
|
|
||||||
if(C.holder)
|
|
||||||
admins_number++
|
|
||||||
|
|
||||||
message_admins("Admin logout: [key_name(src)]")
|
message_admins("Admin logout: [key_name(src)]")
|
||||||
if(admins_number == 0) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell.
|
if(admins_number == 0) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell.
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
preferences = new
|
preferences = new
|
||||||
|
|
||||||
if(!mind)
|
if(!mind)
|
||||||
mind = new
|
mind = new /datum/mind(key)
|
||||||
mind.key = key
|
mind.active = 1
|
||||||
mind.current = src
|
mind.current = src
|
||||||
|
|
||||||
spawn() Playmusic() // git some tunes up in heeyaa~
|
spawn() Playmusic() // git some tunes up in heeyaa~
|
||||||
|
|||||||
@@ -254,7 +254,7 @@
|
|||||||
|
|
||||||
if(character.mind.assigned_role != "Cyborg")
|
if(character.mind.assigned_role != "Cyborg")
|
||||||
ManifestLateSpawn(character,char_icon)
|
ManifestLateSpawn(character,char_icon)
|
||||||
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc.
|
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
|
||||||
else
|
else
|
||||||
character.Robotize()
|
character.Robotize()
|
||||||
del(src)
|
del(src)
|
||||||
@@ -274,7 +274,7 @@
|
|||||||
|
|
||||||
proc/ManifestLateSpawn(var/mob/living/carbon/human/H, icon/H_icon) // Attempted fix to add late joiners to various databases -- TLE
|
proc/ManifestLateSpawn(var/mob/living/carbon/human/H, icon/H_icon) // Attempted fix to add late joiners to various databases -- TLE
|
||||||
// This is basically ripped wholesale from the normal code for adding people to the databases during a fresh round
|
// This is basically ripped wholesale from the normal code for adding people to the databases during a fresh round
|
||||||
if (!isnull(H.mind) && (H.mind.assigned_role != "MODE"))
|
if (H.mind && (H.mind.assigned_role != "MODE"))
|
||||||
var/datum/data/record/G = new()
|
var/datum/data/record/G = new()
|
||||||
var/datum/data/record/M = new()
|
var/datum/data/record/M = new()
|
||||||
var/datum/data/record/S = new()
|
var/datum/data/record/S = new()
|
||||||
@@ -379,8 +379,8 @@
|
|||||||
new_character.dna.ready_dna(new_character)
|
new_character.dna.ready_dna(new_character)
|
||||||
new_character.dna.b_type = preferences.b_type
|
new_character.dna.b_type = preferences.b_type
|
||||||
if(mind)
|
if(mind)
|
||||||
mind.original = new_character
|
|
||||||
mind.transfer_to(new_character)
|
mind.transfer_to(new_character)
|
||||||
|
mind.original = new_character
|
||||||
return new_character
|
return new_character
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -76,20 +76,13 @@
|
|||||||
var/mob/living/silicon/ai/O = new (loc, /datum/ai_laws/asimov,,1)//No MMI but safety is in effect.
|
var/mob/living/silicon/ai/O = new (loc, /datum/ai_laws/asimov,,1)//No MMI but safety is in effect.
|
||||||
O.invisibility = 0
|
O.invisibility = 0
|
||||||
O.aiRestorePowerRoutine = 0
|
O.aiRestorePowerRoutine = 0
|
||||||
O.lastKnownIP = client.address
|
|
||||||
|
|
||||||
if(mind)
|
if(mind)
|
||||||
mind.transfer_to(O)
|
mind.transfer_to(O)
|
||||||
O.mind.original = O
|
O.mind.original = O
|
||||||
else
|
else
|
||||||
O.mind = new
|
|
||||||
O.mind.current = O
|
|
||||||
O.mind.original = O
|
|
||||||
O.mind.assigned_role = "AI"
|
|
||||||
O.key = key
|
O.key = key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var/obj/loc_landmark
|
var/obj/loc_landmark
|
||||||
for(var/obj/effect/landmark/start/sloc in world)
|
for(var/obj/effect/landmark/start/sloc in world)
|
||||||
if (sloc.name != "AI")
|
if (sloc.name != "AI")
|
||||||
@@ -176,19 +169,14 @@
|
|||||||
|
|
||||||
O.UI = UI
|
O.UI = UI
|
||||||
|
|
||||||
if (mind)
|
if(mind) //TODO
|
||||||
mind.transfer_to(O)
|
mind.transfer_to(O)
|
||||||
if (mind.assigned_role == "Cyborg")
|
if(O.mind.assigned_role == "Cyborg")
|
||||||
mind.original = O
|
O.mind.original = O
|
||||||
else if (mind.special_role) O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
|
else if(mind.special_role)
|
||||||
|
O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
|
||||||
else
|
else
|
||||||
mind = new /datum/mind( )
|
O.key = key
|
||||||
mind.key = key
|
|
||||||
mind.current = O
|
|
||||||
mind.original = O
|
|
||||||
mind.transfer_to(O)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
O.loc = loc
|
O.loc = loc
|
||||||
O.job = "Cyborg"
|
O.job = "Cyborg"
|
||||||
@@ -219,25 +207,16 @@
|
|||||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||||
switch(alien_caste)
|
switch(alien_caste)
|
||||||
if("Hunter")
|
if("Hunter")
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (loc)
|
new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc)
|
||||||
if("Sentinel")
|
if("Sentinel")
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (loc)
|
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc)
|
||||||
if("Drone")
|
if("Drone")
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone (loc)
|
new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc)
|
||||||
|
|
||||||
//Honestly not sure why it's giving them DNA.
|
|
||||||
/*
|
|
||||||
new_xeno.dna = dna
|
|
||||||
dna = null
|
|
||||||
new_xeno.dna.uni_identity = "00600200A00E0110148FC01300B009"
|
|
||||||
new_xeno.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
|
|
||||||
*/
|
|
||||||
|
|
||||||
new_xeno.mind_initialize(src, alien_caste)
|
|
||||||
new_xeno.key = key
|
|
||||||
new_xeno.UI = UI
|
|
||||||
|
|
||||||
new_xeno.a_intent = "hurt"
|
new_xeno.a_intent = "hurt"
|
||||||
|
new_xeno.UI = UI
|
||||||
|
new_xeno.key = key
|
||||||
|
|
||||||
new_xeno << "<B>You are now an alien.</B>"
|
new_xeno << "<B>You are now an alien.</B>"
|
||||||
spawn(0)//To prevent the proc from returning null.
|
spawn(0)//To prevent the proc from returning null.
|
||||||
del(src)
|
del(src)
|
||||||
@@ -256,43 +235,26 @@
|
|||||||
for(var/t in organs)
|
for(var/t in organs)
|
||||||
del(t)
|
del(t)
|
||||||
|
|
||||||
|
var/mob/living/carbon/metroid/new_metroid
|
||||||
if(reproduce)
|
if(reproduce)
|
||||||
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
|
var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring)
|
||||||
var/list/babies = list()
|
var/list/babies = list()
|
||||||
for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring)
|
for(var/i=1,i<=number,i++)
|
||||||
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
|
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
|
||||||
M.nutrition = round(nutrition/number)
|
M.nutrition = round(nutrition/number)
|
||||||
step_away(M,src)
|
step_away(M,src)
|
||||||
babies += M
|
babies += M
|
||||||
|
new_metroid = pick(babies)
|
||||||
|
|
||||||
var/mob/living/carbon/metroid/new_metroid = pick(babies)
|
|
||||||
|
|
||||||
new_metroid.mind_initialize(src)
|
|
||||||
new_metroid.key = key
|
|
||||||
new_metroid.UI = UI
|
|
||||||
|
|
||||||
new_metroid.a_intent = "hurt"
|
|
||||||
new_metroid << "<B>You are now a baby Metroid.</B>"
|
|
||||||
|
|
||||||
if(adult)
|
|
||||||
var/mob/living/carbon/metroid/adult/new_metroid = new /mob/living/carbon/metroid/adult (loc)
|
|
||||||
new_metroid.mind_initialize(src)
|
|
||||||
new_metroid.key = key
|
|
||||||
new_metroid.UI = UI
|
|
||||||
|
|
||||||
new_metroid.a_intent = "hurt"
|
|
||||||
new_metroid << "<B>You are now an adult Metroid.</B>"
|
|
||||||
|
|
||||||
else
|
else
|
||||||
var/mob/living/carbon/metroid/new_metroid = new /mob/living/carbon/metroid (loc)
|
if(adult)
|
||||||
|
new_metroid = new /mob/living/carbon/metroid/adult(loc)
|
||||||
|
else
|
||||||
|
new_metroid = new /mob/living/carbon/metroid(loc)
|
||||||
|
new_metroid.a_intent = "hurt"
|
||||||
|
new_metroid.UI = UI
|
||||||
|
new_metroid.key = key
|
||||||
|
|
||||||
new_metroid.mind_initialize(src)
|
new_metroid << "<B>You are now a Metroid. Skreee!</B>"
|
||||||
new_metroid.key = key
|
|
||||||
new_metroid.UI = UI
|
|
||||||
|
|
||||||
new_metroid.a_intent = "hurt"
|
|
||||||
new_metroid << "<B>You are now a baby Metroid.</B>"
|
|
||||||
spawn(0)//To prevent the proc from returning null.
|
spawn(0)//To prevent the proc from returning null.
|
||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
@@ -307,17 +269,15 @@
|
|||||||
canmove = 0
|
canmove = 0
|
||||||
icon = null
|
icon = null
|
||||||
invisibility = 101
|
invisibility = 101
|
||||||
for(var/t in organs)
|
for(var/t in organs) //this really should not be necessary
|
||||||
del(t)
|
del(t)
|
||||||
|
|
||||||
var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc)
|
var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc)
|
||||||
|
|
||||||
new_corgi.mind_initialize(src)
|
|
||||||
new_corgi.key = key
|
|
||||||
new_corgi.UI = UI
|
|
||||||
|
|
||||||
new_corgi.a_intent = "hurt"
|
new_corgi.a_intent = "hurt"
|
||||||
new_corgi << "<B>You are now a Corgi!.</B>"
|
new_corgi.UI = UI
|
||||||
|
new_corgi.key = key
|
||||||
|
|
||||||
|
new_corgi << "<B>You are now a Corgi. Yap Yap!</B>"
|
||||||
spawn(0)//To prevent the proc from returning null.
|
spawn(0)//To prevent the proc from returning null.
|
||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
@@ -19,171 +19,79 @@
|
|||||||
|
|
||||||
|
|
||||||
/obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list)
|
/obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list)
|
||||||
if(istype(M, /mob/living) && M.stat != 2)
|
if(istype(M, /mob/living) && M.stat != DEAD)
|
||||||
for(var/obj/item/W in M)
|
if(M.monkeyizing) return
|
||||||
if (istype(M, /mob/living/silicon/robot)||istype(W, /obj/item/weapon/implant))
|
M.monkeyizing = 1
|
||||||
del (W)
|
M.canmove = 0
|
||||||
M.drop_from_inventory(W)
|
M.icon = null
|
||||||
var/randomize = pick("monkey","robot","metroid","alien","human")
|
M.overlays = null
|
||||||
|
M.invisibility = 101
|
||||||
|
|
||||||
|
if(istype(M, /mob/living/silicon/robot))
|
||||||
|
var/mob/living/silicon/robot/Robot = M
|
||||||
|
if(Robot.mmi) del(Robot.mmi)
|
||||||
|
else
|
||||||
|
for(var/obj/item/W in M)
|
||||||
|
if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something
|
||||||
|
del(W)
|
||||||
|
W.layer = initial(W.layer)
|
||||||
|
W.loc = M.loc
|
||||||
|
W.dropped(src)
|
||||||
|
|
||||||
|
var/mob/living/new_mob
|
||||||
|
|
||||||
|
var/randomize = pick("monkey","robot","metroid","xeno","human")
|
||||||
switch(randomize)
|
switch(randomize)
|
||||||
if("monkey")
|
if("monkey")
|
||||||
if (M.monkeyizing)
|
new_mob = new /mob/living/carbon/monkey(M.loc)
|
||||||
return
|
new_mob.universal_speak = 1
|
||||||
// M.regenerate_icons()
|
|
||||||
M.monkeyizing = 1
|
|
||||||
M.canmove = 0
|
|
||||||
M.icon = null
|
|
||||||
M.invisibility = 101
|
|
||||||
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( M.loc )
|
|
||||||
O.name = "monkey"
|
|
||||||
if (M.client)
|
|
||||||
M.client.mob = O
|
|
||||||
if(M.mind)
|
|
||||||
M.mind.transfer_to(O)
|
|
||||||
O.a_intent = "hurt"
|
|
||||||
O.universal_speak = 1
|
|
||||||
O << "<B>You are now a monkey.</B>"
|
|
||||||
del(M)
|
|
||||||
return O
|
|
||||||
if("robot")
|
if("robot")
|
||||||
if (M.monkeyizing)
|
new_mob = new /mob/living/silicon/robot(M.loc)
|
||||||
return
|
new_mob.gender = M.gender
|
||||||
// M.regenerate_icons()
|
new_mob.invisibility = 0
|
||||||
M.monkeyizing = 1
|
new_mob.job = "Cyborg"
|
||||||
M.canmove = 0
|
var/mob/living/silicon/robot/Robot = new_mob
|
||||||
M.icon = null
|
Robot.mmi = new /obj/item/device/mmi(new_mob)
|
||||||
M.invisibility = 101
|
Robot.mmi.transfer_identity(M) //Does not transfer key/client.
|
||||||
if(M.client)
|
|
||||||
M.client.screen -= M.hud_used.contents
|
|
||||||
M.client.screen -= M.hud_used.adding
|
|
||||||
M.client.screen -= list( M.oxygen, M.throw_icon, M.i_select, M.m_select, M.toxin, M.internals, M.fire, M.hands, M.healths, M.pullin, M.blind, M.flash, M.rest, M.sleep, M.mach )
|
|
||||||
M.client.screen -= list( M.zone_sel, M.oxygen, M.throw_icon, M.i_select, M.m_select, M.toxin, M.internals, M.fire, M.hands, M.healths, M.pullin, M.blind, M.flash, M.rest, M.sleep, M.mach )
|
|
||||||
|
|
||||||
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( M.loc )
|
|
||||||
O.cell = new(O)
|
|
||||||
O.cell.maxcharge = 7500
|
|
||||||
O.cell.charge = 7500
|
|
||||||
O.gender = M.gender
|
|
||||||
O.invisibility = 0
|
|
||||||
O.name = "Cyborg"
|
|
||||||
O.real_name = "Cyborg"
|
|
||||||
if (M.mind)
|
|
||||||
M.mind.transfer_to(O)
|
|
||||||
if (M.mind.assigned_role == "Cyborg")
|
|
||||||
M.mind.original = O
|
|
||||||
else if (M.mind.special_role) O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
|
|
||||||
else
|
|
||||||
M.mind = new /datum/mind( )
|
|
||||||
M.mind.key = M.key
|
|
||||||
M.mind.current = O
|
|
||||||
M.mind.original = O
|
|
||||||
M.mind.transfer_to(O)
|
|
||||||
|
|
||||||
if(!(O.mind in ticker.minds))
|
|
||||||
ticker.minds += O.mind//Adds them to regular mind list.
|
|
||||||
|
|
||||||
O.loc = loc
|
|
||||||
//O << "<B>You are playing a Cyborg. A Cyborg can interact with most electronic objects in its view point.</B>"
|
|
||||||
//O << "<B>You must follow the laws that the AI has. You must follow orders the AI gives you.</B>"
|
|
||||||
//O << "To use something, simply click on it."
|
|
||||||
//O << {"Use say ":s to speak to fellow cyborgs and the AI through binary."}
|
|
||||||
|
|
||||||
O.job = "Cyborg"
|
|
||||||
|
|
||||||
O.mmi = new /obj/item/device/mmi(O)
|
|
||||||
O.mmi.transfer_identity(M)//Does not transfer key/client.
|
|
||||||
del(M)
|
|
||||||
return O
|
|
||||||
if("metroid")
|
if("metroid")
|
||||||
if (M.monkeyizing)
|
|
||||||
return
|
|
||||||
// M.regenerate_icons()
|
|
||||||
M.monkeyizing = 1
|
|
||||||
M.canmove = 0
|
|
||||||
M.icon = null
|
|
||||||
M.invisibility = 101
|
|
||||||
if(prob(50))
|
if(prob(50))
|
||||||
var/mob/living/carbon/metroid/adult/new_metroid = new /mob/living/carbon/metroid/adult (M.loc)
|
new_mob = new /mob/living/carbon/metroid/adult(M.loc)
|
||||||
if (M.client)
|
|
||||||
M.client.mob = new_metroid
|
|
||||||
if(M.mind)
|
|
||||||
M.mind.transfer_to(new_metroid)
|
|
||||||
|
|
||||||
new_metroid.a_intent = "hurt"
|
|
||||||
new_metroid << "<B>You are now an adult Metroid.</B>"
|
|
||||||
new_metroid.universal_speak = 1
|
|
||||||
del(M)
|
|
||||||
return new_metroid
|
|
||||||
else
|
else
|
||||||
var/mob/living/carbon/metroid/new_metroid = new /mob/living/carbon/metroid (M.loc)
|
new_mob = new /mob/living/carbon/metroid(M.loc)
|
||||||
if (M.client)
|
new_mob.universal_speak = 1
|
||||||
M.client.mob = new_metroid
|
|
||||||
if(M.mind)
|
|
||||||
M.mind.transfer_to(new_metroid)
|
|
||||||
new_metroid.a_intent = "hurt"
|
|
||||||
new_metroid.universal_speak = 1
|
|
||||||
new_metroid << "<B>You are now a baby Metroid.</B>"
|
|
||||||
del(M)
|
|
||||||
return new_metroid
|
|
||||||
if("alien")
|
if("alien")
|
||||||
if (M.monkeyizing)
|
var/alien_caste = pick("Hunter","Sentinel","Drone","Larva")
|
||||||
return
|
|
||||||
// M.regenerate_icons()
|
|
||||||
M.monkeyizing = 1
|
|
||||||
M.canmove = 0
|
|
||||||
M.icon = null
|
|
||||||
M.invisibility = 101
|
|
||||||
var/alien_caste = pick("Hunter","Sentinel","Drone")
|
|
||||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
|
||||||
switch(alien_caste)
|
switch(alien_caste)
|
||||||
if("Hunter")
|
if("Hunter") new_mob = new /mob/living/carbon/alien/humanoid/hunter(M.loc)
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (M.loc)
|
if("Sentinel") new_mob = new /mob/living/carbon/alien/humanoid/sentinel(M.loc)
|
||||||
if("Sentinel")
|
if("Drone") new_mob = new /mob/living/carbon/alien/humanoid/drone(M.loc)
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (M.loc)
|
if("Larva") new_mob = new /mob/living/carbon/alien/larva(M.loc)
|
||||||
if("Drone")
|
new_mob.universal_speak = 1
|
||||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone (M.loc)
|
|
||||||
if (M.client)
|
|
||||||
M.client.mob = new_xeno
|
|
||||||
if(M.mind)
|
|
||||||
M.mind.transfer_to(new_xeno)
|
|
||||||
new_xeno.a_intent = "hurt"
|
|
||||||
new_xeno.universal_speak = 1
|
|
||||||
new_xeno << "<B>You are now an alien.</B>"
|
|
||||||
del(M)
|
|
||||||
return new_xeno
|
|
||||||
if("human")
|
if("human")
|
||||||
if (M.monkeyizing)
|
new_mob = new /mob/living/carbon/human(M.loc)
|
||||||
return
|
if(M.gender == MALE)
|
||||||
// M.regenerate_icons()
|
new_mob.gender = MALE
|
||||||
M.monkeyizing = 1
|
new_mob.name = pick(first_names_male)
|
||||||
M.canmove = 0
|
else
|
||||||
M.icon = null
|
new_mob.gender = FEMALE
|
||||||
M.invisibility = 101
|
new_mob.name = pick(first_names_female)
|
||||||
var/mob/living/carbon/human/O = new /mob/living/carbon/human( M.loc )
|
new_mob.name += " [pick(last_names)]"
|
||||||
|
new_mob.real_name = new_mob.name
|
||||||
|
|
||||||
var/first = pick(first_names_male)
|
var/datum/preferences/A = new() //Randomize appearance for the human
|
||||||
var/last = pick(last_names)
|
A.randomize_appearance_for(new_mob)
|
||||||
O.name = "[first] [last]"
|
|
||||||
O.real_name = "[first] [last]"
|
var/mob/living/carbon/human/Human = new_mob
|
||||||
var/race = pick("lizard","golem","metroid","plant","normal")
|
Human.mutantrace = pick("lizard","golem","metroid","plant",4;"")
|
||||||
switch(race)
|
|
||||||
if("lizard")
|
new_mob.a_intent = "hurt"
|
||||||
O.mutantrace = "lizard"
|
if(M.mind)
|
||||||
if("golem")
|
M.mind.transfer_to(new_mob)
|
||||||
O.mutantrace = "golem"
|
else
|
||||||
if("metroid")
|
new_mob.key = M.key
|
||||||
O.mutantrace = "metroid"
|
|
||||||
if("plant")
|
new_mob << "<B>Your form morphs into that of a [randomize].</B>"
|
||||||
O.mutantrace = "plant"
|
|
||||||
if("normal")
|
del(M)
|
||||||
O.mutantrace = ""
|
return new_mob
|
||||||
if (M.client)
|
|
||||||
M.client.mob = O
|
|
||||||
if(M.mind)
|
|
||||||
M.mind.transfer_to(O)
|
|
||||||
O.a_intent = "hurt"
|
|
||||||
O << "<B>You are now a human.</B>"
|
|
||||||
del(M)
|
|
||||||
return O
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|||||||
@@ -940,6 +940,7 @@
|
|||||||
#include "code\modules\mob\living\living_defense.dm"
|
#include "code\modules\mob\living\living_defense.dm"
|
||||||
#include "code\modules\mob\living\living_defines.dm"
|
#include "code\modules\mob\living\living_defines.dm"
|
||||||
#include "code\modules\mob\living\login.dm"
|
#include "code\modules\mob\living\login.dm"
|
||||||
|
#include "code\modules\mob\living\logout.dm"
|
||||||
#include "code\modules\mob\living\say.dm"
|
#include "code\modules\mob\living\say.dm"
|
||||||
#include "code\modules\mob\living\blob\blob.dm"
|
#include "code\modules\mob\living\blob\blob.dm"
|
||||||
#include "code\modules\mob\living\carbon\carbon.dm"
|
#include "code\modules\mob\living\carbon\carbon.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user