Спавнер: выбирать полноростовую сцену, а не портрет

У player скелеты названы player1_*, поэтому фолбэк брал первую по алфавиту
(портрет). ResolveScene теперь исключает portrait/fetus/suckle/_body/_head/...
и приоритетит combat -> stand -> любую полноростовую.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-08-04 05:23:00 +03:00
co-authored by Claude Opus 4.8
parent 4350f4a9e7
commit bb16605129
+17 -9
View File
@@ -148,19 +148,27 @@ public partial class RoomMap : Node2D
if (p != null) ShowInfo(p);
}
private static readonly string[] BadStems =
{ "portrait", "fetus", "suckle", "_body", "_head", "dead", "birth", "milk", "down", "baby" };
private static string ResolveScene(string name)
{
if (name == "baby") return "res://characters/baby/human_baby_native.tscn";
foreach (var s in new[] { "combat", "stand" })
{
string path = $"res://characters/{name}/{name}_{s}_native.tscn";
if (ResourceLoader.Exists(path)) return path;
}
var dir = DirAccess.Open($"res://characters/{name}");
if (dir != null)
foreach (var f in dir.GetFiles())
if (f.EndsWith("_native.tscn")) return $"res://characters/{name}/{f}";
return null;
if (dir == null) return null;
var files = new List<string>();
foreach (var f in dir.GetFiles())
if (f.EndsWith("_native.tscn")) files.Add(f);
if (files.Count == 0) return null;
bool Good(string f) { var l = f.ToLower(); foreach (var b in BadStems) if (l.Contains(b)) return false; return true; }
// приоритет: combat -> stand -> любая полноростовая (не портрет/не частичная)
foreach (var key in new[] { "combat", "stand" })
foreach (var f in files)
if (Good(f) && f.ToLower().Contains(key)) return $"res://characters/{name}/{f}";
foreach (var f in files)
if (Good(f)) return $"res://characters/{name}/{f}";
return $"res://characters/{name}/{files[0]}";
}
private void BuildRoomHeaders()