diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index abdb1832d6f..61f7f08824e 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -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."
@@ -575,6 +623,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 +735,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 +829,7 @@ datum/objective/minimize_casualties
check_completion()
if(owner.kills.len>5) return 0
return 1
-
+
//Vox heist objectives.
datum/objective/heist
diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm
index dccaabeff59..dc2955d7d36 100644
--- a/code/game/gamemodes/steal_items.dm
+++ b/code/game/gamemodes/steal_items.dm
@@ -113,6 +113,10 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C)
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
@@ -220,6 +224,18 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C)
/datum/theft_objective/special
flags = THEFT_FLAG_SPECIAL
+/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 = "advanced energy gun"
typepath = /obj/item/weapon/gun/energy/gun/nuclear
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 3e70f6fd730..0743172bd54 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -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,42 @@
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
+ 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
+ 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 +216,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 +404,45 @@
update_traitor_icons_removed(traitor_mind)
//world << "Removed [traitor_mind.current.name] from traitor shit"
traitor_mind.current << "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)"
+
+/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 << "
[where] is a folder containing secret documents 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.
"
+ mob.update_icons()
diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm
new file mode 100644
index 00000000000..b0761167d4e
--- /dev/null
+++ b/code/game/objects/items/documents.dm
@@ -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"
\ No newline at end of file
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index f2b05f5432f..613b3a39b5f 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -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 << "You put [P] in [src]."
user.drop_item()
P.loc = src
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index c12eea86e4d..828c9f90d29 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -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 << "You put the [W] into \the [src]."
@@ -51,6 +51,8 @@
dat += "Remove - [Ph.name]
"
for(var/obj/item/weapon/paper_bundle/Pa in src)
dat += "Remove - [Pa.name]
"
+ for(var/obj/item/documents/doc in src)
+ dat += "Remove - [doc.name]
"
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()
+
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index a42b0125b6a..b1e9553d546 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 53bf50e7e66..6108f3f06f3 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -1734,7 +1734,7 @@
"aHr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "vault"; dir = 6},/area/security/nuke_storage)
"aHs" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "vault"},/area/security/nuke_storage)
"aHt" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 10},/area/security/nuke_storage)
-"aHu" = (/obj/machinery/computer/secure_data/detective_computer,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
+"aHu" = (/obj/machinery/computer/secure_data/detective_computer,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/folder/documents,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
"aHv" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/gateway)
"aHw" = (/obj/machinery/gateway{density = 0},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/gateway)
"aHx" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/gateway)
diff --git a/paradise.dme b/paradise.dme
index a790a81d85a..3f3bdb6f14b 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -598,6 +598,7 @@
#include "code\game\objects\items\candle.dm"
#include "code\game\objects\items\contraband.dm"
#include "code\game\objects\items\crayons.dm"
+#include "code\game\objects\items\documents.dm"
#include "code\game\objects\items\flag.dm"
#include "code\game\objects\items\latexballoon.dm"
#include "code\game\objects\items\shooting_range.dm"