diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0f4ddab01e0e2..baac761495270 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -363,11 +363,11 @@ U.setup_unlock_code() if(!silent) if(uplink_loc == R) - U.unlock_text = "[employer] has cunningly disguised a Syndicate Uplink as your [R.name]. Simply speak [U.unlock_code] into the :d channel to unlock its hidden features." + U.unlock_text = "[employer] [employer == "You" ? "have" : "has"] cunningly disguised a Syndicate Uplink as your [R.name]. Simply speak [U.unlock_code] into the :d channel to unlock its hidden features." else if(uplink_loc == PDA) - U.unlock_text = "[employer] has cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[U.unlock_code]\" into the ring tone selection to unlock its hidden features." + U.unlock_text = "[employer] [employer == "You" ? "have" : "has"] cunningly disguised a Syndicate Uplink as your [PDA.name]. Simply enter the code \"[U.unlock_code]\" into the ring tone selection to unlock its hidden features." else if(uplink_loc == P) - U.unlock_text = "[employer] has cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [english_list(U.unlock_code)] from its starting position to unlock its hidden features." + U.unlock_text = "[employer] [employer == "You" ? "have" : "has"] cunningly disguised a Syndicate Uplink as your [P.name]. Simply twist the top of the pen [english_list(U.unlock_code)] from its starting position to unlock its hidden features." to_chat(traitor_mob, "[U.unlock_text]") if(uplink_owner) @@ -379,7 +379,7 @@ I.implant(traitor_mob, null, silent = TRUE) var/datum/component/uplink/U = I.GetComponent(/datum/component/uplink) if(!silent) - U.unlock_text = "[employer] has cunningly implanted you with a Syndicate Uplink (although uplink implants cost valuable TC, so you will have slightly less). Simply trigger the uplink to access it." + U.unlock_text = "[employer] [employer == "You" ? "have" : "has"] cunningly implanted [employer == "You" ? "yourself" : "you"] with a Syndicate Uplink (although uplink implants cost valuable TC, so you will have slightly less). Simply trigger the uplink to access it." to_chat(traitor_mob, "[U.unlock_text]") return I diff --git a/code/modules/antagonists/traitor/backstory/traitor_datum_backstory.dm b/code/modules/antagonists/traitor/backstory/traitor_datum_backstory.dm index 2e9fa72dadfdd..d9ba57f5e9bbf 100644 --- a/code/modules/antagonists/traitor/backstory/traitor_datum_backstory.dm +++ b/code/modules/antagonists/traitor/backstory/traitor_datum_backstory.dm @@ -43,9 +43,7 @@ return var/no_faction = isnull(faction) faction = new_faction - employer = new_faction.name - if(new_faction.key == TRAITOR_FACTION_INDEPENDENT) - employer = "You" // "Independent has cunningly disguised a syndicate uplink" doesn't quite work + employer = new_faction.employer_name if(forced) // If the UI is open, force it to recognize the new faction ui_update() @@ -55,7 +53,6 @@ if(no_faction) if(new_faction.give_codewords) give_codewords() - show_tips("traitor_[new_faction.key]") equip(silent) /datum/antagonist/traitor/proc/set_backstory(datum/traitor_backstory/new_backstory) diff --git a/code/modules/antagonists/traitor/backstory/traitor_factions.dm b/code/modules/antagonists/traitor/backstory/traitor_factions.dm index 315907c964d4a..837c6ca7af3af 100644 --- a/code/modules/antagonists/traitor/backstory/traitor_factions.dm +++ b/code/modules/antagonists/traitor/backstory/traitor_factions.dm @@ -1,6 +1,8 @@ /datum/traitor_faction /// The name of this faction var/name + /// The name of this faction when shown to the player as their employer. + var/employer_name /// The define tied to this faction var/key /// A short description of this faction, OOC @@ -12,6 +14,7 @@ /datum/traitor_faction/syndicate name = "The Syndicate" + employer_name = "The Syndicate" description = "A classic - either you were forced into it through blackmail, threat, or debts - or you were born for it, built for it, or \ maybe you joined to get revenge.\n\ Either way, you will have potential allies in other syndicate agents, codewords, and communication methods. You'll have all the resources at your disposal.\n\ @@ -22,6 +25,7 @@ /datum/traitor_faction/black_market name = "The Black Market" + employer_name = "Your black market liason" description = "You're in it for the money, or because you were forced into it.\n\ The monetary potential aboard a Nanotrasen station is huge, and there are actors willing to take advantage of your position.\n\ Your employer expects nothing but good results - and you'd better give it to them, lest you face the consequences.\n\ @@ -32,6 +36,7 @@ /datum/traitor_faction/independent name = "Independent" + employer_name = "You" description = "Not for the faint of heart, being an independent traitor requires superior roleplay abilities, and superior traitor skills. \n\ You are a person who holds grudges, and has been hurt greatly by Nanotrasen.\n\ You will have no allies, and you can only get by on your stolen Syndicate uplink. You have one chance, don't blow it. \n\ diff --git a/code/modules/antagonists/traitor/backstory/traitor_objective_ui.dm b/code/modules/antagonists/traitor/backstory/traitor_objective_ui.dm index 0b02e9b16abef..6a5266f6607ac 100644 --- a/code/modules/antagonists/traitor/backstory/traitor_objective_ui.dm +++ b/code/modules/antagonists/traitor/backstory/traitor_objective_ui.dm @@ -1,29 +1,31 @@ /datum/antagonist/traitor ui_name = "TraitorObjectivesMenu" - var/datum/action/innate/traitor_menu/menu + +/// We will handle this ourselves, thank you. +/datum/antagonist/traitor/make_info_button() + return null /datum/antagonist/traitor/proc/add_menu_action() - if(menu != null) + if(info_button_ref?.resolve() != null) return - menu = new /datum/action/innate/traitor_menu(src) + var/datum/action/antag_info/traitor_menu/menu = new(src) menu.Grant(owner.current) + info_button_ref = WEAKREF(menu) -/datum/action/innate/traitor_menu - name = "Traitor Objectives" - desc = "View and customize your traitor faction, backstory, objectives, and objective backstories." +/datum/action/antag_info/traitor_menu + name = "Traitor Info and Backstory" + desc = "View and customize your traitor faction, backstory, objectives, codewords, uplink location, \ + and objective backstories." button_icon_state = "traitor_objectives" background_icon_state = "bg_agent" - var/datum/antagonist/traitor/ownerantag -/datum/action/innate/traitor_menu/New(datum/H) +/datum/action/antag_info/traitor_menu/New(datum/H) . = ..() + name = "Traitor Info and Backstory" button.name = name - ownerantag = H - -/datum/action/innate/traitor_menu/Activate() - ownerantag.ui_interact(owner) /datum/antagonist/traitor/ui_data(mob/user) + var/list/data = list() data["allowed_factions"] = allowed_factions data["allowed_backstories"] = allowed_backstories @@ -33,6 +35,21 @@ data["backstory"] = "[backstory.type]" if(istype(faction)) data["faction"] = faction.key + data["employer"] = employer + + var/datum/component/uplink/uplink = uplink_ref?.resolve() + data["antag_name"] = name + data["has_codewords"] = has_codewords + if(has_codewords) + data["phrases"] = jointext(GLOB.syndicate_code_phrase, ", ") + data["responses"] = jointext(GLOB.syndicate_code_response, ", ") + data["code"] = uplink?.unlock_code + data["failsafe_code"] = uplink?.failsafe_code + data["has_uplink"] = uplink ? TRUE : FALSE + if(uplink) + data["uplink_unlock_info"] = uplink.unlock_text + data["objectives"] = get_objectives() + return data /datum/antagonist/traitor/ui_static_data(mob/user) @@ -79,12 +96,12 @@ return TRUE if(!("[selected_backstory.type]" in allowed_backstories)) return TRUE - set_faction(selected_faction) + if(!istype(faction)) + set_faction(selected_faction) set_backstory(selected_backstory) return TRUE if("gimme_uplink") if(istype(faction)) return TRUE set_faction(GLOB.traitor_factions_to_datum[TRAITOR_FACTION_SYNDICATE]) - SStgui.close_user_uis(usr, src) - return FALSE + return TRUE diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 3a16cdede60a9..d0f128624ee68 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -8,7 +8,6 @@ banning_key = ROLE_TRAITOR required_living_playtime = 4 antag_moodlet = /datum/mood_event/focused - ui_name = "AntagInfoTraitor" hijack_speed = 0.5 //10 seconds per hijack stage by default var/special_role = ROLE_TRAITOR /// Shown when giving uplinks and codewords to the player @@ -48,32 +47,12 @@ QDEL_NULL(A.radio.keyslot) A.radio.recalculateChannels() - if(menu) - menu.Remove(owner.current) - QDEL_NULL(menu) - SSticker.mode.traitors -= owner if(!silent && owner.current) to_chat(owner.current," You are no longer the [special_role]! ") owner.special_role = null ..() -/datum/antagonist/traitor/ui_static_data(mob/user) - var/datum/component/uplink/uplink = uplink_ref?.resolve() - var/list/data = list() - data["antag_name"] = name - data["has_codewords"] = has_codewords - if(has_codewords) - data["phrases"] = jointext(GLOB.syndicate_code_phrase, ", ") - data["responses"] = jointext(GLOB.syndicate_code_response, ", ") - data["code"] = uplink?.unlock_code - data["failsafe_code"] = uplink?.failsafe_code - data["has_uplink"] = uplink ? TRUE : FALSE - if(uplink) - data["uplink_unlock_info"] = uplink.unlock_text - data["objectives"] = get_objectives() - return data - /datum/antagonist/traitor/proc/handle_hearing(datum/source, list/hearing_args) SIGNAL_HANDLER var/message = hearing_args[HEARING_RAW_MESSAGE] @@ -98,19 +77,12 @@ /datum/antagonist/traitor/greet() var/list/msg = list() msg += "You are the [owner.special_role]." - msg += "Use the 'Open [owner.special_role] Information' action at the top left in order to review your objectives and codewords!" + msg += "Use the 'Traitor Info and Backstory' action at the top left in order to select a backstory and review your objectives, uplink location, and codewords!" to_chat(owner.current, EXAMINE_BLOCK(msg.Join("\n"))) owner.current.client?.tgui_panel?.give_antagonist_popup("Traitor", "Complete your objectives, no matter the cost.") if(traitor_kind == TRAITOR_AI) - give_codewords() // humans get this assigned by their faction - -/datum/antagonist/traitor/proc/forge_single_objective() - switch(traitor_kind) - if(TRAITOR_AI) - return forge_single_AI_objective() - else - return forge_single_human_objective() + has_codewords = TRUE /datum/antagonist/traitor/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR] @@ -149,26 +121,11 @@ A.hack_software = FALSE UnregisterSignal(owner.current, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing)) +/// Enables displaying codewords to this traitor. /datum/antagonist/traitor/proc/give_codewords() if(!owner.current || !istype(faction)) return has_codewords = TRUE - give_codewords_to_player(owner.current, src, faction.name) - -/proc/give_codewords_to_player(mob/player, datum/antagonist/antag_datum, employer = "The Syndicate") - var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") - var/responses = jointext(GLOB.syndicate_code_response, ", ") - - to_chat(player, "[employer] have provided you with the following codewords to identify fellow agents:") - to_chat(player, "Code Phrase: [phrases]") - to_chat(player, "Code Response: [responses]") - - if(istype(antag_datum)) - antag_datum.antag_memory += "Code Phrase: [phrases]
" - antag_datum.antag_memory += "Code Response: [responses]
" - - to_chat(player, "Use the codewords during regular conversation to identify other agents. Proceed with caution, however, as everyone is a potential foe.") - to_chat(player, "You memorize the codewords, allowing you to recognise them when heard.") /datum/antagonist/traitor/proc/equip(var/silent = FALSE) if(traitor_kind == TRAITOR_HUMAN) diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm index 4acf3cc0acf4c..5b09bb9223815 100644 --- a/code/modules/antagonists/traitor/equipment/contractor.dm +++ b/code/modules/antagonists/traitor/equipment/contractor.dm @@ -26,7 +26,6 @@ to_chat(owner.current, "You are the Contractor Support Unit.") owner.announce_objectives() if(owner.current) - give_codewords_to_player(owner.current, src) if(owner.current.client) owner.current.client.tgui_panel?.give_antagonist_popup("Contractor Support Unit", "Follow your contractor's orders.") diff --git a/html/antagtips/traitor_black_market.html b/html/antagtips/traitor_black_market.html deleted file mode 100644 index 3bdd5cd2d380c..0000000000000 --- a/html/antagtips/traitor_black_market.html +++ /dev/null @@ -1,14 +0,0 @@ - -
-

