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.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] 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.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..fc7813a1401c8 --- /dev/null +++ b/Content.Server/TicketPrinter/TicketPrinterSystem.cs @@ -0,0 +1,38 @@ +using Content.Server.Stack; +using Content.Shared.TicketPrinter; +using Robust.Shared.Prototypes; + +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/Cargo/Components/CargoOrderConsoleComponent.cs b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs index 1d3aa6fc9e3a4..3e780f67ed243 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"; @@ -81,9 +81,6 @@ public sealed partial class CargoOrderConsoleComponent : Component public List> AllowedGroups = new() { "market", - "SalvageJobReward2", - "SalvageJobReward3", - "SalvageJobRewardMAX", }; /// diff --git a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs index 944f03cd72aae..c687bcd8ed17a 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", 1000 }, }; /// @@ -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..fa0c1bd8adba1 100644 --- a/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs +++ b/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs @@ -42,4 +42,10 @@ 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 + /// + [DataField] + public bool Independent = false; } 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..a257a19588147 --- /dev/null +++ b/Content.Shared/TicketPrinter/SharedTicketPrinterSystem.cs @@ -0,0 +1,78 @@ +using Content.Shared.Lathe; +using Content.Shared.Materials; +using Content.Shared.Stacks; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +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)) //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 + { + 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]); //ticket value multiplied by amount of material divided by amount of material per sheet + } + } + + /// + /// 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/Locale/en-US/cargo/bounties.ftl b/Resources/Locale/en-US/cargo/bounties.ftl index 91669be403f68..47c2012da2579 100644 --- a/Resources/Locale/en-US/cargo/bounties.ftl +++ b/Resources/Locale/en-US/cargo/bounties.ftl @@ -73,8 +73,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. @@ -142,3 +143,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/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/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/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/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/Locale/en-US/stack/stacks.ftl b/Resources/Locale/en-US/stack/stacks.ftl index 857feb2779806..c14a2bd3fbe65 100644 --- a/Resources/Locale/en-US/stack/stacks.ftl +++ b/Resources/Locale/en-US/stack/stacks.ftl @@ -85,6 +85,11 @@ stack-xenoborg-circuit = dvanced xenoborg {$amount -> *[other] circuitboards } +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/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 091d44cb7f816..e358c07cbf73a 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -734,3 +734,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 e1fd3de738f73..b777d81e3eade 100644 --- a/Resources/Prototypes/Catalog/Cargo/markets.yml +++ b/Resources/Prototypes/Catalog/Cargo/markets.yml @@ -2,10 +2,4 @@ id: market - type: cargoMarket - id: SalvageJobReward2 - -- type: cargoMarket - id: SalvageJobReward3 - -- type: cargoMarket - id: SalvageJobRewardMAX + 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/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/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml index 8e97d530c5cca..b322c5ef5b877 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: NitrogenTankFilled + - id: MiningDrill - id: HandHeldMassScanner - - id: Pickaxe - - id: Welder - - id: Wrench - - id: Screwdriver - - id: Crowbar - - id: Wirecutter - - id: ClothingBeltUtility - 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. @@ -123,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: @@ -135,22 +127,21 @@ 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 - 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,36 +149,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 explorers. components: - type: EntityTableContainerFill containers: entity_storage: id: JetpackVoidFilled + amount: 2 - type: entity - parent: CrateGenericSteel + parent: CrateCargoSecure id: CrateSalvageHardsuit name: mining hardsuit crate - description: Contains a mining hardsuit, breath mask, and one tank of both oxygen and nitrogen. + description: Contains a spationaut 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: ClothingOuterHardsuitSpatio + - 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. @@ -198,7 +195,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. @@ -208,6 +205,42 @@ entity_storage: id: ClothingNeckCloakSalvagerSupreme +- type: entity + 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: EntityTableContainerFill + containers: + entity_storage: !type:AllSelector + children: + - id: PKAUpgradeDamage + - id: PKAUpgradeRange + - id: PKAUpgradeFireRate + +- type: entity + 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: 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 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 e4b329ef70c1f..817f5ac731950 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml @@ -267,6 +267,18 @@ - 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: GuideHelp + guides: + - Power + - type: entity parent: [ BaseFlatpack, BaseSyndicateContraband ] id: SyndicateMicrowaveFlatpack 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..7d7693271dc18 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Salvage/ticket.yml @@ -0,0 +1,98 @@ +- 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_5000 + - coin_salv_10000 + - coin_salv_25000 + layerFunction: Threshold + - type: StackLayerThreshold + thresholds: [10, 100, 1000, 5000, 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: SalvageTicket5000 + suffix: 5000 + components: + - type: Stack + count: 5000 + +- 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/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 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/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/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 96e30a5aa7692..2800b72292e67 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -1779,3 +1779,56 @@ 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. + 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/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 31fef56da674c..ffee3fd9f297a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -610,6 +610,7 @@ staticPacks: - OreSmelting - RGlassSmelting + - type: TicketPrinter - 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/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index c622ad8961d8b..71ffeb9f59b6b 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 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/Textures/Objects/Misc/coins.rsi/coin_salv.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv.png new file mode 100644 index 0000000000000..4df6e7e1d8e1f Binary files /dev/null and b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv.png differ diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_100.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_100.png new file mode 100644 index 0000000000000..ba3b9b0cbeb9f Binary files /dev/null and b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_100.png differ diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_1000.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_1000.png new file mode 100644 index 0000000000000..7f43ffa05028b Binary files /dev/null and b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_1000.png differ diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_10000.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_10000.png new file mode 100644 index 0000000000000..8c8a7d1e926af Binary files /dev/null and b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_10000.png differ 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 0000000000000..307225f81cde3 Binary files /dev/null and b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_25000.png differ diff --git a/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_5000.png b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_5000.png new file mode 100644 index 0000000000000..423f5f2568dc3 Binary files /dev/null and b/Resources/Textures/Objects/Misc/coins.rsi/coin_salv_5000.png differ diff --git a/Resources/Textures/Objects/Misc/coins.rsi/meta.json b/Resources/Textures/Objects/Misc/coins.rsi/meta.json index ac06e96730671..be4aba77a8f7e 100644 --- a/Resources/Textures/Objects/Misc/coins.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/coins.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/15121b534f4ef10339d96412e22fe3ce4d15a45d/icons/obj/coins.dmi", + "copyright": "Taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/15121b534f4ef10339d96412e22fe3ce4d15a45d/icons/obj/coins.dmi, modified by Mehnix for salvage coins", "size": { "x": 32, "y": 32 @@ -21,6 +21,24 @@ }, { "name": "coin_adamantine" + }, + { + "name": "coin_salv" + }, + { + "name": "coin_salv_100" + }, + { + "name": "coin_salv_1000" + }, + { + "name": "coin_salv_5000" + }, + { + "name": "coin_salv_10000" + }, + { + "name": "coin_salv_25000" } ] -} \ No newline at end of file +} diff --git a/Resources/migration.yml b/Resources/migration.yml index 71959fec08dff..9f7020a3e6cf5 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -804,3 +804,13 @@ TowelColorYellow: null TowelColorMaroon: null TowelColorSilver: null TowelColorMime: null + +# 2026-02-11 +MobDwarf: MobHuman +OrganDwarfHeart: OrganHumanHeart +OrganDwarfStomach: OrganHumanStomach +OrganDwarfLiver: OrganHumanLiver + +# 2026-02-27 +SalvageJobBoardComputerCircuitboard: CargoRequestSalvageComputerCircuitboard +ComputerSalvageJobBoard: ComputerCargoOrdersSalvage