--- /dev/null
+using Content.Client.UserInterface.Fragments;
+using Content.Shared.Mech;
+using Robust.Client.GameObjects;
+using Robust.Client.UserInterface;
+
+namespace Content.Client.Mech.Ui.Equipment;
+
+public sealed class MechSoundboardUi : UIFragment
+{
+ private MechSoundboardUiFragment? _fragment;
+
+ public override Control GetUIFragmentRoot()
+ {
+ return _fragment!;
+ }
+
+ public override void Setup(BoundUserInterface userInterface, EntityUid? fragmentOwner)
+ {
+ if (fragmentOwner == null)
+ return;
+
+ _fragment = new MechSoundboardUiFragment();
+ _fragment.OnPlayAction += sound =>
+ {
+ userInterface.SendMessage(new MechSoundboardPlayMessage(fragmentOwner.Value, sound));
+ };
+ }
+
+ public override void UpdateState(BoundUserInterfaceState state)
+ {
+ if (state is not MechSoundboardUiState soundboardState)
+ return;
+
+ _fragment?.UpdateContents(soundboardState);
+ }
+}
--- /dev/null
+<equipment:MechSoundboardUiFragment
+ xmlns:equipment="clr-namespace:Content.Client.Mech.Ui.Equipment"
+ xmlns="https://spacestation14.io" Margin="1 0 2 0" HorizontalExpand="True" VerticalExpand="True">
+ <BoxContainer Orientation="Vertical"
+ HorizontalExpand="True"
+ VerticalExpand="True">
+ <ItemList Name="Sounds"
+ VerticalExpand="True"
+ MinHeight="160"
+ HorizontalExpand="True"
+ SelectMode="Button"/>
+ </BoxContainer>
+</equipment:MechSoundboardUiFragment>
--- /dev/null
+using Content.Shared.Mech;
+using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+
+namespace Content.Client.Mech.Ui.Equipment;
+
+[GenerateTypedNameReferences]
+public sealed partial class MechSoundboardUiFragment : BoxContainer
+{
+ public event Action<int>? OnPlayAction;
+
+ public MechSoundboardUiFragment()
+ {
+ RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this);
+ }
+
+ public void UpdateContents(MechSoundboardUiState state)
+ {
+ foreach (var sound in state.Sounds)
+ {
+ Sounds.AddItem(Loc.GetString($"mech-soundboard-{sound}")).OnSelected += item => {
+ OnPlayAction?.Invoke(Sounds.IndexOf(item));
+ };
+ }
+ }
+}
SubscribeLocalEvent<MechPilotComponent, AtmosExposedGetAirEvent>(OnExpose);
#region Equipment UI message relays
- SubscribeLocalEvent<MechComponent, MechGrabberEjectMessage>(RecieveEquipmentUiMesssages);
+ SubscribeLocalEvent<MechComponent, MechGrabberEjectMessage>(ReceiveEquipmentUiMesssages);
+ SubscribeLocalEvent<MechComponent, MechSoundboardPlayMessage>(ReceiveEquipmentUiMesssages);
#endregion
}
UpdateUserInterface(uid, component);
}
- private void RecieveEquipmentUiMesssages<T>(EntityUid uid, MechComponent component, T args) where T : MechEquipmentUiMessage
+ private void ReceiveEquipmentUiMesssages<T>(EntityUid uid, MechComponent component, T args) where T : MechEquipmentUiMessage
{
var ev = new MechEquipmentUiMessageRelayEvent(args);
var allEquipment = new List<EntityUid>(component.EquipmentContainer.ContainedEntities);
--- /dev/null
+using Content.Shared.Mech.Equipment.Systems;
+using Robust.Shared.Audio;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Mech.Equipment.Components;
+
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+[Access(typeof(MechSoundboardSystem))]
+public sealed partial class MechSoundboardComponent : Component
+{
+ /// <summary>
+ /// List of sounds that can be played
+ /// </summary>
+ [DataField("sounds"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
+ public List<SoundCollectionSpecifier> Sounds = new();
+}
--- /dev/null
+using Content.Shared.Mech;
+using Content.Shared.Mech.Equipment.Components;
+using Content.Shared.Mech.Equipment.Systems;
+using Content.Shared.Timing;
+using Robust.Shared.Audio;
+using System.Linq;
+
+namespace Content.Shared.Mech.Equipment.Systems;
+
+/// <summary>
+/// Handles everything for mech soundboard.
+/// </summary>
+public sealed class MechSoundboardSystem : EntitySystem
+{
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly UseDelaySystem _useDelay = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent<MechSoundboardComponent, MechEquipmentUiStateReadyEvent>(OnUiStateReady);
+ SubscribeLocalEvent<MechSoundboardComponent, MechEquipmentUiMessageRelayEvent>(OnSoundboardMessage);
+ }
+
+ private void OnUiStateReady(EntityUid uid, MechSoundboardComponent comp, MechEquipmentUiStateReadyEvent args)
+ {
+ // you have to specify a collection so it must exist probably
+ var sounds = comp.Sounds.Select(sound => sound.Collection!);
+ var state = new MechSoundboardUiState
+ {
+ Sounds = sounds.ToList()
+ };
+ args.States.Add(uid, state);
+ }
+
+ private void OnSoundboardMessage(EntityUid uid, MechSoundboardComponent comp, MechEquipmentUiMessageRelayEvent args)
+ {
+ if (args.Message is not MechSoundboardPlayMessage msg)
+ return;
+
+ if (!TryComp<MechEquipmentComponent>(uid, out var equipment) ||
+ equipment.EquipmentOwner == null)
+ return;
+
+ if (msg.Sound >= comp.Sounds.Count)
+ return;
+
+ if (_useDelay.ActiveDelay(uid))
+ return;
+
+ // honk!!!!!
+ var mech = equipment.EquipmentOwner.Value;
+ _useDelay.BeginDelay(uid);
+ _audio.PlayPvs(comp.Sounds[msg.Sound], uid);
+ }
+}
}
}
+/// <summary>
+/// Event raised for the soundboard equipment to play a sound from its component
+/// </summary>
+[Serializable, NetSerializable]
+public sealed class MechSoundboardPlayMessage : MechEquipmentUiMessage
+{
+ public int Sound;
+
+ public MechSoundboardPlayMessage(EntityUid equipment, int sound)
+ {
+ Equipment = equipment;
+ Sound = sound;
+ }
+}
+
/// <summary>
/// BUI state for mechs that also contains all equipment ui states.
/// </summary>
public List<EntityUid> Contents = new();
public int MaxContents;
}
+
+/// <summary>
+/// List of sound collection ids to be localized and displayed.
+/// </summary>
+[Serializable, NetSerializable]
+public sealed class MechSoundboardUiState : BoundUserInterfaceState
+{
+ public List<string> Sounds = new();
+}
--- /dev/null
+mech-soundboard-BikeHorn = Honk!
+mech-soundboard-CluwneHorn = !knoH
+mech-soundboard-TrollAnimals = animal noises
+mech-soundboard-TrollEsword = e-sword
+mech-soundboard-TrollBeeping = Beep beep beep
+mech-soundboard-TrollMeeting = red vented!!!!!
technologies-ripley-technology = Exosuit: Ripley
technologies-ripley-technology-description = The latest and greatest in mechanized cargo construction.
+technologies-clown-technology = Exosuit: H.O.N.K.
+technologies-clown-technology-description = Honk?!
+
technologies-adv-parts-technology-description = Like the previous ones, but better!
technologies-adv-parts-technology = Advanced parts technology
tool-quality-sawing-name = Sawing
tool-quality-sawing-tool-name = Saw
+
+tool-quality-honking-name = Honking
+tool-quality-honking-tool-name = Bike Horn
- RipleyLLeg
- RipleyRLeg
+- type: technology
+ name: technologies-clown-technology
+ id: ClownTechnology
+ description: technologies-clown-technology-description
+ icon:
+ sprite: Objects/Specific/Mech/mecha.rsi
+ state: honker
+ requiredPoints: 15000
+ requiredTechnologies:
+ - RipleyTechnology
+ unlockedRecipes:
+ - HonkerCentralElectronics
+ - HonkerPeripheralsElectronics
+ - HonkerTargetingElectronics
+ - MechEquipmentHorn
+ - HonkerHarness
+ - HonkerLArm
+ - HonkerRArm
+ - HonkerLLeg
+ - HonkerRLeg
+
# Industrial Engineering Technology Tree
- type: technology
sprite: Clothing/Mask/clown.rsi
- type: BreathMask
- type: IdentityBlocker
+ # for H.O.N.K. construction
+ - type: Tag
+ tags:
+ - ClownMask
- type: entity
parent: ClothingMaskBase
- type: FootstepModifier
footstepSoundCollection:
collection: FootstepClown
+ # for H.O.N.K. construction
+ - type: Tag
+ tags:
+ - ClownShoes
- type: entity
parent: ClothingShoesBaseButcherable
+# Ripley
+
- type: entity
id: RipleyCentralElectronics
parent: BaseElectronics
state: id_mod
- type: Tag
tags:
- - RipleyPeripheralsControlModule
\ No newline at end of file
+ - RipleyPeripheralsControlModule
+
+# H.O.N.K.
+
+- type: entity
+ id: HonkerCentralElectronics
+ parent: BaseElectronics
+ name: H.O.N.K. central control module
+ description: The electrical control center for the H.O.N.K. mech.
+ components:
+ - type: Sprite
+ sprite: Objects/Misc/module.rsi
+ state: mainboard
+ - type: Tag
+ tags:
+ - HonkerCentralControlModule
+
+- type: entity
+ id: HonkerPeripheralsElectronics
+ parent: BaseElectronics
+ name: H.O.N.K. peripherals control module
+ description: The electrical peripherals control for the H.O.N.K. mech.
+ components:
+ - type: Sprite
+ sprite: Objects/Misc/module.rsi
+ state: id_mod
+ - type: Tag
+ tags:
+ - HonkerPeripheralsControlModule
+
+- type: entity
+ id: HonkerTargetingElectronics
+ parent: BaseElectronics
+ name: H.O.N.K. weapon control and targeting module
+ description: The electrical targeting control for the H.O.N.K. mech.
+ components:
+ - type: Sprite
+ sprite: Objects/Misc/module.rsi
+ state: id_mod
+ - type: Tag
+ tags:
+ - HonkerTargetingControlModule
damage:
types:
Blunt: 0
+ - type: Tool
+ qualities:
+ - Honking
+ useSound:
+ collection: BikeHorn
- type: entity
parent: BaseItem
graph: Ripley
node: start
defaultTarget: ripley
+
+# H.O.N.K.
+
+- type: entity
+ id: BaseHonkerPart
+ parent: BaseMechPart
+ abstract: true
+ components:
+ - type: Sprite
+ drawdepth: Items
+ noRot: false
+ netsync: false
+ sprite: Objects/Specific/Mech/honker_construction.rsi
+
+- type: entity
+ id: BaseHonkerPartItem
+ parent: BaseHonkerPart
+ abstract: true
+ components:
+ - type: Item
+ size: 50
+
+- type: entity
+ parent: BaseHonkerPart
+ id: HonkerHarness
+ name: H.O.N.K. harness
+ description: The core of the H.O.N.K. mech
+ components:
+ - type: Appearance
+ - type: ItemMapper
+ mapLayers:
+ honker_l_arm+o:
+ whitelist:
+ tags:
+ - HonkerLArm
+ honker_r_arm+o:
+ whitelist:
+ tags:
+ - HonkerRArm
+ honker_l_leg+o:
+ whitelist:
+ tags:
+ - HonkerLLeg
+ honker_r_leg+o:
+ whitelist:
+ tags:
+ - HonkerRLeg
+ sprite: Objects/Specific/Mech/honker_construction.rsi
+ - type: ContainerContainer
+ containers:
+ mech-assembly-container: !type:Container
+ - type: MechAssembly
+ finishedPrototype: HonkerChassis
+ requiredParts:
+ HonkerLArm: false
+ HonkerRArm: false
+ HonkerLLeg: false
+ HonkerRLeg: false
+ - type: Sprite
+ state: honker_harness+o
+ noRot: true
+
+- type: entity
+ parent: BaseHonkerPartItem
+ id: HonkerLArm
+ name: H.O.N.K. left arm
+ description: A H.O.N.K. left arm, with unique sockets that accept odd weaponry designed by clown scientists.
+ components:
+ - type: Sprite
+ state: honker_l_arm
+ - type: Tag
+ tags:
+ - HonkerLArm
+
+- type: entity
+ parent: BaseHonkerPartItem
+ id: HonkerLLeg
+ name: H.O.N.K. left leg
+ description: A H.O.N.K. left leg. The foot appears just large enough to fully accommodate a clown shoe.
+ components:
+ - type: Sprite
+ state: honker_l_leg
+ - type: Tag
+ tags:
+ - HonkerLLeg
+
+- type: entity
+ parent: BaseHonkerPartItem
+ id: HonkerRLeg
+ name: H.O.N.K. right leg
+ description: A H.O.N.K. right leg. The foot appears just large enough to fully accommodate a clown shoe.
+ components:
+ - type: Sprite
+ state: honker_r_leg
+ - type: Tag
+ tags:
+ - HonkerRLeg
+
+- type: entity
+ parent: BaseHonkerPartItem
+ id: HonkerRArm
+ name: H.O.N.K. right arm
+ description: A H.O.N.K. right arm, with unique sockets that accept odd weaponry designed by clown scientists.
+ components:
+ - type: Sprite
+ state: honker_r_arm
+ - type: Tag
+ tags:
+ - HonkerRArm
+
+- type: entity
+ id: HonkerChassis
+ parent: BaseHonkerPart
+ name: H.O.N.K. chassis
+ description: An in-progress construction of a H.O.N.K. mech. Contains chuckle unit, bananium core and honk support systems.
+ components:
+ - type: Appearance
+ - type: ContainerContainer
+ containers:
+ battery-container: !type:Container
+ - type: MechAssemblyVisuals
+ statePrefix: honker
+ - type: Sprite
+ noRot: true
+ state: honker0
+ - type: Construction
+ graph: Honker
+ node: start
+ defaultTarget: honker
ui: !type:MechGrabberUi
- type: ContainerContainer
containers:
- item-container: !type:Container
\ No newline at end of file
+ item-container: !type:Container
+
+- type: entity
+ id: MechEquipmentHorn
+ parent: BaseMechEquipment
+ name: mech horn
+ description: An enhanced bike horn that plays a hilarious array of sounds for the enjoyment of the crew. HONK!
+ components:
+ - type: Sprite
+ # TODO: use own sprite
+ state: mecha_honker
+ - type: MechSoundboard
+ sounds:
+ - collection: BikeHorn
+ - collection: CluwneHorn
+ - collection: TrollAnimals
+ - collection: TrollBeeping
+ - collection: TrollEsword
+ - collection: TrollMeeting
+ - type: UIFragment
+ ui: !type:MechSoundboardUi
+ - type: UseDelay
+ delay: 0.5
+ # TODO: tag as being for H.O.N.K. only!!!
containers:
mech-battery-slot:
- PowerCellHigh
+
+# TODO: have a whitelist for honker equipment
+- type: entity
+ id: MechHonker
+ parent: BaseMech
+ name: H.O.N.K.
+ description: "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!"
+ components:
+ - type: Sprite
+ netsync: false
+ drawdepth: Mobs
+ noRot: true
+ sprite: Objects/Specific/Mech/mecha.rsi
+ layers:
+ - map: [ "enum.MechVisualLayers.Base" ]
+ state: honker
+ - type: FootstepModifier
+ footstepSoundCollection:
+ collection: FootstepClown
+ - type: Mech
+ baseState: honker
+ openState: honker-open
+ brokenState: honker-broken
+ mechToPilotDamageMultiplier: 0.5
+
+- type: entity
+ id: MechHonkerBattery
+ parent: MechHonker
+ suffix: Battery
+ components:
+ - type: ContainerFill
+ containers:
+ mech-battery-slot:
+ - PowerCellHigh
- OreProcessorMachineCircuitboard
- RipleyCentralElectronics
- RipleyPeripheralsElectronics
+ - HonkerCentralElectronics
+ - HonkerPeripheralsElectronics
+ - HonkerTargetingElectronics
- GeneratorPlasmaMachineCircuitboard
- GeneratorUraniumMachineCircuitboard
- WallmountGeneratorElectronics
- RipleyLLeg
- RipleyRLeg
- MechEquipmentGrabber
+ - HonkerHarness
+ - HonkerLArm
+ - HonkerRArm
+ - HonkerLLeg
+ - HonkerRLeg
+ - MechEquipmentHorn
- type: MaterialStorage
whitelist:
tags:
--- /dev/null
+- type: constructionGraph
+ id: Honker
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: honker
+ steps:
+ - tool: Honking
+ doAfter: 1
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 1
+
+ - tag: HonkerCentralControlModule
+ name: H.O.N.K. central control module
+ icon:
+ sprite: "Objects/Misc/module.rsi"
+ state: "mainboard"
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 2
+
+ - tool: Honking
+ doAfter: 1
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 3
+
+ - tag: HonkerPeripheralsControlModule
+ name: H.O.N.K. peripherals control module
+ icon:
+ sprite: "Objects/Misc/module.rsi"
+ state: id_mod
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 4
+
+ - tool: Honking
+ doAfter: 1
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 5
+
+ - tag: HonkerTargetingControlModule
+ name: H.O.N.K. weapon control and targeting module
+ icon:
+ sprite: "Objects/Misc/module.rsi"
+ state: id_mod
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 6
+
+ - tool: Honking
+ doAfter: 1
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 7
+
+#i omitted the steps involving inserting machine parts because
+#currently mechs don't support upgrading. add them back in once that's squared away.
+
+ - component: PowerCell
+ name: power cell
+ store: battery-container
+ icon:
+ sprite: Objects/Power/power_cells.rsi
+ state: small
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 8
+
+ - tool: Honking
+ doAfter: 1
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 9
+
+ - tag: ClownMask
+ icon:
+ sprite: "Clothing/Mask/clown.rsi"
+ state: "icon"
+ name: "a clown's mask"
+ doAfter: 1
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 10
+
+ - tag: ClownShoes
+ icon:
+ sprite: "Clothing/Shoes/Specific/clown.rsi"
+ state: "icon"
+ name: "a clown's shoes"
+ doAfter: 1
+ completed:
+ - !type:VisualizerDataInt
+ key: "enum.MechAssemblyVisuals.State"
+ data: 11
+
+ - tool: Honking
+ doAfter: 1
+
+ - node: honker
+ actions:
+ - !type:BuildMech
+ mechPrototype: MechHonker
Glass: 900
Gold: 100
+- type: latheRecipe
+ id: HonkerCentralElectronics
+ result: HonkerCentralElectronics
+ completetime: 4
+ materials:
+ Steel: 100
+ Glass: 900
+ Bananium: 100
+
+- type: latheRecipe
+ id: HonkerPeripheralsElectronics
+ result: HonkerPeripheralsElectronics
+ completetime: 4
+ materials:
+ Steel: 100
+ Glass: 900
+ Bananium: 100
+
+- type: latheRecipe
+ id: HonkerTargetingElectronics
+ result: HonkerTargetingElectronics
+ completetime: 4
+ materials:
+ Steel: 100
+ Glass: 900
+ Bananium: 100
+
# Power
- type: latheRecipe
id: APCElectronics
+# Ripley
- type: latheRecipe
id: RipleyHarness
result: RipleyHarness
materials:
Steel: 500
Plastic: 200
+
+# H.O.N.K.
+- type: latheRecipe
+ id: HonkerHarness
+ result: HonkerHarness
+ completetime: 10
+ materials:
+ Steel: 3000
+ Glass: 1200
+ Bananium: 500
+
+- type: latheRecipe
+ id: HonkerLArm
+ result: HonkerLArm
+ completetime: 10
+ materials:
+ Steel: 3000
+ Glass: 1200
+ Bananium: 500
+
+- type: latheRecipe
+ id: HonkerLLeg
+ result: HonkerLLeg
+ completetime: 10
+ materials:
+ Steel: 3000
+ Glass: 1200
+ Bananium: 500
+
+- type: latheRecipe
+ id: HonkerRLeg
+ result: HonkerRLeg
+ completetime: 10
+ materials:
+ Steel: 3000
+ Glass: 1200
+ Bananium: 500
+
+- type: latheRecipe
+ id: HonkerRArm
+ result: HonkerRArm
+ completetime: 10
+ materials:
+ Steel: 3000
+ Glass: 1200
+ Bananium: 500
+
+- type: latheRecipe
+ id: MechEquipmentHorn
+ result: MechEquipmentHorn
+ completetime: 10
+ materials:
+ Steel: 500
+ Bananium: 200
--- /dev/null
+# various troll sounds for H.O.N.K.
+- type: soundCollection
+ id: TrollAnimals
+ files:
+ - /Audio/Animals/bear.ogg
+ - /Audio/Animals/cat_hiss.ogg
+ - /Audio/Animals/cat_meow.ogg
+ - /Audio/Animals/chicken_cluck_happy.ogg
+ - /Audio/Animals/cow_moo.ogg
+ - /Audio/Animals/duck_quack_happy.ogg
+ - /Audio/Animals/ferret_happy.ogg
+ - /Audio/Animals/fox_squeak.ogg
+ - /Audio/Animals/frog_ribbit.ogg
+ - /Audio/Animals/goat_bah.ogg
+ - /Audio/Animals/goose_honk.ogg
+ - /Audio/Animals/lizard_happy.ogg
+ - /Audio/Animals/monkey_scream.ogg
+ - /Audio/Animals/mouse_squeak.ogg
+ - /Audio/Animals/parrot_raught.ogg
+ - /Audio/Animals/penguin_squawk.ogg
+ - /Audio/Animals/pig_oink.ogg
+ - /Audio/Animals/raccoon_chatter.ogg
+ - /Audio/Animals/sloth_squeak.ogg
+ - /Audio/Animals/small_dog_bark_happy.ogg
+ - /Audio/Animals/snake_hiss.ogg
+ - /Audio/Animals/space_dragon_roar.ogg
+
+- type: soundCollection
+ id: TrollBeeping
+ files:
+ - /Audio/Effects/countdown.ogg
+
+- type: soundCollection
+ id: TrollEsword
+ files:
+ - /Audio/Weapons/ebladeoff.ogg
+ - /Audio/Weapons/ebladeon.ogg
+ - /Audio/Weapons/eblade1.ogg
+
+- type: soundCollection
+ id: TrollMeeting
+ files:
+ - /Audio/Misc/emergency_meeting.ogg
id: CigPack
- type: Tag
- id: HardsuitEVA
-
-- type: Tag
- id: HelmetEVA
+ id: ClownMask
- type: Tag
id: ClownRecorder
- type: Tag
id: ClownRubberStamp
+- type: Tag
+ id: ClownShoes
+
- type: Tag
id: CluwneHorn
- type: Tag
id: Hardsuit # Prevent melee injectors that can't penetrate hardsuits from injecting the wearer (nettles)
+- type: Tag
+ id: HardsuitEVA
+
- type: Tag
id: Head
+- type: Tag
+ id: HelmetEVA
+
- type: Tag
id: HideContextMenu
- type: Tag
id: HolosignProjector
+- type: Tag
+ id: HonkerCentralControlModule
+
+- type: Tag
+ id: HonkerPeripheralsControlModule
+
+- type: Tag
+ id: HonkerTargetingControlModule
+
+- type: Tag
+ id: HonkerLArm
+
+- type: Tag
+ id: HonkerLLeg
+
+- type: Tag
+ id: HonkerRLeg
+
+- type: Tag
+ id: HonkerRArm
+
- type: Tag #Drop this innate tool instead of deleting it.
id: InnateDontDelete
toolName: tool-quality-sawing-tool-name
spawn: Saw
icon: { sprite: Objects/Specific/Medical/Surgery/saw.rsi, state: saw }
+
+- type: tool
+ id: Honking
+ name: tool-quality-honking-name
+ toolName: tool-quality-honking-tool-name
+ spawn: BikeHorn
+ icon: { sprite: Objects/Fun/bikehorn.rsi, state: icon }
--- /dev/null
+{
+ "copyright" : "Taken from https://github.com/tgstation/tgstation at at https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a",
+ "license" : "CC-BY-SA-3.0",
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "honker_chassis"
+ },
+ {
+ "name": "honker_harness"
+ },
+ {
+ "name": "honker_harness+o"
+ },
+ {
+ "name": "honker_r_arm"
+ },
+ {
+ "name": "honker_r_arm+o"
+ },
+ {
+ "name": "honker_l_arm"
+ },
+ {
+ "name": "honker_l_arm+o"
+ },
+ {
+ "name": "honker_r_leg"
+ },
+ {
+ "name": "honker_r_leg+o"
+ },
+ {
+ "name": "honker_l_leg"
+ },
+ {
+ "name": "honker_l_leg+o"
+ },
+ {
+ "name": "honker0"
+ },
+ {
+ "name": "honker1"
+ },
+ {
+ "name": "honker2"
+ },
+ {
+ "name": "honker3"
+ },
+ {
+ "name": "honker4"
+ },
+ {
+ "name": "honker5"
+ },
+ {
+ "name": "honker6"
+ },
+ {
+ "name": "honker7"
+ },
+ {
+ "name": "honker8"
+ },
+ {
+ "name": "honker9"
+ },
+ {
+ "name": "honker10"
+ },
+ {
+ "name": "honker11"
+ }
+ ]
+}