SS14-12462 Nerf food and drink vending machines (#25999)

* SS14-17183 Nerf vending machines

Vending machines provide too much food
(and drink) at the moment to the crew,
robbing the chef/bartender of a reason
to exist, and robbing the janitor of a reason
to want to refil vending machines early in
the round.

This PR adds a new "initialStockQuality" field
to vending machines and sets it at 0.33 for almost all
food and drink vendors. The intent at the moment
is to drop food and drink vending machine stocks
by somewhere around a half - two thirds of the time,
about two-thirds of the stock of a given item will be
missing.

This number can be tuned to discourage people relying
on vending machines and make round start
a bit more variable when hunting noms.

* Add comment to InitialStockQuality.

* Update Content.Shared/VendingMachines/VendingMachineComponent.cs

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
This commit is contained in:
Hannah Giovanna Dawson
2024-03-15 23:28:00 +00:00
committed by GitHub
parent 4aa72af574
commit 41093ab03c
3 changed files with 39 additions and 9 deletions

View File

@@ -7,6 +7,7 @@ using Content.Shared.Popups;
using Robust.Shared.Audio; using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems; using Robust.Shared.Audio.Systems;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.Shared.Random;
namespace Content.Shared.VendingMachines; namespace Content.Shared.VendingMachines;
@@ -17,6 +18,7 @@ public abstract partial class SharedVendingMachineSystem : EntitySystem
[Dependency] protected readonly SharedAudioSystem Audio = default!; [Dependency] protected readonly SharedAudioSystem Audio = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!;
[Dependency] protected readonly IRobustRandom Randomizer = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -27,11 +29,11 @@ public abstract partial class SharedVendingMachineSystem : EntitySystem
protected virtual void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args) protected virtual void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args)
{ {
RestockInventoryFromPrototype(uid, component); RestockInventoryFromPrototype(uid, component, component.InitialStockQuality);
} }
public void RestockInventoryFromPrototype(EntityUid uid, public void RestockInventoryFromPrototype(EntityUid uid,
VendingMachineComponent? component = null) VendingMachineComponent? component = null, float restockQuality = 1f)
{ {
if (!Resolve(uid, ref component)) if (!Resolve(uid, ref component))
{ {
@@ -41,9 +43,9 @@ public abstract partial class SharedVendingMachineSystem : EntitySystem
if (!PrototypeManager.TryIndex(component.PackPrototypeId, out VendingMachineInventoryPrototype? packPrototype)) if (!PrototypeManager.TryIndex(component.PackPrototypeId, out VendingMachineInventoryPrototype? packPrototype))
return; return;
AddInventoryFromPrototype(uid, packPrototype.StartingInventory, InventoryType.Regular, component); AddInventoryFromPrototype(uid, packPrototype.StartingInventory, InventoryType.Regular, component, restockQuality);
AddInventoryFromPrototype(uid, packPrototype.EmaggedInventory, InventoryType.Emagged, component); AddInventoryFromPrototype(uid, packPrototype.EmaggedInventory, InventoryType.Emagged, component, restockQuality);
AddInventoryFromPrototype(uid, packPrototype.ContrabandInventory, InventoryType.Contraband, component); AddInventoryFromPrototype(uid, packPrototype.ContrabandInventory, InventoryType.Contraband, component, restockQuality);
} }
/// <summary> /// <summary>
@@ -80,7 +82,7 @@ public abstract partial class SharedVendingMachineSystem : EntitySystem
private void AddInventoryFromPrototype(EntityUid uid, Dictionary<string, uint>? entries, private void AddInventoryFromPrototype(EntityUid uid, Dictionary<string, uint>? entries,
InventoryType type, InventoryType type,
VendingMachineComponent? component = null) VendingMachineComponent? component = null, float restockQuality = 1.0f)
{ {
if (!Resolve(uid, ref component) || entries == null) if (!Resolve(uid, ref component) || entries == null)
{ {
@@ -107,6 +109,15 @@ public abstract partial class SharedVendingMachineSystem : EntitySystem
{ {
if (PrototypeManager.HasIndex<EntityPrototype>(id)) if (PrototypeManager.HasIndex<EntityPrototype>(id))
{ {
var restock = amount;
var chanceOfMissingStock = 1 - restockQuality;
var result = Randomizer.NextFloat(0, 1);
if (result < chanceOfMissingStock)
{
restock = (uint) Math.Floor(amount * result / chanceOfMissingStock);
}
if (inventory.TryGetValue(id, out var entry)) if (inventory.TryGetValue(id, out var entry))
// Prevent a machine's stock from going over three times // Prevent a machine's stock from going over three times
// the prototype's normal amount. This is an arbitrary // the prototype's normal amount. This is an arbitrary
@@ -114,9 +125,9 @@ public abstract partial class SharedVendingMachineSystem : EntitySystem
// restocking a machine who doesn't want to force vend out // restocking a machine who doesn't want to force vend out
// all the items just to restock one empty slot without // all the items just to restock one empty slot without
// losing the rest of the restock. // losing the rest of the restock.
entry.Amount = Math.Min(entry.Amount + amount, 3 * amount); entry.Amount = Math.Min(entry.Amount + amount, 3 * restock);
else else
inventory.Add(id, new VendingMachineInventoryEntry(type, id, amount)); inventory.Add(id, new VendingMachineInventoryEntry(type, id, restock));
} }
} }
} }

View File

@@ -123,6 +123,14 @@ namespace Content.Shared.VendingMachines
public float DenyAccumulator = 0f; public float DenyAccumulator = 0f;
public float DispenseOnHitAccumulator = 0f; public float DispenseOnHitAccumulator = 0f;
/// <summary>
/// The quality of the stock in the vending machine on spawn.
/// Represents the percentage chance (0.0f = 0%, 1.0f = 100%) each set of items in the machine is fully-stocked.
/// If not fully stocked, the stock will have a random value between 0 (inclusive) and max stock (exclusive).
/// </summary>
[DataField]
public float InitialStockQuality = 1.0f;
/// <summary> /// <summary>
/// While disabled by EMP it randomly ejects items /// While disabled by EMP it randomly ejects items
/// </summary> /// </summary>

View File

@@ -359,6 +359,7 @@
screenState: screen screenState: screen
ejectDelay: 5 ejectDelay: 5
soundVend: /Audio/Machines/machine_vend_hot_drink.ogg soundVend: /Audio/Machines/machine_vend_hot_drink.ogg
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: HotDrinksMachineAds pack: HotDrinksMachineAds
- type: Speech - type: Speech
@@ -396,6 +397,7 @@
ejectState: eject-unshaded ejectState: eject-unshaded
denyState: deny-unshaded denyState: deny-unshaded
ejectDelay: 1.9 ejectDelay: 1.9
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: RobustSoftdrinksAds pack: RobustSoftdrinksAds
- type: Speech - type: Speech
@@ -539,6 +541,7 @@
ejectState: eject-unshaded ejectState: eject-unshaded
denyState: deny-unshaded denyState: deny-unshaded
ejectDelay: 1.9 ejectDelay: 1.9
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: RobustSoftdrinksAds pack: RobustSoftdrinksAds
- type: Speech - type: Speech
@@ -573,6 +576,7 @@
ejectState: eject-unshaded ejectState: eject-unshaded
denyState: deny-unshaded denyState: deny-unshaded
ejectDelay: 1.9 ejectDelay: 1.9
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: RobustSoftdrinksAds pack: RobustSoftdrinksAds
- type: Speech - type: Speech
@@ -607,6 +611,7 @@
ejectState: eject-unshaded ejectState: eject-unshaded
denyState: deny-unshaded denyState: deny-unshaded
ejectDelay: 1.9 ejectDelay: 1.9
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: RobustSoftdrinksAds pack: RobustSoftdrinksAds
- type: Speech - type: Speech
@@ -697,6 +702,7 @@
offState: off offState: off
brokenState: broken brokenState: broken
normalState: normal-unshaded normalState: normal-unshaded
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: DiscountDansAds pack: DiscountDansAds
- type: Speech - type: Speech
@@ -902,6 +908,7 @@
normalState: normal-unshaded normalState: normal-unshaded
ejectState: eject-unshaded ejectState: eject-unshaded
denyState: deny-unshaded denyState: deny-unshaded
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: GetmoreChocolateCorpAds pack: GetmoreChocolateCorpAds
- type: Speech - type: Speech
@@ -1045,6 +1052,7 @@
normalState: normal-unshaded normalState: normal-unshaded
ejectState: eject-unshaded ejectState: eject-unshaded
denyState: deny-unshaded denyState: deny-unshaded
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: BodaAds pack: BodaAds
- type: Speech - type: Speech
@@ -1236,6 +1244,7 @@
offState: off offState: off
brokenState: broken brokenState: broken
normalState: normal-unshaded normalState: normal-unshaded
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: ChangAds pack: ChangAds
- type: Speech - type: Speech
@@ -1258,7 +1267,7 @@
parent: VendingMachine parent: VendingMachine
id: VendingMachineSalvage id: VendingMachineSalvage
name: Salvage Vendor name: Salvage Vendor
description: A dwarves best friend! description: A dwarf's best friend!
components: components:
- type: VendingMachine - type: VendingMachine
pack: SalvageEquipmentInventory pack: SalvageEquipmentInventory
@@ -1299,6 +1308,7 @@
offState: off offState: off
brokenState: broken brokenState: broken
normalState: normal-unshaded normalState: normal-unshaded
initialStockQuality: 0.33
- type: Advertise - type: Advertise
pack: DonutAds pack: DonutAds
- type: Speech - type: Speech
@@ -1911,6 +1921,7 @@
denyState: deny-unshaded denyState: deny-unshaded
ejectDelay: 1.9 ejectDelay: 1.9
soundVend: /Audio/Items/bikehorn.ogg soundVend: /Audio/Items/bikehorn.ogg
initialStockQuality: 1.0 # Nobody knows how Honk does it, but their vending machines always seem well-stocked...
- type: Sprite - type: Sprite
sprite: Structures/Machines/VendingMachines/happyhonk.rsi sprite: Structures/Machines/VendingMachines/happyhonk.rsi
layers: layers: