Спавнер: выбор конкретного персонажа (выпадающий список + Заспавнить)
Кроме типовых кнопок (случайный из ростера) добавлен OptionButton со всеми спавнящимися персонажами (у кого есть полноростовая сцена) и кнопка Заспавнить. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
bb16605129
commit
214d6e3c5b
@@ -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
|
1. **Подземелье** (`scenes/Dungeon.tscn`) — разрез убежища à la Fallout Shelter: сетка 6×5
|
||||||
комнат + объекты (фонари/свет). Карта стартует пустой; персонажи создаются **спавнером**
|
комнат + объекты (фонари/свет). Карта стартует пустой; персонажи создаются **спавнером**
|
||||||
(панель внизу: `+ Раб / Монстр / Ребёнок / Игрок`) и **стоят в idle**, пока их не перетащат.
|
(панель внизу: кнопки типов `+ Раб/Монстр/Ребёнок/Игрок` для случайного, или выпадающий список конкретного персонажа + «Заспавнить») и **стоят в idle**, пока их не перетащат.
|
||||||
- **Типы персонажей** (Игрок/Раб/Монстр/Ребёнок) + генерация имён.
|
- **Типы персонажей** (Игрок/Раб/Монстр/Ребёнок) + генерация имён.
|
||||||
- **Тематические комнаты со слотами по типу**: Дойка = 2 раба + 4 ребёнка,
|
- **Тематические комнаты со слотами по типу**: Дойка = 2 раба + 4 ребёнка,
|
||||||
Логово = 1 раб + 1 монстр. Перетаскивание в подходящий слот меняет скелет на
|
Логово = 1 раб + 1 монстр. Перетаскивание в подходящий слот меняет скелет на
|
||||||
|
|||||||
+38
-6
@@ -118,15 +118,13 @@ public partial class RoomMap : Node2D
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ---------- спавнер персонажей ----------
|
// ---------- спавнер персонажей ----------
|
||||||
|
private OptionButton _charPick;
|
||||||
|
|
||||||
private void BuildSpawner()
|
private void BuildSpawner()
|
||||||
{
|
{
|
||||||
var bar = new HBoxContainer { Position = new Vector2(16, GetViewportRect().Size.Y - 46) };
|
var bar = new HBoxContainer { Position = new Vector2(16, GetViewportRect().Size.Y - 46) };
|
||||||
bar.AddThemeConstantOverride("separation", 8);
|
bar.AddThemeConstantOverride("separation", 8);
|
||||||
var lbl = new Label { Text = "Спавн:" };
|
bar.AddChild(BarLabel("Спавн (тип):"));
|
||||||
lbl.AddThemeColorOverride("font_color", Colors.White);
|
|
||||||
lbl.AddThemeConstantOverride("outline_size", 3);
|
|
||||||
lbl.AddThemeColorOverride("font_outline_color", Colors.Black);
|
|
||||||
bar.AddChild(lbl);
|
|
||||||
foreach (var t in new[] { CType.Slave, CType.Monster, CType.Child, CType.Player })
|
foreach (var t in new[] { CType.Slave, CType.Monster, CType.Child, CType.Player })
|
||||||
{
|
{
|
||||||
var tt = t;
|
var tt = t;
|
||||||
@@ -134,14 +132,48 @@ public partial class RoomMap : Node2D
|
|||||||
b.Pressed += () => SpawnCharacter(tt);
|
b.Pressed += () => SpawnCharacter(tt);
|
||||||
bar.AddChild(b);
|
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);
|
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)
|
private void SpawnCharacter(CType type)
|
||||||
{
|
{
|
||||||
string[] roster = type == CType.Monster ? MonsterRoster : type == CType.Child ? ChildRoster
|
string[] roster = type == CType.Monster ? MonsterRoster : type == CType.Child ? ChildRoster
|
||||||
: type == CType.Player ? PlayerRoster : SlaveRoster;
|
: 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);
|
string path = ResolveScene(name);
|
||||||
if (path == null) return;
|
if (path == null) return;
|
||||||
var p = SpawnPawn(path, _rng.Next(Rows));
|
var p = SpawnPawn(path, _rng.Next(Rows));
|
||||||
|
|||||||
Reference in New Issue
Block a user