From 3dacdc03c619f22f0af956c8ffde885e3e501a73 Mon Sep 17 00:00:00 2001
From: MilenVolf <63782763+MilenVolf@users.noreply.github.com>
Date: Fri, 3 Oct 2025 14:08:36 +0300
Subject: [PATCH] Localize space villain arcade (#40641)
---
.../SpaceVillainArcadeComponent.cs | 41 +++++++------------
.../SpaceVillainArcadeSystem.cs | 10 ++++-
.../Locale/en-US/datasets/arcade_villain.ftl | 40 ++++++++++++++++++
.../Prototypes/Datasets/arcade_villain.yml | 17 ++++++++
4 files changed, 80 insertions(+), 28 deletions(-)
create mode 100644 Resources/Locale/en-US/datasets/arcade_villain.ftl
create mode 100644 Resources/Prototypes/Datasets/arcade_villain.yml
diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeComponent.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeComponent.cs
index 3c8a4de2df..35e1f5b89b 100644
--- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeComponent.cs
+++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeComponent.cs
@@ -1,4 +1,5 @@
using Content.Shared.Arcade;
+using Content.Shared.Dataset;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
@@ -23,85 +24,73 @@ public sealed partial class SpaceVillainArcadeComponent : SharedSpaceVillainArca
///
/// The sound played when a new session of the SpaceVillain game is begun.
///
- [DataField("newGameSound")]
+ [DataField]
public SoundSpecifier NewGameSound = new SoundPathSpecifier("/Audio/Effects/Arcade/newgame.ogg");
///
/// The sound played when the player chooses to attack.
///
- [DataField("playerAttackSound")]
+ [DataField]
public SoundSpecifier PlayerAttackSound = new SoundPathSpecifier("/Audio/Effects/Arcade/player_attack.ogg");
///
/// The sound played when the player chooses to heal.
///
- [DataField("playerHealSound")]
+ [DataField]
public SoundSpecifier PlayerHealSound = new SoundPathSpecifier("/Audio/Effects/Arcade/player_heal.ogg");
///
/// The sound played when the player chooses to regain mana.
///
- [DataField("playerChargeSound")]
+ [DataField]
public SoundSpecifier PlayerChargeSound = new SoundPathSpecifier("/Audio/Effects/Arcade/player_charge.ogg");
///
/// The sound played when the player wins.
///
- [DataField("winSound")]
+ [DataField]
public SoundSpecifier WinSound = new SoundPathSpecifier("/Audio/Effects/Arcade/win.ogg");
///
/// The sound played when the player loses.
///
- [DataField("gameOverSound")]
+ [DataField]
public SoundSpecifier GameOverSound = new SoundPathSpecifier("/Audio/Effects/Arcade/gameover.ogg");
///
/// The prefixes that can be used to create the game name.
///
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("possibleFightVerbs")]
- public List PossibleFightVerbs = new()
- {"Defeat", "Annihilate", "Save", "Strike", "Stop", "Destroy", "Robust", "Romance", "Pwn", "Own"};
+ [DataField]
+ public ProtoId PossibleFightVerbs = "SpaceVillainVerbsFight";
///
/// The first names/titles that can be used to construct the name of the villain.
///
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("possibleFirstEnemyNames")]
- public List PossibleFirstEnemyNames = new(){
- "the Automatic", "Farmer", "Lord", "Professor", "the Cuban", "the Evil", "the Dread King",
- "the Space", "Lord", "the Great", "Duke", "General"
- };
+ [DataField]
+ public ProtoId PossibleFirstEnemyNames = "SpaceVillainNamesEnemyFirst";
///
/// The last names that can be used to construct the name of the villain.
///
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("possibleLastEnemyNames")]
- public List PossibleLastEnemyNames = new()
- {
- "Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid",
- "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn"
- };
+ [DataField]
+ public ProtoId PossibleLastEnemyNames = "SpaceVillainNamesEnemyLast";
///
/// The prototypes that can be dispensed as a reward for winning the game.
///
- [ViewVariables(VVAccess.ReadWrite)]
[DataField]
public List PossibleRewards = new();
///
/// The minimum number of prizes the arcade machine can have.
///
- [DataField("rewardMinAmount")]
+ [DataField]
public int RewardMinAmount;
///
/// The maximum number of prizes the arcade machine can have.
///
- [DataField("rewardMaxAmount")]
+ [DataField]
public int RewardMaxAmount;
///
diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs
index bb717c7012..021d6f6f11 100644
--- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs
+++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs
@@ -4,15 +4,18 @@ using Content.Server.Advertise.EntitySystems;
using Content.Shared.Advertise.Components;
using Content.Shared.Arcade;
using Content.Shared.Power;
+using Content.Shared.Random.Helpers;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
+using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server.Arcade.SpaceVillain;
public sealed partial class SpaceVillainArcadeSystem : EntitySystem
{
+ [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
@@ -52,7 +55,7 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem
/// A fight-verb.
public string GenerateFightVerb(SpaceVillainArcadeComponent arcade)
{
- return _random.Pick(arcade.PossibleFightVerbs);
+ return _random.Pick(_prototypeManager.Index(arcade.PossibleFightVerbs));
}
///
@@ -61,7 +64,10 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem
/// An enemy-name.
public string GenerateEnemyName(SpaceVillainArcadeComponent arcade)
{
- return $"{_random.Pick(arcade.PossibleFirstEnemyNames)} {_random.Pick(arcade.PossibleLastEnemyNames)}";
+ var possibleFirstEnemyNames = _prototypeManager.Index(arcade.PossibleFirstEnemyNames);
+ var possibleLastEnemyNames = _prototypeManager.Index(arcade.PossibleLastEnemyNames);
+
+ return $"{_random.Pick(possibleFirstEnemyNames)} {_random.Pick(possibleLastEnemyNames)}";
}
private void OnComponentInit(EntityUid uid, SpaceVillainArcadeComponent component, ComponentInit args)
diff --git a/Resources/Locale/en-US/datasets/arcade_villain.ftl b/Resources/Locale/en-US/datasets/arcade_villain.ftl
new file mode 100644
index 0000000000..b1cb2d5973
--- /dev/null
+++ b/Resources/Locale/en-US/datasets/arcade_villain.ftl
@@ -0,0 +1,40 @@
+# Verbs
+arcade-villain-verbs-fight-1 = Annihilate
+arcade-villain-verbs-fight-2 = Defeat
+arcade-villain-verbs-fight-3 = Destroy
+arcade-villain-verbs-fight-4 = Own
+arcade-villain-verbs-fight-5 = Pwn
+arcade-villain-verbs-fight-6 = Robust
+arcade-villain-verbs-fight-7 = Romance
+arcade-villain-verbs-fight-8 = Save
+arcade-villain-verbs-fight-9 = Stop
+arcade-villain-verbs-fight-10 = Strike
+
+# Enemy names
+arcade-villain-names-enemy-first-1 = Duke
+arcade-villain-names-enemy-first-2 = Farmer
+arcade-villain-names-enemy-first-3 = General
+arcade-villain-names-enemy-first-4 = Lord
+arcade-villain-names-enemy-first-5 = Professor
+arcade-villain-names-enemy-first-6 = the Automatic
+arcade-villain-names-enemy-first-7 = the Cuban
+arcade-villain-names-enemy-first-8 = the Dread King
+arcade-villain-names-enemy-first-9 = the Evil
+arcade-villain-names-enemy-first-10 = the Great
+arcade-villain-names-enemy-first-11 = the Space
+
+arcade-villain-names-enemy-last-1 = Crushulon
+arcade-villain-names-enemy-last-2 = ERPer
+arcade-villain-names-enemy-last-3 = Ectoplasm
+arcade-villain-names-enemy-last-4 = Griefer
+arcade-villain-names-enemy-last-5 = Jeff
+arcade-villain-names-enemy-last-6 = Lizard Man
+arcade-villain-names-enemy-last-7 = Melonoid
+arcade-villain-names-enemy-last-8 = Murdertron
+arcade-villain-names-enemy-last-9 = Peteoid
+arcade-villain-names-enemy-last-10 = Ruin
+arcade-villain-names-enemy-last-11 = Sorcerer
+arcade-villain-names-enemy-last-12 = Uhangoid
+arcade-villain-names-enemy-last-13 = Unicorn
+arcade-villain-names-enemy-last-14 = Vhakoid
+arcade-villain-names-enemy-last-15 = slime
diff --git a/Resources/Prototypes/Datasets/arcade_villain.yml b/Resources/Prototypes/Datasets/arcade_villain.yml
new file mode 100644
index 0000000000..5e4a517f1f
--- /dev/null
+++ b/Resources/Prototypes/Datasets/arcade_villain.yml
@@ -0,0 +1,17 @@
+- type: localizedDataset
+ id: SpaceVillainVerbsFight
+ values:
+ prefix: arcade-villain-verbs-fight-
+ count: 10
+
+- type: localizedDataset
+ id: SpaceVillainNamesEnemyFirst
+ values:
+ prefix: arcade-villain-names-enemy-first-
+ count: 11
+
+- type: localizedDataset
+ id: SpaceVillainNamesEnemyLast
+ values:
+ prefix: arcade-villain-names-enemy-last-
+ count: 15
--
2.51.2