From 2620f4e365deb42d08cf127850cd57ee565d252e Mon Sep 17 00:00:00 2001 From: uraniummeltdown Date: Fri, 3 Feb 2017 22:26:20 +0400 Subject: [PATCH] adds hivemind link to changelings, allows them to give a victim in > neckgrab hivemind comms for 3 minutes --- code/datums/mind.dm | 59 +++++++----- code/game/gamemodes/changeling/changeling.dm | 33 +++---- .../gamemodes/changeling/powers/linglink.dm | 73 +++++++++++++++ code/modules/mob/language.dm | 92 +++++++++---------- paradise.dme | 1 + 5 files changed, 169 insertions(+), 89 deletions(-) create mode 100644 code/game/gamemodes/changeling/powers/linglink.dm diff --git a/code/datums/mind.dm b/code/datums/mind.dm index fcf1ded97cc..be744b53c34 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -56,6 +56,7 @@ var/miming = 0 // Mime's vow of silence var/datum/faction/faction //associated faction var/datum/changeling/changeling //changeling holder + var/linglink var/datum/vampire/vampire //vampire holder var/datum/nations/nation //nation holder var/datum/abductor/abductor //abductor holder @@ -149,7 +150,7 @@ ) var/text = "" var/mob/living/carbon/human/H = current - if(istype(current, /mob/living/carbon/human)) + if(ishuman(current)) /** Impanted**/ if(isloyal(H)) text = "Mindshield Implant:Remove|Implanted
" @@ -369,7 +370,7 @@ /** SILICON ***/ - if(istype(current, /mob/living/silicon)) + if(issilicon(current)) text = "silicon" var/mob/living/silicon/robot/robot = current if(istype(robot) && robot.emagged) @@ -409,7 +410,7 @@ if(((src in ticker.mode.head_revolutionaries) || \ (src in ticker.mode.traitors) || \ (src in ticker.mode.syndicates)) && \ - istype(current,/mob/living/carbon/human) ) + ishuman(current) ) text = "Uplink: give" var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() @@ -445,18 +446,21 @@ usr << browse(out, "window=edit_memory[src];size=400x500") /datum/mind/Topic(href, href_list) - if(!check_rights(R_ADMIN)) return + if(!check_rights(R_ADMIN)) + return if(href_list["role_edit"]) var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in joblist - if(!new_role) return + if(!new_role) + return assigned_role = new_role log_admin("[key_name(usr)] has changed [key_name(current)]'s assigned role to [assigned_role]") message_admins("[key_name_admin(usr)] has changed [key_name_admin(current)]'s assigned role to [assigned_role]") else if(href_list["memory_edit"]) var/new_memo = copytext(input("Write new memory", "Memory", memory) as null|message,1,MAX_MESSAGE_LEN) - if(isnull(new_memo)) return + if(isnull(new_memo)) + return memory = new_memo log_admin("[key_name(usr)] has edited [key_name(current)]'s memory") message_admins("[key_name_admin(usr)] has edited [key_name_admin(current)]'s memory") @@ -468,7 +472,8 @@ if(href_list["obj_edit"]) objective = locate(href_list["obj_edit"]) - if(!objective) return + if(!objective) + return objective_pos = objectives.Find(objective) //Text strings are easy to manipulate. Revised for simplicity. @@ -478,7 +483,8 @@ def_value = "custom" var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "destroy", "maroon", "identity theft", "custom") - if(!new_obj_type) return + if(!new_obj_type) + return var/datum/objective/new_objective = null @@ -500,7 +506,8 @@ def_target = objective:target.current var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets - if(!new_target) return + if(!new_target) + return var/objective_path = text2path("/datum/objective/[new_obj_type]") if(new_target == "Free objective") @@ -588,7 +595,7 @@ if("identity theft") var/list/possible_targets = list("Free objective") for(var/datum/mind/possible_target in ticker.minds) - if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) + if((possible_target != src) && ishuman(possible_target.current)) possible_targets += possible_target var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets @@ -604,12 +611,14 @@ new_objective.explanation_text = "Escape on the shuttle or an escape pod with the identity of [targ.current.real_name], the [targ.assigned_role] while wearing their identification card." if("custom") var/expl = sanitize(copytext(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null,1,MAX_MESSAGE_LEN)) - if(!expl) return + if(!expl) + return new_objective = new /datum/objective new_objective.owner = src new_objective.explanation_text = expl - if(!new_objective) return + if(!new_objective) + return if(objective) objectives -= objective @@ -622,7 +631,8 @@ else if(href_list["obj_delete"]) var/datum/objective/objective = locate(href_list["obj_delete"]) - if(!istype(objective)) return + if(!istype(objective)) + return objectives -= objective log_admin("[key_name(usr)] has removed one of [key_name(current)]'s objectives: [objective]") @@ -630,7 +640,8 @@ else if(href_list["obj_completed"]) var/datum/objective/objective = locate(href_list["obj_completed"]) - if(!istype(objective)) return + if(!istype(objective)) + return objective.completed = !objective.completed log_admin("[key_name(usr)] has toggled the completion of one of [key_name(current)]'s objectives") @@ -893,7 +904,7 @@ message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") if("initialdna") - if( !changeling || !changeling.absorbed_dna.len ) + if(!changeling || !changeling.absorbed_dna.len) to_chat(usr, "\red Resetting DNA failed!") else current.dna = changeling.absorbed_dna[1] @@ -924,7 +935,7 @@ ticker.mode.update_vampire_icons_added(src) var/datum/mindslaves/slaved = new() slaved.masters += src - src.som = slaved //we MIGT want to mindslave someone + som = slaved //we MIGT want to mindslave someone special_role = SPECIAL_ROLE_VAMPIRE to_chat(current, "Your powers are awoken. Your lust for blood grows... You are a Vampire!") log_admin("[key_name(usr)] has vampired [key_name(current)]") @@ -1033,7 +1044,7 @@ ticker.mode.traitors += src var/datum/mindslaves/slaved = new() slaved.masters += src - src.som = slaved //we MIGT want to mindslave someone + som = slaved //we MIGT want to mindslave someone special_role = SPECIAL_ROLE_TRAITOR to_chat(current, "You are a traitor!") log_admin("[key_name(usr)] has traitored [key_name(current)]") @@ -1130,7 +1141,7 @@ message_admins("[key_name_admin(usr)] has un-emagged [key_name_admin(current)]") if("unemagcyborgs") - if(istype(current, /mob/living/silicon/ai)) + if(isAI(current)) var/mob/living/silicon/ai/ai = current for(var/mob/living/silicon/robot/R in ai.connected_robots) R.emagged = 0 @@ -1324,7 +1335,7 @@ var/explanation = "Summon [ticker.mode.cultdat.entity_name] via the use of the appropriate rune. It will only work if nine cultists stand on and around it." to_chat(current, "Objective #1: [explanation]") current.memory += "Objective #1: [explanation]
" - + var/mob/living/carbon/human/H = current if(istype(H)) @@ -1453,13 +1464,13 @@ qdel(S) spell_list -= S -/datum/mind/proc/transfer_actions(var/mob/living/new_character) +/datum/mind/proc/transfer_actions(mob/living/new_character) if(current && current.actions) for(var/datum/action/A in current.actions) A.Grant(new_character) transfer_mindbound_actions(new_character) -/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) +/datum/mind/proc/transfer_mindbound_actions(mob/living/new_character) for(var/X in spell_list) var/obj/effect/proc_holder/spell/S = X S.action.Grant(new_character) @@ -1553,13 +1564,15 @@ ticker.minds += mind else error("mind_initialize(): No ticker ready yet! Please inform Carn") - if(!mind.name) mind.name = real_name + if(!mind.name) + mind.name = real_name mind.current = src //HUMAN /mob/living/carbon/human/mind_initialize() ..() - if(!mind.assigned_role) mind.assigned_role = "Civilian" //defualt + if(!mind.assigned_role) + mind.assigned_role = "Civilian" //defualt /mob/proc/sync_mind() mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index c25802d38fc..1e67760322c 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -3,7 +3,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode var/list/datum/mind/changelings = list() - /datum/game_mode/changeling name = "changeling" config_tag = "changeling" @@ -38,7 +37,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" to_chat(world, "There are alien changelings on the station. Do not let the changelings succeed!") /datum/game_mode/changeling/pre_setup() - if(config.protect_roles_from_antagonist) restricted_jobs += protected_jobs @@ -69,8 +67,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" ..() - -/datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling) +/datum/game_mode/proc/forge_changeling_objectives(datum/mind/changeling) //OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives. //If they have two objectives as well as absorb, they must survive rather than escape //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting @@ -129,7 +126,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" changeling.objectives += identity_theft return -/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1) +/datum/game_mode/proc/greet_changeling(datum/mind/changeling, you_are=1) if(you_are) to_chat(changeling.current, "You are a changeling!") to_chat(changeling.current, "Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them.") @@ -145,8 +142,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" obj_count++ return - - /datum/game_mode/proc/remove_changeling(datum/mind/changeling_mind) if(changeling_mind in changelings) changelings -= changeling_mind @@ -171,7 +166,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" set_antag_hud(changeling.current, null) /datum/game_mode/proc/grant_changeling_powers(mob/living/carbon/changeling_mob) - if(!istype(changeling_mob)) return + if(!istype(changeling_mob)) + return changeling_mob.make_changeling() /datum/game_mode/proc/auto_declare_completion_changeling() @@ -218,7 +214,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" to_chat(world, text) - return 1 /datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind) @@ -235,6 +230,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/changelingID = "Changeling" var/geneticdamage = 0 var/isabsorbing = 0 + var/islinking = 0 var/geneticpoints = 10 var/purchasedpowers = list() var/mimicing = "" @@ -243,11 +239,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/datum/dna/chosen_dna var/obj/effect/proc_holder/changeling/sting/chosen_sting -/datum/changeling/New(var/gender=FEMALE) +/datum/changeling/New(gender=FEMALE) ..() var/honorific - if(gender == FEMALE) honorific = "Ms." - else honorific = "Mr." + if(gender == FEMALE) + honorific = "Ms." + else + honorific = "Mr." if(possible_changeling_IDs.len) changelingID = pick(possible_changeling_IDs) possible_changeling_IDs -= changelingID @@ -259,25 +257,24 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage) geneticdamage = max(0, geneticdamage-1) - -/datum/changeling/proc/GetDNA(var/dna_owner) +/datum/changeling/proc/GetDNA(dna_owner) for(var/datum/dna/DNA in (absorbed_dna + protected_dna)) if(dna_owner == DNA.real_name) return DNA -/datum/changeling/proc/find_dna(var/datum/dna/tDNA) +/datum/changeling/proc/find_dna(datum/dna/tDNA) for(var/datum/dna/D in (absorbed_dna + protected_dna)) if(tDNA.unique_enzymes == D.unique_enzymes && tDNA.uni_identity == D.uni_identity && tDNA.species == D.species) return D return null -/datum/changeling/proc/has_dna(var/datum/dna/tDNA) +/datum/changeling/proc/has_dna(datum/dna/tDNA) if(find_dna(tDNA)) return 1 return 0 // A changeling's DNA is "stale" if their current form's DNA is the oldest DNA in a full list -/datum/changeling/proc/using_stale_dna(var/mob/living/carbon/user) +/datum/changeling/proc/using_stale_dna(mob/living/carbon/user) var/current_dna = find_dna(user.dna) if(absorbed_dna.len < dna_max) return 0 // Still more room for DNA @@ -292,7 +289,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" if(absorbed_dna.len > dna_max) absorbed_dna.Cut(1, (absorbed_dna.len - dna_max) + 1) -/datum/changeling/proc/can_absorb_dna(var/mob/living/carbon/user, var/mob/living/carbon/target) +/datum/changeling/proc/can_absorb_dna(mob/living/carbon/user, mob/living/carbon/target) if(using_stale_dna(user))//If our current DNA is the stalest, we gotta ditch it. to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") return diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm new file mode 100644 index 00000000000..7c198f5e6af --- /dev/null +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -0,0 +1,73 @@ +/obj/effect/proc_holder/changeling/linglink + name = "Hivemind Link" + desc = "Link your victim's mind into the hivemind for personal interrogation" + chemical_cost = 0 + dna_cost = 0 + req_human = 1 + max_genetic_damage = 100 + +/obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user) + if(!..()) + return + var/datum/changeling/changeling = user.mind.changeling + var/obj/item/weapon/grab/G = user.get_active_hand() + + if(changeling.islinking) + to_chat(user, "We have already formed a link with the victim!") + return + if(!istype(G)) + to_chat(user, "We must be tightly grabbing a creature in our active hand to link with them!") + return + if(G.state <= GRAB_AGGRESSIVE) + to_chat(user, "We must have a tighter grip to link with this creature!") + return + if(iscarbon(G.affecting)) + var/mob/living/carbon/target = G.affecting + if(!target.mind) + to_chat(user, "The victim has no mind to link to!") + return + if(target.stat == DEAD) + to_chat(user, "The victim is dead, you cannot link to a dead mind!") + return + if(target.mind.changeling) + to_chat(user, "The victim is already a part of the hivemind!") + return + return changeling.can_absorb_dna(user,target) + +/obj/effect/proc_holder/changeling/linglink/sting_action(mob/user) + var/datum/changeling/changeling = user.mind.changeling + var/obj/item/weapon/grab/G = user.get_active_hand() + var/mob/living/carbon/target = G.affecting + changeling.islinking = 1 + for(var/stage = 1, stage<=3, stage++) + switch(stage) + if(1) + to_chat(user, "This creature is compatible. We must hold still...") + if(2) + to_chat(user, "We stealthily stab [target] with a minor proboscis...") + to_chat(target, "You experience a stabbing sensation and your ears begin to ring...") + if(3) + to_chat(user, "You mold the [target]'s mind like clay, they can now speak in the hivemind!") + to_chat(target, "A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!") + for(var/mob/M in mob_list) + if(all_languages["Changeling"] in M.languages) + to_chat(M, "We can sense a foreign presence in the hivemind...") + target.mind.linglink = 1 + target.add_language("Changeling") + target.say(":g AAAAARRRRGGGGGHHHHH!!") + to_chat(target, "You can now communicate in the changeling hivemind, say \":g message\" to communicate!") + target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them + sleep(1800) + feedback_add_details("changeling_powers","A[stage]") + if(!do_mob(user, target, 20)) + to_chat(user, "Our link with [target] has ended!") + target.remove_language("Changeling") + changeling.islinking = 0 + target.mind.linglink = 0 + return + + target.remove_language("Changeling") + changeling.islinking = 0 + target.mind.linglink = 0 + to_chat(user, "You cannot sustain the connection any longer, your victim fades from the hivemind") + to_chat(target, "The link cannot be sustained any longer, your connection to the hivemind has faded!") diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index be101742dfa..2b495f02062 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -22,7 +22,7 @@ var/english_names = 0 // Do we want English names by default, no matter what? var/list/scramble_cache = list() -/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4) +/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4) if(!syllables || !syllables.len || english_names) if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) @@ -40,7 +40,7 @@ return "[trim(full_name)]" -/datum/language/proc/scramble(var/input) +/datum/language/proc/scramble(input) if(!syllables || !syllables.len) return stars(input) @@ -95,10 +95,11 @@ // if you yell, you'll be heard from two tiles over instead of one return (copytext(message, length(message)) == "!") ? 2 : 1 -/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask) log_say("[key_name(speaker)]: ([name]) [message]") - if(!speaker_mask) speaker_mask = speaker.name + if(!speaker_mask) + speaker_mask = speaker.name var/msg = "[name], [speaker_mask] [format_message(message, get_spoken_verb(message))]" for(var/mob/player in player_list) @@ -110,10 +111,10 @@ else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player, speaker))) to_chat(player, msg) -/datum/language/proc/check_special_condition(var/mob/other, var/mob/living/speaker) - return 1 +/datum/language/proc/check_special_condition(mob/other, mob/living/speaker) + return TRUE -/datum/language/proc/get_spoken_verb(var/msg_end) +/datum/language/proc/get_spoken_verb(msg_end) switch(msg_end) if("!") return exclaim_verb @@ -170,8 +171,7 @@ "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \ "hal","ket","jurl","mah","tul","cresh","azu","ragh") -/datum/language/tajaran/get_random_name(var/gender) - +/datum/language/tajaran/get_random_name(gender) var/new_name = ..(gender,1) if(prob(80)) new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]" @@ -286,13 +286,13 @@ key = "^" flags = RESTRICTED | HIVEMIND -/datum/language/grey/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) -/datum/language/grey/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker) +/datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) if(other in range(7, speaker)) - return 1 - return 0 + return TRUE + return FALSE /datum/language/drask name = "Orluum" @@ -322,7 +322,7 @@ english_names = 1 //TODO flag certain languages to use the mob-type specific say_quote and then get rid of these. -/datum/language/common/get_spoken_verb(var/msg_end) +/datum/language/common/get_spoken_verb(msg_end) switch(msg_end) if("!") return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs. @@ -341,7 +341,7 @@ syllables = list("tao","shi","tzu","yi","com","be","is","i","op","vi","ed","lec","mo","cle","te","dis","e") english_names = 1 -/datum/language/human/get_spoken_verb(var/msg_end) +/datum/language/human/get_spoken_verb(msg_end) switch(msg_end) if("!") return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs. @@ -396,15 +396,14 @@ key = "y" flags = RESTRICTED | HIVEMIND -/datum/language/wryn/check_special_condition(var/mob/other) - +/datum/language/wryn/check_special_condition(mob/other) var/mob/living/carbon/M = other if(!istype(M)) - return 1 + return TRUE if(locate(/obj/item/organ/internal/wryn/hivenode) in M.internal_organs) - return 1 + return TRUE - return 0 + return FALSE /datum/language/xenocommon name = "Xenomorph" @@ -428,7 +427,6 @@ flags = RESTRICTED | HIVEMIND follow = 1 - /datum/language/terrorspider name = "Spider Hivemind" desc = "Terror spiders have a limited ability to commune over a psychic hivemind, similar to xenomorphs." @@ -440,7 +438,6 @@ flags = RESTRICTED | HIVEMIND follow = 1 - /datum/language/ling name = "Changeling" desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance." @@ -449,6 +446,14 @@ key = "g" flags = RESTRICTED | HIVEMIND +/datum/language/ling/broadcast(mob/living/speaker, message, speaker_mask) + if(speaker.mind && speaker.mind.changeling) + ..(speaker,message,speaker.mind.changeling.changelingID) + else if(speaker.mind && speaker.mind.linglink) + ..() + else + ..(speaker,message) + /datum/language/shadowling name = "Shadowling Hivemind" desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind." @@ -457,20 +462,12 @@ key = "8" flags = RESTRICTED | HIVEMIND - -/datum/language/shadowling/broadcast(var/mob/living/speaker, var/message, var/speaker_mask) +/datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask) if(speaker.mind && speaker.mind.special_role) ..(speaker, message, "([speaker.mind.special_role]) [speaker]") else ..(speaker, message) -/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) - - if(speaker.mind && speaker.mind.changeling) - ..(speaker,message,speaker.mind.changeling.changelingID) - else - ..(speaker,message) - /datum/language/abductor name = "Abductor Mindlink" desc = "Abductors are incapable of speech, but have a psychic link attuned to their own team." @@ -481,14 +478,14 @@ key = "zw" //doesn't matter, this is their default and only language flags = RESTRICTED | HIVEMIND -/datum/language/abductor/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/abductor/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) -/datum/language/abductor/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker) +/datum/language/abductor/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) if(other.mind && other.mind.abductor) if(other.mind.abductor.team == speaker.mind.abductor.team) - return 1 - return 0 + return TRUE + return FALSE /datum/language/corticalborer name = "Cortical Link" @@ -500,11 +497,11 @@ key = "x" flags = RESTRICTED | HIVEMIND -/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/corticalborer/broadcast(mob/living/speaker, message, speaker_mask) var/mob/living/simple_animal/borer/B - if(istype(speaker,/mob/living/carbon)) + if(iscarbon(speaker)) var/mob/living/carbon/M = speaker B = M.has_brain_worms() else if(istype(speaker,/mob/living/simple_animal/borer)) @@ -526,7 +523,7 @@ follow = 1 var/drone_only -/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) +/datum/language/binary/broadcast(mob/living/speaker, message, speaker_mask) if(!speaker.binarycheck()) return @@ -538,15 +535,14 @@ var/message_body = "[speaker.say_quote(message)], \"[message]\"" for(var/mob/M in dead_mob_list) - if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) + if(!isnewplayer(M) && !isbrain(M)) var/message_start_dead = "[name], [speaker.name] ([ghost_follow_link(speaker, ghost=M)])" M.show_message("[message_start_dead] [message_body]", 2) for(var/mob/living/S in living_mob_list) - if(drone_only && !istype(S,/mob/living/silicon/robot/drone)) continue - else if(istype(S , /mob/living/silicon/ai)) + else if(isAI(S)) message_start = "[name], [speaker.name]" else if(!S.binarycheck()) continue @@ -557,7 +553,7 @@ listening -= src for(var/mob/living/M in listening) - if(istype(M, /mob/living/silicon) || M.binarycheck()) + if(issilicon(M) || M.binarycheck()) continue M.show_message("synthesised voice beeps, \"beep beep beep\"",2) @@ -596,17 +592,17 @@ follow = 1 // Language handling. -/mob/proc/add_language(var/language) +/mob/proc/add_language(language) var/datum/language/new_language = all_languages[language] if(!istype(new_language) || new_language in languages) - return 0 + return FALSE languages |= new_language - return 1 + return TRUE -/mob/proc/remove_language(var/rem_language) +/mob/proc/remove_language(rem_language) var/datum/language/L = all_languages[rem_language] . = (L in languages) languages.Remove(L) @@ -620,7 +616,7 @@ // Can we speak this language, as opposed to just understanding it? /mob/proc/can_speak_language(datum/language/speaking) - return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages) + return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in languages) //TBD /mob/verb/check_languages() @@ -661,7 +657,7 @@ if(L) set_default_language(L) check_languages() - return 1 + return TRUE else return ..() diff --git a/paradise.dme b/paradise.dme index 0f9fa26434c..d18c2677d51 100644 --- a/paradise.dme +++ b/paradise.dme @@ -397,6 +397,7 @@ #include "code\game\gamemodes\changeling\powers\hivemind.dm" #include "code\game\gamemodes\changeling\powers\humanform.dm" #include "code\game\gamemodes\changeling\powers\lesserform.dm" +#include "code\game\gamemodes\changeling\powers\linglink.dm" #include "code\game\gamemodes\changeling\powers\mimic_voice.dm" #include "code\game\gamemodes\changeling\powers\mutations.dm" #include "code\game\gamemodes\changeling\powers\panacea.dm"