Separate "thank you" messages from general ads (#25867)

* Separated "thank you" messages from general ads

* Moved MessagePackPrototype to shared, cleaned up AdvertiseComponent, and actually killed AdvertisementsPackPrototype.
+More suggests changes.

* Rename PackPrototypeID to Pack in both components.
This commit is contained in:
Tayrtahn
2024-03-28 02:46:26 -04:00
committed by GitHub
parent 29f34d8423
commit 794a447bb7
72 changed files with 603 additions and 470 deletions

View File

@@ -106,7 +106,6 @@ namespace Content.Client.Entry
_prototypeManager.RegisterIgnore("gameMap");
_prototypeManager.RegisterIgnore("gameMapPool");
_prototypeManager.RegisterIgnore("lobbyBackground");
_prototypeManager.RegisterIgnore("advertisementsPack");
_prototypeManager.RegisterIgnore("gamePreset");
_prototypeManager.RegisterIgnore("noiseChannel");
_prototypeManager.RegisterIgnore("spaceBiome");

View File

@@ -1,42 +0,0 @@
using Content.Server.Advertisements;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Advertise
{
[RegisterComponent, Access(typeof(AdvertiseSystem))]
public sealed partial class AdvertiseComponent : Component
{
/// <summary>
/// Minimum time in seconds to wait before saying a new ad, in seconds. Has to be larger than or equal to 1.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("minWait")]
public int MinimumWait { get; private set; } = 8 * 60;
/// <summary>
/// Maximum time in seconds to wait before saying a new ad, in seconds. Has to be larger than or equal
/// to <see cref="MinimumWait"/>
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("maxWait")]
public int MaximumWait { get; private set; } = 10 * 60;
/// <summary>
/// The identifier for the advertisements pack prototype.
/// </summary>
[DataField("pack", customTypeSerializer:typeof(PrototypeIdSerializer<AdvertisementsPackPrototype>), required: true)]
public string PackPrototypeId { get; private set; } = string.Empty;
/// <summary>
/// The next time an advertisement will be said.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan NextAdvertisementTime { get; set; } = TimeSpan.Zero;
/// <summary>
/// Whether the entity will say advertisements or not.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public bool Enabled { get; set; } = true;
}
}

View File

@@ -1,154 +0,0 @@
using Content.Server.Advertisements;
using Content.Server.Chat.Systems;
using Content.Server.Power.Components;
using Content.Shared.VendingMachines;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
namespace Content.Server.Advertise
{
public sealed class AdvertiseSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly ChatSystem _chat = default!;
/// <summary>
/// The maximum amount of time between checking if advertisements should be displayed
/// </summary>
private readonly TimeSpan _maximumNextCheckDuration = TimeSpan.FromSeconds(15);
/// <summary>
/// The next time the game will check if advertisements should be displayed
/// </summary>
private TimeSpan _nextCheckTime = TimeSpan.MaxValue;
public override void Initialize()
{
SubscribeLocalEvent<AdvertiseComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<AdvertiseComponent, PowerChangedEvent>(OnPowerChanged);
SubscribeLocalEvent<ApcPowerReceiverComponent, AdvertiseEnableChangeAttemptEvent>(OnPowerReceiverEnableChangeAttempt);
SubscribeLocalEvent<VendingMachineComponent, AdvertiseEnableChangeAttemptEvent>(OnVendingEnableChangeAttempt);
// The component inits will lower this.
_nextCheckTime = TimeSpan.MaxValue;
}
private void OnComponentInit(EntityUid uid, AdvertiseComponent advertise, ComponentInit args)
{
RefreshTimer(uid, advertise);
}
private void OnPowerChanged(EntityUid uid, AdvertiseComponent advertise, ref PowerChangedEvent args)
{
SetEnabled(uid, args.Powered, advertise);
}
public void RefreshTimer(EntityUid uid, AdvertiseComponent? advertise = null)
{
if (!Resolve(uid, ref advertise))
return;
if (!advertise.Enabled)
return;
var minDuration = Math.Max(1, advertise.MinimumWait);
var maxDuration = Math.Max(minDuration, advertise.MaximumWait);
var waitDuration = TimeSpan.FromSeconds(_random.Next(minDuration, maxDuration));
var nextTime = _gameTiming.CurTime + waitDuration;
advertise.NextAdvertisementTime = nextTime;
_nextCheckTime = MathHelper.Min(nextTime, _nextCheckTime);
}
public void SayAdvertisement(EntityUid uid, AdvertiseComponent? advertise = null)
{
if (!Resolve(uid, ref advertise))
return;
if (_prototypeManager.TryIndex(advertise.PackPrototypeId, out AdvertisementsPackPrototype? advertisements))
_chat.TrySendInGameICMessage(uid, Loc.GetString(_random.Pick(advertisements.Advertisements)), InGameICChatType.Speak, true);
}
public void SayThankYou(EntityUid uid, AdvertiseComponent? advertise = null)
{
if (!Resolve(uid, ref advertise))
return;
if (_prototypeManager.TryIndex(advertise.PackPrototypeId, out AdvertisementsPackPrototype? advertisements))
{
_chat.TrySendInGameICMessage(uid, Loc.GetString(_random.Pick(advertisements.ThankYous), ("name", Name(uid))), InGameICChatType.Speak, true);
}
}
public void SetEnabled(EntityUid uid, bool enable, AdvertiseComponent? advertise = null)
{
if (!Resolve(uid, ref advertise))
return;
if (advertise.Enabled == enable)
return;
var attemptEvent = new AdvertiseEnableChangeAttemptEvent(enable);
RaiseLocalEvent(uid, attemptEvent);
if (attemptEvent.Cancelled)
return;
advertise.Enabled = enable;
RefreshTimer(uid, advertise);
}
private static void OnPowerReceiverEnableChangeAttempt(EntityUid uid, ApcPowerReceiverComponent component, AdvertiseEnableChangeAttemptEvent args)
{
if(args.Enabling && !component.Powered)
args.Cancel();
}
private static void OnVendingEnableChangeAttempt(EntityUid uid, VendingMachineComponent component, AdvertiseEnableChangeAttemptEvent args)
{
if(args.Enabling && component.Broken)
args.Cancel();
}
public override void Update(float frameTime)
{
var curTime = _gameTiming.CurTime;
if (_nextCheckTime > curTime)
return;
_nextCheckTime = curTime + _maximumNextCheckDuration;
var query = EntityQueryEnumerator<AdvertiseComponent>();
while (query.MoveNext(out var uid, out var advert))
{
if (!advert.Enabled)
continue;
// If this isn't advertising yet
if (advert.NextAdvertisementTime > curTime)
{
_nextCheckTime = MathHelper.Min(advert.NextAdvertisementTime, _nextCheckTime);
continue;
}
SayAdvertisement(uid, advert);
RefreshTimer(uid, advert);
}
}
}
public sealed class AdvertiseEnableChangeAttemptEvent : CancellableEntityEventArgs
{
public bool Enabling { get; }
public AdvertiseEnableChangeAttemptEvent(bool enabling)
{
Enabling = enabling;
}
}
}

