From adc4a08c5d12d6014f6a377e18155db4e0080d15 Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Fri, 30 Jan 2026 18:28:03 +0000 Subject: [PATCH 01/12] Fantastic tokens and where to salvage them Salvage Tokens Acquirable from Recycling Acquirable from Ore Processing --- Content.Server/Lathe/LatheSystem.cs | 3 + .../Materials/MaterialReclaimerSystem.cs | 2 + .../TicketPrinter/TicketPrinterSystem.cs | 38 ++++++++ Content.Shared/Lathe/LatheComponent.cs | 6 ++ .../SharedMaterialReclaimerSystem.cs | 6 ++ .../SharedTicketPrinterSystem.cs | 79 ++++++++++++++++ .../TicketPrinter/TicketPrinterComponent.cs | 34 +++++++ .../TicketPrinter/TicketValueComponent.cs | 14 +++ .../ConfigPresets/Build/development.toml | 2 +- Resources/Locale/en-US/materials/units.ftl | 3 + Resources/Locale/en-US/stack/stacks.ftl | 5 + .../Objects/Materials/Sheets/glass.yml | 12 +++ .../Objects/Materials/Sheets/metal.yml | 4 + .../Objects/Materials/Sheets/other.yml | 6 ++ .../Entities/Objects/Materials/ingots.yml | 4 + .../Entities/Objects/Materials/materials.yml | 4 + .../Entities/Objects/Materials/scrap.yml | 1 + .../Objects/Specific/Salvage/ticket.yml | 89 ++++++++++++++++++ .../Entities/Structures/Machines/lathe.yml | 4 + .../Entities/Structures/Machines/recycler.yml | 4 + .../Objects/Misc/coins.rsi/coin_salv.png | Bin 0 -> 303 bytes .../Objects/Misc/coins.rsi/coin_salv_100.png | Bin 0 -> 332 bytes .../Objects/Misc/coins.rsi/coin_salv_1000.png | Bin 0 -> 338 bytes .../Misc/coins.rsi/coin_salv_10000.png | Bin 0 -> 351 bytes .../Misc/coins.rsi/coin_salv_25000.png | Bin 0 -> 350 bytes .../Textures/Objects/Misc/coins.rsi/meta.json | 19 +++- 26 files changed, 336 insertions(+), 3 deletions(-) create mode 100644 Content.Server/TicketPrinter/TicketPrinterSystem.cs create mode 100644 Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs create mode 100644 Content.Shared/TicketPrinter/TicketPrinterComponent.cs create mode 100644 Content.Shared/TicketPrinter/TicketValueComponent.cs create mode 100644 Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml create mode 100644 Resources/Textures/Objects/Misc/coins.rsi/coin_salv.png create mode 100644 Resources/Textures/Objects/Misc/coins.rsi/coin_salv_100.png create mode 100644 Resources/Textures/Objects/Misc/coins.rsi/coin_salv_1000.png create mode 100644 Resources/Textures/Objects/Misc/coins.rsi/coin_salv_10000.png create mode 100644 Resources/Textures/Objects/Misc/coins.rsi/coin_salv_25000.png diff --git a/Content.Server/Lathe/LatheSystem.cs b/Content.Server/Lathe/LatheSystem.cs index cce17590e86bd..10409dc498687 100644 --- a/Content.Server/Lathe/LatheSystem.cs +++ b/Content.Server/Lathe/LatheSystem.cs @@ -260,6 +260,9 @@ public void FinishProducing(EntityUid uid, LatheComponent? comp = null, LathePro _puddle.TrySpillAt(uid, toAdd, out _); } } + + var ev = new LatheFinishPrintingEvent(_proto.Index(comp.CurrentRecipe)); + RaiseLocalEvent(uid, ref ev); } comp.CurrentRecipe = null; diff --git a/Content.Server/Materials/MaterialReclaimerSystem.cs b/Content.Server/Materials/MaterialReclaimerSystem.cs index c00c938865f6d..2fc9d7c6da0db 100644 --- a/Content.Server/Materials/MaterialReclaimerSystem.cs +++ b/Content.Server/Materials/MaterialReclaimerSystem.cs @@ -202,6 +202,8 @@ public override void Reclaim(EntityUid uid, SpawnChemicalsFromComposition(uid, item, completion, true, component, xform); } + var ev = new ReclaimFinishedEvent(item); + RaiseLocalEvent(uid, ref ev); QueueDel(item); } diff --git a/Content.Server/TicketPrinter/TicketPrinterSystem.cs b/Content.Server/TicketPrinter/TicketPrinterSystem.cs new file mode 100644 index 0000000000000..46d8e11abf558 --- /dev/null +++ b/Content.Server/TicketPrinter/TicketPrinterSystem.cs @@ -0,0 +1,38 @@ +using Content.Shared.TicketPrinter; +using Robust.Shared.Prototypes; +using Content.Server.Stack; + +namespace Content.Server.TicketPrinter; + +public sealed class TicketPrinterSystem : SharedTicketPrinterSystem +{ + [Dependency] private readonly StackSystem _stack = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + public override void Initialize() + { + base.Initialize(); + } + + /// + /// Applies ticket multiplier and spawns tickets, stores any remainder for future spawns + /// + /// Entity spawning the tickets + /// Base amount of tickets to spawn + protected override void PrintTickets(Entity ent, float amount) + { + if (!_proto.Resolve(ent.Comp.TicketProtoId, out var proto)) //does it exist? + return; //Will return Invalid EntProtoId errors if trying to spawn an entity proto ID that doesn't exist. + + var spawnAmount = ent.Comp.Remainder + amount * ent.Comp.TicketMultiplier; //apply multiplier, then add on any remainders of previous prints. + + if (spawnAmount <= 0) //if we're somehow less than zero don't print + return; + + var tickets = _stack.SpawnMultipleAtPosition(proto, (int)Math.Floor(spawnAmount), Transform(ent).Coordinates); + + foreach (var ticket in tickets) + _stack.TryMergeToContacts(ticket); //try to make into a single stack + + ent.Comp.Remainder = spawnAmount - (float)Math.Floor(spawnAmount); //can't spawn fractional tickets so store for the future + } +} diff --git a/Content.Shared/Lathe/LatheComponent.cs b/Content.Shared/Lathe/LatheComponent.cs index 7bd776451454f..c7d38d81f6088 100644 --- a/Content.Shared/Lathe/LatheComponent.cs +++ b/Content.Shared/Lathe/LatheComponent.cs @@ -121,4 +121,10 @@ public LatheRecipeBatch(ProtoId recipe, int itemsPrinted, /// [ByRefEvent] public readonly record struct LatheStartPrintingEvent(LatheRecipePrototype Recipe); + + /// + /// Event raised on a lathe when it finishes producing a recipe. + /// + [ByRefEvent] + public readonly record struct LatheFinishPrintingEvent(LatheRecipePrototype Recipe); } diff --git a/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs b/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs index 77f157fcddcfb..75afb3171d061 100644 --- a/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs +++ b/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs @@ -257,3 +257,9 @@ public override void Update(float frameTime) [ByRefEvent] public record struct GotReclaimedEvent(EntityCoordinates ReclaimerCoordinates); + +/// +/// Event raised on a reclaimer when it finishes reclaiming an entity. +/// +[ByRefEvent] +public record struct ReclaimFinishedEvent(EntityUid Item); diff --git a/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs b/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs new file mode 100644 index 0000000000000..ca28ba15b856d --- /dev/null +++ b/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs @@ -0,0 +1,79 @@ +using Content.Shared.Lathe; +using Content.Shared.Stacks; +using Content.Shared.Materials; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; +using Robust.Shared.GameObjects; + +namespace Content.Shared.TicketPrinter; + +public abstract class SharedTicketPrinterSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPrint); + SubscribeLocalEvent(OnReclaimed); + } + + /// + /// Print tickets when lathe prints entities with a ticket value + /// + /// The lathe + /// event containing recipe + private void OnPrint(Entity ent, ref LatheFinishPrintingEvent args) + { + if (args.Recipe.Result is not { } resultProto) //is the result empty, if not set as resultProto + return; + + var entProto = _proto.Index(resultProto); + if (!entProto.TryGetComponent(out var ticketComp, EntityManager.ComponentFactory)) //does component exist from EntityProtoId of recipe result + return; + + if (entProto.TryGetComponent(out var stackComp, EntityManager.ComponentFactory))//if a stack, produce tickets for each item in the stack + PrintTickets(ent, ticketComp.TicketValue * stackComp.Count); + else + PrintTickets(ent, ticketComp.TicketValue); + } + + /// + /// print tickets when reclaimer reclaims entities with a ticket value + /// + /// the reclaimer + /// reclaim event containing reclaimed item + private void OnReclaimed(Entity ent, ref ReclaimFinishedEvent args) + { + if (_whitelistSystem.IsWhitelistFail(ent.Comp.Whitelist, args.Item)) //plenty of things are reclaimable but only some salvagable, should only give tickets for salvage scrap. + return; + + if (!TryComp(args.Item, out var physComp)) + return; + + foreach (var (material, amount) in physComp.MaterialComposition) //for each material making up the reclaimed item's physical composition + { + if (amount <= 0 || !_proto.TryIndex(material, out var materialProto) || materialProto.StackEntity == null) //get that material's Material Prototype + continue; + var entProto = _proto.Index(materialProto.StackEntity); //use that to get its entity prototype + + if (!entProto.TryGetComponent(out var ticketComp, EntityManager.ComponentFactory) || + !entProto.TryGetComponent(out var matphysComp, EntityManager.ComponentFactory)) //use that to get TicketValue and PhysicalComposition Components + continue; //theoretically an entity may have some materials that do and some materials that don't have ticket values so we have to check them all. + + PrintTickets(ent, ticketComp.TicketValue * amount / matphysComp.MaterialComposition[materialProto.ID]); + } + } + + /// + /// spawn appropriate amount of tickets + /// considerations of stack amounts should occur before this point + /// Ticketprinter modifer applied in this function + /// + /// the entity printing the tickets + /// amount of tickets + protected virtual void PrintTickets(Entity ent, float amount) + { + } +} diff --git a/Content.Shared/TicketPrinter/TicketPrinterComponent.cs b/Content.Shared/TicketPrinter/TicketPrinterComponent.cs new file mode 100644 index 0000000000000..cfb1e8dc7d632 --- /dev/null +++ b/Content.Shared/TicketPrinter/TicketPrinterComponent.cs @@ -0,0 +1,34 @@ +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +namespace Content.Shared.TicketPrinter; + +[RegisterComponent] +/// +/// Spawns bonus entities on creation of entities with a through crafting or reclaiming +/// +public sealed partial class TicketPrinterComponent : Component +{ + /// + /// Entity Prototype to spawn as the "Ticket" + /// + [DataField, ViewVariables] + public EntProtoId TicketProtoId = "SalvageTicket"; + + /// + /// How much to multiply the ticket value by, default 1. + /// + [DataField, ViewVariables] + public float TicketMultiplier = 1f; + + [DataField, ViewVariables] + /// + /// Whitelist of allowed items that will produce tickets, if no whitelist everything is allowed + /// + public EntityWhitelist? Whitelist; + + /// + /// If ticket value ends up less than 1, or has a remainder, store it for the future. + /// + public float Remainder = 0f; +} diff --git a/Content.Shared/TicketPrinter/TicketValueComponent.cs b/Content.Shared/TicketPrinter/TicketValueComponent.cs new file mode 100644 index 0000000000000..d5e9eb7b411b2 --- /dev/null +++ b/Content.Shared/TicketPrinter/TicketValueComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Shared.TicketPrinter; + +[RegisterComponent] +/// +/// Contains the base amount of tickets that will be spawned by when this entity is crafted or reclaimed +/// +public sealed partial class TicketValueComponent : Component +{ + /// + /// Base amount of tickets to spawn + /// + [DataField] + public float TicketValue = 1f; +} diff --git a/Resources/ConfigPresets/Build/development.toml b/Resources/ConfigPresets/Build/development.toml index 4f60c0a57de09..a25a467286535 100644 --- a/Resources/ConfigPresets/Build/development.toml +++ b/Resources/ConfigPresets/Build/development.toml @@ -42,6 +42,6 @@ see_own_notes = true new_player_threshold = 120 [ic] -random_characters = true +random_characters = false random_species_weights = "" ssd_sleep_time = 3600 diff --git a/Resources/Locale/en-US/materials/units.ftl b/Resources/Locale/en-US/materials/units.ftl index ea35ecdad3e81..87cf1653c1389 100644 --- a/Resources/Locale/en-US/materials/units.ftl +++ b/Resources/Locale/en-US/materials/units.ftl @@ -22,3 +22,6 @@ materials-unit-boll = boll # bills of spesos... not very good but they are not (yet?) used for crafting anything # also the lathe/atm would need bigger denominations to output... materials-unit-bill = bill + +# stacks of tokens +materials-unit-ticket = stack diff --git a/Resources/Locale/en-US/stack/stacks.ftl b/Resources/Locale/en-US/stack/stacks.ftl index 7a9898ea101d3..3fbd1a2892c2a 100644 --- a/Resources/Locale/en-US/stack/stacks.ftl +++ b/Resources/Locale/en-US/stack/stacks.ftl @@ -81,6 +81,11 @@ stack-artifact-fragment = artifact {$amount -> *[other] fragments } +stack-salvage-ticket = {$amount -> + [1] token + *[other] tokens +} + # best materials stack-ground-tobacco = ground tobacco stack-ground-cannabis = ground cannabis diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml index 532d0b9cca308..3d98656b1cdb2 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml @@ -86,6 +86,8 @@ reagents: - ReagentId: Silicon Quantity: 10 + - type: TicketValue + ticketValue: 10 - type: entity parent: SheetGlass @@ -163,6 +165,8 @@ max: 1 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: TicketValue + ticketValue: 15 - type: entity parent: SheetRGlass @@ -240,6 +244,8 @@ max: 1 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: TicketValue + ticketValue: 25 - type: entity parent: SheetPGlass @@ -306,6 +312,8 @@ - ReagentId: Carbon Quantity: 0.5 canReact: false + - type: TicketValue + ticketValue: 30 - type: entity parent: SheetRPGlass @@ -381,6 +389,8 @@ - ReagentId: Uranium Quantity: 10 canReact: false + - type: TicketValue + ticketValue: 30 - type: entity parent: SheetUGlass @@ -435,6 +445,8 @@ - ReagentId: Carbon Quantity: 0.5 canReact: false + - type: TicketValue + ticketValue: 35 - type: entity parent: SheetRUGlass diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml index 1cc4c3a5f539c..643066c4b1917 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml @@ -70,6 +70,8 @@ Quantity: 9 - ReagentId: Carbon Quantity: 1 + - type: TicketValue + ticketValue: 10 - type: entity parent: SheetSteel @@ -197,6 +199,8 @@ - ReagentId: Carbon Quantity: 1 canReact: false + - type: TicketValue + ticketValue: 35 - type: entity parent: SheetPlasteel diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml index 66edafe763baf..06e9247b88d59 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml @@ -108,6 +108,8 @@ - ReagentId: Plasma Quantity: 10 canReact: false + - type: TicketValue + ticketValue: 15 - type: entity parent: SheetPlasma @@ -171,6 +173,8 @@ - ReagentId: Phosphorus Quantity: 5 canReact: false + - type: TicketValue + ticketValue: 10 - type: entity parent: SheetPlastic @@ -233,6 +237,8 @@ - ReagentId: Radium Quantity: 2 canReact: false + - type: TicketValue + ticketValue: 20 - type: entity parent: SheetUranium diff --git a/Resources/Prototypes/Entities/Objects/Materials/ingots.yml b/Resources/Prototypes/Entities/Objects/Materials/ingots.yml index 8d9b8259da4cf..4f1ef0440840e 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/ingots.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/ingots.yml @@ -60,6 +60,8 @@ reagents: - ReagentId: Gold Quantity: 10 + - type: TicketValue + ticketValue: 15 - type: entity parent: IngotGold @@ -105,6 +107,8 @@ reagents: - ReagentId: Silver Quantity: 10 + - type: TicketValue + ticketValue: 15 - type: entity parent: IngotSilver diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index 6d5bd964be3fa..2f4da0b863321 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -396,6 +396,8 @@ tags: - RawMaterial - Diamond + - type: TicketValue + ticketValue: 500 - type: entity parent: MaterialDiamond @@ -568,6 +570,8 @@ - type: Appearance - type: Item heldPrefix: bananium + - type: TicketValue + ticketValue: 20 - type: entity parent: MaterialBananium diff --git a/Resources/Prototypes/Entities/Objects/Materials/scrap.yml b/Resources/Prototypes/Entities/Objects/Materials/scrap.yml index 82d2d115d89ff..2db8d70d544f8 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/scrap.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/scrap.yml @@ -50,6 +50,7 @@ - type: Tag tags: - Recyclable + - SalvageScrap - type: Transform anchored: False noRot: true diff --git a/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml b/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml new file mode 100644 index 0000000000000..3aa5ee0359806 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml @@ -0,0 +1,89 @@ +- type: entity + parent: BaseItem + id: SalvageTicket + name: salvage tokens + suffix: 1 + description: A simple and rugged stamped coin, redeemable at a salvage requisition console as proof of contribution to the station. + components: + - type: Item + size: Small + - type: Stack + count: 1 + stackType: SalvTicket + baseLayer: base + layerStates: + - coin_salv + - coin_salv_100 + - coin_salv_1000 + - coin_salv_10000 + - coin_salv_25000 + layerFunction: Threshold + - type: StackLayerThreshold + thresholds: [10, 100, 1000, 10000, 25000] + - type: Sprite + sprite: Objects/Misc/coins.rsi + state: coin_salv + layers: + - state: coin_salv + map: ["base"] + - type: StaticPrice + price: 0 + - type: Material + - type: PhysicalComposition + materialComposition: + SalvTicket: 1 + - type: Appearance + +- type: material + id: SalvTicket + name: salvage token + unit: materials-unit-ticket + stackEntity: SalvageTicket + icon: { sprite: /Textures/Objects/Misc/coins.rsi, state: coin_salv } + price: 1 + +- type: stack + id: SalvTicket + name: stack-salvage-ticket + icon: { sprite: /Textures/Objects/Misc/coins.rsi, state: coin_salv } + spawn: SalvageTicket + +- type: entity + parent: SalvageTicket + id: SalvageTicket10 + suffix: 10 + components: + - type: Stack + count: 10 + +- type: entity + parent: SalvageTicket + id: SalvageTicket100 + suffix: 100 + components: + - type: Stack + count: 100 + +- type: entity + parent: SalvageTicket + id: SalvageTicket1000 + suffix: 1000 + components: + - type: Stack + count: 1000 + +- type: entity + parent: SalvageTicket + id: SalvageTicket10000 + suffix: 10000 + components: + - type: Stack + count: 10000 + +- type: entity + parent: SalvageTicket + id: SalvageTicket25000 + suffix: 25000 + components: + - type: Stack + count: 25000 diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index e59e2d86e778d..a4e2ed1069cdb 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -604,6 +604,10 @@ staticPacks: - OreSmelting - RGlassSmelting + - type: TicketPrinter + whitelist: + tags: + - SalvageScrap - type: entity parent: OreProcessor diff --git a/Resources/Prototypes/Entities/Structures/Machines/recycler.yml b/Resources/Prototypes/Entities/Structures/Machines/recycler.yml index 2058c3c050232..a4fc030de0632 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/recycler.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/recycler.yml @@ -115,3 +115,7 @@ - type: Speech speechVerb: Robotic speechSounds: SyndieBorg + - type: TicketPrinter + whitelist: + tags: + - SalvageScrap diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2f88df2657f2812e0c37226b7e0837f790667b GIT binary patch literal 303 zcmV+~0nq-5P)Px#=}AOER9J=Wl)G)lAQVPVqFA(+XYdd-jNlDe#1t+lJPDi7Fob8YTp?L5oF+z* zt6cwzQiRi85Z^sK1XL=O%75qWmBrrs6QF4t#&LX<^=Q%6SSdx@wg9Z_3Lq8{3wZBO zr4#@$#xgz(LlKckd`JZ@VvJa8OC3Te5)wow;G8>i&MeDPx$21!IgR9J=Wl(DVDAQVM!zG5L!S)Rc|&@h5GU=dTepztJYLc7AMkuAI_`S?=9RJQK7Rbe)=i9cia@Yb=O7wjX@BKqz?>)5E*!P{4SNs#+O8|h@ zx+sTz46U_i9;cLOz3Vy}Pt)|?W0(s|DQPX=4ct#qbQ9(-{M7-@+ZPKwivYkp&o5UtP)Px$3`s;mR9J=Wl(CJ3Fc3xGoeo(dLexMJPAGv6Xk;A_5KxIbaY7N)fQT$10xnrB z7F}>-blTwjA{*pC&m(Ifk@)X?+&SF${SJ_28IQ*!Dl6*HQCKNOQ4|2o^9&#s5exKv zzbmBxaL$GAP16JsiNu#w;J`UY+qPkEtql?qL>(~3?B08(X`*dg#&Hb)wAMjF(uGg4 z@{@5K(OQS%XPIr=ew`C7a1_7pmt_&ZKfwJ(LOwbXUZx~`(U=tp>#0I2Ia zDkn-H&+{O0Aieo50q^~b2+yGuBO)F|#+dyo0#KG^Sa)6bw}a@d9pKc3pE@A9eYC(; k1Yj73TUm)jB9V9--_}TIlNG%usQ>@~07*qoM6N<$fPx$8A(JzR9J=WmA!3+Fcd~lq970zVg`nA;}O_^MWCQ?!6e>NB-{dCxqd@^KoafF=hvdqKLY#y|TO(9fRXICd)DarfC8Yi--k`F?$@x z0Q7zDo|k3mL?jYlQh|fM@2RTF-CJv&galCoP1EelvM`P#RaG$zgL|ixauSjjKE=u} zhG9S{<%XYSwr%@$j<>)u{CYpnvnWR_kftd`QDCio8*HsbYt6c@qCD@9@GJqKwf4&K z5=hh3NgPObeoJ6kmNyYzKP4ZLTMZl{07;VgM1=;PZ$Nw)HBGZ$MF8?Vch_y({_SD( xXak&D_^AQO?!5)BA^=_2-O36C0)fC|d;r literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_25000.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_25000.png new file mode 100644 index 0000000000000000000000000000000000000000..345136886b129050478289116ce3e9250bf40089 GIT binary patch literal 350 zcmV-k0iphhP)Px$7)eAyR9J=Wm9dS4Fcbx6PlrH`5H(N)2_?`0jo^TQfJ)p6iHo2HM1+J0xMZ!o9G9LJ<-3cxf?0AdlbK-YD99LE3* z!{F{$Rpmq^65mpRgJBq`>)Nf2F-}5)r~$3@zAOvlI8xU&)>`+hC<-SbY2iz({Ki^K zQ50_YS!Ua|Kj(N09K)~cd7ec%VgaQTd7fj8`50`Bp)5<*brt1#e}rcVfU+#Ta=ZkT zQcmJPy7OBC%d&ik@ct?Jh}>%65CKS%#3w2=5E^*C0r7FHwcf8H09lr~>$YwG_c(sE w0ZuLa)_`R9-U3$ Date: Sat, 31 Jan 2026 21:26:06 +0000 Subject: [PATCH 02/12] Requisition Console: The Purchases of Salvage Salvage Requisition Console Takes tokens, adds to Salvage Requisitions Account Can use to buy things, which are sent to the ATS --- .../Cargo/UI/FundingAllocationMenu.xaml.cs | 3 + .../StationCargoOrderDatabaseComponent.cs | 3 +- .../Cargo/Systems/CargoSystem.Orders.cs | 3 +- .../Components/CargoOrderConsoleComponent.cs | 2 +- .../Components/StationBankAccountComponent.cs | 2 + .../Cargo/Prototypes/CargoAccountPrototype.cs | 5 + .../ConfigPresets/Build/development.toml | 2 +- .../Locale/en-US/cargo/cargo-accounts.ftl | 3 + .../catalog/cargo/cargoproduct-categories.ftl | 5 + .../Prototypes/Catalog/Cargo/markets.yml | 3 + .../Catalog/Cargo/salvage_requisitions.yml | 197 ++++++++++++++++++ .../Catalog/Fills/Crates/salvage.yml | 92 +++++--- .../Prototypes/Catalog/cargo_accounts.yml | 9 + .../Devices/Circuitboards/computer.yml | 13 ++ .../Entities/Objects/Devices/flatpack.yml | 9 + .../Prototypes/Entities/Stations/base.yml | 1 + .../Machines/Computers/computers.yml | 54 +++++ .../Structures/Storage/Crates/crates.yml | 12 ++ 18 files changed, 384 insertions(+), 34 deletions(-) create mode 100644 Resources/Prototypes/Catalog/Cargo/salvage_requisitions.yml diff --git a/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs b/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs index fdba5f5bd832c..d792c1cfe65dd 100644 --- a/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs +++ b/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs @@ -133,6 +133,9 @@ private void BuildEntries() { var accountProto = _prototypeManager.Index(account); + if (accountProto.Independent == true) + continue; + var accountNameLabel = new RichTextLabel { Modulate = accountProto.Color, diff --git a/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs b/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs index 56401602b31d2..f6d2d38d5d333 100644 --- a/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs +++ b/Content.Server/Cargo/Components/StationCargoOrderDatabaseComponent.cs @@ -38,7 +38,8 @@ public sealed partial class StationCargoOrderDatabaseComponent : Component [DataField] public List> Markets = new() { - "market", + "market", // Request Consoles + "salvage", // Salvage Requisition Console }; // TODO: Can probably dump this diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index 0b5f015593761..113ab32d62619 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -12,6 +12,7 @@ using Content.Shared.Interaction; using Content.Shared.Labels.Components; using Content.Shared.Paper; +using Content.Shared.Stacks; using Content.Shared.Station.Components; using JetBrains.Annotations; using Robust.Shared.Map; @@ -95,7 +96,7 @@ private void OnInteractUsingSlip(Entity ent, ref Int private void OnInteractUsing(EntityUid uid, CargoOrderConsoleComponent component, ref InteractUsingEvent args) { - if (HasComp(args.Used)) + if (TryComp(args.Used, out var stackComp) && stackComp.StackTypeId == component.CashType) { OnInteractUsingCash(uid, component, ref args); } diff --git a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs index 1d3aa6fc9e3a4..b4374552544ed 100644 --- a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs +++ b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs @@ -69,7 +69,7 @@ public sealed partial class CargoOrderConsoleComponent : Component public TimeSpan UnboundedAccountActionDelay = TimeSpan.FromSeconds(10); /// - /// The stack representing cash dispensed on withdrawals. + /// The stack prototype accepted by the console as cash and dispensed on withdrawals. /// [DataField] public ProtoId CashType = "Credit"; diff --git a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs index 944f03cd72aae..cfaa17f9dc373 100644 --- a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs +++ b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs @@ -41,6 +41,7 @@ public sealed partial class StationBankAccountComponent : Component { "Science", 1000 }, { "Security", 1000 }, { "Service", 1000 }, + { "Salvage", 0 }, }; /// @@ -55,6 +56,7 @@ public sealed partial class StationBankAccountComponent : Component { "Science", 0.20 }, { "Security", 0.20 }, { "Service", 0.20 }, + { "Salvage", 0 }, }; /// diff --git a/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs b/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs index 6d5fc3ebfc473..5a0877965970f 100644 --- a/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs +++ b/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs @@ -42,4 +42,9 @@ public sealed partial class CargoAccountPrototype : IPrototype /// [DataField] public EntProtoId AcquisitionSlip; + + /// + /// Whether the account is Independently operated, and so should not appear within the funding allocation console + /// + public bool Independent = false; } diff --git a/Resources/ConfigPresets/Build/development.toml b/Resources/ConfigPresets/Build/development.toml index a25a467286535..4f60c0a57de09 100644 --- a/Resources/ConfigPresets/Build/development.toml +++ b/Resources/ConfigPresets/Build/development.toml @@ -42,6 +42,6 @@ see_own_notes = true new_player_threshold = 120 [ic] -random_characters = false +random_characters = true random_species_weights = "" ssd_sleep_time = 3600 diff --git a/Resources/Locale/en-US/cargo/cargo-accounts.ftl b/Resources/Locale/en-US/cargo/cargo-accounts.ftl index fbad9cda9bfdf..454991cb1790e 100644 --- a/Resources/Locale/en-US/cargo/cargo-accounts.ftl +++ b/Resources/Locale/en-US/cargo/cargo-accounts.ftl @@ -15,3 +15,6 @@ cargo-account-security-code = SEC cargo-account-service-name = Collective Service Holdings cargo-account-service-code = SRV + +cargo-account-salvage-name = Salvage Requisitions +cargo-account-salvage-code = SLV diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl index f2451527b0909..353d30241bd19 100644 --- a/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl @@ -14,3 +14,8 @@ cargoproduct-category-name-science = Science cargoproduct-category-name-security = Security cargoproduct-category-name-service = Service cargoproduct-category-name-shuttle = Shuttle + +cargoproduct-category-name-salv-equipment = Equipment +cargoproduct-category-name-salv-hardsuits = Hardsuits +cargoproduct-category-name-salv-weapons = Weapons +cargoproduct-category-name-salv-other = Other diff --git a/Resources/Prototypes/Catalog/Cargo/markets.yml b/Resources/Prototypes/Catalog/Cargo/markets.yml index e1fd3de738f73..f04ec8b711991 100644 --- a/Resources/Prototypes/Catalog/Cargo/markets.yml +++ b/Resources/Prototypes/Catalog/Cargo/markets.yml @@ -9,3 +9,6 @@ - type: cargoMarket id: SalvageJobRewardMAX + +- type: cargoMarket + id: salvage diff --git a/Resources/Prototypes/Catalog/Cargo/salvage_requisitions.yml b/Resources/Prototypes/Catalog/Cargo/salvage_requisitions.yml new file mode 100644 index 0000000000000..c185783882506 --- /dev/null +++ b/Resources/Prototypes/Catalog/Cargo/salvage_requisitions.yml @@ -0,0 +1,197 @@ +# Tools and Wearables +- type: cargoProduct + id: SalvDoubleEmergencyTank + icon: + sprite: Objects/Tanks/emergency_double.rsi + state: icon + product: CrateDoubleEmergencyTank + cost: 2000 + category: cargoproduct-category-name-salv-equipment + group: salvage + +- type: cargoProduct + id: SalvSeismicCharge + icon: + sprite: Objects/Weapons/Bombs/seismic.rsi + state: icon + product: CrateSeismicCharge + cost: 2000 + category: cargoproduct-category-name-salv-equipment + group: salvage + +- type: cargoProduct + id: SalvFulton + icon: + sprite: /Textures/Objects/Tools/fulton.rsi + state: extraction_pack + product: CrateFulton + cost: 2000 + category: cargoproduct-category-name-salv-equipment + group: salvage + +- type: cargoProduct + id: SalvVoidJetpack + icon: + sprite: Objects/Tanks/Jetpacks/void.rsi + state: icon + product: CrateVoidJetpack + cost: 3000 + category: cargoproduct-category-name-salv-equipment + group: salvage + +- type: cargoProduct + id: SalvMiniJetpack + icon: + sprite: Objects/Tanks/Jetpacks/mini.rsi + state: icon + product: CrateEngineeringMiniJetpack + cost: 750 + category: cargoproduct-category-name-salv-equipment + group: salvage + +- type: cargoProduct + id: SalvPKAResearch + icon: + sprite: /Textures/Objects/Tools/upgrade.rsi + state: display + product: CratePKAUpgrades + cost: 1500 + category: cargoproduct-category-name-salv-equipment + group: salvage + +# Weapons +- type: cargoProduct + id: SalvCrusherDagger + icon: + sprite: Objects/Weapons/Melee/crusher_dagger.rsi + state: icon + product: CrateCrusherDagger + cost: 1500 + category: cargoproduct-category-name-salv-weapons + group: salvage + +- type: cargoProduct + id: SalvCrusher + icon: + sprite: Objects/Weapons/Melee/crusher.rsi + state: icon + product: CrateCrusher + cost: 4000 + category: cargoproduct-category-name-salv-weapons + group: salvage + +- type: cargoProduct + id: SalvCrusherGlaive + icon: + sprite: Objects/Weapons/Melee/crusher_glaive.rsi + state: icon + product: CrateCrusherGlaive + cost: 4000 + category: cargoproduct-category-name-salv-weapons + group: salvage + +# Hardsuits +- type: cargoProduct + id: SalvLuxuryHardsuit + description: Gilded with but a fraction of the wealth you've brought to the station, wear it with pride. + icon: + sprite: Clothing/OuterClothing/Hardsuits/luxury.rsi + state: icon + product: CrateCargoLuxuryHardsuit + cost: 10000 + category: cargoproduct-category-name-salv-hardsuits + group: salvage + +- type: cargoProduct + id: SalvEquipment + icon: + sprite: Clothing/OuterClothing/Hardsuits/salvage.rsi + state: icon + product: CrateSalvageEquipment + cost: 5000 + category: cargoproduct-category-name-salv-hardsuits + group: salvage + +- type: cargoProduct + id: SalvStarter + icon: + sprite: Clothing/OuterClothing/Hardsuits/spatio.rsi + state: icon + product: CrateSalvageHardsuit + cost: 2500 + category: cargoproduct-category-name-salv-hardsuits + group: salvage + +# Other +- type: cargoProduct + id: SalvOreBox + icon: + sprite: /Textures/Structures/Storage/orebox.rsi + state: orebox + product: OreBox + cost: 500 + category: cargoproduct-category-name-salv-other + group: salvage + +- type: cargoProduct + id: SalvShuttleBuild + description: Reclaim the stars, for they are rightfully yours. + icon: + sprite: /Textures/Structures/Shuttles/gyroscope.rsi + state: base + product: CrateShuttleBuild + cost: 8000 + category: cargoproduct-category-name-salv-other + group: salvage + +- type: cargoProduct + id: SalvServiceSmokeables + icon: + sprite: Objects/Consumable/Smokeables/Cigarettes/Cartons/green.rsi + state: icon + product: CrateServiceSmokeables + cost: 1000 + category: cargoproduct-category-name-salv-other + group: salvage + +- type: cargoProduct + id: SalvFoodMRE + icon: + sprite: Objects/Consumable/Food/snacks.rsi + state: nutribrick + product: CrateFoodMRE + cost: 1400 + category: cargoproduct-category-name-salv-other + group: salvage + +# Fun (AKA, overpriced token wasters for when you've bought everything else) +- type: cargoProduct + id: SalvSupremeSalvagerCloak + icon: + sprite: Clothing/Neck/Cloaks/miner.rsi + state: icon + product: CrateSupremeSalvagerCloak + cost: 25000 + category: cargoproduct-category-name-fun + group: salvage + +- type: cargoProduct + id: SalvHydratedScurret + description: Contains a furry friend with lots of experience exploring dilapidated ruins. + icon: + sprite: Structures/Wallmounts/posters.rsi + state: poster55_legit + product: CrateFunScurret + cost: 25000 + category: cargoproduct-category-name-fun + group: salvage + +- type: cargoProduct + id: SalvFunCrateGambling + icon: + sprite: Objects/Economy/cash.rsi + state: cash_1000000 + product: CrateCargoGambling + cost: 10000 + category: cargoproduct-category-name-fun + group: salvage diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml index 97d45ef74263e..273b41aac67d2 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml @@ -1,27 +1,19 @@ - type: entity - parent: CrateGenericSteel + parent: CrateCargoSecure id: CrateSalvageEquipment - name: "salvage equipment crate" + name: mining equipment crate suffix: Filled - description: For the daring. + description: For the daring. Contains a Mining Hardsuit and the tools to more effectively extract minerals within dangerous environments. components: - type: EntityTableContainerFill containers: entity_storage: !type:AllSelector children: - id: ClothingOuterHardsuitSalvage - - id: ClothingMaskBreath - id: OxygenTankFilled - - id: FireExtinguisher - - id: ClothingShoesBootsMag - - id: HandHeldMassScanner - - id: Pickaxe - - id: Welder - - id: Wrench - - id: Screwdriver - - id: Crowbar - - id: Wirecutter - - id: ClothingBeltUtility + - id: NitrogenTankFilled + - id: MiningDrill + - id: MineralScanner - id: OreBag - id: ClothingBeltSalvageWebbing @@ -95,20 +87,20 @@ prob: 0.0001 - type: entity - parent: CrateGenericSteel + parent: CrateCargoSecure id: CrateCrusherDagger name: crusher dagger crate - description: Contains 4 crusher daggers for use by salvage. + description: Contains 3 crusher daggers for use by salvage. components: - type: EntityTableContainerFill containers: entity_storage: id: WeaponCrusherDagger - amount: 4 + amount: 3 # Salvage rewards - type: entity - parent: CrateGenericSteel + parent: CrateCargoSecure id: CrateSeismicCharge name: seismic charge crate description: Contains 6 seismic charges for use by salvage. @@ -135,22 +127,22 @@ amount: 2 - type: entity - parent: CrateGenericSteel + parent: CrateCargoSecure id: CrateCrusher name: crusher crate - description: Contains 2 crushers for use by salvage. + description: Contains a crusher for use by salvage. components: - type: EntityTableContainerFill containers: entity_storage: id: WeaponCrusher - amount: 2 + amount: 1 - type: entity parent: CrateGenericSteel id: CrateFulton name: fulton crate - description: Contains a fulton beacon and 8 fultons. + description: Contains a fulton beacon and 10 fultons. components: - type: EntityTableContainerFill containers: @@ -158,35 +150,42 @@ children: - id: FultonBeacon - id: Fulton - amount: 8 + amount: 10 - type: entity parent: CrateGenericSteel id: CrateVoidJetpack name: void jetpack crate - description: Contains a single void jetpack. + description: Contains 2 void jetpacks for the distinguished space explorer. components: - type: EntityTableContainerFill containers: entity_storage: id: JetpackVoidFilled + amount: 2 - type: entity - parent: CrateGenericSteel + parent: CrateCargoSecure id: CrateSalvageHardsuit - name: salvage hardsuit crate - description: Contains a salvage hardsuit, breath mask, and oxygen tank. + name: salvage basics crate + description: Contains a salvage hardsuit, along with all the other basics an newly recruited salvager would need. components: - type: EntityTableContainerFill containers: entity_storage: !type:AllSelector children: - id: ClothingOuterHardsuitSalvage - - id: ClothingMaskBreath + - id: ClothingMaskGasExplorer - id: OxygenTankFilled + - id: NitrogenTankFilled + - id: ClothingBeltUtilityFilled + - id: ClothingShoesBootsSalvage + - id: FireExtinguisher + - id: Pickaxe + - id: SurvivalKnife - type: entity - parent: CrateGenericSteel + parent: CrateCargoSecure id: CrateCrusherGlaive name: crusher glaive crate description: Contains a crusher glaive for use by salvage. @@ -197,7 +196,7 @@ id: WeaponCrusherGlaive - type: entity - parent: CrateGenericSteel + parent: CratePrivateSecure id: CrateSupremeSalvagerCloak name: supreme salvager cloak crate description: Contains a cloak only to be worn by supreme salvagers. Wearing it undeservedly will result in your doom. @@ -207,6 +206,39 @@ entity_storage: id: ClothingNeckCloakSalvagerSupreme +- type: entity + id: CratePKAUpgrades + parent: CrateScience + name: PKA upgrade kit crate + description: Contains 1 of each PKA upgrade. For use when the science department doesn't research armory technology again. + components: + - type: StorageFill + contents: + - id: PKAUpgradeDamage + - id: PKAUpgradeRange + - id: PKAUpgradeFireRate + +- type: entity + id: CrateShuttleBuild + parent: CrateEngineering + name: shuttle construction crate + description: Contains the bare essentials to create a questionably functional shuttle. Tools sold seperately, fuel not included. + Nanotrasen is not responsible for any space collisions caused as a result of a sudden loss of power. + components: + - type: StorageFill + contents: + - id: DrinkBeerCan # essential for drunk driving and welding fuel storage + amount: 2 + - id: ThrusterFlatpack + amount: 4 + - id: GyroscopeFlatpack + - id: PortableGeneratorJrPacmanFlatpack #total power draw 7.5kW, can provide 8kW. + - id: SheetGlass10 + - id: ShuttleConsoleCircuitboard + - id: CableApcStack + - id: SheetSteel + amount: 2 + - type: entity parent: CrateGenericSteel id: CratePartsT3 diff --git a/Resources/Prototypes/Catalog/cargo_accounts.yml b/Resources/Prototypes/Catalog/cargo_accounts.yml index 1b366de8c615a..cf70c12742ba8 100644 --- a/Resources/Prototypes/Catalog/cargo_accounts.yml +++ b/Resources/Prototypes/Catalog/cargo_accounts.yml @@ -45,3 +45,12 @@ color: "#539c00" radioChannel: Service acquisitionSlip: PaperAcquisitionSlipService + +- type: cargoAccount + id: Salvage + name: cargo-account-salvage-name + code: cargo-account-salvage-code + color: "#a1449a" + radioChannel: Supply + acquisitionSlip: PaperAcquisitionSlipCargo + independent: true diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml index 9ac187c9c9359..5cb1743f3a244 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml @@ -571,3 +571,16 @@ state: cpu_science - type: ComputerBoard prototype: StationAiFixerComputer + +- type: entity + parent: BaseComputerCircuitboard + id: CargoRequestSalvageComputerCircuitboard + name: salvage requisition console board + description: A computer printed circuit board for a salvage requisition console. + components: + - type: Sprite + state: cpu_supply + - type: ComputerBoard + prototype: ComputerCargoOrdersSalvage + - type: StaticPrice + price: 750 diff --git a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml index 8034dd0c667f9..0a6e17f096cf1 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml @@ -267,6 +267,15 @@ - Botany - Chemicals +- type: entity + parent: BaseFlatpack + id: PortableGeneratorJrPacmanFlatpack + name: J.R.P.A.C.M.A.N.-type portable generator flatpack + description: A flatpack used for constructing a J.R.P.A.C.M.A.N.-type portable generator + components: + - type: Flatpack + entity: PortableGeneratorJrPacman + - type: entity parent: [ BaseFlatpack, BaseSyndicateContraband ] id: SyndicateMicrowaveFlatpack diff --git a/Resources/Prototypes/Entities/Stations/base.yml b/Resources/Prototypes/Entities/Stations/base.yml index ecd909ff78912..6efd390ea9314 100644 --- a/Resources/Prototypes/Entities/Stations/base.yml +++ b/Resources/Prototypes/Entities/Stations/base.yml @@ -17,6 +17,7 @@ Science: [ ] Security: [ ] Service: [ ] + Salvage: [ ] - type: StationCargoBountyDatabase - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 96e30a5aa7692..35c60ffc86b7a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -1779,3 +1779,57 @@ name: store-preset-name-nukie-delivery categories: - NukieDelivery + +- type: entity + parent: BaseComputerAiAccess + id: ComputerCargoOrdersSalvage + name: salvage requisition console + description: An interface for redeeming salvage tokens to request additional gear for your duties. + The Requisitions Fund accepts transfers from other departments, but cannot convert Tokens back to Spesos. + components: + - type: AccessReader + access: [["Salvage"]] + - type: Sprite + layers: + - map: ["computerLayerBody"] + state: computer + - map: ["computerLayerKeyboard"] + state: generic_keyboard + - map: ["computerLayerScreen"] + state: salvjob + - map: ["computerLayerKeys"] + state: generic_keys + - map: [ "enum.WiresVisualLayers.MaintenancePanel" ] + state: generic_panel_open + - type: CargoOrderConsole + account: Salvage + cashType: SalvTicket + allowedGroups: + - salvage + baseTransferLimit: 0 + - type: ActiveRadio + channels: + - Supply + - type: ActivatableUI + key: enum.CargoConsoleUiKey.Orders + - type: UserInterface + interfaces: + enum.CargoConsoleUiKey.Orders: + type: CargoOrderConsoleBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface + - type: Computer + board: CargoRequestSalvageComputerCircuitboard + - type: PointLight + radius: 1.5 + energy: 1.6 + color: "#a1449a" + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: BasicDevice + - type: WirelessNetworkConnection + range: 200 + - type: DeviceLinkSource + range: 200 + ports: + - OrderSender diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index c622ad8961d8b..b58e4e19eaa62 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -284,6 +284,18 @@ - type: Sprite sprite: Structures/Storage/Crates/secure.rsi +- type: entity + parent: CrateBaseSecure + id: CrateCargoSecure + name: secure cargo crate + components: + - type: Icon + sprite: Structures/Storage/Crates/secure.rsi + - type: Sprite + sprite: Structures/Storage/Crates/secure.rsi + - type: AccessReader + access: [["Cargo"]] + - type: entity parent: CrateBaseSecure id: CrateHydroSecure From e82854280e3d682686d0eb191b764ac19b9248ff Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Feb 2026 01:23:00 +0000 Subject: [PATCH 03/12] Remove the Jobs Board Or rather, the bits that effect the station Code can remain (for now) --- .../Components/CargoOrderConsoleComponent.cs | 3 - Resources/Locale/en-US/cargo/bounties.ftl | 8 +- Resources/Locale/en-US/salvage/job-board.ftl | 28 --- .../Prototypes/Catalog/Bounties/bounties.yml | 70 +++++++ .../Prototypes/Catalog/Bounties/groups.yml | 9 - .../Catalog/Bounties/salvage_jobs.yml | 173 ------------------ .../Prototypes/Catalog/Cargo/markets.yml | 9 - .../Catalog/Cargo/salvage_rewards.yml | 83 --------- .../Prototypes/Catalog/Fills/Boxes/heads.yml | 2 +- .../Entities/Stations/nanotrasen.yml | 1 - .../ServerInfo/Guidebook/Cargo/Salvage.xml | 10 +- Resources/migration.yml | 4 + 12 files changed, 88 insertions(+), 312 deletions(-) delete mode 100644 Resources/Prototypes/Catalog/Bounties/salvage_jobs.yml delete mode 100644 Resources/Prototypes/Catalog/Cargo/salvage_rewards.yml diff --git a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs index b4374552544ed..3e780f67ed243 100644 --- a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs +++ b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs @@ -81,9 +81,6 @@ public sealed partial class CargoOrderConsoleComponent : Component public List> AllowedGroups = new() { "market", - "SalvageJobReward2", - "SalvageJobReward3", - "SalvageJobRewardMAX", }; /// diff --git a/Resources/Locale/en-US/cargo/bounties.ftl b/Resources/Locale/en-US/cargo/bounties.ftl index 636d8865c72de..835e7ccc217b4 100644 --- a/Resources/Locale/en-US/cargo/bounties.ftl +++ b/Resources/Locale/en-US/cargo/bounties.ftl @@ -76,8 +76,9 @@ bounty-item-flash = Flash bounty-item-tooth-space-carp = Space Carp Tooth bounty-item-tooth-sharkminnow = Sharkminnow Tooth bounty-item-ring = Ring -bounty-item-remains = Hivelord Remains +bounty-item-hivelord-remains = Hivelord Remains bounty-item-plates = Goliath Hide Plates +bounty-item-ore = Any Ore bounty-description-artifact = NanoTrasen is in some hot water for stealing artifacts from non-spacefaring planets. Return one and we'll compensate you for it. bounty-description-baseball-bat = Baseball fever is going on at CentComm! Be a dear and ship them some baseball bats, so that management can live out their childhood dream. @@ -147,3 +148,8 @@ bounty-description-cotton-boll = A massive swarm of mothroaches ate all the pape bounty-description-microwave-machine-board = Mr. Giggles thought it'd be funny to stick forks in all the kitchen microwaves. Help us replace them before the chefs start making clown burgers. bounty-description-flashes = GREETINGS \[Station] WE REQUIRE 6 FLASHES DUE TO A NORMAL \[TrainingExercise] WITH SECURITY. EVERYTHING IS \[Normal]. bounty-description-ring = On this EXTRAORDINARY day there will be a wedding between the Gelts, but Mr. Gelt has lost the rings. They need a new pair. +bounty-description-tooth-space-carp = Our culinary research division has been trialing a new set of carp-tooth cutlery for our next gala event, could you provide us with some fishy dentures for the next batch? +bounty-description-ore = Station Delta's salvage team has yet to come back from their latest expedition, can you send them some ores? Their Science Department is threatening to revolt. +bounty-description-tooth-sharkminnow = We've received worrying news that a tribe of lava planet-dwelling lizard people have somehow managed to storm one of our stations. Their leader demands a crown of Sharkminnow teeth as a sign of amnesty, could you get us some so they go away? +bounty-description-diamond = Diamonds are a girl's best friend, and our industrial-grade machining lathe sure looks like she could use them, mind grabbing a few? +bounty-description-hivelord-remains = The Hivelord is a mysterious and wonderful creature, an enigma of natural evolution. Kill and gut one for us then send its remains, we'd like to see what makes it tick. Beware they rot quickly. diff --git a/Resources/Locale/en-US/salvage/job-board.ftl b/Resources/Locale/en-US/salvage/job-board.ftl index 1333be7651bb4..a5689bfde8ff5 100644 --- a/Resources/Locale/en-US/salvage/job-board.ftl +++ b/Resources/Locale/en-US/salvage/job-board.ftl @@ -17,31 +17,3 @@ job-board-label-text = [head=2]Salvage Job Shipment[/head] {"[italic]Shipments are subject to inspection by the Donk corporation[/italic]"} - -salv-job-board-name-BountyTeethSpaceCarp = Space Carp -salv-job-board-name-BountySalvageScrap = Deep-Space Debris -salv-job-board-name-BountySalvageOreGold = Gold (Ore) -salv-job-board-name-BountySalvageOreSilver = Silver (Ore) - -salv-job-board-name-BountySalvageOreUranium = Uranium (Ore) -salv-job-board-name-BountySalvageOrePlasma = Plasma (Ore) -salv-job-board-name-BountySalvageOreBananium = Bananium (Ore) -salv-job-board-name-BountyTeethSharkminnow = Sharkminnow - -salv-job-board-name-BountyGoliathPlates = Goliath -salv-job-board-name-BountyHivelordRemains = Hivelord -salv-job-board-name-BountySalvageDiamond = Diamond - -bounty-description-tooth-space-carp = We need you to get a sample of some space carp teeth. You can find these guys on all kinds of salvage debris. Just be careful about their bite. -bounty-description-salvage-scrap = We are researching the effects of deep space on station materials, and we need some samples. Find some old junk off of debris and bring it to us. -bounty-description-salvage-ore-gold = We are engaging in an experimental new electronics manufacturing process. Deliver us a large sum of unrefined gold ore. It can come from any source. -bounty-description-salvage-ore-silver = We are studying the material effects of silver based on the refining methods. Send us a large amount of unrefined silver ore. It can come from any source. - -bounty-description-tooth-sharkminnow = We need you to get a sample of some Sharkminnow teeth. These guys are a fair bit nastier than the smaller carp you're familiar with. Take care to not let them bite you: they'll suck out your blood and heal. -bounty-description-salvage-ore-plasma = We need a shipment of plasma ore to send over to the research station. Please provide us with some so that we can continue our testing. It can come from any source. -bounty-description-salvage-ore-uranium = We need a sample of uranium ore for our ongoing experiments on nuclear devices. Be aware that while the uranium does glow slightly, it will probably not harm you. It can come from any source. -bounty-description-salvage-ore-bananium = We have an ongoing project to decode the mystifying clown genomic sequence. We believe a sample of raw bananium will help us achieve this. Note that this only comes from the rarest of deep-space asteroids. - -bounty-description-remains = We need you to get a sample of a few Hivelord cores. Be aware that Hivelords can replicate infinitely if the core is not destroyed. Take care not to get overwhelmed. -bounty-description-plates = We need you to get a couple sheets of Goliath hide. These guys are pretty slow, but be careful about the tentacles: they'll grab you and pull you to the ground. You don't want to know what happens next. -bounty-description-diamond = We need you to acquire a few diamonds for some advanced fabrication. These can either be found in the mining asteroid nearby or cut out of the basilisk creature. Whichever way you want to do it, get us some. diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 137a494674a8f..834db627508cc 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -760,3 +760,73 @@ whitelist: tags: - Ring + +- type: cargoBounty + id: BountyTeethSpaceCarp + reward: 9000 + description: bounty-description-tooth-space-carp + sprite: + sprite: Mobs/Aliens/Carps/space.rsi + state: icon + entries: + - name: bounty-item-tooth-space-carp + amount: 9 + whitelist: + tags: + - ToothSpaceCarp + +- type: cargoBounty + id: BountySalvageOre + reward: 9000 + description: bounty-description-ore + sprite: + sprite: Objects/Materials/ore.rsi + state: iron + entries: + - name: bounty-item-ore + amount: 45 + whitelist: + tags: + - Ore + +- type: cargoBounty + id: BountyTeethSharkminnow + reward: 12000 + description: bounty-description-tooth-sharkminnow + sprite: + sprite: Mobs/Aliens/Carps/sharkminnow.rsi + state: icon + entries: + - name: bounty-item-tooth-sharkminnow + amount: 3 + whitelist: + tags: + - ToothSharkminnow + +- type: cargoBounty + id: BountyHivelordRemains + reward: 10000 + description: bounty-description-hivelord-remains + sprite: + sprite: Mobs/Aliens/Asteroid/hivelord.rsi + state: hivelord + entries: + - name: bounty-item-hivelord-remains + amount: 1 + whitelist: + tags: + - HivelordRemains + +- type: cargoBounty + id: BountySalvageDiamond + reward: 15000 + description: bounty-description-diamond + sprite: + sprite: Objects/Materials/materials.rsi + state: diamond + entries: + - name: bounty-item-diamond + amount: 2 + whitelist: + tags: + - Diamond diff --git a/Resources/Prototypes/Catalog/Bounties/groups.yml b/Resources/Prototypes/Catalog/Bounties/groups.yml index 54010b96bf217..2fb58aae0146b 100644 --- a/Resources/Prototypes/Catalog/Bounties/groups.yml +++ b/Resources/Prototypes/Catalog/Bounties/groups.yml @@ -1,11 +1,2 @@ - type: cargoBountyGroup id: StationBounty - -- type: cargoBountyGroup - id: SalvageJobTier1 - -- type: cargoBountyGroup - id: SalvageJobTier2 - -- type: cargoBountyGroup - id: SalvageJobTier3 diff --git a/Resources/Prototypes/Catalog/Bounties/salvage_jobs.yml b/Resources/Prototypes/Catalog/Bounties/salvage_jobs.yml deleted file mode 100644 index d1f7a002c525f..0000000000000 --- a/Resources/Prototypes/Catalog/Bounties/salvage_jobs.yml +++ /dev/null @@ -1,173 +0,0 @@ -# NOTE: if you add any bounties to this, you need to go to Resources/Prototypes/Entities/Stations/base.yml and adjust the thresholds on BaseStationSalvageJobs. -# If you don't do this, you won't raise the limit for completing a given rank and may throw off some balance. - -# Tier 1 - -- type: cargoBounty - id: BountyTeethSpaceCarp - reward: 7500 - description: bounty-description-tooth-space-carp - group: SalvageJobTier1 - sprite: - sprite: Mobs/Aliens/Carps/space.rsi - state: icon - entries: - - name: bounty-item-tooth-space-carp - amount: 10 - whitelist: - tags: - - ToothSpaceCarp - -- type: cargoBounty - id: BountySalvageScrap - reward: 7500 - description: bounty-description-salvage-scrap - group: SalvageJobTier1 - sprite: - sprite: Objects/Materials/Scrap/generic.rsi - state: metal-1 - entries: - - name: bounty-item-scrap - amount: 10 - whitelist: - tags: - - SalvageScrap - -- type: cargoBounty - id: BountySalvageOreGold - reward: 7500 - description: bounty-description-salvage-ore-gold - group: SalvageJobTier1 - sprite: - sprite: Objects/Materials/ore.rsi - state: gold - entries: - - name: bounty-item-ore-gold - amount: 45 - whitelist: - tags: - - OreGold - -- type: cargoBounty - id: BountySalvageOreSilver - reward: 7500 - description: bounty-description-salvage-ore-silver - group: SalvageJobTier1 - sprite: - sprite: Objects/Materials/ore.rsi - state: silver - entries: - - name: bounty-item-ore-silver - amount: 45 - whitelist: - tags: - - OreSilver - -# Tier 2 - -- type: cargoBounty - id: BountyTeethSharkminnow - reward: 12500 - description: bounty-description-tooth-sharkminnow - group: SalvageJobTier2 - sprite: - sprite: Mobs/Aliens/Carps/sharkminnow.rsi - state: icon - entries: - - name: bounty-item-tooth-sharkminnow - amount: 3 - whitelist: - tags: - - ToothSharkminnow - -- type: cargoBounty - id: BountySalvageOrePlasma - reward: 12500 - description: bounty-description-salvage-ore-plasma - group: SalvageJobTier2 - sprite: - sprite: Objects/Materials/ore.rsi - state: plasma - entries: - - name: bounty-item-ore-plasma - amount: 45 - whitelist: - tags: - - OrePlasma - -- type: cargoBounty - id: BountySalvageOreUranium - reward: 12500 - description: bounty-description-salvage-ore-uranium - group: SalvageJobTier2 - sprite: - sprite: Objects/Materials/ore.rsi - state: uranium - entries: - - name: bounty-item-ore-uranium - amount: 30 - whitelist: - tags: - - OreUranium - -- type: cargoBounty - id: BountySalvageOreBananium - reward: 12500 - description: bounty-description-salvage-ore-bananium - group: SalvageJobTier2 - sprite: - sprite: Objects/Materials/ore.rsi - state: bananium - entries: - - name: bounty-item-ore-bananium - amount: 30 - whitelist: - tags: - - OreBananium - -# Tier 3 - -- type: cargoBounty - id: BountyGoliathPlates - reward: 20000 - description: bounty-description-plates - group: SalvageJobTier3 - sprite: - sprite: Mobs/Aliens/Asteroid/goliath.rsi - state: goliath - entries: - - name: bounty-item-plates - amount: 6 - whitelist: - tags: - - GoliathPlate - -- type: cargoBounty - id: BountyHivelordRemains - reward: 20000 - description: bounty-description-remains - group: SalvageJobTier3 - sprite: - sprite: Mobs/Aliens/Asteroid/hivelord.rsi - state: hivelord - entries: - - name: bounty-item-remains - amount: 3 - whitelist: - tags: - - HivelordRemains - -- type: cargoBounty - id: BountySalvageDiamond - reward: 20000 - description: bounty-description-diamond - group: SalvageJobTier3 - sprite: - sprite: Objects/Materials/materials.rsi - state: diamond - entries: - - name: bounty-item-diamond - amount: 3 - whitelist: - tags: - - Diamond diff --git a/Resources/Prototypes/Catalog/Cargo/markets.yml b/Resources/Prototypes/Catalog/Cargo/markets.yml index f04ec8b711991..b777d81e3eade 100644 --- a/Resources/Prototypes/Catalog/Cargo/markets.yml +++ b/Resources/Prototypes/Catalog/Cargo/markets.yml @@ -1,14 +1,5 @@ - type: cargoMarket id: market -- type: cargoMarket - id: SalvageJobReward2 - -- type: cargoMarket - id: SalvageJobReward3 - -- type: cargoMarket - id: SalvageJobRewardMAX - - type: cargoMarket id: salvage diff --git a/Resources/Prototypes/Catalog/Cargo/salvage_rewards.yml b/Resources/Prototypes/Catalog/Cargo/salvage_rewards.yml deleted file mode 100644 index 19fea1f55f143..0000000000000 --- a/Resources/Prototypes/Catalog/Cargo/salvage_rewards.yml +++ /dev/null @@ -1,83 +0,0 @@ -# Rank 2 -- type: cargoProduct - id: CargoDoubleEmergencyTank - icon: - sprite: Objects/Tanks/emergency_double.rsi - state: icon - product: CrateDoubleEmergencyTank - cost: 2400 - category: cargoproduct-category-name-cargo - group: SalvageJobReward2 - -- type: cargoProduct - id: CargoSeismicCharge - icon: - sprite: Objects/Weapons/Bombs/seismic.rsi - state: icon - product: CrateSeismicCharge - cost: 1800 - category: cargoproduct-category-name-cargo - group: SalvageJobReward2 - -- type: cargoProduct - id: CargoCrusher - icon: - sprite: Objects/Weapons/Melee/crusher.rsi - state: icon - product: CrateCrusher - cost: 5000 - category: cargoproduct-category-name-cargo - group: SalvageJobReward2 - -- type: cargoProduct - id: CargoSalvageHardsuit - icon: - sprite: Clothing/OuterClothing/Hardsuits/salvage.rsi - state: icon - product: CrateSalvageHardsuit - cost: 7500 - category: cargoproduct-category-name-cargo - group: SalvageJobReward2 - -# Rank 3 -- type: cargoProduct - id: CargoFulton - icon: - sprite: /Textures/Objects/Tools/fulton.rsi - state: extraction_pack - product: CrateFulton - cost: 3000 - category: cargoproduct-category-name-cargo - group: SalvageJobReward3 - -- type: cargoProduct - id: CargoVoidJetpack - icon: - sprite: Objects/Tanks/Jetpacks/void.rsi - state: icon - product: CrateVoidJetpack - cost: 4000 - category: cargoproduct-category-name-cargo - group: SalvageJobReward3 - -- type: cargoProduct - id: CargoCrusherGlaive - icon: - sprite: Objects/Weapons/Melee/crusher_glaive.rsi - state: icon - product: CrateCrusherGlaive - cost: 8000 - category: cargoproduct-category-name-cargo - group: SalvageJobReward3 - -# Max Rank - -- type: cargoProduct - id: CargoSupremeSalvagerCloak - icon: - sprite: Clothing/Neck/Cloaks/miner.rsi - state: icon - product: CrateSupremeSalvagerCloak - cost: 25000 - category: cargoproduct-category-name-cargo - group: SalvageJobRewardMAX diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/heads.yml b/Resources/Prototypes/Catalog/Fills/Boxes/heads.yml index 98c4c667fbc42..625edb4472e0c 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/heads.yml @@ -89,7 +89,7 @@ - id: CargoSaleComputerCircuitboard - id: CargoShuttleConsoleCircuitboard - id: SalvageMagnetMachineCircuitboard - - id: SalvageJobBoardComputerCircuitboard + - id: CargoRequestSalvageComputerCircuitboard - id: MailTeleporterMachineCircuitboard - type: entity diff --git a/Resources/Prototypes/Entities/Stations/nanotrasen.yml b/Resources/Prototypes/Entities/Stations/nanotrasen.yml index 0b1e143703ceb..5fb40f272a2b4 100644 --- a/Resources/Prototypes/Entities/Stations/nanotrasen.yml +++ b/Resources/Prototypes/Entities/Stations/nanotrasen.yml @@ -22,7 +22,6 @@ - BaseStationAlertLevels - BaseStationMagnet - BaseStationExpeditions - - BaseStationSalvageJobs - BaseStationSiliconLawCrewsimov - BaseStationAllEventsEligible - BaseStationNanotrasen diff --git a/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml b/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml index 9cab9aced2364..6407571f37235 100644 --- a/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml +++ b/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml @@ -132,20 +132,22 @@ ### Salvage Job Board - + + - The [color=cyan]Salvage Job Board[/color] is a computer located in the Salvage Bay. It serves as Salvage's version of the [color=cyan]Cargo Bounty Computer[/color], allowing Salvagers to fulfill specific jobs with Salvage-specific materials in order to earn Spesos and unlock [color=yellow]Advanced Salvage Gear[/color]. + The [color=cyan]Salvage Requisition Console[/color] is a computer located in the Salvage Bay. It serves as Salvage's version of the [color=cyan]Cargo Request Console[/color], allowing Salvagers to turn in [color=purple] Salvage Tokens [/color] earned from processing ores and recycling scrap to request [color=yellow]Advanced Salvage Gear[/color]. - Once you gather the supplies necessary to complete a job, print out a [color=cyan]Salvage Job Shipment Label[/color] and attach it to the crate or locker containing the goods. You can use your [color=cyan]Appraisal Tool[/color] to double-check that it's ready for sale. The prepared bounty can then be brought to the [color=cyan]Automated Trade Station[/color] to earn Cargo Spesos and to unlock new Salvage-specific crates in the [color=cyan]Cargo Request Computer[/color]. + Processing Steel, Glass, and Plastic will yield a base amount of tokens, more rare materials such as Gold Ingots will earn more, with Uranium and Diamonds earning the most. + In times of need, other departments can subsidise the [color=purple]Salvage Requisitions[/color] account by transferring spesos to it from their request consoles. However funds transferred in this way cannot be transferred back. - Completing Salvage Jobs will upgrade your rank and unlock new equipment purchases in the [color=cyan]Cargo Request Computer[/color], including: + Useful purchases include: - [color=cyan]Fultons[/color]: Once a Fulton has been linked to a Fulton Beacon, they can be attached to unanchored structures like crates or machines to teleport them back to the Beacon after a short wait. Exceptionally useful for moving both items and people. - [color=cyan]Crusher Weapons[/color]: A series of upgraded melee options for Salvagers to purchase. The [color=red]Crusher Dagger[/color] is an upgrade to your Survival knife, swinging automatically and far faster than a regular knife. The [color=red]Crusher[/color] and upgraded [color=red]Crusher Glaive[/color] are gigantic polearms which can fire special projectiles when wielded. These projectiles do no damage on their own, but if a marked enemy is meleed quickly enough, you'll leech some of their life away to heal yourself. All Crusher weaponry comes with a built-in floodlamp. diff --git a/Resources/migration.yml b/Resources/migration.yml index 71959fec08dff..b027a0778f48f 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -804,3 +804,7 @@ TowelColorYellow: null TowelColorMaroon: null TowelColorSilver: null TowelColorMime: null + +# 2026-01-31 +SalvageJobBoardComputerCircuitboard: CargoRequestSalvageComputerCircuitboard +ComputerSalvageJobBoard: ComputerCargoOrdersSalvage From ba2ed50d103afecc81ec705f6183e3f8efd1f642 Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Feb 2026 01:34:58 +0000 Subject: [PATCH 04/12] Final nitpicks Slight Texture change add 5000 tokens entity texture some typos and grammar stuff salvage starts with some money, as a treat. --- .../Components/StationBankAccountComponent.cs | 2 +- .../Prototypes/Catalog/Fills/Crates/salvage.yml | 4 ++-- .../Entities/Objects/Devices/flatpack.yml | 3 +++ .../Objects/Specific/Salvage/ticket.yml | 11 ++++++++++- .../Structures/Machines/Computers/computers.yml | 1 - .../Objects/Misc/coins.rsi/coin_salv.png | Bin 303 -> 346 bytes .../Objects/Misc/coins.rsi/coin_salv_100.png | Bin 332 -> 366 bytes .../Objects/Misc/coins.rsi/coin_salv_1000.png | Bin 338 -> 380 bytes .../Objects/Misc/coins.rsi/coin_salv_10000.png | Bin 351 -> 396 bytes .../Objects/Misc/coins.rsi/coin_salv_25000.png | Bin 350 -> 397 bytes .../Objects/Misc/coins.rsi/coin_salv_5000.png | Bin 0 -> 395 bytes 11 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 Resources/Textures/Objects/Misc/coins.rsi/coin_salv_5000.png diff --git a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs index cfaa17f9dc373..c687bcd8ed17a 100644 --- a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs +++ b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs @@ -41,7 +41,7 @@ public sealed partial class StationBankAccountComponent : Component { "Science", 1000 }, { "Security", 1000 }, { "Service", 1000 }, - { "Salvage", 0 }, + { "Salvage", 1000 }, }; /// diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml index 273b41aac67d2..b9aab4eb75e67 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml @@ -115,7 +115,7 @@ parent: CrateGenericSteel id: CrateDoubleEmergencyTank name: double emergency tank crate - description: Contains 2 double emergency oxygen tanks and 2 double emergency nitrogen tanks + description: Contains 2 double emergency oxygen tanks and 2 double emergency nitrogen tanks. components: - type: EntityTableContainerFill containers: @@ -156,7 +156,7 @@ parent: CrateGenericSteel id: CrateVoidJetpack name: void jetpack crate - description: Contains 2 void jetpacks for the distinguished space explorer. + description: Contains 2 void jetpacks for the distinguished space explorers. components: - type: EntityTableContainerFill containers: diff --git a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml index 0a6e17f096cf1..376da0f164e5c 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml @@ -275,6 +275,9 @@ components: - type: Flatpack entity: PortableGeneratorJrPacman + - type: GuideHelp + guides: + - Power - type: entity parent: [ BaseFlatpack, BaseSyndicateContraband ] diff --git a/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml b/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml index 3aa5ee0359806..bf22ec67ad26f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml @@ -15,11 +15,12 @@ - coin_salv - coin_salv_100 - coin_salv_1000 + - coint_salv_5000 - coin_salv_10000 - coin_salv_25000 layerFunction: Threshold - type: StackLayerThreshold - thresholds: [10, 100, 1000, 10000, 25000] + thresholds: [10, 100, 1000, 5000, 10000, 25000] - type: Sprite sprite: Objects/Misc/coins.rsi state: coin_salv @@ -72,6 +73,14 @@ - type: Stack count: 1000 +- type: entity + parent: SalvageTicket + id: SalvageTicket5000 + suffix: 5000 + components: + - type: Stack + count: 5000 + - type: entity parent: SalvageTicket id: SalvageTicket10000 diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 35c60ffc86b7a..2800b72292e67 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -1785,7 +1785,6 @@ id: ComputerCargoOrdersSalvage name: salvage requisition console description: An interface for redeeming salvage tokens to request additional gear for your duties. - The Requisitions Fund accepts transfers from other departments, but cannot convert Tokens back to Spesos. components: - type: AccessReader access: [["Salvage"]] diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv.png index 8c2f88df2657f2812e0c37226b7e0837f790667b..4df6e7e1d8e1f517a45ce5f04987267db66d08ee 100644 GIT binary patch delta 307 zcmV-30nGld0@?zQFn<9QNkl084I8*&6BdDjf&vy{ z14eM;A(#O{V+m1^hKHh5;HM}>{8j#u&pr2C$>8yLJpY}?JCB>D*#Uwepe#!#EvHAX z!a@k5C<0)bCV<;UK3s|mArL|UFbo3#Qc9$hbX~Xqs(}|;Yk!g?p(qN%Fg%UiPDQ)loPlptZ&rLzZQX<4Bfe7-P;9wr#tt_32_DO;eOo z=Q<2Slv2cT%skJxv~DHPw(aBjd;-w-Jsi=0->>URUDuaK>y!XT=f)VuaU{=k@;rCa zary_Us@egpwJhhEloH@p_s#}>8sQkvJ6ax($K&}kz5r8OS~$)G=n((_002ovPDHLk FV1n|viFg12 delta 264 zcmV+j0r&pe0?ShSXB@DMbN;0;*B6fP({37gO` zglDi^Az3b*CPtB~T>pwvgwtIR-#t78R4SFqf9LI$#oqf9plKS$aeS2ZXwlVJDMj11 z0Icf@AQlk|c<)c86aX>CGCmAL5s^rINChrpj96<+9YQD)5`RP|;G8>i&MeD>384& diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_100.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_100.png index 9d8f796d60ffc837630291554d165f329b6d49b8..ba3b9b0cbeb9f76fccc9e756b76462f8b5cd7b26 100644 GIT binary patch delta 326 zcmV-M0lEIn0`3BkF@GpYL_t(oh3%9vZi6rshQC%tmRN|qdGf--4ZQd!xkwl?WFQye z1{{IKhu{nd79^A*UBIfU4%kuEq5dWt>0)VdT0FY85rR09UKY!K0PJiF`XstP)&lE-Bjf4^u zS6$c7Wm!;4p|!?2=l>aFnCBU`b{uU*R04h9v7HcBUW4%Bt+ zpV_i3{=1aYuRpKX>tWrf1opyvJJ^O25iN+CgnJ4k0sD5w?JH?i4}*073|~J`4kia3ro=flLSi#u%D=?|(^x1FHkp+B2nuWm#a1 zL5z`}DWyn)(}f?l@-Hz)D5a?Qz07eO|IR5E$i<)M+qSWC*aA{Y^nDNS{X=2zJ+#)? z_nnnj{1e_w0D#uID2IIvt+i(!r<7>D>pB`w)AZhBm zg%HGX48Sx^0Md;YGDMe8f z0L=3YAQlk|^nJf8r2ufwh3`$%1QChEmsH@uIY-;JVQ;Ms5`Pjz9Wci1-g~BLqHSBo zaSZ>o)nEfgOP?lv_cU||lgXpat w;M9emIv}}yv?IV(1Yj73TUm)jB9V9--_}TIlNG%usQ>@~07*qoM6N<$f_E^5b^rhX diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_10000.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_10000.png index a23702a35fe1b428b1d365b3381b30a28fb5a98a..8c8a7d1e926af442a3c6758895ca4c6e3d360531 100644 GIT binary patch delta 356 zcmV-q0h|8c0*nKYF@Hu$L_t(oh3%CwZi6rshQC%tj=T_gV`5?9241)c7l9!ILvoSa zfFrQ@5bSJ-EJ!E=UBE(BhuBdYRpp;-A^-1x-$OR++V$V{_RQg`s%C&72q=oe%ggJ~ zT386d@puHF?|T5}An!iKg%AiK0I2I40HqX4DK3}G{G$O@HGfS*9LMB&P8fzZh^w4% zm1Q}P<46=m#Bq!<#(vXUbGzMO8ONie@FLJO4aOMKG^K4@(lo^wV=3J4_lLbcd;%m% zg4Wuu!!Sf^O%z28!{FrQOh8Hr!1a2C1^sqEO_P(K7Xg;ejWM)sOO|D1S?1;A^$$oX zEr}#a=(>(+nq8c`$Cto3jyA}u^2!M7_wNy4L*Y9DF5PNs{@za5C|avsOuU4r4&jjE|<&vqXAYmO@Bii$K-iV7=|{8tDJC^ zWjT-INEAiHaf~s>?rE*L-EOdquV=l_ASEbZrZOF$`Q z*Qe9zVc)+;fDMK32)K0b9pGyafb;qMl-I6ZyI!VGN7|0ak{IUC00000NkvXXu0mjf D6UD19 delta 310 zcmV-60m=T21Kt9VF@G3IL_t(oh3%EGjf5~11!qr(K#mYKPy`7j&;gC$fPjEX+zE+` zpaw*Qgb27~u~>A$eWMeJC&D1!A3q`d;s#yU?Ep~}(KOA=C&TNdV{jbDq-hGkG)(|v z5wSqmb$cAg01U(6?pIaiL?ja5Qh|eE7^v&ot&K5GLV~CPt$+2tEDPf}Qr9)sTKB9d z3MV0H;Y+Oi##&2J6mIxgX4|$u=XeVo!>{Xko<%ug0i_gqo@0#p7;KE8EKAmP73Fz< zgl7qWvMjxFyabd|PU1ki^IHPTvV4f}{wev0+-l$u0Z5X>Cn_`$8hE||@o}uR-mfA6 zS(dr$wr&6SI4^#*0ZuLa)_`R9-U3$Px$MM*?KR9J=Wl`(FEFcgNrRz;4y5P4%_Vc`Z|xCs}5Ap=8lk=%eIu=o({Y=|sK zC<9%(E+Q2*L4q1fcJG z0Oug@KE;I)2q6Hd>ly&16iO*Bm&^R40ai6lLmbECc}^IHHi)a7aFt~_kK;%bMZ|H8 zF~)w=T64SIU>V1wqwpfoG!4cW(ln)QThcVe7-K2i@ArqjK70ZsNrKkeuEQ`yYfThI z48!2$_ literal 0 HcmV?d00001 From 64247b2cf78013ee85fdf78338509128267daf5e Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Feb 2026 02:30:51 +0000 Subject: [PATCH 05/12] Oops Missing DataField Missing RSI field --- Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs | 1 + Resources/Textures/Objects/Misc/coins.rsi/meta.json | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs b/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs index 5a0877965970f..fa0c1bd8adba1 100644 --- a/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs +++ b/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs @@ -46,5 +46,6 @@ public sealed partial class CargoAccountPrototype : IPrototype /// /// Whether the account is Independently operated, and so should not appear within the funding allocation console /// + [DataField] public bool Independent = false; } diff --git a/Resources/Textures/Objects/Misc/coins.rsi/meta.json b/Resources/Textures/Objects/Misc/coins.rsi/meta.json index f433aec04fcc7..be4aba77a8f7e 100644 --- a/Resources/Textures/Objects/Misc/coins.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/coins.rsi/meta.json @@ -31,6 +31,9 @@ { "name": "coin_salv_1000" }, + { + "name": "coin_salv_5000" + }, { "name": "coin_salv_10000" }, From 6d93da1a199519d813fa0b5d2ba94b0bf3f650c0 Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Feb 2026 02:53:15 +0000 Subject: [PATCH 06/12] The Evil and Malicious Typo Testing code before pushing it? Damn why would I do that? It's just a 2-line quick and simple update made at half 2 in the morning after all. There's no way you could mess that up. Like who'd ever do that. Nobody. Nope. Alternative PR Name: Ice that t --- .../Prototypes/Entities/Objects/Specific/Salvage/ticket.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml b/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml index bf22ec67ad26f..7d7693271dc18 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml @@ -15,7 +15,7 @@ - coin_salv - coin_salv_100 - coin_salv_1000 - - coint_salv_5000 + - coin_salv_5000 - coin_salv_10000 - coin_salv_25000 layerFunction: Threshold From ace3fa228628372b9eadcde0513a4f4f45881685 Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Feb 2026 03:11:58 +0000 Subject: [PATCH 07/12] PKA Arbitrage Made them worth less --- Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml b/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml index e06597c0fab24..01c30f5078eb4 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml @@ -11,7 +11,7 @@ size: Small - type: GunUpgrade - type: StaticPrice - price: 750 + price: 300 - type: Tag tags: - PKAUpgrade From 9ef042cf0ad52dcc0d35b9f02195d84586b4facb Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Feb 2026 04:26:50 +0000 Subject: [PATCH 08/12] More nitpicks You only need one stack of steel to make the shuttle Less memey description --- Resources/Prototypes/Catalog/Fills/Crates/salvage.yml | 3 +-- Resources/Prototypes/Entities/Structures/Machines/lathe.yml | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml index b9aab4eb75e67..9140c9c1bd3fd 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml @@ -210,7 +210,7 @@ id: CratePKAUpgrades parent: CrateScience name: PKA upgrade kit crate - description: Contains 1 of each PKA upgrade. For use when the science department doesn't research armory technology again. + description: Contains 1 of each PKA upgrade. An alternative for when the Science Department is understaffed. components: - type: StorageFill contents: @@ -237,7 +237,6 @@ - id: ShuttleConsoleCircuitboard - id: CableApcStack - id: SheetSteel - amount: 2 - type: entity parent: CrateGenericSteel diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index a4e2ed1069cdb..37377c46c4535 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -605,9 +605,6 @@ - OreSmelting - RGlassSmelting - type: TicketPrinter - whitelist: - tags: - - SalvageScrap - type: entity parent: OreProcessor From 3830cf93ebcafa70460862dc1719b016393c37a1 Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Feb 2026 14:25:11 +0000 Subject: [PATCH 09/12] Updates based on comments Container Fills Proper Parenting --- .../Catalog/Fills/Crates/salvage.yml | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml index 9140c9c1bd3fd..1e7f0435eead8 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml @@ -136,7 +136,6 @@ containers: entity_storage: id: WeaponCrusher - amount: 1 - type: entity parent: CrateGenericSteel @@ -207,36 +206,40 @@ id: ClothingNeckCloakSalvagerSupreme - type: entity - id: CratePKAUpgrades parent: CrateScience + id: CratePKAUpgrades name: PKA upgrade kit crate description: Contains 1 of each PKA upgrade. An alternative for when the Science Department is understaffed. components: - - type: StorageFill - contents: - - id: PKAUpgradeDamage - - id: PKAUpgradeRange - - id: PKAUpgradeFireRate + - type: EntityTableContainerFill + containers: + entity_storage: !type:AllSelector + children: + - id: PKAUpgradeDamage + - id: PKAUpgradeRange + - id: PKAUpgradeFireRate - type: entity - id: CrateShuttleBuild parent: CrateEngineering + id: CrateShuttleBuild name: shuttle construction crate description: Contains the bare essentials to create a questionably functional shuttle. Tools sold seperately, fuel not included. Nanotrasen is not responsible for any space collisions caused as a result of a sudden loss of power. components: - - type: StorageFill - contents: - - id: DrinkBeerCan # essential for drunk driving and welding fuel storage - amount: 2 - - id: ThrusterFlatpack - amount: 4 - - id: GyroscopeFlatpack - - id: PortableGeneratorJrPacmanFlatpack #total power draw 7.5kW, can provide 8kW. - - id: SheetGlass10 - - id: ShuttleConsoleCircuitboard - - id: CableApcStack - - id: SheetSteel + - type: EntityTableContainerFill + containers: + entity_storage: !type:AllSelector + children: + - id: DrinkBeerCan # essential for drunk driving and welding fuel storage + amount: 2 + - id: ThrusterFlatpack + amount: 4 + - id: GyroscopeFlatpack + - id: PortableGeneratorJrPacmanFlatpack #total power draw 7.5kW, can provide 8kW. + - id: SheetGlass10 + - id: ShuttleConsoleCircuitboard + - id: CableApcStack + - id: SheetSteel - type: entity parent: CrateGenericSteel From 765db454ebf58d70db02366fe04fc04883b57033 Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Sun, 1 Mar 2026 14:26:17 +0000 Subject: [PATCH 10/12] updates based on comments --- Content.Server/TicketPrinter/TicketPrinterSystem.cs | 2 +- .../TicketPrinter/SharedTicketPrinterSystem.cs | 7 +++---- .../Entities/Structures/Storage/Crates/crates.yml | 12 ++++++------ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Content.Server/TicketPrinter/TicketPrinterSystem.cs b/Content.Server/TicketPrinter/TicketPrinterSystem.cs index 46d8e11abf558..fc7813a1401c8 100644 --- a/Content.Server/TicketPrinter/TicketPrinterSystem.cs +++ b/Content.Server/TicketPrinter/TicketPrinterSystem.cs @@ -1,6 +1,6 @@ +using Content.Server.Stack; using Content.Shared.TicketPrinter; using Robust.Shared.Prototypes; -using Content.Server.Stack; namespace Content.Server.TicketPrinter; diff --git a/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs b/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs index ca28ba15b856d..a257a19588147 100644 --- a/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs +++ b/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs @@ -1,9 +1,8 @@ using Content.Shared.Lathe; -using Content.Shared.Stacks; using Content.Shared.Materials; +using Content.Shared.Stacks; using Content.Shared.Whitelist; using Robust.Shared.Prototypes; -using Robust.Shared.GameObjects; namespace Content.Shared.TicketPrinter; @@ -49,7 +48,7 @@ private void OnReclaimed(Entity ent, ref ReclaimFinished if (_whitelistSystem.IsWhitelistFail(ent.Comp.Whitelist, args.Item)) //plenty of things are reclaimable but only some salvagable, should only give tickets for salvage scrap. return; - if (!TryComp(args.Item, out var physComp)) + if (!TryComp(args.Item, out var physComp)) //if we have no physical composition, this item was never reclaimable in the first place return; foreach (var (material, amount) in physComp.MaterialComposition) //for each material making up the reclaimed item's physical composition @@ -62,7 +61,7 @@ private void OnReclaimed(Entity ent, ref ReclaimFinished !entProto.TryGetComponent(out var matphysComp, EntityManager.ComponentFactory)) //use that to get TicketValue and PhysicalComposition Components continue; //theoretically an entity may have some materials that do and some materials that don't have ticket values so we have to check them all. - PrintTickets(ent, ticketComp.TicketValue * amount / matphysComp.MaterialComposition[materialProto.ID]); + PrintTickets(ent, ticketComp.TicketValue * amount / matphysComp.MaterialComposition[materialProto.ID]); //ticket value multiplied by amount of material divided by amount of material per sheet } } diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index b58e4e19eaa62..71ffeb9f59b6b 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -289,12 +289,12 @@ id: CrateCargoSecure name: secure cargo crate components: - - type: Icon - sprite: Structures/Storage/Crates/secure.rsi - - type: Sprite - sprite: Structures/Storage/Crates/secure.rsi - - type: AccessReader - access: [["Cargo"]] + - type: Icon + sprite: Structures/Storage/Crates/secure.rsi + - type: Sprite + sprite: Structures/Storage/Crates/secure.rsi + - type: AccessReader + access: [["Cargo"]] - type: entity parent: CrateBaseSecure From 7421880f512fbc777e454dee6c35ecf6b122e7c1 Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Mon, 2 Mar 2026 21:33:27 +0000 Subject: [PATCH 11/12] H --- Resources/Prototypes/Catalog/Fills/Crates/salvage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml index 30f0ff44ba87a..b322c5ef5b877 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml @@ -13,7 +13,7 @@ - id: OxygenTankFilled - id: NitrogenTankFilled - id: MiningDrill - - id: HandheldMassScanner + - id: HandHeldMassScanner - id: OreBag - id: ClothingBeltSalvageWebbing From c67a87f513b884133fe80a391d3505d906d1e84a Mon Sep 17 00:00:00 2001 From: MNX <56132549+Mehnix@users.noreply.github.com> Date: Mon, 2 Mar 2026 23:45:29 +0000 Subject: [PATCH 12/12] gamble test fail prevention maybe --- Content.IntegrationTests/Tests/CargoTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.IntegrationTests/Tests/CargoTest.cs b/Content.IntegrationTests/Tests/CargoTest.cs index df85e61550ad8..23d80d6c6b652 100644 --- a/Content.IntegrationTests/Tests/CargoTest.cs +++ b/Content.IntegrationTests/Tests/CargoTest.cs @@ -22,7 +22,8 @@ public sealed class CargoTest private static readonly HashSet> Ignored = [ // This is ignored because it is explicitly intended to be able to sell for more than it costs. - new("FunCrateGambling") + new("FunCrateGambling"), + new("SalvFunCrateGambling") ]; [Test]