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"