You are a Traitor!

- -

The Black Market has provided you with a disguised uplink. It can either be your PDA, your headset, or your pen.

-

The details of your objective are stored within your notes, to see them use the Notes verb.

-

To utilize your PDA uplink, enter the messenger tab and set the ringtone as the code you have been provided.

-

To utilize your Headset uplink, speak the code provided into the :d channel.

-

To utilize the pen uplink, twist it to the first setting, then to the second one.

-

The uplink starts out with 20 telecrystals which are utilized to purchase different items to aid you in fulfilling your objectives.

-

Try fulfilling your objectives, but don't forget to create fun situations for both you and the crew.

-

For further information visit https://wiki.beestation13.com/view/Traitor

-
- diff --git a/html/antagtips/traitor_independent.html b/html/antagtips/traitor_independent.html deleted file mode 100644 index ba83a288b15b1..0000000000000 --- a/html/antagtips/traitor_independent.html +++ /dev/null @@ -1,14 +0,0 @@ - -
-

You are a Traitor!

- -

You have retrieved a stolen disguised uplink. It can either be your PDA, your headset, or your pen.

-

The details of your objective are stored within your notes, to see them use the Notes verb.

-

To utilize your PDA uplink, enter the messenger tab and set the ringtone as the code you have been provided.

-

