Add Different Styles for Instruments (#9250)

This commit is contained in:
EmoGarbage404
2022-07-02 04:08:56 -04:00
committed by GitHub
parent 6e0e350e86
commit a633fe7d5e
7 changed files with 107 additions and 2 deletions

View File

@@ -0,0 +1,14 @@
namespace Content.Server.Instruments;
[RegisterComponent]
public sealed class SwappableInstrumentComponent : Component
{
/// <summary>
/// Used to store the different instruments that can be swapped between.
/// string = display name of the instrument
/// byte 1 = instrument midi program
/// byte 2 = instrument midi bank
/// </summary>
[DataField("instrumentList", required: true)]
public Dictionary<string, (byte, byte)> InstrumentList = new();
}

View File

@@ -0,0 +1,51 @@
using Content.Shared.Instruments;
using Content.Shared.Popups;
using Content.Shared.Verbs;
using Robust.Shared.Player;
namespace Content.Server.Instruments;
public sealed class SwappableInstrumentSystem : EntitySystem
{
[Dependency] private readonly SharedInstrumentSystem _sharedInstrument = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SwappableInstrumentComponent, GetVerbsEvent<AlternativeVerb>>(AddStyleVerb);
}
private void AddStyleVerb(EntityUid uid, SwappableInstrumentComponent component, GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanInteract || !args.CanAccess || component.InstrumentList.Count <= 1)
return;
if (!TryComp<SharedInstrumentComponent>(uid, out var instrument))
return;
if (instrument.Playing) //no changing while playing
return;
var priority = 0;
foreach (var entry in component.InstrumentList)
{
AlternativeVerb selection = new()
{
Text = entry.Key,
Category = VerbCategory.InstrumentStyle,
Priority = priority,
Act = () =>
{
_sharedInstrument.SetInstrumentProgram(instrument, entry.Value.Item1, entry.Value.Item2);
_popup.PopupEntity(Loc.GetString("swappable-instrument-component-style-set", ("style", entry.Key)),
args.User, Filter.Entities(args.User));
}
};
priority--;
args.Verbs.Add(selection);
}
}
}

View File

@@ -18,6 +18,12 @@ public abstract class SharedInstrumentSystem : EntitySystem
public virtual void EndRenderer(EntityUid uid, bool fromStateChange, SharedInstrumentComponent? instrument = null) public virtual void EndRenderer(EntityUid uid, bool fromStateChange, SharedInstrumentComponent? instrument = null)
{ } { }
public void SetInstrumentProgram(SharedInstrumentComponent component, byte program, byte bank)
{
component.InstrumentProgram = program;
component.InstrumentBank = bank;
}
private void OnGetState(EntityUid uid, SharedInstrumentComponent instrument, ref ComponentGetState args) private void OnGetState(EntityUid uid, SharedInstrumentComponent instrument, ref ComponentGetState args)
{ {
args.State = args.State =

View File

@@ -68,6 +68,9 @@ namespace Content.Shared.Verbs
public static readonly VerbCategory Split = public static readonly VerbCategory Split =
new("verb-categories-split", null); new("verb-categories-split", null);
public static readonly VerbCategory InstrumentStyle =
new("verb-categories-instrument-style", null);
public static readonly VerbCategory SetSensor = new("verb-categories-set-sensor", null); public static readonly VerbCategory SetSensor = new("verb-categories-set-sensor", null);
} }
} }

View File

@@ -8,3 +8,6 @@ instruments-component-menu-no-midi-support = MIDI support is currently not
FluidSynth or a development package FluidSynth or a development package
for FluidSynth. for FluidSynth.
# SwappableInstrumentComponent
swappable-instrument-component-style-set = Style set to "{$style}"

View File

@@ -20,6 +20,7 @@ verb-categories-rotate = Rotate
verb-categories-smite = Smite verb-categories-smite = Smite
verb-categories-transfer = Set Transfer Amount verb-categories-transfer = Set Transfer Amount
verb-categories-split = Split verb-categories-split = Split
verb-categories-instrument-style = Instrument Style
verb-categories-set-sensor = Sensor verb-categories-set-sensor = Sensor
verb-categories-timer = Set Delay verb-categories-timer = Set Delay

View File

@@ -26,6 +26,10 @@
components: components:
- type: Instrument - type: Instrument
program: 62 program: 62
- type: SwappableInstrument
instrumentList:
"Electro": {62: 0} #i needed generic sounding synth presets, sue me
"Bubbles": {63: 0}
- type: Sprite - type: Sprite
sprite: Objects/Fun/Instruments/h_synthesizer.rsi sprite: Objects/Fun/Instruments/h_synthesizer.rsi
state: icon state: icon
@@ -43,7 +47,11 @@
description: Anyway, here's Wonderwall. description: Anyway, here's Wonderwall.
components: components:
- type: Instrument - type: Instrument
program: 25 program: 24
- type: SwappableInstrument
instrumentList:
"Nylon": {24: 0}
"Steel": {25: 0}
- type: Sprite - type: Sprite
sprite: Objects/Fun/Instruments/guitar.rsi sprite: Objects/Fun/Instruments/guitar.rsi
state: icon state: icon
@@ -82,6 +90,10 @@
components: components:
- type: Instrument - type: Instrument
program: 56 program: 56
- type: SwappableInstrument
instrumentList:
"Standard": {56: 0}
"Muted": {59: 0}
- type: Sprite - type: Sprite
sprite: Objects/Fun/Instruments/trumpet.rsi sprite: Objects/Fun/Instruments/trumpet.rsi
state: icon state: icon
@@ -117,6 +129,11 @@
components: components:
- type: Instrument - type: Instrument
program: 27 program: 27
- type: SwappableInstrument
instrumentList:
"Clean": {27: 0}
"Jazz": {25: 0}
"Muted": {28: 0}
- type: Sprite - type: Sprite
sprite: Objects/Fun/Instruments/eguitar.rsi sprite: Objects/Fun/Instruments/eguitar.rsi
state: icon state: icon
@@ -134,6 +151,10 @@
components: components:
- type: Instrument - type: Instrument
program: 21 program: 21
- type: SwappableInstrument
instrumentList:
"Standard": {21: 0}
"Tango": {23: 0}
- type: Sprite - type: Sprite
sprite: Objects/Fun/Instruments/accordion.rsi sprite: Objects/Fun/Instruments/accordion.rsi
state: icon state: icon
@@ -240,7 +261,13 @@
description: An instrument. You could probably grind this into raw jazz. description: An instrument. You could probably grind this into raw jazz.
components: components:
- type: Instrument - type: Instrument
program: 67 program: 66
- type: SwappableInstrument
instrumentList:
"Soprano": {64: 0}
"Alto": {65: 0}
"Tenor": {66: 0}
"Baritone": {67: 0}
- type: Sprite - type: Sprite
sprite: Objects/Fun/Instruments/saxophone.rsi sprite: Objects/Fun/Instruments/saxophone.rsi
state: icon state: icon