Спавнер: выбор конкретного персонажа (выпадающий список + Заспавнить)

Кроме типовых кнопок (случайный из ростера) добавлен OptionButton со всеми
спавнящимися персонажами (у кого есть полноростовая сцена) и кнопка Заспавнить.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-08-04 05:25:25 +03:00
co-authored by Claude Opus 4.8
parent bb16605129
commit 214d6e3c5b
2 changed files with 39 additions and 7 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ D:\Godot_v4.7.1\Godot_v4.7.1-stable_mono_win64.exe
1. **Подземелье** (`scenes/Dungeon.tscn`) — разрез убежища à la Fallout Shelter: сетка 6×5
комнат + объекты (фонари/свет). Карта стартует пустой; персонажи создаются **спавнером**
(панель внизу: `+ Раб / Монстр / Ребёнок / Игрок`) и **стоят в idle**, пока их не перетащат.
(панель внизу: кнопки типов `+ Раб/Монстр/Ребёнок/Игрок` для случайного, или выпадающий список конкретного персонажа + «Заспавнить») и **стоят в idle**, пока их не перетащат.
- **Типы персонажей** (Игрок/Раб/Монстр/Ребёнок) + генерация имён.
- **Тематические комнаты со слотами по типу**: Дойка = 2 раба + 4 ребёнка,
Логово = 1 раб + 1 монстр. Перетаскивание в подходящий слот меняет скелет на
+38 -6
View File
@@ -118,15 +118,13 @@ public partial class RoomMap : Node2D
}
// ---------- спавнер персонажей ----------
private OptionButton _charPick;
private void BuildSpawner()
{
var bar = new HBoxContainer { Position = new Vector2(16, GetViewportRect().Size.Y - 46) };
bar.AddThemeConstantOverride("separation", 8);
var lbl = new Label { Text = "Спавн:" };
lbl.AddThemeColorOverride("font_color", Colors.White);
lbl.AddThemeConstantOverride("outline_size", 3);
lbl.AddThemeColorOverride("font_outline_color", Colors.Black);
bar.AddChild(lbl);
bar.AddChild(BarLabel("Спавн (тип):"));
foreach (var t in new[] { CType.Slave, CType.Monster, CType.Child, CType.Player })
{
var tt = t;
@@ -134,14 +132,48 @@ public partial class RoomMap : Node2D
b.Pressed += () => SpawnCharacter(tt);
bar.AddChild(b);
}
bar.AddChild(BarLabel("| персонаж:"));
_charPick = new OptionButton();
foreach (var name in SpawnableCharacters()) _charPick.AddItem(name);
bar.AddChild(_charPick);
var spawnBtn = new Button { Text = "Заспавнить" };
spawnBtn.Pressed += () =>
{
if (_charPick.Selected >= 0) SpawnByName(_charPick.GetItemText(_charPick.Selected));
};
bar.AddChild(spawnBtn);
AddChild(bar);
}
private static Label BarLabel(string text)
{
var l = new Label { Text = text };
l.AddThemeColorOverride("font_color", Colors.White);
l.AddThemeConstantOverride("outline_size", 3);
l.AddThemeColorOverride("font_outline_color", Colors.Black);
return l;
}
private static List<string> SpawnableCharacters()
{
var list = new List<string>();
var root = DirAccess.Open("res://characters");
if (root != null)
foreach (var d in root.GetDirectories())
if (ResolveScene(d) != null) list.Add(d);
list.Sort();
return list;
}
private void SpawnCharacter(CType type)
{
string[] roster = type == CType.Monster ? MonsterRoster : type == CType.Child ? ChildRoster
: type == CType.Player ? PlayerRoster : SlaveRoster;
string name = roster[_rng.Next(roster.Length)];
SpawnByName(roster[_rng.Next(roster.Length)]);
}
private void SpawnByName(string name)
{
string path = ResolveScene(name);
if (path == null) return;
var p = SpawnPawn(path, _rng.Next(Rows));