Skip to content

Commit 39b96e0

Browse files
committed
Changed the way head position marker is handled and closes #126
1 parent e51e0ca commit 39b96e0

File tree

3 files changed

+38
-20
lines changed

3 files changed

+38
-20
lines changed

src/Json/JsonMerger.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,17 @@ public static JObject Merge(JObject original, JObject patch)
2727

2828
if (originalValue == null)
2929
{
30-
original[propName] = patchValue;
30+
JArray? patchArray = patchValue.TryCast<JArray>();
31+
if (patchArray != null)
32+
{
33+
bool isSkins = propName.Equals("skins", StringComparison.OrdinalIgnoreCase);
34+
JArray merged = MergeArrays(new JArray(), patchArray, isSkins);
35+
original[propName] = merged;
36+
}
37+
else
38+
{
39+
original[propName] = patchValue;
40+
}
3141
continue;
3242
}
3343

src/Loader.cs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -652,13 +652,23 @@ public static void LoadPrefabInfoFile(Mod mod, Mod.File file)
652652
var spriteContainer = unitInstance.transform.GetChild(0);
653653
var material = ClearExistingPartsAndExtractMaterial(spriteContainer);
654654

655-
var visualParts = ApplyVisualParts(prefab.visualParts, spriteContainer, material, out Transform headMarker);
655+
var visualParts = ApplyVisualParts(prefab, spriteContainer, material);
656+
657+
Transform? headPositionMarker = null;
658+
foreach (var vp in visualParts)
659+
{
660+
if (vp.visualPart.gameObject.name == prefab.headPositionMarker)
661+
{
662+
headPositionMarker = vp.visualPart.gameObject.transform;
663+
break;
664+
}
665+
}
666+
667+
unitInstance.headPositionMarker = headPositionMarker ?? visualParts[0].visualPart.transform;
656668

657669
var svr = unitInstance.GetComponent<SkinVisualsReference>();
658670
svr.visualParts = visualParts.ToArray();
659671

660-
unitInstance.headPositionMarker = headMarker;
661-
662672
GameObject.DontDestroyOnLoad(unitInstance.gameObject);
663673
Registry.unitPrefabs.Add(prefab, unitInstance.GetComponent<Unit>());
664674

@@ -700,26 +710,20 @@ public static void LoadPrefabInfoFile(Mod mod, Mod.File file)
700710
/// <param name="material">The material to use for the parts.</param>
701711
/// <returns>A list of the created visual parts.</returns>
702712
private static List<SkinVisualsReference.VisualPart> ApplyVisualParts(
703-
List<Visual.VisualPartInfo> partInfos,
713+
Visual.PrefabInfo prefab,
704714
Transform spriteContainer,
705-
Material? material,
706-
out Transform headMarker)
715+
Material? material)
707716
{
717+
if (prefab.visualParts.Count == 0)
718+
return new List<SkinVisualsReference.VisualPart>();
719+
708720
List<SkinVisualsReference.VisualPart> parts = new();
709-
headMarker = spriteContainer;
710721

711-
foreach (var info in partInfos)
722+
foreach (var info in prefab.visualParts)
712723
{
713-
var vp = CreateVisualPart(info, spriteContainer, material);
714-
if (info.headPositionMarker)
715-
{
716-
headMarker = vp.visualPart.transform;
717-
}
718-
parts.Add(vp);
724+
parts.Add(CreateVisualPart(info, spriteContainer, material));
719725
}
720726

721-
if (headMarker == spriteContainer)
722-
headMarker = parts[0].visualPart.gameObject.transform;
723727
return parts;
724728
}
725729

src/Managers/Visual.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,12 @@ public enum PrefabType
6666
}
6767

6868
/// <summary>Represents information about a custom prefab.</summary>
69-
public record PrefabInfo(PrefabType type, string name, List<VisualPartInfo> visualParts);
69+
public record PrefabInfo(
70+
PrefabType type,
71+
string name,
72+
List<VisualPartInfo> visualParts,
73+
string headPositionMarker = ""
74+
);
7075

7176
/// <summary>Represents information about a visual part of a prefab.</summary>
7277
public record VisualPartInfo(
@@ -75,8 +80,7 @@ public record VisualPartInfo(
7580
float rotation = 0f,
7681
Vector2 coordinates = new Vector2(),
7782
Vector2 scale = new Vector2(),
78-
bool tintable = false,
79-
bool headPositionMarker = false
83+
bool tintable = false
8084
);
8185
private static bool enableOutlines = false;
8286
private static bool seenWarningWCPopup = false;

0 commit comments

Comments
 (0)