From 214d6e3c5b7a833749612cfa7edba37bdb936d57 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Tue, 4 Aug 2026 05:25:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BF=D0=B0=D0=B2=D0=BD=D0=B5=D1=80:=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=20=D0=BA=D0=BE=D0=BD=D0=BA=D1=80?= =?UTF-8?q?=D0=B5=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=B6=D0=B0=20(=D0=B2=D1=8B=D0=BF=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=8E=D1=89=D0=B8=D0=B9=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA=20+=20=D0=97=D0=B0=D1=81=D0=BF=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Кроме типовых кнопок (случайный из ростера) добавлен OptionButton со всеми спавнящимися персонажами (у кого есть полноростовая сцена) и кнопка Заспавнить. Co-Authored-By: Claude Opus 4.8 --- README.md | 2 +- src/RoomMap.cs | 44 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a7ae95f..873c8c9 100644 --- a/README.md +++ b/README.md @@ -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 монстр. Перетаскивание в подходящий слот меняет скелет на diff --git a/src/RoomMap.cs b/src/RoomMap.cs index 7d6bfed..9243b95 100644 --- a/src/RoomMap.cs +++ b/src/RoomMap.cs @@ -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 SpawnableCharacters() + { + var list = new List(); + 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));