Files
CHOMPStation2/code/datums/mind.dm
n3ophyt3@gmail.com 37ca6b2c40 Mostly a behind-the-scenes change, stuffing someone's brain into a cyborg body now causes the mind datum to transfer over to the new body. This should prevent such shenanigans as cloning a borged guy to suck the player back to the fleshy side of life.
Given that the mind datum is where traitors store their objectives (and how assassination targets are tracked), I have gone to some effort to ensure that, much like people currently in the thunderdome, people that are borgs still get counted as being dead. Also, borgs cannot succeed at hijack/escape objectives. If you find this to not be the case, PLEASE REPORT IT.

Borging a changeling now ends the round, much like cremating/gibbing them does.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@962 316c924e-a436-60f5-8080-3fe189b3f50e
2011-02-05 04:35:12 +00:00

442 lines
15 KiB
Plaintext

datum/mind
var/key
var/mob/current
var/mob/original
var/memory
var/assigned_role
var/special_role
var/list/datum/objective/objectives = list()
var/list/datum/objective/special_verbs = list()
proc/transfer_to(mob/new_character)
if(current)
current.mind = null
new_character.mind = src
current = new_character
new_character.key = key
proc/store_memory(new_text)
memory += "[new_text]<BR>"
proc/show_memory(mob/recipient)
var/output = "<B>[current.real_name]'s Memory</B><HR>"
output += memory
if(objectives.len>0)
output += "<HR><B>Objectives:</B>"
var/obj_count = 1
for(var/datum/objective/objective in objectives)
output += "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
recipient << browse(output,"window=memory")
proc/edit_memory()
var/out = "<B>[current.real_name]</B><br>"
out += "Assigned role: [assigned_role]. <a href='?src=\ref[src];role_edit=1'>Edit</a><br>"
out += "Special role: "
var/srole
var/cantoggle = 1
var/datum/game_mode/current_mode = ticker.mode
switch (current_mode.config_tag)
if ("revolution")
if (src in current_mode:head_revolutionaries)
srole = "Head Revolutionary"
out += "<font color=red>Head Revolutionary</font> "
cantoggle = 0
else if(src in current_mode:revolutionaries)
srole = "Revolutionary"
out += "<a href='?src=\ref[src];traitorize=headrev'>Head Revolutionary</a> <font color=red>Revolutionary</font> "
else
out += "<a href='?src=\ref[src];traitorize=headrev'>Head Revolutionary</a> <a href='?src=\ref[src];traitorize=rev'>Revolutionary</a> "
if ("cult")
if (src in current_mode:cult)
srole = "Cultist"
out += "<font color=red>Cultist</font>"
cantoggle = 0
if ("wizard")
if (current_mode:wizard && src == current_mode:wizard)
srole = "Wizard"
out += "<font color=red>Wizard</font>"
cantoggle = 0
else
out = "<a href='?src=\ref[src];traitorize=wizard'>Wizard</a> "
if ("changeling")
if (src in current_mode:changelings)
srole = "Changeling"
out += "<font color=red>Changeling</font>"
cantoggle = 0
else
out = "<a href='?src=\ref[src];traitorize=changeling'>Changeling</a> "
if ("malfunction")
if (src in current_mode:malf_ai)
srole = "Malfunction"
out += "<font color=red>Malfunction</font>"
cantoggle = 0
if ("nuclear")
if(src in current_mode:syndicates)
srole = "Syndicate"
out = "<font color=red>Syndicate</font>"
cantoggle = current_mode:syndicates.len > 1
else
out += "<a href='?src=\ref[src];traitorize=syndicate'>Syndicate</a> "
if (cantoggle)
if(src in current_mode.traitors)
if (special_role == "Fake Wizard")
out += "<a href='?src=\ref[src];traitorize=traitor'>Traitor</a> "
out += "<font color=red>Fake Wizard</font> "
srole = "Fake Wizard"
else
out += "<b>Traitor</b> "
out += "<a href='?src=\ref[src];traitorize=fakewizard'>Fake Wizard</a> "
srole = "Traitor"
else
out += "<a href='?src=\ref[src];traitorize=traitor'>Traitor</a> "
out += "<a href='?src=\ref[src];traitorize=fakewizard'>Fake Wizard</a> "
if (srole)
out += "<a href='?src=\ref[src];traitorize=civilian'>Civilian</a> "
else
out += "<font color=red>Civilian</font> "
out += "<br>"
out += "Memory:<hr>"
out += memory
out += "<hr><a href='?src=\ref[src];memory_edit=1'>Edit memory</a><br>"
out += "Objectives:<br>"
if (objectives.len == 0)
out += "EMPTY<br>"
else
var/obj_count = 1
for(var/datum/objective/objective in objectives)
out += "<B>[obj_count]</B>: [objective.explanation_text] <a href='?src=\ref[src];obj_edit=\ref[objective]'>Edit</a> <a href='?src=\ref[src];obj_delete=\ref[objective]'>Delete</a><br>"
obj_count++
out += "<a href='?src=\ref[src];obj_add=1'>Add objective</a><br><br>"
out += "<a href='?src=\ref[src];obj_announce=1'>Announce objectives</a><br><br>"
usr << browse(out, "window=edit_memory[src]")
Topic(href, href_list)
if (href_list["role_edit"])
var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs()
if (!new_role) return
assigned_role = new_role
else if (href_list["memory_edit"])
var/new_memo = input("Write new memory", "Memory", memory) as message
if (!new_memo) return
memory = new_memo
else if (href_list["obj_edit"] || href_list["obj_add"])
var/datum/objective/objective = null
var/objective_pos = null
var/def_value = null
if (href_list["obj_edit"])
objective = locate(href_list["obj_edit"])
if (!objective) return
objective_pos = objectives.Find(objective)
if (istype(objective, /datum/objective/assassinate))
def_value = "assassinate"
else if (istype(objective, /datum/objective/hijack))
def_value = "hijack"
else if (istype(objective, /datum/objective/escape))
def_value = "escape"
else if (istype(objective, /datum/objective/survive))
def_value = "survive"
else if (istype(objective, /datum/objective/steal))
def_value = "steal"
else if (istype(objective, /datum/objective/nuclear))
def_value = "nuclear"
else if (istype(objective, /datum/objective/absorb))
def_value = "absorb"
else if (istype(objective, /datum/objective))
def_value = "custom"
// TODO: cult objectives
//else if (istype(objective, /datum/objective/eldergod))
// def_value = "eldergod"
//else if (istype(objective, /datum/objective/survivecult))
// def_value = "survivecult"
//else if (istype(objective, /datum/objective/sacrifice))
// def_value = "sacrifice"
var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "hijack", "escape", "survive", "steal", "nuclear", "absorb", "custom")
if (!new_obj_type) return
var/datum/objective/new_objective = null
switch (new_obj_type)
if ("assassinate")
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))
possible_targets += possible_target.current
var/mob/def_target = null
if (istype(objective, /datum/objective/assassinate) && objective:target)
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 == "Free objective")
new_objective = new /datum/objective/assassinate
new_objective.owner = src
new_objective:target = null
new_objective.explanation_text = "Free objective"
else
new_objective = new /datum/objective/assassinate
new_objective.owner = src
new_objective:target = new_target:mind
new_objective.explanation_text = "Assassinate [new_target:real_name], the [new_target:mind.assigned_role]."
if ("hijack")
new_objective = new /datum/objective/hijack
new_objective.owner = src
if ("escape")
new_objective = new /datum/objective/escape
new_objective.owner = src
if ("survive")
new_objective = new /datum/objective/survive
new_objective.owner = src
if ("steal")
if (!istype(objective, /datum/objective/steal))
new_objective = new /datum/objective/steal
new_objective.owner = src
else
new_objective = objective
var/datum/objective/steal/steal = new_objective
if (!steal.select_target())
return
if ("nuclear")
new_objective = new /datum/objective/nuclear
new_objective.owner = src
if ("absorb")
var/def_num = null
if (istype(objective, /datum/objective/absorb))
def_num = objective:num_to_eat
var/num_to_eat = input("Number to eat:", "Objective", def_num) as text
new_objective = new /datum/objective/absorb
new_objective.owner = src
new_objective:num_to_eat = num_to_eat
new_objective.explanation_text = "Absorb [num_to_eat] compatible genomes."
if ("custom")
var/expl = input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null
if (!expl) return
new_objective = new /datum/objective
new_objective.owner = src
new_objective.explanation_text = expl
if (!new_objective) return
if (objective)
objectives -= objective
objectives.Insert(objective_pos, new_objective)
else
objectives += new_objective
else if (href_list["obj_delete"])
var/datum/objective/objective = locate(href_list["obj_delete"])
if (!objective) return
objectives -= objective
else if (href_list["traitorize"])
// clear old memory
clear_memory(href_list["traitorize"] == "civilian" ? 0 : 1)
var/datum/game_mode/current_mode = ticker.mode
switch (href_list["traitorize"])
if ("headrev")
current_mode:equip_revolutionary(current)
//find first headrev
for(var/datum/mind/rev_mind in current_mode:head_revolutionaries)
// copy objectives
for (var/datum/objective/assassinate/obj in rev_mind.objectives)
var/datum/objective/assassinate/rev_obj = new
rev_obj = src
rev_obj.target = obj.target
rev_obj.explanation_text = obj.explanation_text
objectives += rev_obj
break
current_mode:update_rev_icons_added(src)
current_mode:head_revolutionaries += src
var/obj_count = 1
current << "\blue You are a member of the revolutionaries' leadership!"
for(var/datum/objective/objective in objectives)
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
if ("rev")
current_mode:add_revolutionary(src)
if ("wizard")
if (alert("Old wizard would be unwizarded. Are you sure?", , "Yes", "No") != "Yes") return
if (current_mode:wizard)
current_mode:wizard.clear_memory(0)
current_mode:wizard = src
current_mode:equip_wizard(current)
current << "<B>\red You are the Space Wizard!</B>"
current.loc = pick(wizardstart)
if ("fakewizard")
current_mode.traitors += src
current_mode.equip_wizard(current)
current << "<B>\red You are the Space Wizard!</B>"
current.loc = pick(wizardstart)
special_role = "Fake Wizard"
if ("changeling")
if (alert("Old changeling would lose their memory. Are you sure?", , "Yes", "No") != "Yes") return
if (changeling)
changeling.clear_memory()
current_mode:changelings -= changeling
current_mode:grant_changeling_powers(current)
changeling = src
current_mode:changelings += src
changeling.current << "<B>\red You are a changeling!</B>"
if ("syndicate")
var/obj/landmark/synd_spawn = locate("landmark*Syndicate-Spawn")
current.loc = get_turf(synd_spawn)
current_mode:equip_syndicate(current)
current_mode:syndicates += src
if ("traitor")
current_mode.equip_traitor(current)
current_mode.traitors += src
current << "<B>You are the traitor.</B>"
special_role = "traitor"
else if (href_list["obj_announce"])
var/obj_count = 1
current << "\blue Your current objectives:"
for(var/datum/objective/objective in objectives)
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
edit_memory()
proc/clear_memory(var/silent = 1)
var/datum/game_mode/current_mode = ticker.mode
// remove traitor uplinks
var/list/L = current.get_contents()
for (var/t in L)
if (istype(t, /obj/item/device/pda))
if (t:uplink) del(t:uplink)
t:uplink = null
else if (istype(t, /obj/item/device/radio))
if (t:traitorradio) del(t:traitorradio)
t:traitorradio = null
t:traitor_frequency = 0.0
else if (istype(t, /obj/item/weapon/SWF_uplink) || istype(t, /obj/item/weapon/syndicate_uplink))
if (t:origradio)
var/obj/item/device/radio/R = t:origradio
R.loc = current.loc
R.traitorradio = null
R.traitor_frequency = 0.0
del(t)
// remove wizards spells
//If there are more special powers that need removal, they can be procced into here./N
current.spellremove(current)
// clear memory
memory = ""
special_role = null
// remove from traitors list
if (src in current_mode.traitors)
current_mode.traitors -= src
if (!silent)
if (special_role == "Fake Wizard")
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
else
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
// clear gamemode specific values
switch (current_mode.config_tag)
if ("revolution")
if (src in current_mode:head_revolutionaries)
current_mode:head_revolutionaries -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a head revolutionary!</B></FONT>"
current_mode:update_rev_icons_removed(src)
else if(src in current_mode:revolutionaries)
if (silent)
current_mode:revolutionaries -= src
current_mode:update_rev_icons_removed(src)
else
current_mode:remove_revolutionary(src)
if ("cult")
if (src in current_mode:cult)
current_mode:cult -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a cultist!</B></FONT>"
if ("wizard")
if (src == current_mode:wizard)
current_mode:wizard = null
//current_mode.wizards -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
if ("changeling")
if (src in current_mode:changelings)
current_mode:changelings -= src
//remove verbs
current.remove_changeling_powers()
//remove changeling info
current.changeling_level = 0
current.absorbed_dna = null
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a changeling!</B></FONT>"
if ("malfunction")
if (src in current_mode:malf_ai)
current_mode:malf_ai -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a malfunction!</B></FONT>"
if ("nuclear")
if (src in current_mode:syndicates)
current_mode:syndicates -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a syndicate!</B></FONT>"