diff --git a/Content.Client/Mech/Ui/Equipment/MechSoundboardUi.cs b/Content.Client/Mech/Ui/Equipment/MechSoundboardUi.cs
new file mode 100644
index 0000000000..67825318a4
--- /dev/null
+++ b/Content.Client/Mech/Ui/Equipment/MechSoundboardUi.cs
@@ -0,0 +1,36 @@
+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);
+ }
+}
diff --git a/Content.Client/Mech/Ui/Equipment/MechSoundboardUiFragment.xaml b/Content.Client/Mech/Ui/Equipment/MechSoundboardUiFragment.xaml
new file mode 100644
index 0000000000..341eb0ab74
--- /dev/null
+++ b/Content.Client/Mech/Ui/Equipment/MechSoundboardUiFragment.xaml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/Content.Client/Mech/Ui/Equipment/MechSoundboardUiFragment.xaml.cs b/Content.Client/Mech/Ui/Equipment/MechSoundboardUiFragment.xaml.cs
new file mode 100644
index 0000000000..ce00e65299
--- /dev/null
+++ b/Content.Client/Mech/Ui/Equipment/MechSoundboardUiFragment.xaml.cs
@@ -0,0 +1,28 @@
+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? 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));
+ };
+ }
+ }
+}
diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs
index 60eee7f881..9eec5fa34c 100644
--- a/Content.Server/Mech/Systems/MechSystem.cs
+++ b/Content.Server/Mech/Systems/MechSystem.cs
@@ -62,7 +62,8 @@ public sealed class MechSystem : SharedMechSystem
SubscribeLocalEvent(OnExpose);
#region Equipment UI message relays
- SubscribeLocalEvent(RecieveEquipmentUiMesssages);
+ SubscribeLocalEvent(ReceiveEquipmentUiMesssages);
+ SubscribeLocalEvent(ReceiveEquipmentUiMesssages);
#endregion
}
@@ -262,7 +263,7 @@ public sealed class MechSystem : SharedMechSystem
UpdateUserInterface(uid, component);
}
- private void RecieveEquipmentUiMesssages(EntityUid uid, MechComponent component, T args) where T : MechEquipmentUiMessage
+ private void ReceiveEquipmentUiMesssages(EntityUid uid, MechComponent component, T args) where T : MechEquipmentUiMessage
{
var ev = new MechEquipmentUiMessageRelayEvent(args);
var allEquipment = new List(component.EquipmentContainer.ContainedEntities);
diff --git a/Content.Shared/Mech/Equipment/Components/MechSoundboardComponent.cs b/Content.Shared/Mech/Equipment/Components/MechSoundboardComponent.cs
new file mode 100644
index 0000000000..cce5c99563
--- /dev/null
+++ b/Content.Shared/Mech/Equipment/Components/MechSoundboardComponent.cs
@@ -0,0 +1,16 @@
+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
+{
+ ///
+ /// List of sounds that can be played
+ ///
+ [DataField("sounds"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
+ public List Sounds = new();
+}
diff --git a/Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs b/Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs
new file mode 100644
index 0000000000..5431c659c3
--- /dev/null
+++ b/Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs
@@ -0,0 +1,57 @@
+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;
+
+///
+/// Handles everything for mech soundboard.
+///
+public sealed class MechSoundboardSystem : EntitySystem
+{
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly UseDelaySystem _useDelay = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnUiStateReady);
+ SubscribeLocalEvent(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(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);
+ }
+}
diff --git a/Content.Shared/Mech/MechUI.cs b/Content.Shared/Mech/MechUI.cs
index 381760166b..f555fe69bd 100644
--- a/Content.Shared/Mech/MechUI.cs
+++ b/Content.Shared/Mech/MechUI.cs
@@ -67,6 +67,21 @@ public sealed class MechGrabberEjectMessage : MechEquipmentUiMessage
}
}
+///
+/// Event raised for the soundboard equipment to play a sound from its component
+///
+[Serializable, NetSerializable]
+public sealed class MechSoundboardPlayMessage : MechEquipmentUiMessage
+{
+ public int Sound;
+
+ public MechSoundboardPlayMessage(EntityUid equipment, int sound)
+ {
+ Equipment = equipment;
+ Sound = sound;
+ }
+}
+
///
/// BUI state for mechs that also contains all equipment ui states.
///
@@ -100,3 +115,12 @@ public sealed class MechGrabberUiState : BoundUserInterfaceState
public List Contents = new();
public int MaxContents;
}
+
+///
+/// List of sound collection ids to be localized and displayed.
+///
+[Serializable, NetSerializable]
+public sealed class MechSoundboardUiState : BoundUserInterfaceState
+{
+ public List Sounds = new();
+}
diff --git a/Resources/Locale/en-US/mech/soundboard.ftl b/Resources/Locale/en-US/mech/soundboard.ftl
new file mode 100644
index 0000000000..d9c0dc5b8e
--- /dev/null
+++ b/Resources/Locale/en-US/mech/soundboard.ftl
@@ -0,0 +1,6 @@
+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!!!!!
diff --git a/Resources/Locale/en-US/prototypes/catalog/research/technologies.ftl b/Resources/Locale/en-US/prototypes/catalog/research/technologies.ftl
index f98366b17e..4f1f1af5c6 100644
--- a/Resources/Locale/en-US/prototypes/catalog/research/technologies.ftl
+++ b/Resources/Locale/en-US/prototypes/catalog/research/technologies.ftl
@@ -88,6 +88,9 @@ technologies-archaeology-description = Advanced equipment for uncovering the sec
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
diff --git a/Resources/Locale/en-US/tools/tool-qualities.ftl b/Resources/Locale/en-US/tools/tool-qualities.ftl
index 921b61bc59..3036de0219 100644
--- a/Resources/Locale/en-US/tools/tool-qualities.ftl
+++ b/Resources/Locale/en-US/tools/tool-qualities.ftl
@@ -21,3 +21,6 @@ tool-quality-slicing-tool-name = Knife
tool-quality-sawing-name = Sawing
tool-quality-sawing-tool-name = Saw
+
+tool-quality-honking-name = Honking
+tool-quality-honking-tool-name = Bike Horn
diff --git a/Resources/Prototypes/Catalog/Research/technologies.yml b/Resources/Prototypes/Catalog/Research/technologies.yml
index afd7521fc0..dba06d996f 100644
--- a/Resources/Prototypes/Catalog/Research/technologies.yml
+++ b/Resources/Prototypes/Catalog/Research/technologies.yml
@@ -312,6 +312,27 @@
- 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
diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml
index 80d70c95f8..04bc867249 100644
--- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml
+++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml
@@ -172,6 +172,10 @@
sprite: Clothing/Mask/clown.rsi
- type: BreathMask
- type: IdentityBlocker
+ # for H.O.N.K. construction
+ - type: Tag
+ tags:
+ - ClownMask
- type: entity
parent: ClothingMaskBase
diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
index e690d890d6..2129207047 100644
--- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
+++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
@@ -22,6 +22,10 @@
- type: FootstepModifier
footstepSoundCollection:
collection: FootstepClown
+ # for H.O.N.K. construction
+ - type: Tag
+ tags:
+ - ClownShoes
- type: entity
parent: ClothingShoesBaseButcherable
diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/mech.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/mech.yml
index 0ea4629adb..c718093eb5 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/mech.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/mech.yml
@@ -1,3 +1,5 @@
+# Ripley
+
- type: entity
id: RipleyCentralElectronics
parent: BaseElectronics
@@ -22,4 +24,45 @@
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
diff --git a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml
index ae12b37d03..1a95cdd996 100644
--- a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml
+++ b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml
@@ -39,6 +39,11 @@
damage:
types:
Blunt: 0
+ - type: Tool
+ qualities:
+ - Honking
+ useSound:
+ collection: BikeHorn
- type: entity
parent: BaseItem
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml
index 16f273ff44..aad2c52dce 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml
@@ -150,3 +150,132 @@
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
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mecha_equipment.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mecha_equipment.yml
index fbbc13ddfb..2a24173c3a 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mecha_equipment.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mecha_equipment.yml
@@ -23,4 +23,27 @@
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!!!
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml
index d752a28f86..446ad650dc 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml
@@ -103,3 +103,37 @@
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
diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
index c183b8f28d..8b0ba1ba52 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -313,6 +313,9 @@
- OreProcessorMachineCircuitboard
- RipleyCentralElectronics
- RipleyPeripheralsElectronics
+ - HonkerCentralElectronics
+ - HonkerPeripheralsElectronics
+ - HonkerTargetingElectronics
- GeneratorPlasmaMachineCircuitboard
- GeneratorUraniumMachineCircuitboard
- WallmountGeneratorElectronics
@@ -373,6 +376,12 @@
- RipleyLLeg
- RipleyRLeg
- MechEquipmentGrabber
+ - HonkerHarness
+ - HonkerLArm
+ - HonkerRArm
+ - HonkerLLeg
+ - HonkerRLeg
+ - MechEquipmentHorn
- type: MaterialStorage
whitelist:
tags:
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/honker_construction.yml b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/honker_construction.yml
new file mode 100644
index 0000000000..830b6bcb6f
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/honker_construction.yml
@@ -0,0 +1,116 @@
+- 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
diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml
index 5cb7cf7c5d..033804b6fa 100644
--- a/Resources/Prototypes/Recipes/Lathes/electronics.yml
+++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml
@@ -327,6 +327,33 @@
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
diff --git a/Resources/Prototypes/Recipes/Lathes/mech_parts.yml b/Resources/Prototypes/Recipes/Lathes/mech_parts.yml
index f9e47cdcad..c6accfa925 100644
--- a/Resources/Prototypes/Recipes/Lathes/mech_parts.yml
+++ b/Resources/Prototypes/Recipes/Lathes/mech_parts.yml
@@ -1,3 +1,4 @@
+# Ripley
- type: latheRecipe
id: RipleyHarness
result: RipleyHarness
@@ -45,3 +46,57 @@
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
diff --git a/Resources/Prototypes/SoundCollections/troll.yml b/Resources/Prototypes/SoundCollections/troll.yml
new file mode 100644
index 0000000000..9983f11078
--- /dev/null
+++ b/Resources/Prototypes/SoundCollections/troll.yml
@@ -0,0 +1,43 @@
+# 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
diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml
index 5c2fac4564..9c65f89831 100644
--- a/Resources/Prototypes/tags.yml
+++ b/Resources/Prototypes/tags.yml
@@ -141,10 +141,7 @@
id: CigPack
- type: Tag
- id: HardsuitEVA
-
-- type: Tag
- id: HelmetEVA
+ id: ClownMask
- type: Tag
id: ClownRecorder
@@ -152,6 +149,9 @@
- type: Tag
id: ClownRubberStamp
+- type: Tag
+ id: ClownShoes
+
- type: Tag
id: CluwneHorn
@@ -327,9 +327,15 @@
- 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
@@ -348,6 +354,27 @@
- 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
diff --git a/Resources/Prototypes/tool_qualities.yml b/Resources/Prototypes/tool_qualities.yml
index 94fee02462..08e00f17ce 100644
--- a/Resources/Prototypes/tool_qualities.yml
+++ b/Resources/Prototypes/tool_qualities.yml
@@ -53,3 +53,10 @@
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 }
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker0.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker0.png
new file mode 100644
index 0000000000..01601a288d
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker0.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker1.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker1.png
new file mode 100644
index 0000000000..2a7ab1d762
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker1.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker10.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker10.png
new file mode 100644
index 0000000000..6260449569
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker10.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker11.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker11.png
new file mode 100644
index 0000000000..76f6cfd264
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker11.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker2.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker2.png
new file mode 100644
index 0000000000..ea4e806eb5
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker2.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker3.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker3.png
new file mode 100644
index 0000000000..8507c83cbf
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker3.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker4.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker4.png
new file mode 100644
index 0000000000..089e330fbf
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker4.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker5.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker5.png
new file mode 100644
index 0000000000..3dd89c377b
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker5.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker6.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker6.png
new file mode 100644
index 0000000000..857db6f803
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker6.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker7.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker7.png
new file mode 100644
index 0000000000..ff13a670af
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker7.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker8.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker8.png
new file mode 100644
index 0000000000..3dbd188439
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker8.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker9.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker9.png
new file mode 100644
index 0000000000..0dfe4e1fc9
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker9.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_chassis.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_chassis.png
new file mode 100644
index 0000000000..531ae1d850
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_chassis.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_harness+o.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_harness+o.png
new file mode 100644
index 0000000000..9c2eb36cda
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_harness+o.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_harness.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_harness.png
new file mode 100644
index 0000000000..de4a5f8a77
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_harness.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_arm+o.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_arm+o.png
new file mode 100644
index 0000000000..a511f8f542
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_arm+o.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_arm.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_arm.png
new file mode 100644
index 0000000000..41d2c83327
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_arm.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_leg+o.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_leg+o.png
new file mode 100644
index 0000000000..c27a1ff245
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_leg+o.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_leg.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_leg.png
new file mode 100644
index 0000000000..b030880c47
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_l_leg.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_arm+o.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_arm+o.png
new file mode 100644
index 0000000000..0733c1cd5c
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_arm+o.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_arm.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_arm.png
new file mode 100644
index 0000000000..b3897f0985
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_arm.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_leg+o.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_leg+o.png
new file mode 100644
index 0000000000..0c75e70f83
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_leg+o.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_leg.png b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_leg.png
new file mode 100644
index 0000000000..0b0c3ff8e5
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/honker_r_leg.png differ
diff --git a/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/meta.json b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/meta.json
new file mode 100644
index 0000000000..1011b46a07
--- /dev/null
+++ b/Resources/Textures/Objects/Specific/Mech/honker_construction.rsi/meta.json
@@ -0,0 +1,80 @@
+{
+ "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"
+ }
+ ]
+}