View File

@@ -0,0 +1,45 @@
using Content.Server.Advertise.EntitySystems;
using Content.Shared.Advertise;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Advertise.Components;
/// <summary>
/// Makes this entity periodically advertise by speaking a randomly selected
/// message from a specified MessagePack into local chat.
/// </summary>
[RegisterComponent, Access(typeof(AdvertiseSystem))]
public sealed partial class AdvertiseComponent : Component
{
/// <summary>
/// Minimum time in seconds to wait before saying a new ad, in seconds. Has to be larger than or equal to 1.
/// </summary>
[DataField]
public int MinimumWait { get; private set; } = 8 * 60;
/// <summary>
/// Maximum time in seconds to wait before saying a new ad, in seconds. Has to be larger than or equal
/// to <see cref="MinimumWait"/>
/// </summary>
[DataField]
public int MaximumWait { get; private set; } = 10 * 60;
/// <summary>
/// The identifier for the advertisements pack prototype.
/// </summary>
[DataField(required: true)]
public ProtoId<MessagePackPrototype> Pack { get; private set; }
/// <summary>
/// The next time an advertisement will be said.
/// </summary>
[DataField]
public TimeSpan NextAdvertisementTime { get; set; } = TimeSpan.Zero;
/// <summary>
/// Whether the entity will say advertisements or not.
/// </summary>
[DataField]
public bool Enabled { get; set; } = true;
}

View File

@@ -0,0 +1,36 @@
using Content.Shared.Advertise;
using Robust.Shared.Prototypes;
namespace Content.Server.Advertise.Components;
/// <summary>
/// Causes the entity to speak using the Chat system when its ActivatableUI is closed, optionally
/// requiring that a Flag be set as well.
/// </summary>
[RegisterComponent, Access(typeof(SpeakOnUIClosedSystem))]
public sealed partial class SpeakOnUIClosedComponent : Component
{
/// <summary>
/// The identifier for the message pack prototype containing messages to be spoken by this entity.
/// </summary>
[DataField(required: true)]
public ProtoId<MessagePackPrototype> Pack { get; private set; }
/// <summary>
/// Is this component active? If false, no messages will be spoken.
/// </summary>
[DataField]
public bool Enabled = true;
/// <summary>
/// Should messages be spoken only if the <see cref="Flag"/> is set (true), or every time the UI is closed (false)?
/// </summary>
[DataField]
public bool RequireFlag = true;
/// <summary>
/// State variable only used if <see cref="RequireFlag"/> is true. Set with <see cref="SpeakOnUIClosedSystem.TrySetFlag"/>.
/// </summary>
[DataField]
public bool Flag;
}

View File