To utilize your Headset uplink, speak the code provided into the :d channel.

-

To utilize the pen uplink, twist it to the first setting, then to the second one.

-

The uplink starts out with 20 telecrystals which are utilized to purchase different items to aid you in fulfilling your objectives.

-

Try fulfilling your objectives, but don't forget to create fun situations for both you and the crew.

-

For further information visit https://wiki.beestation13.com/view/Traitor

-
- diff --git a/html/antagtips/traitor_syndicate.html b/html/antagtips/traitor_syndicate.html deleted file mode 100644 index a9910db7bf80a..0000000000000 --- a/html/antagtips/traitor_syndicate.html +++ /dev/null @@ -1,15 +0,0 @@ - -
-

You are a Traitor!

- -

The Syndicate has provided you with a disguised uplink. It can either be your PDA, your headset, or your pen.

-

The details of your objective are stored within your notes, to see them use the Notes verb.

-

To utilize your PDA uplink, enter the messenger tab and set the ringtone as the code you have been provided.

-

To utilize your Headset uplink, speak the code provided into the :d channel.

-

To utilize the pen uplink, twist it to the first setting, then to the second one.

-

The uplink starts out with 20 telecrystals which are utilized to purchase different items to aid you in fulfilling your objectives.

-

The Syndicate has also given you and any other agents on board code-words which can be used to find eachother. They're highlighted in red and blue.

