/* Note from Carnie: The way datum/mind stuff works has been changed a lot. Minds now represent IC characters rather than following a client around constantly. Guidelines for using minds properly: - Never mind.transfer_to(ghost). The var/current and var/original of a mind must always be of type mob/living! ghost.mind is however used as a reference to the ghost's corpse - When creating a new mob for an existing IC character (e.g. cloning a dead guy or borging a brain of a human) the existing mind of the old mob should be transfered to the new mob like so: mind.transfer_to(new_mob) - You must not assign key= or ckey= after transfer_to() since the transfer_to transfers the client for you. By setting key or ckey explicitly after transfering the mind with transfer_to you will cause bugs like DCing the player. - IMPORTANT NOTE 2, if you want a player to become a ghost, use mob.ghostize() It does all the hard work for you. - When creating a new mob which will be a new IC character (e.g. putting a shade in a construct or randomly selecting a ghost to become a xeno during an event). Simply assign the key or ckey like you've always done. new_mob.key = key The Login proc will handle making a new mob for that mobtype (including setting up stuff like mind.name). Simple! However if you want that mind to have any special properties like being a traitor etc you will have to do that yourself. */ datum/mind var/key var/name //replaces mob/var/original_name var/mob/living/current var/mob/living/original //TODO: remove.not used in any meaningful way ~Carn. First I'll need to tweak the way silicon-mobs handle minds. var/active = 0 var/memory var/assigned_role var/special_role var/list/restricted_roles = list() var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. var/role_alt_title var/datum/job/assigned_job var/list/kills=list() var/list/datum/objective/objectives = list() var/list/datum/objective/special_verbs = list() var/has_been_rev = 0//Tracks if this mind has been a rev or not var/datum/faction/faction //associated faction var/datum/changeling/changeling //changeling holder var/datum/nations/nation //associated nation for CTF var/datum/vampire/vampire //vampire holder var/rev_cooldown = 0 // the world.time since the mob has been brigged, or -1 if not at all var/brigged_since = -1 New(var/key) src.key = key //put this here for easier tracking ingame var/datum/money_account/initial_account proc/transfer_to(mob/living/new_character) if(!istype(new_character)) world.log << "## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn" if(current) //remove ourself from our old body's mind variable current.mind = null nanomanager.user_transferred(current, new_character) if(new_character.mind) //remove any mind currently in our new body's mind variable new_character.mind.current = null current = new_character //link ourself to our new body new_character.mind = src //and link our new body to ourself transfer_actions(new_character) if(active) new_character.key = key //now transfer the key to link the client to our new body proc/store_memory(new_text) memory += "[new_text]
" proc/show_memory(mob/recipient) var/output = "[current.real_name]'s Memory
" output += memory if(objectives.len>0) output += "
Objectives:" var/obj_count = 1 for(var/datum/objective/objective in objectives) output += "Objective #[obj_count]: [objective.explanation_text]" obj_count++ if(job_objectives.len>0) output += "
Job Objectives:" recipient << browse(output,"window=memory") proc/edit_memory() if(!ticker || !ticker.mode) alert("Not before round-start!", "Alert") return var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
" out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
" out += "Assigned role: [assigned_role]. Edit
" out += "Factions and special roles:
" var/list/sections = list( "implant", "revolution", "cult", "wizard", "changeling", "vampire", "nuclear", "traitor", // "traitorchan", "monkey", "malfunction", ) var/text = "" var/mob/living/carbon/human/H = current if (istype(current, /mob/living/carbon/human)) /** Impanted**/ if(H.is_loyalty_implanted(H)) text = "Loyalty Implant:Remove|Implanted
" else text = "Loyalty Implant:No Implant|Implant him!
" sections["implant"] = text /** REVOLUTION ***/ text = "revolution" if (ticker.mode.config_tag=="revolution") text += uppertext(text) text = "[text]: " if (H.is_loyalty_implanted(H)) text += "LOYAL EMPLOYEE|headrev|rev" else if (src in ticker.mode.head_revolutionaries) text = "employee|HEADREV|rev" text += "
Flash: give" var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (flash) if(!flash.broken) text += "|take." else text += "|take|repair." else text += "." text += " Reequip (gives traitor uplink)." if (objectives.len==0) text += "
Objectives are empty! Set to kill all heads." else if (src in ticker.mode.revolutionaries) text += "employee|headrev|REV" else text += "EMPLOYEE|headrev|rev" if(current && current.client && current.client.prefs.be_special & BE_REV) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" sections["revolution"] = text /** CULT ***/ text = "cult" if (ticker.mode.config_tag=="cult") text = uppertext(text) text = "[text]: " if (H.is_loyalty_implanted(H)) text += "LOYAL EMPLOYEE|cultist" else if (src in ticker.mode.cult) text += "employee|CULTIST" text += "
Give tome|amulet." /* if (objectives.len==0) text += "
Objectives are empty! Set to sacrifice and escape or summon." */ else text += "EMPLOYEE|cultist" if(current && current.client && current.client.prefs.be_special & BE_CULTIST) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" sections["cult"] = text /** WIZARD ***/ text = "wizard" if (ticker.mode.config_tag=="wizard") text = uppertext(text) text = "[text]: " if (src in ticker.mode.wizards) text += "YES|no" text += "
To lair, undress, dress up, let choose name." if (objectives.len==0) text += "
Objectives are empty! Randomize!" else text += "yes|NO" if(current && current.client && current.client.prefs.be_special & BE_WIZARD) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" sections["wizard"] = text /** CHANGELING ***/ text = "changeling" if (ticker.mode.config_tag=="changeling" || ticker.mode.config_tag=="traitorchan") text = uppertext(text) text = "[text]: " if (src in ticker.mode.changelings) text += "YES|no" if (objectives.len==0) text += "
Objectives are empty! Randomize!" if( changeling && changeling.absorbed_dna.len && (current.real_name != changeling.absorbed_dna[1]) ) text += "
Transform to initial appearance." else text += "yes|NO" if(current && current.client && current.client.prefs.be_special & BE_CHANGELING) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" sections["changeling"] = text /** VAMPIRE ***/ text = "vampire" if (ticker.mode.config_tag=="vampire") text = uppertext(text) text = "[text]: " if (src in ticker.mode.vampires) text += "YES|no" if (objectives.len==0) text += "
Objectives are empty! Randomize!" else text += "yes|NO" if(src in ticker.mode.enthralled) text += "YES|no" else text += "yes|NO" /** Enthralled ***/ text += "
enthralled" sections["vampire"] = text /** NUCLEAR ***/ text = "nuclear" if (ticker.mode.config_tag=="nuclear") text = uppertext(text) text = "[text]: " if (src in ticker.mode.syndicates) text += "OPERATIVE|nanotrasen" text += "
To shuttle, undress, dress up." var/code for (var/obj/machinery/nuclearbomb/bombue in machines) if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") code = bombue.r_code break if (code) text += " Code is [code]. tell the code." else text += "operative|NANOTRASEN" if(current && current.client && current.client.prefs.be_special & BE_OPERATIVE) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" sections["nuclear"] = text /** TRAITOR ***/ text = "traitor" if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") text = uppertext(text) text = "[text]: " if (H.is_loyalty_implanted(H)) text +="traitor|LOYAL EMPLOYEE" else if (src in ticker.mode.traitors) text += "TRAITOR|EMPLOYEE" if (objectives.len==0) text += "
Objectives are empty! Randomize!" else text += "traitor|EMPLOYEE" if(current && current.client && current.client.prefs.be_special & BE_TRAITOR) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" sections["traitor"] = text /** SHADOWLING **/ text = "shadowling" if(ticker.mode.config_tag == "shadowling") text = uppertext(text) text = "[text]: " if(src in ticker.mode.shadows) text += "SHADOWLING|thrall|human" else if(src in ticker.mode.shadowling_thralls) text += "Shadowling|THRALL|human" else text += "shadowling|thrall|HUMAN" if(current && current.client && current.client.prefs.be_special & BE_SHADOWLING) text += "|Enabled in Prefs" else text += "|Disabled in Prefs" sections["shadowling"] = text /** MONKEY ***/ if (istype(current, /mob/living/carbon)) text = "monkey" if (ticker.mode.config_tag=="monkey") text = uppertext(text) text = "[text]: " if (istype(current, /mob/living/carbon/human)) text += "healthy|infected|HUMAN|other" else text += "healthy|infected|human|OTHER" /*if(current && current.client && current.client.prefs.be_special & BE_MONKEY) text += "|Enabled in Prefs" else text += "|Disabled in Prefs"*/ sections["monkey"] = text /** SILICON ***/ if (istype(current, /mob/living/silicon)) text = "silicon" if (ticker.mode.config_tag=="malfunction") text = uppertext(text) text = "[text]: " if (istype(current, /mob/living/silicon/ai)) if (src in ticker.mode.malf_ai) text += "MALF|not malf" else text += "malf|NOT MALF" var/mob/living/silicon/robot/robot = current if (istype(robot) && robot.emagged) text += "
Cyborg: Is emagged! Unemag!
0th law: [robot.laws.zeroth]" var/mob/living/silicon/ai/ai = current if (istype(ai) && ai.connected_robots.len) var/n_e_robots = 0 for (var/mob/living/silicon/robot/R in ai.connected_robots) if (R.emagged) n_e_robots++ text += "
[n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. Unemag" sections["malfunction"] = text if (ticker.mode.config_tag == "traitorchan") if (sections["traitor"]) out += sections["traitor"]+"
" if (sections["changeling"]) out += sections["changeling"]+"
" sections -= "traitor" sections -= "changeling" else if (sections[ticker.mode.config_tag]) out += sections[ticker.mode.config_tag]+"
" sections -= ticker.mode.config_tag for (var/i in sections) if (sections[i]) out += sections[i]+"
" if (((src in ticker.mode.head_revolutionaries) || \ (src in ticker.mode.traitors) || \ (src in ticker.mode.syndicates)) && \ istype(current,/mob/living/carbon/human) ) text = "Uplink: give" var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() var/crystals if (suplink) crystals = suplink.uses if (suplink) text += "|take" if (usr.client.holder.rights & (R_SERVER|R_EVENT)) text += ", [crystals] crystals" else text += ", [crystals] crystals" text += "." //hiel grammar out += text out += "
" out += "Memory:
" out += memory out += "
Edit memory
" out += "Objectives:
" if (objectives.len == 0) out += "EMPTY
" else var/obj_count = 1 for(var/datum/objective/objective in objectives) out += "[obj_count]: [objective.explanation_text] Edit Delete Toggle Completion
" obj_count++ out += "Add objective

" out += "Announce objectives

" usr << browse(out, "window=edit_memory[src]") Topic(href, href_list) 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 assigned_role = new_role else if (href_list["memory_edit"]) var/new_memo = sanitize(copytext(input("Write new memory", "Memory", memory) as null|message,1,MAX_MESSAGE_LEN)) if (isnull(new_memo)) return memory = new_memo else if (href_list["obj_edit"] || href_list["obj_add"]) var/datum/objective/objective var/objective_pos var/def_value if (href_list["obj_edit"]) objective = locate(href_list["obj_edit"]) if (!objective) return objective_pos = objectives.Find(objective) //Text strings are easy to manipulate. Revised for simplicity. var/temp_obj_type = "[objective.type]"//Convert path into a text string. def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. if(!def_value)//If it's a custom objective, it will be an empty string. 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", "harm", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "destroy", "maroon", "identity theft", "custom") if (!new_obj_type) return var/datum/objective/new_objective = null switch (new_obj_type) if ("assassinate","protect","debrain", "harm", "brig", "maroon") //To determine what to name the objective in explanation text. var/objective_type_capital = uppertext(copytext(new_obj_type, 1,2))//Capitalize first letter. var/objective_type_text = copytext(new_obj_type, 2)//Leave the rest of the text. var/objective_type = "[objective_type_capital][objective_type_text]"//Add them together into a text string. 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 var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain) if (objective&&(objective.type in objective_list) && 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 var/objective_path = text2path("/datum/objective/[new_obj_type]") if (new_target == "Free objective") new_objective = new objective_path new_objective.owner = src new_objective:target = null new_objective.explanation_text = "Free objective" else new_objective = new objective_path new_objective.owner = src new_objective:target = new_target:mind //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. new_objective.explanation_text = "[objective_type] [new_target:real_name], the [new_target:mind:assigned_role=="MODE" ? (new_target:mind:special_role) : (new_target:mind:assigned_role)]." if ("destroy") var/list/possible_targets = active_ais(1) if(possible_targets.len) var/mob/new_target = input("Select target:", "Objective target") as null|anything in possible_targets new_objective = new /datum/objective/destroy new_objective.target = new_target.mind new_objective.owner = src new_objective.explanation_text = "Destroy [new_target.name], the experimental AI." else usr << "No active AIs with minds" if ("prevent") new_objective = new /datum/objective/block new_objective.owner = src 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 ("die") new_objective = new /datum/objective/die new_objective.owner = src if ("nuclear") new_objective = new /datum/objective/nuclear 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("download","capture","absorb", "blood") var/def_num if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) def_num = objective.target_amount var/target_number = input("Input target number:", "Objective", def_num) as num|null if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist. return switch(new_obj_type) if("download") new_objective = new /datum/objective/download new_objective.explanation_text = "Download [target_number] research levels." if("capture") new_objective = new /datum/objective/capture new_objective.explanation_text = "Accumulate [target_number] capture points." if("absorb") new_objective = new /datum/objective/absorb new_objective.explanation_text = "Absorb [target_number] compatible genomes." if("blood") new_objective = new /datum/objective/blood new_objective.explanation_text = "Accumulate atleast [target_number] units of blood in total." new_objective.owner = src new_objective.target_amount = target_number 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)) possible_targets += possible_target.current var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets if (!new_target) return var/datum/mind/targ = new_target if(!istype(targ)) log_debug("Invalid target for identity theft objective, cancelling") return new_objective = new /datum/objective/escape/escape_with_identity new_objective.owner = src new_objective.target = new_target 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 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(!istype(objective)) return objectives -= objective else if(href_list["obj_completed"]) var/datum/objective/objective = locate(href_list["obj_completed"]) if(!istype(objective)) return objective.completed = !objective.completed else if(href_list["implant"]) var/mob/living/carbon/human/H = current H.hud_updateflag |= (1 << IMPLOYAL_HUD) // updates that players HUD images so secHUD's pick up they are implanted or not. switch(href_list["implant"]) if("remove") for(var/obj/item/weapon/implant/loyalty/I in H.contents) for(var/obj/item/organ/external/organs in H.organs) if(I in organs.implants) I.Destroy() H << "\blue Your loyalty implant has been deactivated." if("add") var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) L.imp_in = H L.implanted = 1 var/obj/item/organ/external/affected = H.organs_by_name["head"] affected.implants += L L.part = affected H << "\red You somehow have become the recepient of a loyalty transplant, and it just activated!" if(src in ticker.mode.revolutionaries) special_role = null ticker.mode.revolutionaries -= src src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!" if(src in ticker.mode.head_revolutionaries) special_role = null ticker.mode.head_revolutionaries -=src src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!" if(src in ticker.mode.cult) ticker.mode.cult -= src ticker.mode.update_cult_icons_removed(src) special_role = null var/datum/game_mode/cult/cult = ticker.mode if (istype(cult)) cult.memoize_cult_objectives(src) current << "\red The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!" memory = "" if(src in ticker.mode.traitors) ticker.mode.traitors -= src special_role = null current << "\red The nanobots in the loyalty implant remove all thoughts about being a traitor to Nanotrasen. Have a nice day!" log_admin("[key_name_admin(usr)] has de-traitor'ed [current].") else if (href_list["revolution"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["revolution"]) if("clear") if(src in ticker.mode.revolutionaries) ticker.mode.revolutionaries -= src current << "\red You have been brainwashed! You are no longer a revolutionary!" ticker.mode.update_rev_icons_removed(src) special_role = null if(src in ticker.mode.head_revolutionaries) ticker.mode.head_revolutionaries -= src current << "\red You have been brainwashed! You are no longer a head revolutionary!" ticker.mode.update_rev_icons_removed(src) special_role = null log_admin("[key_name_admin(usr)] has de-rev'ed [current].") if("rev") if(src in ticker.mode.head_revolutionaries) ticker.mode.head_revolutionaries -= src ticker.mode.update_rev_icons_removed(src) current << "\red Revolution has been disappointed of your leader traits! You are a regular revolutionary now!" else if(!(src in ticker.mode.revolutionaries)) current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" else return ticker.mode.revolutionaries += src ticker.mode.update_rev_icons_added(src) special_role = "Revolutionary" log_admin("[key_name(usr)] has rev'ed [current].") if("headrev") if(src in ticker.mode.revolutionaries) ticker.mode.revolutionaries -= src ticker.mode.update_rev_icons_removed(src) current << "\red You have proved your devotion to revoltion! Yea are a head revolutionary now!" else if(!(src in ticker.mode.head_revolutionaries)) current << "\blue You are a member of the revolutionaries' leadership now!" else return if (ticker.mode.head_revolutionaries.len>0) // copy targets var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries if (valid_head) for (var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new rev_obj.owner = src rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." objectives += rev_obj ticker.mode.greet_revolutionary(src,0) ticker.mode.head_revolutionaries += src ticker.mode.update_rev_icons_added(src) special_role = "Head Revolutionary" log_admin("[key_name_admin(usr)] has head-rev'ed [current].") if("autoobjectives") ticker.mode.forge_revolutionary_objectives(src) ticker.mode.greet_revolutionary(src,0) usr << "\blue The objectives for revolution have been generated and shown to [key]" if("flash") if (!ticker.mode.equip_revolutionary(current)) usr << "\red Spawning flash failed!" if("takeflash") var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (!flash) usr << "\red Deleting flash failed!" qdel(flash) if("repairflash") var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (!flash) usr << "\red Repairing flash failed!" else flash.broken = 0 if("reequip") var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L qdel(flash) take_uplink() var/fail = 0 fail |= !ticker.mode.equip_traitor(current, 1) fail |= !ticker.mode.equip_revolutionary(current) if (fail) usr << "\red Reequipping revolutionary goes wrong!" else if (href_list["cult"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["cult"]) if("clear") if(src in ticker.mode.cult) ticker.mode.remove_cultist(src) log_admin("[key_name_admin(usr)] has de-cult'ed [current].") if("cultist") if(!(src in ticker.mode.cult)) ticker.mode.add_cultist(src) special_role = "Cultist" current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." log_admin("[key_name_admin(usr)] has cult'ed [current].") if("tome") var/mob/living/carbon/human/H = current if (istype(H)) var/obj/item/weapon/tome/T = new(H) var/list/slots = list ( "backpack" = slot_in_backpack, "left pocket" = slot_l_store, "right pocket" = slot_r_store, "left hand" = slot_l_hand, "right hand" = slot_r_hand, ) var/where = H.equip_in_one_of_slots(T, slots) if (!where) usr << "\red Spawning tome failed!" else H << "A tome, a message from your new master, appears in your [where]." if("amulet") if (!ticker.mode.equip_cultist(current)) usr << "\red Spawning amulet failed!" else if (href_list["wizard"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["wizard"]) if("clear") if(src in ticker.mode.wizards) ticker.mode.wizards -= src special_role = null current.spellremove(current) current.faction = list("Station") current << "\red You have been brainwashed! You are no longer a wizard!" log_admin("[key_name_admin(usr)] has de-wizard'ed [current].") if("wizard") if(!(src in ticker.mode.wizards)) ticker.mode.wizards += src special_role = "Wizard" //ticker.mode.learn_basic_spells(current) current << "\red You are the Space Wizard!" current.faction = list("wizard") log_admin("[key_name_admin(usr)] has wizard'ed [current].") if("lair") current.loc = pick(wizardstart) if("dressup") ticker.mode.equip_wizard(current) if("name") ticker.mode.name_wizard(current) if("autoobjectives") ticker.mode.forge_wizard_objectives(src) usr << "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually." else if (href_list["changeling"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["changeling"]) if("clear") if(src in ticker.mode.changelings) ticker.mode.changelings -= src special_role = null current.remove_changeling_powers() if(changeling) del(changeling) current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!" log_admin("[key_name_admin(usr)] has de-changeling'ed [current].") if("changeling") if(!(src in ticker.mode.changelings)) ticker.mode.changelings += src ticker.mode.grant_changeling_powers(current) special_role = "Changeling" current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!" log_admin("[key_name_admin(usr)] has changeling'ed [current].") if("autoobjectives") ticker.mode.forge_changeling_objectives(src) usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually." if("initialdna") if( !changeling || !changeling.absorbed_dna.len ) usr << "\red Resetting DNA failed!" else current.dna = changeling.absorbed_dna[1] current.real_name = current.dna.real_name current.UpdateAppearance() domutcheck(current, null) else if (href_list["vampire"]) switch(href_list["vampire"]) if("clear") if(src in ticker.mode.vampires) ticker.mode.vampires -= src special_role = null current.remove_vampire_powers() if(vampire) del(vampire) current << "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!" log_admin("[key_name_admin(usr)] has de-vampired [current].") if("vampire") if(!(src in ticker.mode.vampires)) ticker.mode.vampires += src ticker.mode.grant_vampire_powers(current) special_role = "Vampire" current << "Your powers are awoken. Your lust for blood grows... You are a Vampire!" log_admin("[key_name_admin(usr)] has vampired [current].") if("autoobjectives") ticker.mode.forge_vampire_objectives(src) usr << "\blue The objectives for vampire [key] have been generated. You can edit them and announce manually." else if (href_list["nuclear"]) var/mob/living/carbon/human/H = current current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["nuclear"]) if("clear") if(src in ticker.mode.syndicates) ticker.mode.syndicates -= src ticker.mode.update_synd_icons_removed(src) special_role = null for (var/datum/objective/nuclear/O in objectives) objectives-=O current << "\red You have been brainwashed! You are no longer a syndicate operative!" log_admin("[key_name_admin(usr)] has de-nuke op'ed [current].") if("nuclear") if(!(src in ticker.mode.syndicates)) ticker.mode.syndicates += src ticker.mode.update_synd_icons_added(src) if (ticker.mode.syndicates.len==1) ticker.mode.prepare_syndicate_leader(src) else current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" special_role = "Syndicate" current << "\blue You are a [syndicate_name()] agent!" ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) log_admin("[key_name_admin(usr)] has nuke op'ed [current].") if("lair") current.loc = get_turf(locate("landmark*Syndicate-Spawn")) if("dressup") qdel(H.belt) qdel(H.back) qdel(H.l_ear) qdel(H.r_ear) qdel(H.gloves) qdel(H.head) qdel(H.shoes) qdel(H.wear_id) qdel(H.wear_pda) qdel(H.wear_suit) qdel(H.w_uniform) if (!ticker.mode.equip_syndicate(current)) usr << "\red Equipping a syndicate failed!" if("tellcode") var/code for (var/obj/machinery/nuclearbomb/bombue in machines) if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") code = bombue.r_code break if (code) store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) current << "The nuclear authorization code is: [code]" else usr << "\red No valid nuke found!" else if (href_list["traitor"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["traitor"]) if("clear") if(src in ticker.mode.traitors) ticker.mode.traitors -= src special_role = null current << "\red You have been brainwashed! You are no longer a traitor!" log_admin("[key_name_admin(usr)] has de-traitor'ed [current].") if(isAI(current)) var/mob/living/silicon/ai/A = current A.set_zeroth_law("") A.show_laws() if("traitor") if(!(src in ticker.mode.traitors)) ticker.mode.traitors += src special_role = "traitor" current << "\red You are a traitor!" log_admin("[key_name_admin(usr)] has traitor'ed [current].") if(istype(current, /mob/living/silicon)) var/mob/living/silicon/A = current call(/datum/game_mode/proc/add_law_zero)(A) A.show_laws() if("autoobjectives") ticker.mode.forge_traitor_objectives(src) usr << "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually." else if(href_list["shadowling"]) switch(href_list["shadowling"]) if("clear") ticker.mode.update_shadow_icons_removed(src) current.spell_list.Cut() if(src in ticker.mode.shadows) ticker.mode.shadows -= src special_role = null current << "Your powers have been quenched! You are no longer a shadowling!" current.spell_list.Cut() if(current.mind) current.mind.spell_list.Cut() message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") log_admin("[key_name(usr)] has de-shadowling'ed [current].") current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch current.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance current.remove_language("Shadowling Hivemind") else if(src in ticker.mode.shadowling_thralls) ticker.mode.shadowling_thralls -= src special_role = null current.remove_language("Shadowling Hivemind") current << "You have been brainwashed! You are no longer a thrall!" message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") log_admin("[key_name(usr)] has de-thrall'ed [current].") if("shadowling") if(!ishuman(current)) usr << "This only works on humans!" return ticker.mode.shadows += src special_role = "Shadowling" current << "You notice a brightening around you. No, it isn't that. The shadows grow, darken, swirl. The darkness has a new welcome for you, and you realize with a \ start that you can't be human. No, you are a shadowling, a harbringer of the shadows! Your alien abilities have been unlocked from within, and you may both commune with your allies and use \ a chrysalis to reveal your true form. You are to ascend at all costs." ticker.mode.finalize_shadowling(src) ticker.mode.update_shadow_icons_added(src) if("thrall") if(!ishuman(current)) usr << "This only works on humans!" return ticker.mode.add_thrall(src) special_role = "Shadowling Thrall" current << "All at once it becomes clear to you. Where others see darkness, you see an ally. You realize that the shadows are not dead and dark as one would think, but \ living, and breathing, and eating. Their children, the Shadowlings, are to be obeyed and protected at all costs." current << "You may use the Hivemind Commune ability to communicate with your fellow enlightened ones." message_admins("[key_name_admin(usr)] has thrall'ed [current].") log_admin("[key_name(usr)] has thrall'ed [current].") else if (href_list["silicon"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["silicon"]) if("unmalf") if(src in ticker.mode.malf_ai) ticker.mode.malf_ai -= src special_role = null var/mob/living/silicon/ai/A = current A.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules, /datum/game_mode/malfunction/proc/takeover, /datum/game_mode/malfunction/proc/ai_win) A.malf_picker.remove_verbs(A) A.make_laws() del(A.malf_picker) A.show_laws() A.icon_state = "ai" A << "\red You have been patched! You are no longer malfunctioning!" message_admins("[key_name_admin(usr)] has de-malf'ed [A].") log_admin("[key_name_admin(usr)] has de-malf'ed [A].") if("malf") make_AI_Malf() log_admin("[key_name_admin(usr)] has malf'ed [current].") if("unemag") var/mob/living/silicon/robot/R = current if (istype(R)) R.emagged = 0 if (R.activated(R.module.emag)) R.module_active = null if(R.module_state_1 == R.module.emag) R.module_state_1 = null R.contents -= R.module.emag else if(R.module_state_2 == R.module.emag) R.module_state_2 = null R.contents -= R.module.emag else if(R.module_state_3 == R.module.emag) R.module_state_3 = null R.contents -= R.module.emag log_admin("[key_name_admin(usr)] has unemag'ed [R].") if("unemagcyborgs") if (istype(current, /mob/living/silicon/ai)) var/mob/living/silicon/ai/ai = current for (var/mob/living/silicon/robot/R in ai.connected_robots) R.emagged = 0 if (R.module) if (R.activated(R.module.emag)) R.module_active = null if(R.module_state_1 == R.module.emag) R.module_state_1 = null R.contents -= R.module.emag else if(R.module_state_2 == R.module.emag) R.module_state_2 = null R.contents -= R.module.emag else if(R.module_state_3 == R.module.emag) R.module_state_3 = null R.contents -= R.module.emag log_admin("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.") else if (href_list["common"]) switch(href_list["common"]) if("undress") if(ishuman(current)) var/mob/living/carbon/human/H = current // Don't "undress" organs right out of the body for(var/obj/item/W in H.contents - (H.organs | H.internal_organs)) current.unEquip(W, 1) else for(var/obj/item/W in current) current.unEquip(W, 1) if("takeuplink") take_uplink() memory = null//Remove any memory they may have had. if("crystals") if (usr.client.holder.rights & (R_SERVER|R_EVENT)) var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() var/crystals if (suplink) crystals = suplink.uses crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num if (!isnull(crystals)) if (suplink) suplink.uses = crystals if("uplink") if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) usr << "\red Equipping a syndicate failed!" else if (href_list["obj_announce"]) var/obj_count = 1 current << "\blue Your current objectives:" for(var/datum/objective/objective in objectives) current << "Objective #[obj_count]: [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 */ proc/find_syndicate_uplink() var/list/L = current.get_contents() for (var/obj/item/I in L) if (I.hidden_uplink) return I.hidden_uplink return null proc/take_uplink() var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() if(H) qdel(H) proc/make_AI_Malf() if(!(src in ticker.mode.malf_ai)) ticker.mode.malf_ai += src current.verbs += /mob/living/silicon/ai/proc/choose_modules current.verbs += /datum/game_mode/malfunction/proc/takeover current:malf_picker = new /datum/module_picker current:laws = new /datum/ai_laws/malfunction current:show_laws() current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..." special_role = "malfunction" current.icon_state = "ai-malf" proc/make_Tratior() if(!(src in ticker.mode.traitors)) ticker.mode.traitors += src special_role = "traitor" ticker.mode.forge_traitor_objectives(src) ticker.mode.finalize_traitor(src) ticker.mode.greet_traitor(src) proc/make_Nuke() if(!(src in ticker.mode.syndicates)) ticker.mode.syndicates += src ticker.mode.update_synd_icons_added(src) if (ticker.mode.syndicates.len==1) ticker.mode.prepare_syndicate_leader(src) else current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" special_role = "Syndicate" assigned_role = "MODE" current << "\blue You are a [syndicate_name()] agent!" ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) current.loc = get_turf(locate("landmark*Syndicate-Spawn")) var/mob/living/carbon/human/H = current qdel(H.belt) qdel(H.back) qdel(H.l_ear) qdel(H.r_ear) qdel(H.gloves) qdel(H.head) qdel(H.shoes) qdel(H.wear_id) qdel(H.wear_pda) qdel(H.wear_suit) qdel(H.w_uniform) ticker.mode.equip_syndicate(current) proc/make_Changling() if(!(src in ticker.mode.changelings)) ticker.mode.changelings += src ticker.mode.grant_changeling_powers(current) special_role = "Changeling" ticker.mode.forge_changeling_objectives(src) ticker.mode.greet_changeling(src) proc/make_Wizard() if(!(src in ticker.mode.wizards)) ticker.mode.wizards += src special_role = "Wizard" assigned_role = "MODE" //ticker.mode.learn_basic_spells(current) if(!wizardstart.len) current.loc = pick(latejoin) current << "HOT INSERTION, GO GO GO" else current.loc = pick(wizardstart) ticker.mode.equip_wizard(current) for(var/obj/item/weapon/spellbook/S in current.contents) S.op = 0 ticker.mode.name_wizard(current) ticker.mode.forge_wizard_objectives(src) ticker.mode.greet_wizard(src) proc/make_Cultist() if(!(src in ticker.mode.cult)) ticker.mode.cult += src ticker.mode.update_cult_icons_added(src) special_role = "Cultist" current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." var/datum/game_mode/cult/cult = ticker.mode if (istype(cult)) cult.memoize_cult_objectives(src) else var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." current << "Objective #1: [explanation]" current.memory += "Objective #1: [explanation]
" current << "The convert rune is join blood self" current.memory += "The convert rune is join blood self
" var/mob/living/carbon/human/H = current if (istype(H)) var/obj/item/weapon/tome/T = new(H) var/list/slots = list ( "backpack" = slot_in_backpack, "left pocket" = slot_l_store, "right pocket" = slot_r_store, "left hand" = slot_l_hand, "right hand" = slot_r_hand, ) var/where = H.equip_in_one_of_slots(T, slots) if (!where) else H << "A tome, a message from your new master, appears in your [where]." if (!ticker.mode.equip_cultist(current)) H << "Spawning an amulet from your Master failed." proc/make_Rev() if (ticker.mode.head_revolutionaries.len>0) // copy targets var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries if (valid_head) for (var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new rev_obj.owner = src rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." objectives += rev_obj ticker.mode.greet_revolutionary(src,0) ticker.mode.head_revolutionaries += src ticker.mode.update_rev_icons_added(src) special_role = "Head Revolutionary" ticker.mode.forge_revolutionary_objectives(src) ticker.mode.greet_revolutionary(src,0) var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L qdel(flash) take_uplink() var/fail = 0 // fail |= !ticker.mode.equip_traitor(current, 1) fail |= !ticker.mode.equip_revolutionary(current) // check whether this mind's mob has been brigged for the given duration // have to call this periodically for the duration to work properly proc/is_brigged(duration) var/turf/T = current.loc if(!istype(T)) brigged_since = -1 return 0 var/is_currently_brigged = current.is_in_brig() if(!is_currently_brigged) brigged_since = -1 return 0 if(brigged_since == -1) brigged_since = world.time return (duration <= world.time - brigged_since) /datum/mind/proc/AddSpell(var/obj/effect/proc_holder/spell/spell) spell_list += spell if(!spell.action) spell.action = new/datum/action/spell_action spell.action.target = spell spell.action.name = spell.name spell.action.button_icon = spell.action_icon spell.action.button_icon_state = spell.action_icon_state spell.action.background_icon_state = spell.action_background_icon_state spell.action.Grant(current) return /datum/mind/proc/transfer_actions(var/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) for(var/obj/effect/proc_holder/spell/spell in spell_list) if(!spell.action) // Unlikely but whatever spell.action = new/datum/action/spell_action spell.action.target = spell spell.action.name = spell.name spell.action.button_icon = spell.action_icon spell.action.button_icon_state = spell.action_icon_state spell.action.background_icon_state = spell.action_background_icon_state spell.action.Grant(new_character) return //Initialisation procs /mob/proc/mind_initialize() if(mind) mind.key = key else mind = new /datum/mind(key) if(ticker) ticker.minds += mind else error("mind_initialize(): No ticker ready yet! Please inform Carn") 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 /mob/proc/sync_mind() mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) mind.active = 1 //indicates that the mind is currently synced with a client //slime /mob/living/carbon/slime/mind_initialize() ..() mind.assigned_role = "slime" //XENO /mob/living/carbon/alien/mind_initialize() ..() mind.assigned_role = "Alien" //XENO HUMANOID /mob/living/carbon/alien/humanoid/queen/mind_initialize() ..() mind.special_role = "Queen" /mob/living/carbon/alien/humanoid/hunter/mind_initialize() ..() mind.special_role = "Hunter" /mob/living/carbon/alien/humanoid/drone/mind_initialize() ..() mind.special_role = "Drone" /mob/living/carbon/alien/humanoid/sentinel/mind_initialize() ..() mind.special_role = "Sentinel" //XENO LARVA /mob/living/carbon/alien/larva/mind_initialize() ..() mind.special_role = "Larva" //AI /mob/living/silicon/ai/mind_initialize() ..() mind.assigned_role = "AI" //BORG /mob/living/silicon/robot/mind_initialize() ..() mind.assigned_role = "Cyborg" //PAI /mob/living/silicon/pai/mind_initialize() ..() mind.assigned_role = "pAI" mind.special_role = "" //BLOB /mob/camera/overmind/mind_initialize() ..() mind.special_role = "Blob" //Animals /mob/living/simple_animal/mind_initialize() ..() mind.assigned_role = "Animal" /mob/living/simple_animal/pet/corgi/mind_initialize() ..() mind.assigned_role = "Corgi" /mob/living/simple_animal/shade/mind_initialize() ..() mind.assigned_role = "Shade" /mob/living/simple_animal/construct/builder/mind_initialize() ..() mind.assigned_role = "Artificer" mind.special_role = "Cultist" /mob/living/simple_animal/construct/wraith/mind_initialize() ..() mind.assigned_role = "Wraith" mind.special_role = "Cultist" /mob/living/simple_animal/construct/armoured/mind_initialize() ..() mind.assigned_role = "Juggernaut" mind.special_role = "Cultist" /mob/living/simple_animal/vox/armalis/mind_initialize() ..() mind.assigned_role = "Armalis" mind.special_role = "Vox Raider"