Merge pull request #244 from TheDZD/changeling

Traitor Objective Improvement
This commit is contained in:
Fox-McCloud
2015-01-31 21:11:46 -05:00
10 changed files with 320 additions and 60 deletions
+36 -25
View File
@@ -177,12 +177,12 @@ datum/mind
text += "<a href='?src=\ref[src];revolution=clear'>employee</a>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<b>REV</b>"
else
text += "<b>EMPLOYEE</b>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
if(current && current.client && current.client.prefs.be_special & BE_REV)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
sections["revolution"] = text
/** CULT ***/
@@ -201,13 +201,13 @@ datum/mind
*/
else
text += "<b>EMPLOYEE</b>|<a href='?src=\ref[src];cult=cultist'>cultist</a>"
if(current && current.client && current.client.prefs.be_special & BE_CULTIST)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
sections["cult"] = text
/** WIZARD ***/
@@ -222,12 +222,12 @@ datum/mind
text += "<br>Objectives are empty! <a href='?src=\ref[src];wizard=autoobjectives'>Randomize!</a>"
else
text += "<a href='?src=\ref[src];wizard=wizard'>yes</a>|<b>NO</b>"
if(current && current.client && current.client.prefs.be_special & BE_WIZARD)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
sections["wizard"] = text
/** CHANGELING ***/
@@ -243,12 +243,12 @@ datum/mind
text += "<br><a href='?src=\ref[src];changeling=initialdna'>Transform to initial appearance.</a>"
else
text += "<a href='?src=\ref[src];changeling=changeling'>yes</a>|<b>NO</b>"
if(current && current.client && current.client.prefs.be_special & BE_CHANGELING)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
sections["changeling"] = text
/** NINJA ***/
@@ -263,12 +263,12 @@ datum/mind
//text += "<br>Objectives are empty! <a href='?src=\ref[src];wizard=autoobjectives'>Randomize!</a>"
else
text += "<a href='?src=\ref[src];ninja=ninja'>yes</a>|<b>NO</b>"
if(current && current.client && current.client.prefs.be_special & BE_NINJA)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
text += "|Disabled in Prefs"
sections["ninja"] = text
/** VAMPIRE ***/
@@ -282,15 +282,15 @@ datum/mind
text += "<br>Objectives are empty! <a href='?src=\ref[src];vampire=autoobjectives'>Randomize!</a>"
else
text += "<a href='?src=\ref[src];vampire=vampire'>yes</a>|<b>NO</b>"
if(src in ticker.mode.enthralled)
text += "<b><font color='#FF0000'>YES</font></b>|no"
else
text += "yes|<font color='#00FF00'>NO</font></b>"
/** Enthralled ***/
text += "<br><b>enthralled</b>"
sections["vampire"] = text
@@ -311,12 +311,12 @@ datum/mind
text += " Code is [code]. <a href='?src=\ref[src];nuclear=tellcode'>tell the code.</a>"
else
text += "<a href='?src=\ref[src];nuclear=nuclear'>operative</a>|<b>NANOTRASEN</b>"
if(current && current.client && current.client.prefs.be_special & BE_OPERATIVE)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
text += "|Disabled in Prefs"
sections["nuclear"] = text
/** TRAITOR ***/
@@ -333,12 +333,12 @@ datum/mind
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize</a>!"
else
text += "<a href='?src=\ref[src];traitor=traitor'>traitor</a>|<b>EMPLOYEE</b>"
if(current && current.client && current.client.prefs.be_special & BE_TRAITOR)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"
text += "|Disabled in Prefs"
sections["traitor"] = text
/** MONKEY ***/
@@ -359,12 +359,12 @@ datum/mind
else
text += "healthy|infected|human|<b>OTHER</b>"
/*if(current && current.client && current.client.prefs.be_special & BE_MONKEY)
text += "|Enabled in Prefs"
else
text += "|Disabled in Prefs"*/
text += "|Disabled in Prefs"*/
sections["monkey"] = text
@@ -475,13 +475,13 @@ datum/mind
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", "speciesist", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom")
var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "harm", "speciesist", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "destroy", "maroon", "custom")
if (!new_obj_type) return
var/datum/objective/new_objective = null
switch (new_obj_type)
if ("assassinate","protect","debrain", "harm", "brig")
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.
@@ -513,6 +513,17 @@ datum/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 ("speciesist")
new_objective = new /datum/objective/speciesist
new_objective.owner = src
+89 -1
View File
@@ -234,6 +234,31 @@ datum/objective/anti_revolution/demote
return 0
return 1
datum/objective/maroon
find_target()
..()
if(target && target.current)
explanation_text = "Prevent [target.current.real_name], the [target.assigned_role] from escaping alive."
else
explanation_text = "Free Objective"
return target
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Prevent [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] from escaping alive."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current)
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
if(target.current.z == 2)
return 0
return 1
datum/objective/debrain//I want braaaainssss
find_target()
..()
@@ -422,6 +447,29 @@ datum/objective/escape
else
return 0
datum/objective/escape/escape_with_identity
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
find_target()
target = ..()
if(target && target.current)
target_real_name = target.current.real_name
explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role] while wearing their identification card."
else
explanation_text = "Free Objective."
check_completion()
if(!target_real_name)
return 1
if(!ishuman(owner.current))
return 0
var/mob/living/carbon/human/H = owner.current
if(..())
if(H.dna.real_name == target_real_name)
if(H.get_id_name()== target_real_name)
return 1
return 0
datum/objective/die
explanation_text = "Die a glorious death."
@@ -545,6 +593,8 @@ datum/objective/steal
else
if(O.flags & 1) // THEFT_FLAG_SPECIAL
continue
if(O.flags & 2)
continue
steal_target=O
explanation_text = "Steal [O]."
return
@@ -575,6 +625,28 @@ datum/objective/steal
if(!steal_target) return 1 // Free Objective
return steal_target.check_completion(owner)
datum/objective/steal/exchange
proc/set_faction(var/faction,var/otheragent)
target = otheragent
var/datum/theft_objective/unique/targetinfo
if(faction == "red")
targetinfo = new /datum/theft_objective/unique/docs_blue
else if(faction == "blue")
targetinfo = new /datum/theft_objective/unique/docs_red
explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent"
steal_target = targetinfo.typepath
datum/objective/steal/exchange/backstab
set_faction(var/faction)
var/datum/theft_objective/unique/targetinfo
if(faction == "red")
targetinfo = new /datum/theft_objective/unique/docs_red
else if(faction == "blue")
targetinfo = new /datum/theft_objective/unique/docs_blue
explanation_text = "Do not give up or lose [targetinfo.name]."
steal_target = targetinfo.typepath
datum/objective/download
proc/gen_amount_goal()
@@ -665,7 +737,23 @@ datum/objective/absorb
else
return 0
datum/objective/destroy
find_target()
var/list/possible_targets = active_ais(1)
var/mob/living/silicon/ai/target_ai = pick(possible_targets)
target = target_ai.mind
if(target && target.current)
explanation_text = "Destroy [target.name], the experimental AI."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current)
if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey)
return 1
return 0
return 1
/* Isn't suited for global objectives
/*---------CULTIST----------*/
@@ -743,7 +831,7 @@ datum/objective/minimize_casualties
check_completion()
if(owner.kills.len>5) return 0
return 1
//Vox heist objectives.
datum/objective/heist
+43 -3
View File
@@ -3,6 +3,7 @@
// Separated into datums so we can prevent roles from getting certain objectives.
#define THEFT_FLAG_SPECIAL 1
#define THEFT_FLAG_UNIQUE 2
/datum/theft_objective
var/name=""
@@ -17,13 +18,16 @@
return 0
var/list/all_items = owner.current.get_contents()
for(var/obj/I in all_items) //Check for items
if(istype(I, typepath))
if(istype(I, typepath) && check_special_completion(I))
//Stealing the cheap autoinjector doesn't count
if(istype(I, /obj/item/weapon/reagent_containers/hypospray/autoinjector))
continue
return 1
return 0
/datum/proc/check_special_completion() //for objectives with special checks (is that slime extract unused? does that intellicard have an ai in it? etcetc)
return 1
/datum/theft_objective/antique_laser_gun
name = "the captain's antique laser gun"
typepath = /obj/item/weapon/gun/energy/laser/captain
@@ -52,6 +56,13 @@
name = "a functional AI"
typepath = /obj/item/device/aicard
datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C)
if(..())
for(var/mob/living/silicon/ai/A in C)
if(istype(A, /mob/living/silicon/ai) && A.stat != 2) //See if any AI's are alive inside that card.
return 1
return 0
/datum/theft_objective/defib
name = "a defibrillator"
typepath = /obj/item/weapon/defibrillator
@@ -73,12 +84,20 @@
protected_jobs = list("Research Director")
/datum/theft_objective/slime_extract
name = "a sample of slime extract"
name = "a sample of unused slime extract"
typepath = /obj/item/slime_extract
protected_jobs = list("Research Director","Xenobiologist")
/datum/theft_objective/slime_extract/check_special_completion(var/obj/item/slime_extract/E)
if(..())
if(E.Uses > 0)
return 1
return 0
/datum/theft_objective/corgi
name = "a piece of corgi meat"
typepath = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
protected_jobs = list("Head of Personnel")
/datum/theft_objective/capmedal
name = "the medal of captaincy"
@@ -95,6 +114,10 @@
typepath = /obj/item/clothing/suit/armor/reactive
protected_jobs = list("Research Director")
/datum/theft_objective/steal/documents
name = "any set of secret documents of any organization"
typepath = /obj/item/documents //Any set of secret documents. Doesn't have to be NT's
/datum/theft_objective/rd_jumpsuit
name = "the research director's jumpsuit"
typepath = /obj/item/clothing/under/rank/research_director
@@ -133,6 +156,7 @@
/datum/theft_objective
name = "an ablative armor vest"
typepath = /obj/item/clothing/suit/armor/laserproof
protected_jobs = list("Head of Security", "Warden")
/datum/theft_objective/number
var/min=0
@@ -170,6 +194,7 @@
typepath = /obj/item/weapon/tank
min=28
max=28
protected_jobs = list("Chief Engineer", "Engineer", "Scientist", "Research Director", "Life Support Specialist")
/datum/theft_objective/number/plasma_gas/getAmountStolen(var/obj/item/I)
return I:air_contents:toxins
@@ -200,8 +225,23 @@
/datum/theft_objective/special
flags = THEFT_FLAG_SPECIAL
/datum/theft_objective/unique
flags = THEFT_FLAG_UNIQUE
/datum/theft_objective/unique/docs_red
name = "the \"Red\" secret documents"
typepath = /obj/item/documents/syndicate/red
/datum/theft_objective/unique/docs_blue
name = "the \"Blue\" secret documents"
typepath = /obj/item/documents/syndicate/blue
/datum/theft_objective/special/pinpointer
name = "the captain's pinpointer"
typepath = /obj/item/weapon/pinpointer
/datum/theft_objective/special/nuke_gun
name = "nuclear gun"
name = "advanced energy gun"
typepath = /obj/item/weapon/gun/energy/gun/nuclear
/datum/theft_objective/special/diamond_drill
+87 -28
View File
@@ -4,6 +4,9 @@
var/list/datum/mind/implanter = list()
var/list/datum/mind/implanted = list()
var/datum/mind/exchange_red
var/datum/mind/exchange_blue
/datum/game_mode/traitor
name = "traitor"
config_tag = "traitor"
@@ -95,34 +98,49 @@
traitor.objectives += block_objective
else
switch(rand(1,100))
if(1 to 30)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
if(31 to 40)
var/datum/objective/debrain/debrain_objective = new
debrain_objective.owner = traitor
debrain_objective.find_target()
traitor.objectives += debrain_objective
if(41 to 50)
var/datum/objective/protect/protect_objective = new
protect_objective.owner = traitor
protect_objective.find_target_with_special_role(null,0)
if (!protect_objective.target)
protect_objective.find_target() //We could not find any traitors, protect somebody
traitor.objectives += protect_objective
if(51 to 66)
var/datum/objective/harm/harm_objective = new
harm_objective.owner = traitor
harm_objective.find_target()
traitor.objectives += harm_objective
if(!exchange_blue && traitors.len >= 5) //Set up an exchange if there are enough traitors
if(!exchange_red)
exchange_red = traitor
else
var/datum/objective/steal/steal_objective = new
steal_objective.owner = traitor
steal_objective.find_target()
traitor.objectives += steal_objective
exchange_blue = traitor
assign_exchange_role(exchange_red)
assign_exchange_role(exchange_blue)
else
var/list/active_ais = active_ais()
if(active_ais.len && prob(100/num_players()))
var/datum/objective/destroy/destroy_objective = new
destroy_objective.owner = traitor
destroy_objective.find_target()
traitor.objectives += destroy_objective
else
switch(rand(1,100))
if(1 to 30)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
if(31 to 40)
var/datum/objective/debrain/debrain_objective = new
debrain_objective.owner = traitor
debrain_objective.find_target()
traitor.objectives += debrain_objective
if(41 to 50)
var/datum/objective/protect/protect_objective = new
protect_objective.owner = traitor
protect_objective.find_target_with_special_role(null,0)
if (!protect_objective.target)
protect_objective.find_target() //We could not find any traitors, protect somebody
traitor.objectives += protect_objective
if(51 to 61)
var/datum/objective/harm/harm_objective = new
harm_objective.owner = traitor
harm_objective.find_target()
traitor.objectives += harm_objective
else
var/datum/objective/steal/steal_objective = new
steal_objective.owner = traitor
steal_objective.find_target()
traitor.objectives += steal_objective
switch(rand(1,100))
if(1 to 30) // Die glorious death
if (!(locate(/datum/objective/die) in traitor.objectives) && !(locate(/datum/objective/steal) in traitor.objectives))
@@ -205,7 +223,6 @@
traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
/datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer)
var/law = "Accomplish your objectives at all costs."
var/law_borg = "Accomplish your AI's objectives at all costs."
@@ -394,3 +411,45 @@
update_traitor_icons_removed(traitor_mind)
//world << "Removed [traitor_mind.current.name] from traitor shit"
traitor_mind.current << "\red <FONT size = 3><B>The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)</B></FONT>"
/datum/game_mode/proc/assign_exchange_role(var/datum/mind/owner)
//set faction
var/faction = "red"
if(owner == exchange_blue)
faction = "blue"
//Assign objectives
var/datum/objective/steal/exchange/exchange_objective = new
exchange_objective.set_faction(faction,((faction == "red") ? exchange_blue : exchange_red))
exchange_objective.owner = owner
owner.objectives += exchange_objective
if(prob(20))
var/datum/objective/steal/exchange/backstab/backstab_objective = new
backstab_objective.set_faction(faction)
backstab_objective.owner = owner
owner.objectives += backstab_objective
//Spawn and equip documents
var/mob/living/carbon/human/mob = owner.current
var/obj/item/weapon/folder/syndicate/folder
if(owner == exchange_red)
folder = new/obj/item/weapon/folder/syndicate/red(mob.locs)
else
folder = new/obj/item/weapon/folder/syndicate/blue(mob.locs)
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 = "At your feet"
var/equipped_slot = mob.equip_in_one_of_slots(folder, slots)
if (equipped_slot)
where = "In your [equipped_slot]"
mob << "<BR><BR><span class='info'>[where] is a folder containing <b>secret documents</b> that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.</span><BR>"
mob.update_icons()
+29
View File
@@ -0,0 +1,29 @@
/obj/item/documents
name = "secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "docs_generic"
item_state = "paper"
throwforce = 0
w_class = 1.0
throw_range = 1
throw_speed = 1
layer = 4
pressure_resistance = 1
/obj/item/documents/nanotrasen
desc = "\"Top Secret\" Nanotrasen documents printed on special copy-protected paper. It is filled with complex diagrams and lists of names, dates and coordinates."
icon_state = "docs_verified"
/obj/item/documents/syndicate
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence."
/obj/item/documents/syndicate/red
name = "'Red' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Red\"."
icon_state = "docs_red"
/obj/item/documents/syndicate/blue
name = "'Blue' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"."
icon_state = "docs_blue"
+1 -1
View File
@@ -34,7 +34,7 @@
/obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob)
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle))
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle) || istype(P, /obj/item/documents))
user << "<span class='notice'>You put [P] in [src].</span>"
user.drop_item()
P.loc = src
+33 -1
View File
@@ -31,7 +31,7 @@
return
/obj/item/weapon/folder/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo) || istype(W, /obj/item/weapon/paper_bundle))
if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo) || istype(W, /obj/item/weapon/paper_bundle) || istype(W, /obj/item/documents))
user.drop_item()
W.loc = src
user << "<span class='notice'>You put the [W] into \the [src].</span>"
@@ -51,6 +51,8 @@
dat += "<A href='?src=\ref[src];remove=\ref[Ph]'>Remove</A> - <A href='?src=\ref[src];look=\ref[Ph]'>[Ph.name]</A><BR>"
for(var/obj/item/weapon/paper_bundle/Pa in src)
dat += "<A href='?src=\ref[src];remove=\ref[Pa]'>Remove</A> - <A href='?src=\ref[src];look=\ref[Pa]'>[Pa.name]</A><BR>"
for(var/obj/item/documents/doc in src)
dat += "<A href='?src=\ref[src];remove=\ref[doc]'>Remove</A> - <A href='?src=\ref[src];look=\ref[doc]'>[doc.name]</A><BR>"
user << browse(dat, "window=folder")
onclose(user, "folder")
add_fingerprint(usr)
@@ -92,3 +94,33 @@
attack_self(usr)
update_icon()
return
/obj/item/weapon/folder/documents
name = "folder- 'TOP SECRET'"
desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\""
/obj/item/weapon/folder/documents/New()
..()
new /obj/item/documents/nanotrasen(src)
update_icon()
/obj/item/weapon/folder/syndicate
name = "folder- 'TOP SECRET'"
desc = "A folder stamped \"Top Secret - Property of The Syndicate.\""
/obj/item/weapon/folder/syndicate/red
icon_state = "folder_sred"
/obj/item/weapon/folder/syndicate/red/New()
..()
new /obj/item/documents/syndicate/red(src)
update_icon()
/obj/item/weapon/folder/syndicate/blue
icon_state = "folder_sblue"
/obj/item/weapon/folder/syndicate/blue/New()
..()
new /obj/item/documents/syndicate/blue(src)
update_icon()