-

Try fulfilling your objectives, but don't forget to create fun situations for both you and the crew.

-

For further information visit https://wiki.beestation13.com/view/Traitor

-
- diff --git a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx index 9daee4698c43c..76dceb8a6713f 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx @@ -100,26 +100,32 @@ const CodewordsSection = (_props, context) => { ); }; -export const AntagInfoTraitor = (_props, context) => { +export const AntagInfoTraitorContent = (_props, context) => { const { data } = useBackend(context); const { antag_name, objectives } = data; + return ( + + + + + + + + + + + + + + + ); +}; + +export const AntagInfoTraitor = (_props, context) => { return ( - - - - - - - - - - - - - - + ); diff --git a/tgui/packages/tgui/interfaces/TraitorObjectivesMenu.js b/tgui/packages/tgui/interfaces/TraitorObjectivesMenu.js index dd80ade13fcc2..1653739cb5e7d 100644 --- a/tgui/packages/tgui/interfaces/TraitorObjectivesMenu.js +++ b/tgui/packages/tgui/interfaces/TraitorObjectivesMenu.js @@ -1,56 +1,97 @@ import { useBackend, useLocalState } from '../backend'; import { Button, Dimmer, Stack, Box, Section, Tabs, Flex, Icon, Tooltip } from '../components'; import { Window } from '../layouts'; +import { AntagInfoTraitorContent } from './AntagInfoTraitor'; export const TraitorObjectivesMenu = (_, context) => { const { data } = useBackend(context); - const { - all_backstories = {}, - backstory, - } = data; - let [ui_phase, set_ui_phase] = useLocalState(context, "traitor_ui_phase", all_backstories[backstory] ? 3 : 0); - let [selected_faction, set_selected_faction_backend] = useLocalState(context, "traitor_selected_faction", "syndicate"); - let [selected_backstory, set_selected_backstory] = useLocalState(context, "traitor_selected_backstory", null); + const { all_backstories = {}, all_factions = {}, backstory, faction } = data; + let has_backstory = all_backstories[backstory]; + let has_faction = all_factions[faction]; + let [ui_phase, set_ui_phase] = useLocalState(context, 'traitor_ui_phase', has_faction ? 2 : 0); + let [tabIndex, setTabIndex] = useLocalState(context, 'traitor_selected_tab', 1); + let [selected_faction, set_selected_faction_backend] = useLocalState(context, 'traitor_selected_faction', 'syndicate'); + let [selected_backstory, set_selected_backstory] = useLocalState(context, 'traitor_selected_backstory', null); const set_selected_faction = (faction) => { set_selected_faction_backend(faction); if (selected_backstory && !all_backstories[selected_backstory].allowed_factions.includes(faction)) { set_selected_backstory(null); } }; - let windowTitle = "Traitor Backstory"; + let windowTitle = 'Traitor Backstory'; switch (ui_phase) { case 0: - windowTitle = "Traitor Backstory: Introduction"; + windowTitle = 'Traitor Backstory: Introduction'; break; case 1: - windowTitle = "Traitor Backstory: Faction Select"; + windowTitle = 'Traitor Backstory: Faction Select'; break; case 2: - windowTitle = "Traitor Backstory: Backstory Select"; + windowTitle = tabIndex === 1 ? 'Traitor Info' : 'Traitor Backstory'; break; } + let info_ui = ui_phase === 2 && has_faction; return ( - + - {ui_phase === 0 && ( - - )} + {ui_phase === 0 && } {ui_phase === 1 && ( + set_selected_faction={set_selected_faction} + /> )} - {ui_phase === 2 && ( + {ui_phase === 2 && !has_faction && ( + set_selected_backstory={set_selected_backstory} + show_nav + /> )} - {ui_phase === 3 && ( - + {ui_phase === 2 && has_faction && ( + <> + +