diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 0981cabac877..040a2397bfab 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -52,7 +52,7 @@ /datum/dynamic_ruleset/latejoin/infiltrator name = "Syndicate Infiltrator" - antag_datum = /datum/antagonist/traitor + antag_datum = /datum/antagonist/traitor/infiltrator antag_flag = ROLE_SYNDICATE_INFILTRATOR antag_flag_override = ROLE_TRAITOR protected_roles = list( diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 38b7062217af..286fc3d3d843 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -211,7 +211,7 @@ /datum/dynamic_ruleset/midround/from_living/autotraitor name = "Syndicate Sleeper Agent" midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/traitor + antag_datum = /datum/antagonist/traitor/infiltrator/sleeper_agent antag_flag = ROLE_SLEEPER_AGENT antag_flag_override = ROLE_TRAITOR protected_roles = list( @@ -257,7 +257,7 @@ var/mob/M = pick(candidates) assigned += M candidates -= M - var/datum/antagonist/traitor/newTraitor = new + var/datum/antagonist/traitor/infiltrator/sleeper_agent/newTraitor = new M.mind.add_antag_datum(newTraitor) message_admins("[ADMIN_LOOKUPFLW(M)] was selected by the [name] ruleset and has been made into a midround traitor.") log_dynamic("[key_name(M)] was selected by the [name] ruleset and has been made into a midround traitor.") diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 70d598cdcbb3..b150289f2e4d 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -15,6 +15,8 @@ suicide_cry = "FOR THE SYNDICATE!!" preview_outfit = /datum/outfit/traitor var/give_objectives = TRUE + /// Whether to give secondary objectives to the traitor, which aren't necessary but can be completed for a progression and TC boost. + var/give_secondary_objectives = TRUE var/should_give_codewords = TRUE ///give this traitor an uplink? var/give_uplink = TRUE @@ -42,6 +44,16 @@ ///the final objective the traitor has to accomplish, be it escaping, hijacking, or just martyrdom. var/datum/objective/ending_objective +/datum/antagonist/traitor/infiltrator + // Used to denote traitors who have joined midround and therefore have no access to secondary objectives. + // Progression elements are best left to the roundstart antagonists + // There will still be a timelock on uplink items + name = "\improper Infiltrator" + give_secondary_objectives = TRUE // Changed from FALSE to TRUE - MONKEYSTATION EDIT CHANGE + +/datum/antagonist/traitor/infiltrator/sleeper_agent + name = "\improper Syndicate Sleeper Agent" + /datum/antagonist/traitor/New(give_objectives = TRUE) . = ..() src.give_objectives = give_objectives @@ -64,8 +76,9 @@ uplink_handler.has_progression = TRUE SStraitor.register_uplink_handler(uplink_handler) - uplink_handler.has_objectives = TRUE - uplink_handler.generate_objectives() + if(give_secondary_objectives) + uplink_handler.has_objectives = TRUE + uplink_handler.generate_objectives() if(uplink_handler.progression_points < SStraitor.current_global_progression) uplink_handler.progression_points = SStraitor.current_global_progression * SStraitor.newjoin_progression_coeff diff --git a/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx b/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx index 584e8136fbd9..4a980ca7a456 100644 --- a/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx +++ b/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx @@ -1,7 +1,7 @@ import { useBackend, useLocalState } from '../backend'; import { Box, LabeledList, Stack, Tabs, Tooltip } from '../components'; import { Window } from '../layouts'; -import { getReputation } from './Uplink/calculateReputationLevel'; +import { getDangerLevel } from './Uplink/calculateDangerLevel'; import type { InfernoNode } from 'inferno'; type Objective = { @@ -272,7 +272,7 @@ export const TraitorObjectiveDebug = (props, context) => { ))} {player_data.map((value) => { - const rep = getReputation(value.progression_points); + const rep = getDangerLevel(value.progression_points); return ( void, grow: boolean = false ) => { - const reputation = getReputation(objective.progression_minimum); + const dangerLevel = getDangerLevel(objective.progression_minimum); return ( { handleObjectiveAction(objective, value.action); }} @@ -335,7 +335,7 @@ const ObjectiveFunction = ( type ObjectiveElementProps = { name: string; - reputation: Rank; + dangerLevel: Rank; description: string; telecrystalReward: number; progressionReward: number; @@ -355,7 +355,7 @@ type ObjectiveElementProps = { export const ObjectiveElement = (props: ObjectiveElementProps, context) => { const { name, - reputation, + dangerLevel, description, uiButtons = null, telecrystalReward, @@ -400,7 +400,7 @@ export const ObjectiveElement = (props: ObjectiveElementProps, context) => { @@ -452,13 +452,13 @@ export const ObjectiveElement = (props: ObjectiveElementProps, context) => { 'border-right': 'none', 'border-bottom': objectiveFinished ? 'none' : undefined, }} - className={reputation.gradient} + className={dangerLevel.gradient} py={0.5} width="100%" textAlign="center"> {telecrystalReward} TC, - {calculateProgression(progressionReward)} Reputation + {calculateProgression(progressionReward)} Threat Level {Math.abs(progressionDiff) > 10 && ( { as="span"> {Math.abs(progressionDiff)}% - {progressionDiff > 0 ? 'less' : 'more'} reputation - from this objective. This is because your - reputation is{' '} + {progressionDiff > 0 ? 'less' : 'more'} threat + from this objective. This is because your threat + level is{' '} {progressionDiff > 0 ? 'ahead ' : 'behind '} where it normally should be at. @@ -505,7 +505,7 @@ export const ObjectiveElement = (props: ObjectiveElementProps, context) => { {objectiveFinished ? ( {ranks.map((value) => { @@ -104,7 +104,7 @@ export const reputationLevelsTooltip = ( ); -export const getReputation = (progression_points: number) => { +export const getDangerLevel = (progression_points: number) => { const minutes = progression_points / 600; for (let index = 0; index < ranks.length; index++) { @@ -117,31 +117,31 @@ export const getReputation = (progression_points: number) => { return ranks[ranks.length - 1]; }; -export const calculateReputationLevel = ( +export const calculateDangerLevel = ( progression_points: number, textOnly: boolean ) => { const minutes = progression_points / 600; const displayedProgression = calculateProgression(progression_points); - const reputation = getReputation(progression_points); + const dangerLevel = getDangerLevel(progression_points); if (textOnly) { return ( - {reputation.title} ({displayedProgression}) + {dangerLevel.title} ({displayedProgression}) ); } return ( - {reputation.title} ({displayedProgression}) + {dangerLevel.title} ({displayedProgression}) ); }; diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx index 51aad617fb70..24cbb734d885 100644 --- a/tgui/packages/tgui/interfaces/Uplink/index.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx @@ -8,7 +8,7 @@ import { BooleanLike } from 'common/react'; import { Box, Tabs, Button, Stack, Section, Tooltip, Dimmer } from '../../components'; import { PrimaryObjectiveMenu } from './PrimaryObjectiveMenu'; import { Objective, ObjectiveMenu } from './ObjectiveMenu'; -import { calculateProgression, calculateReputationLevel, reputationDefault, reputationLevelsTooltip } from './calculateReputationLevel'; +import { calculateProgression, calculateDangerLevel, dangerDefault, dangerLevelsTooltip } from './calculateDangerLevel'; type UplinkItem = { id: string; @@ -223,7 +223,7 @@ export class Uplink extends Component<{}, UplinkState> { <> ,  - {calculateReputationLevel(item.progression_minimum, true)} + {calculateDangerLevel(item.progression_minimum, true)} ) : ( @@ -273,12 +273,15 @@ export class Uplink extends Component<{}, UplinkState> { (!!has_progression && ( - Your current level of reputation.  - Reputation determines what quality of objective - you get and what items you can purchase.  + Your current level of threat. Threat + determines + {has_objectives + ? ' the severity of secondary objectives you get and ' + : ' '} + what items you can purchase.  {/* A minute in deciseconds */} - Reputation passively increases by{' '} + Threat passively increases by{' '} {calculateProgression( current_progression_scaling @@ -288,10 +291,10 @@ export class Uplink extends Component<{}, UplinkState> { {Math.abs(progressionPercentage) > 0 && ( - Because your reputation is{' '} + Because your threat level is {progressionPercentage < 0 - ? 'ahead ' - : 'behind '} + ? ' ahead ' + : ' behind '} of where it should be, you are getting { {progressionPercentage < 0 ? 'less' : 'more'}{' '} - reputation every minute + threat every minute )} - {reputationLevelsTooltip} + {dangerLevelsTooltip} )) || - 'Your current level of reputation. You are a respected elite and do not need to improve your reputation.' + "Your current threat level. You are a killing machine and don't need to improve your threat level." }> {/* If we have no progression, just give them a generic title */} {has_progression - ? calculateReputationLevel(progression_points, false) - : calculateReputationLevel(reputationDefault, false)} + ? calculateDangerLevel(progression_points, false) + : calculateDangerLevel(dangerDefault, false)}