diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 7b125439d53..1d676ea2667 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -60,7 +60,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 d30f3ffef76..7ad11367fc4 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -226,7 +226,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( @@ -264,7 +264,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 aaf162c15f8..20ded165fc0 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -18,6 +18,8 @@ default_custom_objective = "Perform an overcomplicated heist on valuable Nanotrasen assets." hardcore_random_bonus = TRUE 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 @@ -45,6 +47,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 = FALSE //FLUFFY FRONTIER REMOVAL - Трейторы всё же должны иметь побочки. + +/datum/antagonist/traitor/infiltrator/sleeper_agent + name = "\improper Syndicate Sleeper Agent" + /datum/antagonist/traitor/New(give_objectives = TRUE) . = ..() src.give_objectives = give_objectives @@ -67,8 +79,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() uplink_handler.can_replace_objectives = CALLBACK(src, PROC_REF(can_change_objectives)) uplink_handler.replace_objectives = CALLBACK(src, PROC_REF(submit_player_objective)) diff --git a/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm b/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm index 7b02d4a58f3..dd7af42f581 100644 --- a/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm +++ b/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm @@ -1,10 +1,10 @@ -/datum/antagonist/traitor/infiltrator +/datum/antagonist/traitor/lone_infiltrator name = "Lone Infiltrator" var/infil_outfit = /datum/outfit/syndicateinfiltrator preview_outfit = /datum/outfit/lone_infiltrator_preview job_rank = ROLE_LONE_INFILTRATOR -/datum/antagonist/traitor/infiltrator/on_gain() +/datum/antagonist/traitor/lone_infiltrator/on_gain() var/mob/living/carbon/human/current = owner.current current.equipOutfit(infil_outfit) var/chosen_name = current.dna.species.random_name(current.gender,1,1) diff --git a/modular_skyrat/modules/Midroundtraitor/code/event.dm b/modular_skyrat/modules/Midroundtraitor/code/event.dm index 6bf83fc2cd0..ebaa5abaf44 100644 --- a/modular_skyrat/modules/Midroundtraitor/code/event.dm +++ b/modular_skyrat/modules/Midroundtraitor/code/event.dm @@ -1,6 +1,6 @@ /datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator name = "Lone Infiltrator" - antag_datum = /datum/antagonist/traitor/infiltrator + antag_datum = /datum/antagonist/traitor/lone_infiltrator midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT antag_flag = ROLE_LONE_INFILTRATOR restricted_roles = list(JOB_CYBORG, @@ -46,7 +46,7 @@ player_mind.special_role = "Lone Infiltrator" player_mind.active = TRUE player_mind.transfer_to(operative) - player_mind.add_antag_datum(/datum/antagonist/traitor/infiltrator) + player_mind.add_antag_datum(/datum/antagonist/traitor/lone_infiltrator) message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into lone infiltrator by midround ruleset.") log_game("[key_name(operative)] was spawned as a lone infiltrator by midround ruleset.") diff --git a/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx b/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx index ef20d344de9..4042c199460 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'; type Objective = { name: string; @@ -271,7 +271,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); }} @@ -334,7 +334,7 @@ const ObjectiveFunction = ( type ObjectiveElementProps = { name: string; - reputation: Rank; + dangerLevel: Rank; description: string; telecrystalReward: number; progressionReward: number; @@ -354,7 +354,7 @@ type ObjectiveElementProps = { export const ObjectiveElement = (props: ObjectiveElementProps, context) => { const { name, - reputation, + dangerLevel, description, uiButtons = null, telecrystalReward, @@ -399,7 +399,7 @@ export const ObjectiveElement = (props: ObjectiveElementProps, context) => { @@ -451,13 +451,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. @@ -504,7 +504,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 91a9adb0ba9..6fd26b4e9be 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; @@ -227,7 +227,7 @@ export class Uplink extends Component<{}, UplinkState> { <> ,  - {calculateReputationLevel(item.progression_minimum, true)} + {calculateDangerLevel(item.progression_minimum, true)} ) : ( @@ -280,12 +280,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 @@ -295,10 +298,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)}