@@ -0,0 +1,137 @@
using Content.Server.Advertise.Components;
using Content.Server.Chat.Systems;
using Content.Server.Power.Components;
using Content.Shared.VendingMachines;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
namespace Content.Server.Advertise.EntitySystems;
public sealed class AdvertiseSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly ChatSystem _chat = default!;
/// <summary>
/// The maximum amount of time between checking if advertisements should be displayed
/// </summary>
private readonly TimeSpan _maximumNextCheckDuration = TimeSpan.FromSeconds(15);
/// <summary>
/// The next time the game will check if advertisements should be displayed
/// </summary>
private TimeSpan _nextCheckTime = TimeSpan.MaxValue;
public override void Initialize()
{
SubscribeLocalEvent<AdvertiseComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<AdvertiseComponent, PowerChangedEvent>(OnPowerChanged);
SubscribeLocalEvent<ApcPowerReceiverComponent, AdvertiseEnableChangeAttemptEvent>(OnPowerReceiverEnableChangeAttempt);
SubscribeLocalEvent<VendingMachineComponent, AdvertiseEnableChangeAttemptEvent>(OnVendingEnableChangeAttempt);
// The component inits will lower this.
_nextCheckTime = TimeSpan.MaxValue;
}
private void OnMapInit(EntityUid uid, AdvertiseComponent advertise, MapInitEvent args)
{
RefreshTimer(uid, advertise);
}
private void OnPowerChanged(EntityUid uid, AdvertiseComponent advertise, ref PowerChangedEvent args)
{
SetEnabled(uid, args.Powered, advertise);
}
public void RefreshTimer(EntityUid uid, AdvertiseComponent? advertise = null)
{
if (!Resolve(uid, ref advertise))
return;
if (!advertise.Enabled)
return;
var minDuration = Math.Max(1, advertise.MinimumWait);
var maxDuration = Math.Max(minDuration, advertise.MaximumWait);
var waitDuration = TimeSpan.FromSeconds(_random.Next(minDuration, maxDuration));
var nextTime = _gameTiming.CurTime + waitDuration;
advertise.NextAdvertisementTime = nextTime;
_nextCheckTime = MathHelper.Min(nextTime, _nextCheckTime);
}
public void SayAdvertisement(EntityUid uid, AdvertiseComponent? advertise = null)
{
if (!Resolve(uid, ref advertise))
return;
if (_prototypeManager.TryIndex(advertise.Pack, out var advertisements))
_chat.TrySendInGameICMessage(uid, Loc.GetString(_random.Pick(advertisements.Messages)), InGameICChatType.Speak, hideChat: true);
}
public void SetEnabled(EntityUid uid, bool enable, AdvertiseComponent? advertise = null)
{
if (!Resolve(uid, ref advertise))
return;
if (advertise.Enabled == enable)
return;
var attemptEvent = new AdvertiseEnableChangeAttemptEvent(enable);
RaiseLocalEvent(uid, attemptEvent);
if (attemptEvent.Cancelled)
return;
advertise.Enabled = enable;
RefreshTimer(uid, advertise);
}
private static void OnPowerReceiverEnableChangeAttempt(EntityUid uid, ApcPowerReceiverComponent component, AdvertiseEnableChangeAttemptEvent args)
{
if (args.Enabling && !component.Powered)
args.Cancel();
}
private static void OnVendingEnableChangeAttempt(EntityUid uid, VendingMachineComponent component, AdvertiseEnableChangeAttemptEvent args)
{
if (args.Enabling && component.Broken)
args.Cancel();
}
public override void Update(float frameTime)
{
var curTime = _gameTiming.CurTime;
if (_nextCheckTime > curTime)
return;
_nextCheckTime = curTime + _maximumNextCheckDuration;
var query = EntityQueryEnumerator<AdvertiseComponent>();
while (query.MoveNext(out var uid, out var advert))
{
if (!advert.Enabled)
continue;
// If this isn't advertising yet
if (advert.NextAdvertisementTime > curTime)
{
_nextCheckTime = MathHelper.Min(advert.NextAdvertisementTime, _nextCheckTime);
continue;
}
SayAdvertisement(uid, advert);
RefreshTimer(uid, advert);
}
}
}
public sealed class AdvertiseEnableChangeAttemptEvent(bool enabling) : CancellableEntityEventArgs
{
public bool Enabling { get; } = enabling;
}

View File

@@ -0,0 +1,58 @@
using Content.Server.Advertise.Components;
using Content.Server.Chat.Systems;
using Content.Server.UserInterface;
using Content.Shared.Advertise;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server.Advertise;
public sealed partial class SpeakOnUIClosedSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ChatSystem _chat = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SpeakOnUIClosedComponent, BoundUIClosedEvent>(OnBoundUIClosed);
}
private void OnBoundUIClosed(Entity<SpeakOnUIClosedComponent> entity, ref BoundUIClosedEvent args)
{
if (!TryComp(entity, out ActivatableUIComponent? activatable) || !args.UiKey.Equals(activatable.Key))
return;
if (entity.Comp.RequireFlag && !entity.Comp.Flag)
return;
TrySpeak((entity, entity.Comp));
}
public bool TrySpeak(Entity<SpeakOnUIClosedComponent?> entity)
{
if (!Resolve(entity, ref entity.Comp))
return false;
if (!entity.Comp.Enabled)
return false;
if (!_prototypeManager.TryIndex(entity.Comp.Pack, out MessagePackPrototype? messagePack))
return false;
var message = Loc.GetString(_random.Pick(messagePack.Messages), ("name", Name(entity)));
_chat.TrySendInGameICMessage(entity, message, InGameICChatType.Speak, true);
entity.Comp.Flag = false;
return true;
}
public bool TrySetFlag(Entity<SpeakOnUIClosedComponent?> entity, bool value = true)
{
if (!Resolve(entity, ref entity.Comp))
return false;
entity.Comp.Flag = value;
return true;
}
}

View File

@@ -1,18 +0,0 @@
using Robust.Shared.Prototypes;
namespace Content.Server.Advertisements
{
[Serializable, Prototype("advertisementsPack")]
public sealed partial class AdvertisementsPackPrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
[DataField("advertisements")]
public List<string> Advertisements { get; private set; } = new();
[DataField("thankyous")]
public List<string> ThankYous { get; private set; } = new();
}
}

View File

