diff --git a/code/datums/mind.dm b/code/datums/mind.dm index de8436b9285..9bc55a7212e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -136,13 +136,13 @@ datum/mind text += "YES|no" if (objectives.len==0) text += "
Objectives are empty! Randomize!" - if (current.absorbed_dna.len>0 && current.real_name != current.absorbed_dna[1]) + if (current.changeling && (current.changeling.absorbed_dna.len>0 && current.real_name != current.changeling.absorbed_dna[1])) text += "
Transform to initial appearance." else text += "yes|NO" - var/datum/game_mode/changeling/changeling = ticker.mode - if (istype(changeling) && changeling.changelingdeath) - text += "
All the changelings are dead! Restart in [round((changeling.TIME_TO_GET_REVIVED-(world.time-changeling.changelingdeathtime))/10)] seconds." +// var/datum/game_mode/changeling/changeling = ticker.mode +// if (istype(changeling) && changeling.changelingdeath) +// text += "
All the changelings are dead! Restart in [round((changeling.TIME_TO_GET_REVIVED-(world.time-changeling.changelingdeathtime))/10)] seconds." sections["changeling"] = text /** NUCLEAR ***/ @@ -576,11 +576,8 @@ datum/mind ticker.mode.changelings -= src special_role = null current.remove_changeling_powers() - current.absorbed_dna = null - current.chem_charges = 0 - current.changeling_fakedeath = 0 - current.sting_range = 1 - current.changeling_level = 0 + if(current.changeling) + del(current.changeling) current << "\red You have been brainwashed! You are no longer a changeling!" if("changeling") if(!(src in ticker.mode.changelings)) @@ -593,11 +590,11 @@ datum/mind usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually." if("initialdna") - if (!usr.absorbed_dna[1]) + if (!usr.changeling || !usr.changeling.absorbed_dna[1]) usr << "\red Resetting DNA failed!" else - usr.dna = usr.absorbed_dna[usr.absorbed_dna[1]] - usr.real_name = usr.absorbed_dna[1] + usr.dna = usr.changeling.absorbed_dna[usr.changeling.absorbed_dna[1]] + usr.real_name = usr.changeling.absorbed_dna[1] updateappearance(usr, usr.dna.uni_identity) domutcheck(usr, null) diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm index 5f653ee1607..151ffbb5c97 100644 --- a/code/defines/mob/mob.dm +++ b/code/defines/mob/mob.dm @@ -197,13 +197,15 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER +/* //Changeling mode stuff//Carbon var/changeling_level = 0 var/list/absorbed_dna = list() var/changeling_fakedeath = 0 var/chem_charges = 20.00 var/sting_range = 1 - +*/ + var/datum/changeling/changeling = null var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE var/obj/control_object // Hacking in to control objects -- TLE diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 25286d41254..5c5ed684c77 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -47,13 +47,11 @@ waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - changelingdeathtime //timestamp when last changeling was killed - const/TIME_TO_GET_REVIVED = 3000 - changelingdeath = 0 + const/changeling_amount = 4 /datum/game_mode/changeling/announce() world << "The current game mode is - Changeling!" - world << "There is an alien changeling on the station. Do not let the changeling succeed!" + world << "There are alien changelings on the station. Do not let the changelings succeed!" /*/datum/game_mode/changeling/can_start() for(var/mob/new_player/P in world) @@ -70,10 +68,12 @@ possible_changelings -= player if(possible_changelings.len>0) - var/datum/mind/changeling = pick(possible_changelings) - //possible_changelings-=changeling - changelings += changeling - modePlayer += changelings + for(var/i = 0, i < changeling_amount, i++) + if(!possible_changelings.len) break + var/datum/mind/changeling = pick(possible_changelings) + possible_changelings -= changeling + changelings += changeling + modePlayer += changelings return 1 else return 0 @@ -148,6 +148,7 @@ /datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1) if (you_are) changeling.current << "\red You are a changeling!" + changeling.current << "\red Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." changeling.current << "You must complete the following tasks:" var/obj_count = 1 @@ -157,7 +158,7 @@ return /datum/game_mode/changeling/check_finished() - var/changelings_alive = 0 +/* var/changelings_alive = 0 for(var/datum/mind/changeling in changelings) if(!istype(changeling.current,/mob/living/carbon)) continue @@ -175,7 +176,8 @@ if(world.time-changelingdeathtime > TIME_TO_GET_REVIVED) return 1 else - return ..() + return ..()*/ + return 0 /datum/game_mode/proc/grant_changeling_powers(mob/living/carbon/human/changeling_mob) if (!istype(changeling_mob)) @@ -188,7 +190,7 @@ var/changeling_name var/totalabsorbed = 0 if (changeling.current) - totalabsorbed = changeling.current.absorbed_dna.len - 1 + totalabsorbed = changeling.current.changeling.absorbed_dna.len - 1 if(changeling.current) changeling_name = "[changeling.current.real_name] (played by [changeling.key])" @@ -212,3 +214,25 @@ else world << "The changeling has failed!" return 1 + +/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind) + var/changeling_level = 0 + var/list/absorbed_dna = list() + var/changeling_fakedeath = 0 + var/chem_charges = 20.00 + var/sting_range = 1 + var/changelingID = null + var/mob/living/host = null + +/datum/changeling/New() + ..() + var/list/possibleIDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega") + + for(var/mob/living/carbon/aChangeling in world) + if(aChangeling.changeling) + possibleIDs -= aChangeling.changeling.changelingID + + if(possibleIDs.len) + changelingID = pick(possibleIDs) + else + changelingID = "[rand(1,1000)]" \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 00eb5725f7b..48ab79e588d 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -1,4 +1,7 @@ /mob/proc/make_lesser_changeling() + if(!changeling) changeling = new + changeling.host = src + src.verbs += /client/proc/changeling_lesser_transform src.verbs += /client/proc/changeling_fakedeath @@ -6,10 +9,13 @@ src.verbs += /client/proc/changeling_deaf_sting src.verbs += /client/proc/changeling_silence_sting - src.changeling_level = 1 + changeling.changeling_level = 1 return /mob/proc/make_changeling() + if(!changeling) changeling = new + changeling.host = src + src.verbs += /client/proc/changeling_absorb_dna src.verbs += /client/proc/changeling_transform src.verbs += /client/proc/changeling_lesser_form @@ -22,11 +28,11 @@ src.verbs += /client/proc/changeling_transformation_sting src.verbs += /client/proc/changeling_boost_range - src.changeling_level = 2 - if (!src.absorbed_dna) - src.absorbed_dna = list() - if (src.absorbed_dna.len == 0) - src.absorbed_dna[src.real_name] = src.dna + changeling.changeling_level = 2 + if (!changeling.absorbed_dna) + changeling.absorbed_dna = list() + if (changeling.absorbed_dna.len == 0) + changeling.absorbed_dna[src.real_name] = src.dna return /mob/proc/make_greater_changeling() @@ -51,6 +57,10 @@ set category = "Changeling" set name = "Absorb DNA" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + if(usr.stat) usr << "\red Not when we are incapacitated." return @@ -70,7 +80,7 @@ usr << "\red We must have a tighter grip to absorb this creature." return - usr.chem_charges += 5 + usr.changeling.chem_charges += 5 var/mob/living/carbon/human/T = M @@ -100,9 +110,16 @@ usr.visible_message(text("\red [usr] sucks the fluids from [T]!")) T << "\red You have been absorbed by the changeling!" - usr.absorbed_dna[T.real_name] = T.dna + usr.changeling.absorbed_dna[T.real_name] = T.dna if(usr.nutrition < 400) usr.nutrition = min((usr.nutrition + T.nutrition), 400) - usr.chem_charges += 5 + usr.changeling.chem_charges += 5 + if(T.changeling) + if(T.changeling.absorbed_dna) + usr.changeling.absorbed_dna |= T.changeling.absorbed_dna //steal all their loot + T.changeling.absorbed_dna = list() + T.changeling.absorbed_dna[T.real_name] = T.dna + usr.changeling.chem_charges += T.changeling.chem_charges + T.changeling.chem_charges = 0 T.death(0) T.real_name = "Unknown" @@ -114,28 +131,33 @@ /client/proc/changeling_transform() set category = "Changeling" set name = "Transform (5)" + + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + if(usr.stat) usr << "\red Not when we are incapacitated." return - if (usr.absorbed_dna.len <= 0) + if (usr.changeling.absorbed_dna.len <= 0) usr << "\red We have not yet absorbed any compatible DNA." return - if(usr.chem_charges < 5) + if(usr.changeling.chem_charges < 5) usr << "\red We don't have enough stored chemicals to do that!" return - var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna + var/S = input("Select the target DNA: ", "Target DNA", null) in usr.changeling.absorbed_dna if (S == null) return - usr.chem_charges -= 5 + usr.changeling.chem_charges -= 5 usr.visible_message(text("\red [usr] transforms!")) - usr.dna = usr.absorbed_dna[S] + usr.dna = usr.changeling.absorbed_dna[S] usr.real_name = S updateappearance(usr, usr.dna.uni_identity) domutcheck(usr, null) @@ -151,15 +173,19 @@ set category = "Changeling" set name = "Lesser Form (1)" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + if(usr.stat) usr << "\red Not when we are incapacitated." return - if(usr.chem_charges < 1) + if(usr.changeling.chem_charges < 1) usr << "\red We don't have enough stored chemicals to do that!" return - usr.chem_charges-- + usr.changeling.chem_charges-- usr.remove_changeling_powers() @@ -189,7 +215,7 @@ var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey(src) O.dna = usr.dna usr.dna = null - O.absorbed_dna = usr.absorbed_dna + O.changeling = usr.changeling for(var/obj/T in usr) del(T) @@ -222,30 +248,34 @@ set category = "Changeling" set name = "Transform (1)" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + if(usr.stat) usr << "\red Not when we are incapacitated." return - if (usr.absorbed_dna.len <= 0) + if (usr.changeling.absorbed_dna.len <= 0) usr << "\red We have not yet absorbed any compatible DNA." return - if(usr.chem_charges < 1) + if(usr.changeling.chem_charges < 1) usr << "\red We don't have enough stored chemicals to do that!" return - var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna + var/S = input("Select the target DNA: ", "Target DNA", null) in usr.changeling.absorbed_dna if (S == null) return - usr.chem_charges -= 1 + usr.changeling.chem_charges -= 1 usr.remove_changeling_powers() usr.visible_message(text("\red [usr] transforms!")) - usr.dna = usr.absorbed_dna[S] + usr.dna = usr.changeling.absorbed_dna[S] var/list/implants = list() for (var/obj/item/weapon/implant/I in usr) //Still preserving implants @@ -280,7 +310,7 @@ O.gender = MALE O.dna = usr.dna usr.dna = null - O.absorbed_dna = usr.absorbed_dna + O.changeling = usr.changeling O.real_name = S for(var/obj/T in usr) @@ -312,21 +342,25 @@ set category = "Changeling" set name = "Regenerative Stasis (20)" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + if(usr.stat == 2) usr << "\red We are dead." return - if(usr.chem_charges < 20) + if(usr.changeling.chem_charges < 20) usr << "\red We don't have enough stored chemicals to do that!" return - usr.chem_charges -= 20 + usr.changeling.chem_charges -= 20 usr << "\blue We will regenerate our form." usr.lying = 1 usr.canmove = 0 - usr.changeling_fakedeath = 1 + usr.changeling.changeling_fakedeath = 1 usr.remove_changeling_powers() usr.emote("gasp") @@ -351,10 +385,10 @@ usr << "\blue We have regenerated." usr.visible_message(text("\red [usr] appears to wake from the dead, having healed all wounds.")) - usr.changeling_fakedeath = 0 - if (usr.changeling_level == 1) + usr.changeling.changeling_fakedeath = 0 + if (usr.changeling.changeling_level == 1) usr.make_lesser_changeling() - else if (usr.changeling_level == 2) + else if (usr.changeling.changeling_level == 2) usr.make_changeling() return @@ -364,18 +398,22 @@ set name = "Ranged Sting (10)" set desc="Your next sting ability can be used against targets 3 squares away." + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + if(usr.stat) usr << "\red Not when we are incapacitated." return - if(usr.chem_charges < 10) + if(usr.changeling.chem_charges < 10) usr << "\red We don't have enough stored chemicals to do that!" return - usr.chem_charges -= 10 + usr.changeling.chem_charges -= 10 usr << "\blue Your throat adjusts to launch the sting." - usr.sting_range = 3 + usr.changeling.sting_range = 3 usr.verbs -= /client/proc/changeling_boost_range @@ -389,8 +427,12 @@ set name = "Silence sting (10)" set desc="Sting target" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + var/list/victims = list() - for(var/mob/living/carbon/C in oview(usr:sting_range)) + for(var/mob/living/carbon/C in oview(usr.changeling.sting_range)) victims += C var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims if(T) @@ -399,17 +441,20 @@ usr << "\red Not when we are incapacitated." return - if(usr.chem_charges < 10) + if(usr.changeling.chem_charges < 10) usr << "\red We don't have enough stored chemicals to do that!" return - usr.chem_charges -= 10 - usr.sting_range = 1 + usr.changeling.chem_charges -= 10 + usr.changeling.sting_range = 1 usr << "\blue We stealthily sting [T]." - T << "You feel a small prick and a burning sensation in your throat." - T.silent += 30 + if(!T.changeling) + T << "You feel a small prick and a burning sensation in your throat." + T.silent += 30 + else + T << "You feel a small prick." usr.verbs -= /client/proc/changeling_silence_sting @@ -423,8 +468,12 @@ set name = "Blind sting (20)" set desc="Sting target" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + var/list/victims = list() - for(var/mob/living/carbon/C in oview(usr.sting_range)) + for(var/mob/living/carbon/C in oview(usr.changeling.sting_range)) victims += C var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims if(T) @@ -432,12 +481,12 @@ usr << "\red Not when we are incapacitated." return - if(usr.chem_charges < 20) + if(usr.changeling.chem_charges < 20) usr << "\red We don't have enough stored chemicals to do that!" return - usr.chem_charges -= 20 - usr.sting_range = 1 + usr.changeling.chem_charges -= 20 + usr.changeling.sting_range = 1 usr << "\blue We stealthily sting [T]." @@ -452,12 +501,14 @@ spawn(5) del(B) T.canmove = 1 - T << text("\blue Your eyes cry out in pain!") - T.disabilities |= 1 - spawn(300) - T.disabilities &= ~1 - T.eye_blind = 10 - T.eye_blurry = 20 + + if(!T.changeling) + T << text("\blue Your eyes cry out in pain!") + T.disabilities |= 1 + spawn(300) + T.disabilities &= ~1 + T.eye_blind = 10 + T.eye_blurry = 20 usr.verbs -= /client/proc/changeling_blind_sting @@ -471,8 +522,12 @@ set name = "Deaf sting (5)" set desc="Sting target:" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + var/list/victims = list() - for(var/mob/living/carbon/C in oview(usr.sting_range)) + for(var/mob/living/carbon/C in oview(usr.changeling.sting_range)) victims += C var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims @@ -481,18 +536,19 @@ usr << "\red Not when we are incapacitated." return - if(usr.chem_charges < 5) + if(usr.changeling.chem_charges < 5) usr << "\red We don't have enough stored chemicals to do that!" return - usr.chem_charges -= 5 - usr.sting_range = 1 + usr.changeling.chem_charges -= 5 + usr.changeling.sting_range = 1 usr << "\blue We stealthily sting [T]." - T.sdisabilities |= 4 - spawn(300) - T.sdisabilities &= ~4 + if(!T.changeling) + T.sdisabilities |= 4 + spawn(300) + T.sdisabilities &= ~4 usr.verbs -= /client/proc/changeling_deaf_sting @@ -506,8 +562,12 @@ set name = "Paralysis sting (30)" set desc="Sting target" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + var/list/victims = list() - for(var/mob/living/carbon/C in oview(usr.sting_range)) + for(var/mob/living/carbon/C in oview(usr.changeling.sting_range)) victims += C var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims @@ -517,18 +577,22 @@ usr << "\red Not when we are incapacitated." return - if(usr.chem_charges < 30) + if(usr.changeling.chem_charges < 30) usr << "\red We don't have enough stored chemicals to do that!" return - usr.chem_charges -= 30 - usr.sting_range = 1 + usr.changeling.chem_charges -= 30 + usr.changeling.sting_range = 1 usr << "\blue We stealthily sting [T]." - T << "You feel a small prick and a burning sensation." - if (T.reagents) - T.reagents.add_reagent("zombiepowder", 20) + if(!T.changeling) + T << "You feel a small prick and a burning sensation." + + if (T.reagents) + T.reagents.add_reagent("zombiepowder", 20) + else + T << "You feel a small prick." usr.verbs -= /client/proc/changeling_paralysis_sting @@ -542,8 +606,12 @@ set name = "Transformation sting (30)" set desc="Sting target" + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + var/list/victims = list() - for(var/mob/living/carbon/C in oview(usr.sting_range)) + for(var/mob/living/carbon/C in oview(usr.changeling.sting_range)) victims += C var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims @@ -552,7 +620,7 @@ usr << "\red Not when we are incapacitated." return - if(usr.chem_charges < 30) + if(usr.changeling.chem_charges < 30) usr << "\red We don't have enough stored chemicals to do that!" return @@ -560,22 +628,23 @@ usr << "\red We can't transform that target!" return - var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna + var/S = input("Select the target DNA: ", "Target DNA", null) in usr.changeling.absorbed_dna if (S == null) return - usr.chem_charges -= 30 - usr.sting_range = 1 + usr.changeling.chem_charges -= 30 + usr.changeling.sting_range = 1 usr << "\blue We stealthily sting [T]." - T.visible_message(text("\red [T] transforms!")) + if(!T.changeling) + T.visible_message(text("\red [T] transforms!")) - T.dna = usr.absorbed_dna[S] - T.real_name = S - updateappearance(T, T.dna.uni_identity) - domutcheck(T, null) + T.dna = usr.changeling.absorbed_dna[S] + T.real_name = S + updateappearance(T, T.dna.uni_identity) + domutcheck(T, null) usr.verbs -= /client/proc/changeling_transformation_sting diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 7ce7bc636ef..bb18d81e40e 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -428,7 +428,7 @@ datum/objective/absorb return target_amount check_completion() - if(owner && owner.current && owner.current.absorbed_dna && ((owner.current.absorbed_dna.len - 1) >= target_amount)) + if(owner && owner.current && owner.current.changeling && owner.current.changeling.absorbed_dna && ((owner.current.changeling.absorbed_dna.len - 1) >= target_amount)) return 1 else return 0 diff --git a/code/game/gamemodes/wizard/spells.dm b/code/game/gamemodes/wizard/spells.dm index 7742a335955..551e5684ab2 100644 --- a/code/game/gamemodes/wizard/spells.dm +++ b/code/game/gamemodes/wizard/spells.dm @@ -5,10 +5,7 @@ set name = "Blind" set desc = "This spell temporarly blinds a single person and does not require wizard garb." - var/list/victims = list() - for(var/mob/living/carbon/C in oview(usr.sting_range)) - victims += C - var/mob/M = input(usr, "Who do you wish to sting?") as null | anything in victims + var/mob/M = input(usr, "Who do you wish to blind?") as mob in oview() if(M) if(usr.stat) diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm index 131e81c83d5..72e705fc250 100644 --- a/code/game/objects/devices/scanners.dm +++ b/code/game/objects/devices/scanners.dm @@ -194,7 +194,7 @@ MASS SPECTROMETER O.show_message(text("\red [] has analyzed []'s vitals!", user, M), 1) //Foreach goto(67) var/fake_oxy = max(rand(1,40), M.oxyloss, (300 - (M.toxloss + M.fireloss + M.bruteloss))) - if(M.changeling_fakedeath || M.reagents && M.reagents.has_reagent("zombiepowder")) + if((M.reagents && M.reagents.has_reagent("zombiepowder")) || (M.changeling && M.changeling.changeling_fakedeath)) user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1) user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.toxloss > 50 ? "\red [M.toxloss]" : M.toxloss, M.fireloss > 50 ? "\red[M.fireloss]" : M.fireloss, M.bruteloss > 50 ? "\red[M.bruteloss]" : M.bruteloss), 1) else @@ -202,7 +202,7 @@ MASS SPECTROMETER user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.oxyloss > 50 ? "\red [M.oxyloss]" : M.oxyloss, M.toxloss > 50 ? "\red [M.toxloss]" : M.toxloss, M.fireloss > 50 ? "\red[M.fireloss]" : M.fireloss, M.bruteloss > 50 ? "\red[M.bruteloss]" : M.bruteloss), 1) user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - if(M.changeling_fakedeath || M.reagents && M.reagents.has_reagent("zombiepowder")) + if((M.changeling && M.changeling.changeling_fakedeath) || (M.reagents && M.reagents.has_reagent("zombiepowder"))) user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.toxloss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.fireloss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.bruteloss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) else user.show_message(text("\blue [] | [] | [] | []", M.oxyloss > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.toxloss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.fireloss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.bruteloss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 268e021ef79..3f256136b23 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1620,7 +1620,7 @@ dat += "Monkey" if(istype(M, /mob/living/carbon/alien)) dat += "Alien" - dat += {"[M.client]" : "No client")] + dat += {"[M.client?"[M.client]":"No client"] X PM "} @@ -1665,7 +1665,7 @@ dat += "Monkey" if(isalien(M)) dat += "Alien" - dat += {"[(M.client ? "[M.client]" : "No client")] + dat += {"[(M.client ? "[M.client]" : "No client")] X PM "} diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2285f18bfcc..865e94fe9d2 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -106,7 +106,7 @@ if(100 to 200) usr << "\red [src] is twitching ever so slightly." - if (src.stat == 2 || src.changeling_fakedeath == 1) + if (src.stat == 2 || (changeling && changeling.changeling_fakedeath == 1)) usr << "\red [src] is limp and unresponsive, a dull lifeless look in [t_his] eyes." else if (src.bruteloss) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 746066ccec7..741f0e01eb8 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -187,8 +187,8 @@ stat("Tank Pressure", internal.air_contents.return_pressure()) stat("Distribution Pressure", internal.distribute_pressure) if (mind) - if (mind.special_role == "Changeling") - stat("Chemical Storage", chem_charges) + if (mind.special_role == "Changeling" && changeling) + stat("Chemical Storage", changeling.chem_charges) if (istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_initialized) stat("Energy Charge", round(wear_suit:cell:charge/100)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 10881a3c3b4..4e4714eadbf 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -290,7 +290,7 @@ return null update_canmove() - if(paralysis || stunned || weakened || buckled || changeling_fakedeath) canmove = 0 + if(paralysis || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0 else canmove = 1 handle_breath(datum/gas_mixture/breath) @@ -685,7 +685,7 @@ if (silent) silent-- - if (paralysis || stunned || weakened || changeling_fakedeath) //Stunned etc. + if (paralysis || stunned || weakened || (changeling && changeling.changeling_fakedeath)) //Stunned etc. if (stunned > 0) stunned-- stat = 0 @@ -1021,8 +1021,8 @@ handle_changeling() if (mind) - if (mind.special_role == "Changeling") - chem_charges = between(0, (max((0.9 - (chem_charges / 50)), 0.1) + chem_charges), 50) + if (mind.special_role == "Changeling" && changeling) + changeling.chem_charges = between(0, (max((0.9 - (changeling.chem_charges / 50)), 0.1) + changeling.chem_charges), 50) /* diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 6e9c0f64f01..afb0461e7a2 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -432,7 +432,7 @@ src.stat = 2 else - if (src.paralysis || src.stunned || src.weakened || changeling_fakedeath) //Stunned etc. + if (src.paralysis || src.stunned || src.weakened || (changeling && changeling.changeling_fakedeath)) //Stunned etc. if (src.stunned > 0) src.stunned = 0 src.stat = 0 diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 249a33b4dcf..e91ff943212 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -246,7 +246,7 @@ return null update_canmove() - if(paralysis || stunned || weakened || buckled || changeling_fakedeath) canmove = 0 + if(paralysis || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0 else canmove = 1 handle_breath(datum/gas_mixture/breath) @@ -420,7 +420,7 @@ if (src.stat != 2) //Alive. - if (src.paralysis || src.stunned || src.weakened || changeling_fakedeath) //Stunned etc. + if (src.paralysis || src.stunned || src.weakened || (changeling && changeling.changeling_fakedeath)) //Stunned etc. if (src.stunned > 0) src.stunned-- src.stat = 0 @@ -608,5 +608,5 @@ handle_changeling() if (mind) - if (mind.special_role == "Changeling") - src.chem_charges = between(0, (max((0.9 - (chem_charges / 50)), 0.1) + chem_charges), 50) \ No newline at end of file + if (mind.special_role == "Changeling" && changeling) + changeling.chem_charges = between(0, (max((0.9 - (changeling.chem_charges / 50)), 0.1) + changeling.chem_charges), 50) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index e2626cd8058..11d2b8ed631 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -461,8 +461,8 @@ stat(null, text("Move Mode: []", m_intent)) if(client && mind) if (client.statpanel == "Status") - if (mind.special_role == "Changeling") - stat("Chemical Storage", chem_charges) + if (mind.special_role == "Changeling" && changeling) + stat("Chemical Storage", changeling.chem_charges) return /mob/living/carbon/monkey/update_clothing() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 6f2aa0e8ebd..5cab9cd57a7 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -86,6 +86,7 @@ ":t" = "Syndicate", ":d" = "Mining", ":q" = "Cargo", + ":g" = "changeling", //kinda localization -- rastaf0 //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. @@ -104,6 +105,7 @@ ":å" = "Syndicate", ":â" = "Mining", ":é" = "Cargo", + ":ï" = "changeling", ) message_mode = keys[channel_prefix] @@ -145,6 +147,7 @@ message += "Z" */ var/list/obj/item/used_radios = new + switch (message_mode) if ("headset") if (src:ears) @@ -215,7 +218,13 @@ used_radios += src:radio message_range = 1 italics = 1 -/////SPECIAL HEADSETS START + if("changeling") + if(src.changeling) + for(var/mob/living/carbon/aChangeling in world) + if(aChangeling.changeling) + aChangeling << "[gender=="male"?"Mr.":"Mrs."] [changeling.changelingID]: [message]" + return +////SPECIAL HEADSETS START else //world << "SPECIAL HEADSETS" if (message_mode in radiochannels)