mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 19:13:30 +01:00
adds hivemind link to changelings, allows them to give a victim in > neckgrab hivemind comms for 3 minutes
This commit is contained in:
+36
-23
@@ -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:<a href='?src=[UID()];implant=remove'>Remove</a>|<b><font color='green'>Implanted</font></b></br>"
|
||||
@@ -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: <a href='?src=[UID()];common=uplink'>give</a>"
|
||||
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, "<B><font color='red'>Your powers are awoken. Your lust for blood grows... You are a Vampire!</font></B>")
|
||||
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, "<span class='danger'>You are a traitor!</span>")
|
||||
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, "<B>Objective #1</B>: [explanation]")
|
||||
current.memory += "<B>Objective #1</B>: [explanation]<BR>"
|
||||
|
||||
|
||||
|
||||
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)
|
||||
|
||||
@@ -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, "<B>There are alien changelings on the station. Do not let the changelings succeed!</B>")
|
||||
|
||||
/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, "<span class='danger'>You are a changeling!</span>")
|
||||
to_chat(changeling.current, "<span class='danger'>Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them.</span>")
|
||||
@@ -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, "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>")
|
||||
return
|
||||
|
||||
@@ -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, "<span class='warning'>We have already formed a link with the victim!</span>")
|
||||
return
|
||||
if(!istype(G))
|
||||
to_chat(user, "<span class='warning'>We must be tightly grabbing a creature in our active hand to link with them!</span>")
|
||||
return
|
||||
if(G.state <= GRAB_AGGRESSIVE)
|
||||
to_chat(user, "<span class='warning'>We must have a tighter grip to link with this creature!</span>")
|
||||
return
|
||||
if(iscarbon(G.affecting))
|
||||
var/mob/living/carbon/target = G.affecting
|
||||
if(!target.mind)
|
||||
to_chat(user, "<span class='warning'>The victim has no mind to link to!</span>")
|
||||
return
|
||||
if(target.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>The victim is dead, you cannot link to a dead mind!</span>")
|
||||
return
|
||||
if(target.mind.changeling)
|
||||
to_chat(user, "<span class='warning'>The victim is already a part of the hivemind!</span>")
|
||||
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, "<span class='notice'>This creature is compatible. We must hold still...</span>")
|
||||
if(2)
|
||||
to_chat(user, "<span class='notice'>We stealthily stab [target] with a minor proboscis...</span>")
|
||||
to_chat(target, "<span class='userdanger'>You experience a stabbing sensation and your ears begin to ring...</span>")
|
||||
if(3)
|
||||
to_chat(user, "<span class='notice'>You mold the [target]'s mind like clay, they can now speak in the hivemind!</span>")
|
||||
to_chat(target, "<span class='userdanger'>A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!</span>")
|
||||
for(var/mob/M in mob_list)
|
||||
if(all_languages["Changeling"] in M.languages)
|
||||
to_chat(M, "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>")
|
||||
target.mind.linglink = 1
|
||||
target.add_language("Changeling")
|
||||
target.say(":g AAAAARRRRGGGGGHHHHH!!")
|
||||
to_chat(target, "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \":g message\" to communicate!</span>")
|
||||
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, "<span class='warning'>Our link with [target] has ended!</span>")
|
||||
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, "<span class='notice'>You cannot sustain the connection any longer, your victim fades from the hivemind</span>")
|
||||
to_chat(target, "<span class='userdanger'>The link cannot be sustained any longer, your connection to the hivemind has faded!</span>")
|
||||
@@ -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 = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> [format_message(message, get_spoken_verb(message))]</span></i>"
|
||||
|
||||
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 = "<span class='message'>[speaker.say_quote(message)], \"[message]\"</span></span></i>"
|
||||
|
||||
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 = "<i><span class='game say'>[name], <span class='name'>[speaker.name] ([ghost_follow_link(speaker, ghost=M)])</span>"
|
||||
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 = "<i><span class='game say'>[name], <a href='byond://?src=[S.UID()];track=\ref[speaker]'><span class='name'>[speaker.name]</span></a>"
|
||||
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("<i><span class='game say'><span class='name'>synthesised voice</span> <span class='message'>beeps, \"beep beep beep\"</span></span></i>",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 ..()
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user