@@ -1,12 +1,11 @@
using System.Linq;
using System.Numerics;
using Content.Server.Advertise;
using Content.Server.Advertise.Components;
using Content.Server.Cargo.Systems;
using Content.Server.Chat.Systems;
using Content.Server.Emp;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.UserInterface;
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
using Content.Shared.Actions;
@@ -25,7 +24,6 @@ using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Server.VendingMachines
{
@@ -39,7 +37,7 @@ namespace Content.Server.VendingMachines
[Dependency] private readonly ThrowingSystem _throwingSystem = default!;
[Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AdvertiseSystem _advertise = default!;
[Dependency] private readonly SpeakOnUIClosedSystem _speakOnUIClosed = default!;
public override void Initialize()
{
@@ -58,7 +56,6 @@ namespace Content.Server.VendingMachines
Subs.BuiEvents<VendingMachineComponent>(VendingMachineUiKey.Key, subs =>
{
subs.Event<BoundUIOpenedEvent>(OnBoundUIOpened);
subs.Event<BoundUIClosedEvent>(OnBoundUIClosed);
subs.Event<VendingMachineEjectMessage>(OnInventoryEjectMessage);
});
@@ -114,16 +111,6 @@ namespace Content.Server.VendingMachines
UpdateVendingMachineInterfaceState(uid, component);
}
private void OnBoundUIClosed(EntityUid uid, VendingMachineComponent component, BoundUIClosedEvent args)
{
// Only vendors that advertise will send message after dispensing
if (component.ShouldSayThankYou && TryComp<AdvertiseComponent>(uid, out var advertise))
{
_advertise.SayThankYou(uid, advertise);
component.ShouldSayThankYou = false;
}
}
private void UpdateVendingMachineInterfaceState(EntityUid uid, VendingMachineComponent component)
{
var state = new VendingMachineInterfaceState(GetAllInventory(uid, component));
@@ -294,7 +281,10 @@ namespace Content.Server.VendingMachines
vendComponent.Ejecting = true;
vendComponent.NextItemToEject = entry.ID;
vendComponent.ThrowNextItem = throwItem;
vendComponent.ShouldSayThankYou = true;
if (TryComp(uid, out SpeakOnUIClosedComponent? speakComponent))
_speakOnUIClosed.TrySetFlag((uid, speakComponent));
entry.Amount--;
UpdateVendingMachineInterfaceState(uid, vendComponent);
TryUpdateVisualState(uid, vendComponent);

View File

@@ -0,0 +1,14 @@
using Robust.Shared.Prototypes;
namespace Content.Shared.Advertise;
[Serializable, Prototype("messagePack")]
public sealed partial class MessagePackPrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
[DataField]
public List<LocId> Messages { get; private set; } = [];
}

View File

@@ -51,8 +51,6 @@ namespace Content.Shared.VendingMachines
public bool Broken;
public bool ShouldSayThankYou;
/// <summary>
/// When true, will forcefully throw any object it dispenses
/// </summary>

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: AmmoVendAds
advertisements:
messages:
- advertisement-ammo-1
- advertisement-ammo-2
- advertisement-ammo-3
@@ -11,5 +11,3 @@
- advertisement-ammo-8
- advertisement-ammo-9
- advertisement-ammo-10
thankyous:
- vending-machine-thanks

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: AtmosDrobeAds
advertisements:
messages:
- advertisement-atmosdrobe-1
- advertisement-atmosdrobe-2
- advertisement-atmosdrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,7 +1,5 @@
- type: advertisementsPack
- type: messagePack
id: BarDrobeAds
advertisements:
messages:
- advertisement-bardrobe-1
- advertisement-bardrobe-2
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: BoozeOMatAds
advertisements:
messages:
- advertisement-boozeomat-1
- advertisement-boozeomat-2
- advertisement-boozeomat-3
@@ -20,8 +20,3 @@
- advertisement-boozeomat-17
- advertisement-boozeomat-18
- advertisement-boozeomat-19
thankyous:
- vending-machine-thanks
- thankyou-boozeomat-1
- thankyou-boozeomat-2
- thankyou-boozeomat-3

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: CargoDrobeAds
advertisements:
messages:
- advertisement-cargodrobe-1
- advertisement-cargodrobe-2
- advertisement-cargodrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,12 +1,8 @@
- type: advertisementsPack
- type: messagePack
id: ChangAds
advertisements:
messages:
- advertisement-chang-1
- advertisement-chang-2
- advertisement-chang-3
- advertisement-chang-4
- advertisement-chang-5
thankyous:
- vending-machine-thanks
- thankyou-chang-1
- thankyou-chang-2

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: ChefDrobeAds
advertisements:
messages:
- advertisement-chefdrobe-1
- advertisement-chefdrobe-2
- advertisement-chefdrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: ChefvendAds
advertisements:
messages:
- advertisement-chefvend-1
- advertisement-chefvend-2
- advertisement-chefvend-3
@@ -10,9 +10,3 @@
- advertisement-chefvend-7
- advertisement-chefvend-8
- advertisement-chefvend-9
thankyous:
- vending-machine-thanks
- thankyou-chefvend-1
- thankyou-chefvend-2
- thankyou-chefvend-3
- thankyou-chefvend-4

View File

@@ -1,9 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: ChemDrobeAds
advertisements:
messages:
- advertisement-chemdrobe-1
- advertisement-chemdrobe-2
- advertisement-chemdrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: CigaretteMachineAds
advertisements:
messages:
- advertisement-cigs-1
- advertisement-cigs-2
- advertisement-cigs-3
@@ -13,8 +13,3 @@
- advertisement-cigs-10
- advertisement-cigs-11
- advertisement-cigs-12
thankyous:
- vending-machine-thanks
- thankyou-cigs-1
- thankyou-cigs-2
- thankyou-cigs-3

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: ClothesMateAds
advertisements:
messages:
- advertisement-clothes-1
- advertisement-clothes-2
- advertisement-clothes-3
@@ -8,5 +8,3 @@
- advertisement-clothes-5
- advertisement-clothes-6
- advertisement-clothes-7
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: HotDrinksMachineAds
advertisements:
messages:
- advertisement-coffee-1
- advertisement-coffee-2
- advertisement-coffee-3
@@ -15,9 +15,3 @@
- advertisement-coffee-12
- advertisement-coffee-13
- advertisement-coffee-14
thankyous:
- vending-machine-thanks
- thankyou-coffee-1
- thankyou-coffee-2
- thankyou-coffee-3
- thankyou-coffee-4

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: RobustSoftdrinksAds
advertisements:
messages:
- advertisement-cola-1
- advertisement-cola-2
- advertisement-cola-3
@@ -9,9 +9,3 @@
- advertisement-cola-6
- advertisement-cola-7
- advertisement-cola-8
thankyous:
- vending-machine-thanks
- thankyou-cola-1
- thankyou-cola-2
- thankyou-cola-3
- thankyou-cola-4

View File

@@ -1,11 +1,9 @@
- type: advertisementsPack
- type: messagePack
id: CondimentVendAds
advertisements:
messages:
- advertisement-condiment-1
- advertisement-condiment-2
- advertisement-condiment-3
- advertisement-condiment-4
- advertisement-condiment-5
- advertisement-condiment-6
thankyous:
- vending-machine-thanks

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: CuraDrobeAds
advertisements:
messages:
- advertisement-curadrobe-1
- advertisement-curadrobe-2
- advertisement-curadrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: DetDrobeAds
advertisements:
messages:
- advertisement-detdrobe-1
- advertisement-detdrobe-2
- advertisement-detdrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: DinnerwareAds
advertisements:
messages:
- advertisement-dinnerware-1
- advertisement-dinnerware-2
- advertisement-dinnerware-3
@@ -11,5 +11,3 @@
- advertisement-dinnerware-8
- advertisement-dinnerware-9
- advertisement-dinnerware-10
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: DiscountDansAds
advertisements:
messages:
- advertisement-discount-1
- advertisement-discount-2
- advertisement-discount-3
@@ -10,13 +10,3 @@
- advertisement-discount-7
- advertisement-discount-8
- advertisement-discount-9
thankyous:
- vending-machine-thanks
- thankyou-discount-1
- thankyou-discount-2
- thankyou-discount-3
- thankyou-discount-4
- thankyou-discount-5
- thankyou-discount-6
- thankyou-discount-7
- thankyou-discount-8

View File

@@ -1,14 +1,8 @@
- type: advertisementsPack
- type: messagePack
id: DonutAds
advertisements:
messages:
- advertisement-donut-1
- advertisement-donut-2
- advertisement-donut-3
- advertisement-donut-4
- advertisement-donut-5
thankyous:
- vending-machine-thanks
- thankyou-donut-1
- thankyou-donut-2
- thankyou-donut-3
- thankyou-donut-4

View File

@@ -1,10 +1,8 @@
- type: advertisementsPack
- type: messagePack
id: EngiDrobeAds
advertisements:
messages:
- advertisement-engidrobe-1
- advertisement-engidrobe-2
- advertisement-engidrobe-3
- advertisement-engidrobe-4
- advertisement-engidrobe-5
thankyous:
- vending-machine-thanks

View File

@@ -1,11 +1,9 @@
- type: advertisementsPack
- type: messagePack
id: FatExtractorFacts
advertisements:
messages:
- fat-extractor-fact-1
- fat-extractor-fact-2
- fat-extractor-fact-3
- fat-extractor-fact-4
- fat-extractor-fact-5
- fat-extractor-fact-6
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: GoodCleanFunAds
advertisements:
messages:
- advertisement-goodcleanfun-1
- advertisement-goodcleanfun-2
- advertisement-goodcleanfun-3
@@ -11,9 +11,3 @@
- advertisement-goodcleanfun-8
- advertisement-goodcleanfun-9
- advertisement-goodcleanfun-10
thankyous:
- vending-machine-thanks
- thankyou-goodcleanfun-1
- thankyou-goodcleanfun-2
- thankyou-goodcleanfun-3
- thankyou-goodcleanfun-4

View File

@@ -1,7 +1,5 @@
- type: advertisementsPack
- type: messagePack
id: GeneDrobeAds
advertisements:
messages:
- advertisement-genedrobe-1
- advertisement-genedrobe-2
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: HappyHonkAds
advertisements:
messages:
- advertisement-happyhonk-1
- advertisement-happyhonk-2
- advertisement-happyhonk-3
@@ -11,9 +11,3 @@
- advertisement-happyhonk-8
- advertisement-happyhonk-9
- advertisement-happyhonk-10
thankyous:
- vending-machine-thanks
- thankyou-happyhonk-1
- thankyou-happyhonk-2
- thankyou-happyhonk-3
- thankyou-happyhonk-4

View File

@@ -1,9 +1,7 @@
- type: advertisementsPack
- type: messagePack
id: HyDrobeAds
advertisements:
messages:
- advertisement-hydrobe-1
- advertisement-hydrobe-2
- advertisement-hydrobe-3
- advertisement-hydrobe-4
thankyous:
- vending-machine-thanks

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: JaniDrobeAds
advertisements:
messages:
- advertisement-janidrobe-1
- advertisement-janidrobe-2
- advertisement-janidrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: LawDrobeAds
advertisements:
messages:
- advertisement-lawdrobe-1
- advertisement-lawdrobe-2
- advertisement-lawdrobe-3
@@ -9,10 +9,3 @@
- advertisement-lawdrobe-6
- advertisement-lawdrobe-7
- advertisement-lawdrobe-8
thankyous:
- vending-machine-thanks
- thankyou-lawdrobe-1
- thankyou-lawdrobe-2
- thankyou-lawdrobe-3
- thankyou-lawdrobe-4
- thankyou-lawdrobe-5

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: MagiVendAds
advertisements:
messages:
- advertisement-magivend-1
- advertisement-magivend-2
- advertisement-magivend-3
@@ -12,5 +12,3 @@
- advertisement-magivend-9
- advertisement-magivend-10
- advertisement-magivend-11
thankyous:
- vending-machine-thanks

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: MediDrobeAds
advertisements:
messages:
- advertisement-medidrobe-1
- advertisement-medidrobe-2
- advertisement-medidrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,11 +1,9 @@
- type: advertisementsPack
- type: messagePack
id: MegaSeedAds
advertisements:
messages:
- advertisement-megaseed-1
- advertisement-megaseed-2
- advertisement-megaseed-3
- advertisement-megaseed-4
- advertisement-megaseed-5
- advertisement-megaseed-6
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: NanoMedAds
advertisements:
messages:
- advertisement-nanomed-1
- advertisement-nanomed-2
- advertisement-nanomed-3
@@ -10,5 +10,3 @@
- advertisement-nanomed-7
- advertisement-nanomed-8
- advertisement-nanomed-9
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: NutriMaxAds
advertisements:
messages:
- advertisement-nutrimax-1
- advertisement-nutrimax-2
- advertisement-nutrimax-3
@@ -8,7 +8,3 @@
- advertisement-nutrimax-5
- advertisement-nutrimax-6
- advertisement-nutrimax-7
thankyous:
- vending-machine-thanks
- thankyou-nutrimax-1
- thankyou-nutrimax-2

View File

@@ -1,9 +1,7 @@
- type: advertisementsPack
- type: messagePack
id: RoboDrobeAds
advertisements:
messages:
- advertisement-robodrobe-1
- advertisement-robodrobe-2
- advertisement-robodrobe-3
- advertisement-robodrobe-4
thankyous:
- vending-machine-thanks

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: SciDrobeAds
advertisements:
messages:
- advertisement-scidrobe-1
- advertisement-scidrobe-2
- advertisement-scidrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -1,10 +1,8 @@
- type: advertisementsPack
- type: messagePack
id: SecDrobeAds
advertisements:
messages:
- advertisement-secdrobe-1
- advertisement-secdrobe-2
- advertisement-secdrobe-3
- advertisement-secdrobe-4
- advertisement-secdrobe-5
thankyous:
- vending-machine-thanks

View File

@@ -1,13 +1,8 @@
- type: advertisementsPack
- type: messagePack
id: SecTechAds
advertisements:
messages:
- advertisement-sectech-1
- advertisement-sectech-2
- advertisement-sectech-3
- advertisement-sectech-4
- advertisement-sectech-5
thankyous:
- vending-machine-thanks
- thankyou-sectech-1
- thankyou-sectech-2
- thankyou-sectech-3

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: SmartFridgeAds
advertisements:
messages:
- advertisement-smartfridge-1
- advertisement-smartfridge-2
- advertisement-smartfridge-3
@@ -9,5 +9,3 @@
- advertisement-smartfridge-6
- advertisement-smartfridge-7
- advertisement-smartfridge-8
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: GetmoreChocolateCorpAds
advertisements:
messages:
- advertisement-snack-1
- advertisement-snack-2
- advertisement-snack-3
@@ -16,11 +16,3 @@
- advertisement-snack-13
- advertisement-snack-14
- advertisement-snack-15
thankyous:
- vending-machine-thanks
- thankyou-snack-1
- thankyou-snack-2
- thankyou-snack-3
- thankyou-snack-4
- thankyou-snack-5
- thankyou-snack-6

View File

@@ -1,14 +1,9 @@
- type: advertisementsPack
- type: messagePack
id: BodaAds
advertisements:
messages:
- advertisement-sovietsoda-1
- advertisement-sovietsoda-2
- advertisement-sovietsoda-3
- advertisement-sovietsoda-4
- advertisement-sovietsoda-5
- advertisement-sovietsoda-6
thankyous:
- vending-machine-thanks
- thankyou-sovietsoda-1
- thankyou-sovietsoda-2
- thankyou-sovietsoda-3

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: SyndieDrobeAds
advertisements:
messages:
- advertisement-syndiedrobe-1
- advertisement-syndiedrobe-2
- advertisement-syndiedrobe-3
@@ -32,10 +32,3 @@
- advertisement-syndiedrobe-29
- advertisement-syndiedrobe-30
- advertisement-syndiedrobe-31
thankyous:
- vending-machine-thanks
- thankyou-syndiedrobe-1
- thankyou-syndiedrobe-2
- thankyou-syndiedrobe-3
- thankyou-syndiedrobe-4
- thankyou-syndiedrobe-5

View File

@@ -1,11 +1,9 @@
- type: advertisementsPack
- type: messagePack
id: AutoDrobeAds
advertisements:
messages:
- advertisement-theater-1
- advertisement-theater-2
- advertisement-theater-3
- advertisement-theater-4
- advertisement-theater-5
- advertisement-theater-6
thankyous:
- vending-machine-thanks

View File

@@ -1,6 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: VendomatAds
advertisements:
messages:
- advertisement-vendomat-1
- advertisement-vendomat-2
- advertisement-vendomat-3
@@ -8,5 +8,3 @@
- advertisement-vendomat-5
- advertisement-vendomat-6
- advertisement-vendomat-7
thankyous:
- vending-machine-thanks

View File

@@ -1,8 +1,6 @@
- type: advertisementsPack
- type: messagePack
id: ViroDrobeAds
advertisements:
messages:
- advertisement-virodrobe-1
- advertisement-virodrobe-2
- advertisement-virodrobe-3
thankyous:
- vending-machine-thanks

View File

@@ -0,0 +1,7 @@
- type: messagePack
id: BoozeOMatGoodbyes
messages:
- vending-machine-thanks
- thankyou-boozeomat-1
- thankyou-boozeomat-2
- thankyou-boozeomat-3

View File

@@ -0,0 +1,6 @@
- type: messagePack
id: ChangGoodbyes
messages:
- vending-machine-thanks
- thankyou-chang-1
- thankyou-chang-2

View File

@@ -0,0 +1,8 @@
- type: messagePack
id: ChefvendGoodbyes
messages:
- vending-machine-thanks
- thankyou-chefvend-1
- thankyou-chefvend-2
- thankyou-chefvend-3
- thankyou-chefvend-4

View File

@@ -0,0 +1,7 @@
- type: messagePack
id: CigaretteMachineGoodbyes
messages:
- vending-machine-thanks
- thankyou-cigs-1
- thankyou-cigs-2
- thankyou-cigs-3

View File

@@ -0,0 +1,8 @@
- type: messagePack
id: HotDrinksMachineGoodbyes
messages:
- vending-machine-thanks
- thankyou-coffee-1
- thankyou-coffee-2
- thankyou-coffee-3
- thankyou-coffee-4

View File

@@ -0,0 +1,8 @@
- type: messagePack
id: RobustSoftdrinksGoodbyes
messages:
- vending-machine-thanks
- thankyou-cola-1
- thankyou-cola-2
- thankyou-cola-3
- thankyou-cola-4

View File

@@ -0,0 +1,12 @@
- type: messagePack
id: DiscountDansGoodbyes
messages:
- vending-machine-thanks
- thankyou-discount-1
- thankyou-discount-2
- thankyou-discount-3
- thankyou-discount-4
- thankyou-discount-5
- thankyou-discount-6
- thankyou-discount-7
- thankyou-discount-8

View File

@@ -0,0 +1,8 @@
- type: messagePack
id: DonutGoodbyes
messages:
- vending-machine-thanks
- thankyou-donut-1
- thankyou-donut-2
- thankyou-donut-3
- thankyou-donut-4

View File

@@ -0,0 +1,8 @@
- type: messagePack
id: GoodCleanFunGoodbyes
messages:
- vending-machine-thanks
- thankyou-goodcleanfun-1
- thankyou-goodcleanfun-2
- thankyou-goodcleanfun-3
- thankyou-goodcleanfun-4

View File

@@ -0,0 +1,4 @@
- type: messagePack
id: GenericVendGoodbyes
messages:
- vending-machine-thanks

View File

@@ -0,0 +1,8 @@
- type: messagePack
id: HappyHonkGoodbyes
messages:
- vending-machine-thanks
- thankyou-happyhonk-1
- thankyou-happyhonk-2
- thankyou-happyhonk-3
- thankyou-happyhonk-4

View File

@@ -0,0 +1,8 @@
- type: messagePack
id: LawDrobeGoodbyes
messages:
- thankyou-lawdrobe-1
- thankyou-lawdrobe-2
- thankyou-lawdrobe-3
- thankyou-lawdrobe-4
- thankyou-lawdrobe-5

View File

@@ -0,0 +1,6 @@
- type: messagePack
id: NutriMaxGoodbyes
messages:
- vending-machine-thanks
- thankyou-nutrimax-1
- thankyou-nutrimax-2

View File

@@ -0,0 +1,7 @@
- type: messagePack
id: SecTechGoodbyes
messages:
- vending-machine-thanks
- thankyou-sectech-1
- thankyou-sectech-2
- thankyou-sectech-3

View File

@@ -0,0 +1,10 @@
- type: messagePack
id: GetmoreChocolateCorpGoodbyes
messages:
- vending-machine-thanks
- thankyou-snack-1
- thankyou-snack-2
- thankyou-snack-3
- thankyou-snack-4
- thankyou-snack-5
- thankyou-snack-6

View File

@@ -0,0 +1,7 @@
- type: messagePack
id: BodaGoodbyes
messages:
- vending-machine-thanks
- thankyou-sovietsoda-1
- thankyou-sovietsoda-2
- thankyou-sovietsoda-3

View File

@@ -0,0 +1,9 @@
- type: messagePack
id: SyndieDrobeGoodbyes
messages:
- vending-machine-thanks
- thankyou-syndiedrobe-1
- thankyou-syndiedrobe-2
- thankyou-syndiedrobe-3
- thankyou-syndiedrobe-4
- thankyou-syndiedrobe-5

View File

@@ -130,6 +130,8 @@
density: 190
- type: Advertise
pack: CondimentVendAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Transform
noRot: false
@@ -147,6 +149,8 @@
normalState: normal-unshaded
- type: Advertise
pack: AmmoVendAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/ammo.rsi
@@ -174,6 +178,8 @@
loopDeny: false
- type: Advertise
pack: BoozeOMatAds
- type: SpeakOnUIClosed
pack: BoozeOMatGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/boozeomat.rsi
@@ -235,6 +241,8 @@
ejectState: eject-unshaded
- type: Advertise
pack: ChefvendAds
- type: SpeakOnUIClosed
pack: ChefvendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/chefvend.rsi
layers:
@@ -269,6 +277,8 @@
denyState: deny-unshaded
- type: Advertise
pack: CigaretteMachineAds
- type: SpeakOnUIClosed
pack: CigaretteMachineGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/cigs.rsi
@@ -295,6 +305,8 @@
denyState: deny-unshaded
- type: Advertise
pack: ClothesMateAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/clothing.rsi
@@ -325,6 +337,8 @@
denyState: deny-unshaded
- type: Advertise
pack: ClothesMateAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/winterdrobe.rsi
@@ -362,6 +376,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: HotDrinksMachineAds
- type: SpeakOnUIClosed
pack: HotDrinksMachineGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/coffee.rsi
@@ -400,6 +416,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: RobustSoftdrinksAds
- type: SpeakOnUIClosed
pack: RobustSoftdrinksGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/cola.rsi
@@ -579,6 +597,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: RobustSoftdrinksAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/pwrgame.rsi
@@ -614,6 +634,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: RobustSoftdrinksAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/gib.rsi
@@ -644,6 +666,8 @@
ejectState: eject-unshaded
- type: Advertise
pack: DinnerwareAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/dinnerware.rsi
layers:
@@ -674,6 +698,8 @@
normalState: normal-unshaded
- type: Advertise
pack: MagiVendAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/magivend.rsi
layers:
@@ -705,6 +731,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: DiscountDansAds
- type: SpeakOnUIClosed
pack: DiscountDansGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/discount.rsi
@@ -767,6 +795,8 @@
ejectDelay: 0.6
- type: Advertise
pack: NanoMedAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/medical.rsi
layers:
@@ -802,6 +832,8 @@
denyState: deny-unshaded
- type: Advertise
pack: NutriMaxAds
- type: SpeakOnUIClosed
pack: NutriMaxGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/nutri.rsi
layers:
@@ -834,6 +866,8 @@
denyState: deny-unshaded
- type: Advertise
pack: SecTechAds
- type: SpeakOnUIClosed
pack: SecTechGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/sec.rsi
layers:
@@ -870,6 +904,8 @@
denyState: deny-unshaded
- type: Advertise
pack: MegaSeedAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/seeds.rsi
layers:
@@ -911,6 +947,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: GetmoreChocolateCorpAds
- type: SpeakOnUIClosed
pack: GetmoreChocolateCorpGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/snack.rsi
@@ -1055,6 +1093,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: BodaAds
- type: SpeakOnUIClosed
pack: BodaGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/sovietsoda.rsi
@@ -1087,6 +1127,8 @@
screenState: screen
- type: Advertise
pack: AutoDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/theater.rsi
@@ -1121,6 +1163,8 @@
denyState: deny-unshaded
- type: Advertise
pack: VendomatAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/vendomat.rsi
@@ -1152,6 +1196,8 @@
denyState: deny-unshaded
- type: Advertise
pack: VendomatAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/robotics.rsi
@@ -1216,6 +1262,8 @@
ejectDelay: 1.8
- type: Advertise
pack: GoodCleanFunAds
- type: SpeakOnUIClosed
pack: GoodCleanFunGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/games.rsi
layers:
@@ -1247,6 +1295,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: ChangAds
- type: SpeakOnUIClosed
pack: ChangGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/changs.rsi
@@ -1311,6 +1361,8 @@
initialStockQuality: 0.33
- type: Advertise
pack: DonutAds
- type: SpeakOnUIClosed
pack: DonutGoodbyes
- type: Speech
- type: Sprite
sprite: Structures/Machines/VendingMachines/donut.rsi
@@ -1394,6 +1446,8 @@
normalState: normal-unshaded
- type: Advertise
pack: HyDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/hydrobe.rsi
layers:
@@ -1420,6 +1474,8 @@
normalState: normal-unshaded
- type: Advertise
pack: LawDrobeAds
- type: SpeakOnUIClosed
pack: LawDrobeGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/lawdrobe.rsi
layers:
@@ -1446,6 +1502,8 @@
normalState: normal-unshaded
- type: Advertise
pack: SecDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/secdrobe.rsi
layers:
@@ -1472,6 +1530,8 @@
normalState: normal-unshaded
- type: Advertise
pack: BarDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/bardrobe.rsi
layers:
@@ -1526,6 +1586,8 @@
normalState: normal-unshaded
- type: Advertise
pack: CargoDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/cargodrobe.rsi
layers:
@@ -1552,6 +1614,8 @@
normalState: normal-unshaded
- type: Advertise
pack: MediDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/medidrobe.rsi
layers:
@@ -1578,6 +1642,8 @@
normalState: normal-unshaded
- type: Advertise
pack: ChemDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/chemdrobe.rsi
layers:
@@ -1604,6 +1670,8 @@
normalState: normal-unshaded
- type: Advertise
pack: CuraDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/curadrobe.rsi
layers:
@@ -1630,6 +1698,8 @@
normalState: normal-unshaded
- type: Advertise
pack: AtmosDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/atmosdrobe.rsi
layers:
@@ -1656,6 +1726,8 @@
normalState: normal-unshaded
- type: Advertise
pack: EngiDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/engidrobe.rsi
layers:
@@ -1682,6 +1754,8 @@
normalState: normal-unshaded
- type: Advertise
pack: ChefDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/chefdrobe.rsi
layers:
@@ -1708,6 +1782,8 @@
normalState: normal-unshaded
- type: Advertise
pack: DetDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/detdrobe.rsi
layers:
@@ -1734,6 +1810,8 @@
normalState: normal-unshaded
- type: Advertise
pack: JaniDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/janidrobe.rsi
layers:
@@ -1760,6 +1838,8 @@
normalState: normal-unshaded
- type: Advertise
pack: SciDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/scidrobe.rsi
layers:
@@ -1786,6 +1866,8 @@
normalState: normal-unshaded
- type: Advertise
pack: SyndieDrobeAds
- type: SpeakOnUIClosed
pack: SyndieDrobeGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/syndiedrobe.rsi
layers:
@@ -1812,6 +1894,8 @@
normalState: normal-unshaded
- type: Advertise
pack: RoboDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/robodrobe.rsi
layers:
@@ -1838,6 +1922,8 @@
normalState: normal-unshaded
- type: Advertise
pack: GeneDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/genedrobe.rsi
layers:
@@ -1864,6 +1950,8 @@
normalState: normal-unshaded
- type: Advertise
pack: ViroDrobeAds
- type: SpeakOnUIClosed
pack: GenericVendGoodbyes
- type: Sprite
sprite: Structures/Machines/VendingMachines/virodrobe.rsi
layers:
@@ -1938,6 +2026,8 @@
color: "#3c5eb5"
- type: Advertise
pack: HappyHonkAds
- type: SpeakOnUIClosed
pack: HappyHonkGoodbyes
- type: AccessReader
access: [["Kitchen"], ["Theatre"]]