diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs index d6239449a25..690d991f50d 100644 --- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs @@ -40,11 +40,11 @@ private string MakeBriefing(EntityUid ent) { var isHuman = HasComp(ent); var briefing = isHuman - ? Loc.GetString("thief-role-greeting-human") - : Loc.GetString("thief-role-greeting-animal"); + ? Loc.GetString("scorethief-role-greeting-human") // Funky change + : Loc.GetString("scorethief-role-greeting-animal"); // Funky change if (isHuman) - briefing += "\n \n" + Loc.GetString("thief-role-greeting-equipment") + "\n"; + briefing += "\n \n" + Loc.GetString("scorethief-role-greeting-equipment") + "\n"; // Funky change return briefing; } diff --git a/Content.Server/_Funkystation/Objectives/Components/ScoreThiefConditionComponent.cs b/Content.Server/_Funkystation/Objectives/Components/ScoreThiefConditionComponent.cs new file mode 100644 index 00000000000..cd8a7ee2b18 --- /dev/null +++ b/Content.Server/_Funkystation/Objectives/Components/ScoreThiefConditionComponent.cs @@ -0,0 +1,25 @@ +using Content.Server._Funkystation.Objectives.Systems; + +namespace Content.Server._Funkystation.Objectives.Components; + +/// +/// Requires that you steal enough to fill a speso quota +/// +[RegisterComponent, Access(typeof(ScoreThiefConditionSystem))] +public sealed partial class ScoreThiefConditionComponent : Component +{ + [DataField(required: true)] + public int AmountSpesos; + + [DataField(required: true)] + public int AmountSpesosVariance; + + [DataField] + public int AmountSpesosVarianceInterval = 1000; + + [DataField] + public bool CheckStealAreas = true; + + public int TargetScore = 0; + public int CurrentScore = 0; +} diff --git a/Content.Server/_Funkystation/Objectives/Components/ScoreThiefPriceModifierComponent.cs b/Content.Server/_Funkystation/Objectives/Components/ScoreThiefPriceModifierComponent.cs new file mode 100644 index 00000000000..80e11b7d172 --- /dev/null +++ b/Content.Server/_Funkystation/Objectives/Components/ScoreThiefPriceModifierComponent.cs @@ -0,0 +1,20 @@ +using Content.Server._Funkystation.Objectives.Systems; +using Robust.Shared.Serialization.TypeSerializers.Implementations; + +namespace Content.Server._Funkystation.Objectives.Components; + +/// +/// Modifies the price of an entity for scorethief, including possibly making it worthless +/// +[RegisterComponent, Access(typeof(ScoreThiefConditionSystem))] +public sealed partial class ScoreThiefPriceModifierComponent : Component +{ + /// + /// Must be a Loc string + /// + [DataField] + public string? Reason = null; + + [DataField(required: true)] + public double Multiplier; +} diff --git a/Content.Server/_Funkystation/Objectives/Systems/ScoreThiefConditionSystem.cs b/Content.Server/_Funkystation/Objectives/Systems/ScoreThiefConditionSystem.cs new file mode 100644 index 00000000000..89fb8e5d85a --- /dev/null +++ b/Content.Server/_Funkystation/Objectives/Systems/ScoreThiefConditionSystem.cs @@ -0,0 +1,194 @@ +using Content.Server._Funkystation.Objectives.Components; +using Content.Server.Cargo.Systems; +using Content.Shared.Interaction; +using Content.Shared.Mind.Components; +using Content.Shared.Objectives.Components; +using Content.Shared.Objectives.Systems; +using JetBrains.Annotations; +using Robust.Shared.Containers; +using Robust.Shared.Random; +using Robust.Shared.Utility; + +namespace Content.Server._Funkystation.Objectives.Systems; + +/// +/// The objective system for scorethief +/// +// Large portions of this were taken from https://github.com/funky-station/forky-station/blob/22a547c7c8aa1f0f6ac5f8c3e9941f2dfc25bd17/Content.Server/Objectives/Systems/StealConditionSystem.cs +[UsedImplicitly] +public sealed partial class ScoreThiefConditionSystem : EntitySystem +{ + [Dependency] private IRobustRandom _random = default!; + [Dependency] private MetaDataSystem _metaData = default!; + [Dependency] private SharedObjectivesSystem _objectives = default!; + [Dependency] private EntityLookupSystem _lookup = default!; + [Dependency] private SharedInteractionSystem _interaction = default!; + [Dependency] private IEntityManager _entManager = default!; + [Dependency] private EntityQuery _containerQuery = default!; + [Dependency] private EntityQuery _modifierQuery = default!; + [Dependency] private EntityQuery _mindQuery = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAssigned); + SubscribeLocalEvent(OnAfterAssign); + SubscribeLocalEvent(OnGetProgress); + + } + + private void OnAssigned(Entity condition, ref ObjectiveAssignedEvent args) + { + condition.Comp.TargetScore = _random.Next( + (condition.Comp.AmountSpesos - condition.Comp.AmountSpesosVariance)/condition.Comp.AmountSpesosVarianceInterval, + (condition.Comp.AmountSpesos + condition.Comp.AmountSpesosVariance)/condition.Comp.AmountSpesosVarianceInterval + ) * condition.Comp.AmountSpesosVarianceInterval; + } + + private void OnAfterAssign(Entity condition, ref ObjectiveAfterAssignEvent args) + { + string rsiState; + switch(condition.Comp.TargetScore) + { + case 1: + rsiState = "cash"; + break; + case <= 10: + rsiState = "cash_10"; + break; + case <= 100: + rsiState = "cash_100"; + break; + case <= 500: + rsiState = "cash_500"; + break; + case <= 1000: + rsiState = "cash_1000"; + break; + case <= 5000: + rsiState = "cash_5000"; + break; + case <= 10000: + rsiState = "cash_10000"; + break; + case <= 25000: + rsiState = "cash_25000"; + break; + case <= 50000: + rsiState = "cash_50000"; + break; + case <= 100000: + rsiState = "cash_100000"; + break; + default: + rsiState = "cash_1000000"; + break; + } + var sprite = new SpriteSpecifier.Rsi(new ResPath("/Textures/Objects/Economy/cash.rsi"), rsiState); + + _metaData.SetEntityName(condition.Owner, + Loc.GetString("scorethief-objective-title-one") + " " + condition.Comp.TargetScore + " " + Loc.GetString("scorethief-objective-title-two"), + args.Meta); + _objectives.SetIcon(condition.Owner, sprite, args.Objective); + } + + private void OnGetProgress(Entity condition, ref ObjectiveGetProgressEvent args) + { + condition.Comp.CurrentScore = 0; + var checkPlayer = true; + + // Check steal areas + if (condition.Comp.CheckStealAreas) + { + var areasQuery = AllEntityQuery(); + while (areasQuery.MoveNext(out var uid, out var area, out var xform)) + { + if (!area.Owners.Contains(args.MindId)) + continue; + + HashSet> nearestEnts = new(); + + _lookup.GetEntitiesInRange(xform.Coordinates, area.Range, nearestEnts); + foreach (var ent in nearestEnts) + { + if (!_interaction.InRangeUnobstructed((uid, xform), (ent, ent.Comp), range: area.Range)) + continue; + + condition.Comp.CurrentScore += GetValue(ent, out _, area: true); + if (ent == args.Mind.CurrentEntity) + { + checkPlayer = false; + } + } + } + } + + // Check thief's inventory + if (args.Mind.CurrentEntity != null && checkPlayer) + { + condition.Comp.CurrentScore += GetValue(args.Mind.CurrentEntity.Value, out _, self: true); + } + + args.Progress = Math.Clamp((float)condition.Comp.CurrentScore / condition.Comp.TargetScore, 0f, 1f); + _metaData.SetEntityDescription(condition.Owner, Math.Clamp((int)((float)condition.Comp.CurrentScore/condition.Comp.TargetScore*100), 0, 100) + "%"); + } + + /// Get the price of an item (not including contained items) taking into account ScoreThiefPriceModifierComponent + public int GetValue(EntityUid entity, out string? reason, bool area = false, bool self = false) + { + reason = null; + var priceSystem = _entManager.System(); + double multiplier = 1; + if (_modifierQuery.TryGetComponent(entity, out var modifier)) + { + multiplier = modifier.Multiplier; + if (modifier.Reason != null) + { + reason = Loc.GetString(modifier.Reason); + } + } + + if (_mindQuery.HasComp(entity)) + { + if (!self) + { + reason = Loc.GetString("scorethief-modifier-alive"); + return 0; + } + multiplier = 0; + } + + var price = 0; + + price = (int)(priceSystem.GetPrice(entity, false)*multiplier); + + if (_containerQuery.TryComp(entity, out var containerManager) && !area) + { + foreach (var container in containerManager.Containers.Values) + { + foreach (var ent in container.ContainedEntities) + { + price += GetValue(ent, out _); + } + } + } + + return price; + } + + private int GetValueRecursive(ContainerManagerComponent currentManager) + { + var value = 0; + // recursively check each container + // checks inventory, bag, implants, etc. + foreach (var container in currentManager.Containers.Values) + { + foreach (var entity in container.ContainedEntities) + { + value += GetValue(entity, out _); + } + } + return value; + } +} diff --git a/Content.Server/_Funkystation/ScoreThief/Components/InnateAppraisalComponent.cs b/Content.Server/_Funkystation/ScoreThief/Components/InnateAppraisalComponent.cs new file mode 100644 index 00000000000..fffba92eecc --- /dev/null +++ b/Content.Server/_Funkystation/ScoreThief/Components/InnateAppraisalComponent.cs @@ -0,0 +1,14 @@ +using Content.Server._Funkystation.ScoreThief.Systems; + +namespace Content.Server._Funkystation.ScoreThief.Components; + +/// +/// Gives an entity the innate ability to appraise items it looks at +/// +[RegisterComponent, Access(typeof(InnateAppraisalSystem))] +public sealed partial class InnateAppraisalComponent : Component +{ + // Use ScoreThiefPriceModifierComponent? + [DataField] + public bool BlackMarket = false; +} diff --git a/Content.Server/_Funkystation/ScoreThief/Systems/InnateAppraisalSystem.cs b/Content.Server/_Funkystation/ScoreThief/Systems/InnateAppraisalSystem.cs new file mode 100644 index 00000000000..2784e436b18 --- /dev/null +++ b/Content.Server/_Funkystation/ScoreThief/Systems/InnateAppraisalSystem.cs @@ -0,0 +1,67 @@ +using Content.Server._Funkystation.ScoreThief.Components; +using Content.Shared.Examine; +using Content.Shared.Verbs; +using JetBrains.Annotations; +using Robust.Shared.Utility; +using Content.Server._Funkystation.Objectives.Systems; +using Content.Server.Cargo.Systems; +using Robust.Shared.Containers; + +namespace Content.Server._Funkystation.ScoreThief.Systems; + +[UsedImplicitly] +public sealed partial class InnateAppraisalSystem : EntitySystem +{ + + [Dependency] private EntityQuery _appraisalQuery = default!; + [Dependency] private ExamineSystemShared _examineSystem = default!; + [Dependency] private IEntityManager _entManager = default!; + + public override void Initialize() + { + base.Initialize(); + // Transform component because everything you can examine has it. We can't make args ref without this. + // Jank solution but it works sooooo whatever + SubscribeLocalEvent>(OnExamineVerb); + } + + // Parts of this method were taken from https://github.com/funky-station/forky-station/blob/272393a35fb0a88097f7041c49356fb595aac138/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs + private void OnExamineVerb(Entity _, ref GetVerbsEvent args) + { + if (!_appraisalQuery.TryComp(args.User, out var comp)) + return; + var target = args.Target; + var user = args.User; + var verb = new ExamineVerb() + { + Act = () => + { + var pricingSystem = _entManager.System(); + var scoreThiefConditionSystem = _entManager.System(); + var price = 0; + string? reason = null; + if (comp.BlackMarket) + { + price = scoreThiefConditionSystem.GetValue(target, out reason); + } + else + { + price = (int)pricingSystem.GetPrice(target); + } + var markup = new FormattedMessage(); + markup.AddMarkupOrThrow(Loc.GetString("scorethief-inspect-one") + " [color=green]" + price + "[/color] " + Loc.GetString("scorethief-inspect-two")); + if (reason != null) + { + markup.AddMarkupOrThrow("\n\n[color=gold]" + reason + "[/color]"); + } + _examineSystem.SendExamineTooltip(user, target, markup, false, false); + }, + Text = Loc.GetString("scorethief-appraise"), + Message = Loc.GetString("scorethief-appraise"), + Category = VerbCategory.Examine, + Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Objects/Tools/appraisal-tool.rsi"), "icon"), + }; + + args.Verbs.Add(verb); + } +} diff --git a/Resources/Locale/en-US/_Funkystation/objectives/conditions/scorethief.ftl b/Resources/Locale/en-US/_Funkystation/objectives/conditions/scorethief.ftl new file mode 100644 index 00000000000..aca651e9125 --- /dev/null +++ b/Resources/Locale/en-US/_Funkystation/objectives/conditions/scorethief.ftl @@ -0,0 +1,26 @@ +scorethief-objective-title-one = Steal +scorethief-objective-title-two = worth of spesos of items +scorethief-inspect-one = This is worth +scorethief-inspect-two = spesos. +scorethief-appraise = Estimate the price of the item +scorethief-modifier-alive = Living things are too hard to transport to be worth it and dead things spoil. +scorethief-modifier-id = Basic ID cards are too traceable to be worth anything. +scorethief-modifier-cap-id = Certain people are willing to pay a lot for all-access on a Nanotrasen station. +scorethief-modifier-hop-id = Certain people are willing to pay a lot for near all-access on a Nanotrasen station. +scorethief-modifier-master-comms = Certain people are willing to pay a lot for all-comms on a Nanotrasen station. +scorethief-modifier-centcomm-comms = Certain people are willing to pay a lot to snoop on Central Command. +scorethief-modifier-command-comms = Certain people are willing to pay a lot for command comms. +scorethief-modifier-sec-comms = Certain people are willing to pay for security comms. +scorethief-modifier-critical-infrastructure = Critical station infrastructure is too high profile and easily traceable to be worth anything. +scorethief-modifier-money = Spesos' microdots make them easily traceable. + +scorethief-role-greeting-human = + You are criminal scum, a professional thief previously arrested and on parole for grand theft. You are back to steal again. + You were forcibly given a pacifism implant after your last arrest, but that won't stop you from getting meeting the market's demands. + +scorethief-role-greeting-animal = + You are a kleptomaniac animal. + Steal things that you like. + +scorethief-role-greeting-equipment = + You have a satchel of thieves' tools and possess the innate ability to steal without notice. Choose your starting equipment, and do your work stealthily. diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 6175c19d531..af570fb7057 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -331,6 +331,11 @@ - StationAiCoreElectronics - type: StaticPrice price: 5000 + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes # The job-ready version of an AI spawn. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index 0ad24174705..2d0a1d5d0bf 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -10,6 +10,10 @@ sprite: Objects/Devices/encryption_keys.rsi - type: Sprite sprite: Objects/Devices/encryption_keys.rsi + # Funky changes start + - type: StaticPrice + price: 10 + # Funky changes end - type: entity parent: EncryptionKey @@ -61,6 +65,11 @@ layers: - state: crypt_blue - state: nano_label + # Funky changes start + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-centcomm-comms" + multiplier: 1500 + # Funky changes end - type: entity parent: [ EncryptionKey, BaseCentcommCommandContraband ] @@ -83,6 +92,11 @@ layers: - state: crypt_gold - state: cap_label + # Funky changes start + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-command-comms" + multiplier: 400 + # Funky changes end - type: entity parent: [ EncryptionKey, BaseCommandContraband ] @@ -101,6 +115,11 @@ - type: Tag tags: - EncryptionCommand + # Funky changes start + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-command-comms" + multiplier: 200 + # Funky changes end - type: entity parent: [ EncryptionKey, BaseEngineeringContraband ] @@ -204,6 +223,11 @@ - type: Tag tags: - EncryptionSecurity + # Funky changes start + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-sec-comms" + multiplier: 100 + # Funky changes end - type: entity parent: [ EncryptionKey, BaseCivilianContraband ] diff --git a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml index 523385788ba..dc5ee13c35a 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml @@ -26,6 +26,11 @@ - GhostOnlyWarp - type: StealTarget stealGroup: NukeDisk + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes - type: entity name: nuclear authentication disk diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index 189982ff7d1..5c992d7108d 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -25,6 +25,11 @@ - WhitelistChameleonIdCard - type: StealTarget stealGroup: IDCard + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-id" + multiplier: 0 + # End funky changes #IDs with layers @@ -71,6 +76,11 @@ - HighRiskItem - type: StealTarget stealGroup: CaptainIDCard + # Funky changes start + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-cap-id" + multiplier: 500 + # Funky changes end - type: entity parent: IDCardStandard @@ -91,6 +101,11 @@ heldPrefix: silver - type: PresetIdCard job: HeadOfPersonnel + # Funky changes start + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-hop-id" + multiplier: 400 + # Funky changes end - type: entity parent: IDCardStandard @@ -1295,7 +1310,7 @@ parent: IDCardStandard id: UniversalIDCard name: universal ID card - suffix: Admin + suffix: AdminA description: An ID card that gives you access beyond your wildest dreams. components: - type: Sprite diff --git a/Resources/Prototypes/Entities/Objects/Misc/space_cash.yml b/Resources/Prototypes/Entities/Objects/Misc/space_cash.yml index 24dab4f562c..f18f36af744 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/space_cash.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/space_cash.yml @@ -52,6 +52,10 @@ mask: - ItemMask - type: Appearance + # Funky changes start + - type: ScoreThiefPriceModifier + multiplier: 0 + reason: "scorethief-modifier-money" - type: material id: Credit diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index fd4a6711c3a..d1a218d846b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -236,6 +236,11 @@ board: CargoShuttleConsoleCircuitboard - type: StealTarget stealGroup: CargoShuttleConsoleCircuitboard + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes - type: entity parent: BaseComputerAiAccess @@ -683,6 +688,11 @@ damageModifierSet: StructuralMetallicStrong - type: Injurable damageContainer: StructuralInorganic + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes - type: entity parent: ComputerComms diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml index 519f3ff165f..82bdba9d0c4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml @@ -331,3 +331,8 @@ - type: GuideHelp guides: - AnomalousResearch + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes diff --git a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml index 84948f38fb4..7fdff40ccdd 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml @@ -79,6 +79,11 @@ color: "#a8ffd9" - type: StaticPrice price: 5000 + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes - type: entity parent: [ GravityGenerator, ConstructibleMachine ] diff --git a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml index ae163cfacce..9eda328d50f 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml @@ -117,6 +117,11 @@ tags: - GhostOnlyWarp - type: FTLSmashImmune + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes - type: entity parent: NuclearBomb diff --git a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml index 3caa56d3f8f..bacc217352a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml @@ -184,6 +184,11 @@ key_slots: !type:Container machine_board: !type:Container machine_parts: !type:Container + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes - type: entity parent: TelecomServer diff --git a/Resources/Prototypes/Entities/Structures/Power/smes.yml b/Resources/Prototypes/Entities/Structures/Power/smes.yml index 9cccff3df77..fe8e83b83e8 100644 --- a/Resources/Prototypes/Entities/Structures/Power/smes.yml +++ b/Resources/Prototypes/Entities/Structures/Power/smes.yml @@ -102,6 +102,11 @@ - PowerStorage - VoltageNetworks - Power + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes # Interface - type: BatteryInterface @@ -116,6 +121,7 @@ - type: ActivatableUI key: enum.BatteryUiKey.Key + # SMES' in use - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Shuttles/station_anchor.yml b/Resources/Prototypes/Entities/Structures/Shuttles/station_anchor.yml index 1467cf52ed9..2c36c0fdb70 100644 --- a/Resources/Prototypes/Entities/Structures/Shuttles/station_anchor.yml +++ b/Resources/Prototypes/Entities/Structures/Shuttles/station_anchor.yml @@ -45,6 +45,11 @@ - LargeMobMask layer: - WallLayer + # Start funky changes + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # End funky changes - type: entity id: StationAnchorIndestructible diff --git a/Resources/Prototypes/GameRules/subgamemodes.yml b/Resources/Prototypes/GameRules/subgamemodes.yml index dfe815cf13c..748d68b2d91 100644 --- a/Resources/Prototypes/GameRules/subgamemodes.yml +++ b/Resources/Prototypes/GameRules/subgamemodes.yml @@ -5,15 +5,18 @@ - type: ThiefRule - type: AntagObjectives objectives: + - ScoreThiefObjective # Funky change - EscapeThiefShuttleObjective - - type: AntagRandomObjectives - sets: - - groups: ThiefBigObjectiveGroups - prob: 0.7 - maxPicks: 1 - - groups: ThiefObjectiveGroups - maxPicks: 10 - maxDifficulty: 2.5 + # Funky changes start + #- type: AntagRandomObjectives + # sets: + # - groups: ThiefBigObjectiveGroups + # prob: 0.7 + # maxPicks: 1 + # - groups: ThiefObjectiveGroups + # maxPicks: 10 + # maxDifficulty: 2.5 + # Funky changes end - type: AntagSelection agentName: thief-round-end-agent-name selectionTime: PrePlayerSpawn diff --git a/Resources/Prototypes/Roles/Antags/thief.yml b/Resources/Prototypes/Roles/Antags/thief.yml index 7584a164c61..c3befa942ff 100644 --- a/Resources/Prototypes/Roles/Antags/thief.yml +++ b/Resources/Prototypes/Roles/Antags/thief.yml @@ -22,6 +22,10 @@ - type: Thieving stripTimeReduction: 2 stealthy: true + # Funky changes start + - type: InnateAppraisal + blackMarket: True + # Funky changes end mindRoles: - MindRoleThief briefing: diff --git a/Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/nuclear_reactor.yml b/Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/nuclear_reactor.yml index d0cb19ab072..26313583c73 100644 --- a/Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/nuclear_reactor.yml +++ b/Resources/Prototypes/_FarHorizons/Entities/Structures/Power/Generation/FissionGenerator/nuclear_reactor.yml @@ -143,6 +143,11 @@ guides: - NuclearReactor - Power + # Funky changes begin + - type: ScoreThiefPriceModifier + reason: "scorethief-modifier-critical-infrastructure" + multiplier: 0 + # Funky changes end # Crew nuclear reactors - type: entity diff --git a/Resources/Prototypes/_Funkystation/Objectives/scoreThief.yml b/Resources/Prototypes/_Funkystation/Objectives/scoreThief.yml new file mode 100644 index 00000000000..8ad802e2caa --- /dev/null +++ b/Resources/Prototypes/_Funkystation/Objectives/scoreThief.yml @@ -0,0 +1,12 @@ +- type: entity + parent: BaseThiefObjective + id: ScoreThiefObjective + components: + - type: Objective + difficulty: 0.0 + - type: RoleRequirement + roles: + - ThiefRole + - type: ScoreThiefCondition + amountSpesos: 35000 + amountSpesosVariance: 10000 diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml b/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml index 6dd6278334c..609ef555416 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml @@ -8,7 +8,10 @@ - Thieves are petty yet crafty [color=green]criminals[/color] who can't keep their hands to themselves. You were forcefully given a [bold]pacifism implant[/bold] after your last arrest, but you won't let that stop you from trying to add to your collection. + Thieves are the source of most of the world's black market goods. You were given a [bold]pacifism implant[/bold] after your last arrest, but that won't stop you from meeting the market's demands. + + ## The Black Market + Your goal is to sell items on the [color=cyan]black market[/color]. Anything you have on you or near your [color=cyan]thieving beacon[/color] at the end of the shift will count towards your speso goal. ## Art of the Steal Unlike other antagonists, [bold]staying out of trouble is almost a requirement for you[/bold] because of your implant. @@ -51,22 +54,10 @@ - ## Centerpiece of the Collection - Your kleptomania will take you places. One day, you'll feel like stealing a few figurines. Another day, you'll feel like stealing an industrial machine. - - No matter. They'll all be a part of your collection within a matter of time. - - You can steal items by [bold]having them on your person[/bold] when you get to CentComm. Failing this, you can steal larger items by [bold]leaving them by your beacon.[/bold] - - Some of the more [italic]animate[/italic] objectives may not cooperate with you. Make sure they're alive and with you or your beacon when the shift ends. - - Things that you may desire include but are not limited to: - + ## Eyes on the Price + Your many years of thieving have given you a good idea of the price that anything you look at will go for on the black market. Some items, like pieces of critical station infrastructure, are basically impossible to offload, while others, like the captain's ID card, will fetch a very high price. - - - - + + -