diff --git a/src/RoomMap.cs b/src/RoomMap.cs index a1da0f0..7d6bfed 100644 --- a/src/RoomMap.cs +++ b/src/RoomMap.cs @@ -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(); + 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()