Skip to content

Commit fd60f46

Browse files
committed
2 parents ffceeec + 34b9b02 commit fd60f46

27 files changed

Lines changed: 2162 additions & 170 deletions

ImMilo/Program.cs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
namespace ImMilo;
1818

19+
using MiloLib.Assets.Ham;
1920
using Veldrid;
2021
using Veldrid.Sdl2;
2122
using Veldrid.StartupUtilities;
@@ -766,10 +767,43 @@ static void UIContent()
766767
hasCustomEditor = true;
767768
}
768769

770+
if(viewingObject is HamMove || viewingObject is MoveGraph || viewingObject is DancerSequence) { hasCustomEditor = true; }
771+
769772
if (hasCustomEditor)
770773
{
771-
if (ImGui.BeginTabBar("Editors"))
772-
{
774+
if (ImGui.BeginTabBar("Editors")) {
775+
776+
if (viewingObject is HamMove move) {
777+
if (ImGui.BeginTabItem("Output")) {
778+
if (ImGui.BeginChild("ScrollText", new Vector2(0, 1000), ImGuiChildFlags.Borders, ImGuiWindowFlags.AlwaysVerticalScrollbar|ImGuiWindowFlags.AlwaysHorizontalScrollbar)) {
779+
780+
ImGui.TextUnformatted(move.ToString());
781+
ImGui.EndChild();
782+
}
783+
ImGui.EndTabItem();
784+
}
785+
}
786+
else if(viewingObject is MoveGraph graph) {
787+
if (ImGui.BeginTabItem("Output")) {
788+
if (ImGui.BeginChild("ScrollText", new Vector2(0, 1000), ImGuiChildFlags.Borders, ImGuiWindowFlags.AlwaysVerticalScrollbar | ImGuiWindowFlags.AlwaysHorizontalScrollbar)) {
789+
790+
ImGui.TextUnformatted(graph.ToString());
791+
ImGui.EndChild();
792+
}
793+
ImGui.EndTabItem();
794+
}
795+
}
796+
else if (viewingObject is DancerSequence seq) {
797+
if (ImGui.BeginTabItem("Output")) {
798+
if (ImGui.BeginChild("ScrollText", new Vector2(0, 1000), ImGuiChildFlags.Borders, ImGuiWindowFlags.AlwaysVerticalScrollbar | ImGuiWindowFlags.AlwaysHorizontalScrollbar)) {
799+
800+
ImGui.TextUnformatted(seq.ToString());
801+
ImGui.EndChild();
802+
}
803+
ImGui.EndTabItem();
804+
}
805+
}
806+
773807
if (viewingObject is RndTex tex)
774808
{
775809
if (ImGui.BeginTabItem(FontAwesome5.Image + " Texture"))

MiloLib/Assets/DirectoryMeta.cs

Lines changed: 78 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Text;
1818
using System.Threading.Tasks;
1919
using static MiloLib.Assets.DirectoryMeta;
20+
using static MiloLib.Assets.Ham.Range;
2021

2122
namespace MiloLib.Assets
2223
{
@@ -466,6 +467,11 @@ public void Write(EndianWriter writer)
466467

467468
writer.WriteInt32((entries.Count * 2) + 4);
468469
writer.WriteUInt32(stringTableSize);
470+
471+
if (revision >= 32)
472+
{
473+
writer.WriteBoolean(false);
474+
}
469475

470476
writer.WriteInt32((int)entries.Count);
471477

@@ -728,11 +734,13 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
728734
Debug.WriteLine("Reading entry ObjectDir " + entry.name.value);
729735
entry.isProxy = true;
730736
entry.obj = new ObjectDir(0).Read(reader, true, this, entry);
731-
732-
dir = new DirectoryMeta();
733-
dir.platform = platform;
734-
dir.Read(reader);
735-
entry.dir = dir;
737+
if (((ObjectDir)entry.obj).inlineProxy && ((ObjectDir)entry.obj).proxyPath.value != "")
738+
{
739+
dir = new DirectoryMeta();
740+
dir.platform = platform;
741+
dir.Read(reader);
742+
entry.dir = dir;
743+
}
736744
break;
737745
case "OverdriveMeterDir":
738746
Debug.WriteLine("Reading entry OverdriveMeterDir " + entry.name.value);
@@ -974,6 +982,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
974982
Debug.WriteLine("Reading entry BandSwatch " + entry.name.value);
975983
entry.obj = new BandSwatch().Read(reader, true, this, entry);
976984
break;
985+
case "BustAMoveData":
986+
Debug.WriteLine("Reading entry BustAMoveData " + entry.name.value);
987+
entry.obj = new BustAMoveData().Read(reader, true, this, entry);
988+
break;
977989
case "Cam":
978990
Debug.WriteLine("Reading entry Cam " + entry.name.value);
979991
entry.obj = new RndCam().Read(reader, true, this, entry);
@@ -1042,6 +1054,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
10421054
Debug.WriteLine("Reading entry ColorPalette " + entry.name.value);
10431055
entry.obj = new ColorPalette().Read(reader, true, this, entry);
10441056
break;
1057+
case "DancerSequence":
1058+
Debug.WriteLine("Reading entry DancerSequence " + entry.name.value);
1059+
entry.obj = new DancerSequence().Read(reader, true, this, entry);
1060+
break;
10451061
case "Environ":
10461062
Debug.WriteLine("Reading entry Environ " + entry.name.value);
10471063
entry.obj = new RndEnviron().Read(reader, true, this, entry);
@@ -1059,6 +1075,22 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
10591075
Debug.WriteLine("Reading entry Group " + entry.name.value);
10601076
entry.obj = new RndGroup().Read(reader, true, this, entry);
10611077
break;
1078+
case "HamBattleData":
1079+
Debug.WriteLine("Reading entry HamBattleData " + entry.name.value);
1080+
entry.obj = new HamBattleData().Read(reader, true, this, entry);
1081+
break;
1082+
case "HamMove":
1083+
Debug.WriteLine("Reading entry HamMove " + entry.name.value);
1084+
entry.obj = new HamMove().Read(reader, true, this, entry);
1085+
break;
1086+
case "HamPartyJumpData":
1087+
Debug.WriteLine("Reading entry HamPartyJumpData " + entry.name.value);
1088+
entry.obj = new HamPartyJumpData().Read(reader, true, this, entry);
1089+
break;
1090+
case "HamSupereasyData":
1091+
Debug.WriteLine("Reading entry HamSupereasyData " + entry.name.value);
1092+
entry.obj = new HamSupereasyData().Read(reader, true, this, entry);
1093+
break;
10621094
case "InlineHelp":
10631095
Debug.WriteLine("Reading entry InlineHelp " + entry.name.value);
10641096
entry.obj = new InlineHelp().Read(reader, true, this, entry);
@@ -1083,6 +1115,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
10831115
Debug.WriteLine("Reading entry MotionBlur " + entry.name.value);
10841116
entry.obj = new RndMotionBlur().Read(reader, true, this, entry);
10851117
break;
1118+
case "MoveGraph":
1119+
Debug.WriteLine("Reading entry MoveGraph " + entry.name.value);
1120+
entry.obj = new MoveGraph().Read(reader, true, this, entry);
1121+
break;
10861122
case "Object":
10871123
Debug.WriteLine("Reading entry Object " + entry.name.value);
10881124
entry.obj = new Object().Read(reader, true, this, entry);
@@ -1113,6 +1149,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
11131149
Debug.WriteLine("Reading entry PostProc " + entry.name.value);
11141150
entry.obj = new RndPostProc().Read(reader, true, this, entry);
11151151
break;
1152+
case "PracticeSection":
1153+
Debug.WriteLine("Reading entry PracticeSection " + entry.name.value);
1154+
entry.obj = new PracticeSection().Read(reader, true, this, entry);
1155+
break;
11161156
case "PropAnim":
11171157
Debug.WriteLine("Reading entry PropAnim " + entry.name.value);
11181158
entry.obj = new RndPropAnim().Read(reader, true, this, entry);
@@ -1362,12 +1402,18 @@ public void WriteEntry(EndianWriter writer, DirectoryMeta.Entry entry)
13621402
case "MoveDir":
13631403
((MoveDir)entry.obj).Write(writer, true, this, entry);
13641404
entry.isProxy = false;
1365-
entry.dir.Write(writer);
1405+
if (entry.dir != null)
1406+
{
1407+
entry.dir.Write(writer);
1408+
}
13661409
break;
13671410
case "ObjectDir":
13681411
((ObjectDir)entry.obj).Write(writer, true, this, entry);
1369-
entry.isProxy = false;
1370-
entry.dir.Write(writer);
1412+
if (entry.dir != null)
1413+
{
1414+
entry.isProxy = false;
1415+
entry.dir.Write(writer);
1416+
}
13711417
break;
13721418
case "OverdriveMeterDir":
13731419
((OverdriveMeterDir)entry.obj).Write(writer, true, this, entry);
@@ -1713,6 +1759,30 @@ public void WriteEntry(EndianWriter writer, DirectoryMeta.Entry entry)
17131759
case "WorldReflection":
17141760
((WorldReflection)entry.obj).Write(writer, true, this, entry);
17151761
break;
1762+
case "DancerSequence":
1763+
((DancerSequence)entry.obj).Write(writer, true, this, entry);
1764+
break;
1765+
case "MoveGraph":
1766+
((MoveGraph)entry.obj).Write(writer, true, this, entry);
1767+
break;
1768+
case "HamMove":
1769+
((HamMove)entry.obj).Write(writer, true, this, entry);
1770+
break;
1771+
case "BustAMoveData":
1772+
((BustAMoveData)entry.obj).Write(writer, true, this, entry);
1773+
break;
1774+
case "PracticeSection":
1775+
((PracticeSection)entry.obj).Write(writer, true, this, entry);
1776+
break;
1777+
case "HamBattleData":
1778+
((HamBattleData)entry.obj).Write(writer, true, this, entry);
1779+
break;
1780+
case "HamPartyJumpData":
1781+
((HamPartyJumpData)entry.obj).Write(writer, true, this, entry);
1782+
break;
1783+
case "HamSupereasyData":
1784+
((HamSupereasyData)entry.obj).Write(writer, true, this, entry);
1785+
break;
17161786
// re-enable when the class is 100%
17171787
//case "CharClip":
17181788
// Debug.WriteLine("Reading entry CharClip " + entry.name.value);
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using System.Collections.Generic;
2+
using System.Diagnostics;
3+
using System.Numerics;
4+
using MiloLib.Assets.Rnd;
5+
using MiloLib.Classes;
6+
using MiloLib.Utils;
7+
8+
namespace MiloLib.Assets.Ham
9+
{
10+
public class BustAMoveData : Object
11+
{
12+
13+
private ushort altRevision;
14+
private ushort revision;
15+
16+
public class BAMPhrase
17+
{
18+
// "How many times this bar phrasing repeats". Ranges from 1 to 100.
19+
int count;
20+
// "How many bars per phrase". Ranges from 1 to 100.
21+
int bars;
22+
23+
public BAMPhrase Read(EndianReader reader)
24+
{
25+
count = reader.ReadInt32();
26+
bars = reader.ReadInt32();
27+
return this;
28+
}
29+
30+
public BAMPhrase Write(EndianWriter writer)
31+
{
32+
writer.WriteInt32(count);
33+
writer.WriteInt32(bars);
34+
return this;
35+
}
36+
};
37+
38+
private uint numPhrases;
39+
public List<BAMPhrase> mPhrases = new();
40+
41+
public BustAMoveData Read(EndianReader reader, bool standalone, DirectoryMeta parent, DirectoryMeta.Entry entry)
42+
{
43+
uint combinedRevision = reader.ReadUInt32();
44+
if (BitConverter.IsLittleEndian) (revision, altRevision) = ((ushort)(combinedRevision & 0xFFFF), (ushort)((combinedRevision >> 16) & 0xFFFF));
45+
else (altRevision, revision) = ((ushort)(combinedRevision & 0xFFFF), (ushort)((combinedRevision >> 16) & 0xFFFF));
46+
47+
base.Read(reader, false, parent, entry);
48+
49+
numPhrases = reader.ReadUInt32();
50+
for (int i = 0; i < numPhrases; i++)
51+
{
52+
mPhrases.Add(new BAMPhrase().Read(reader));
53+
}
54+
55+
if (standalone)
56+
if ((reader.Endianness == Endian.BigEndian ? 0xADDEADDE : 0xDEADDEAD) != reader.ReadUInt32()) throw new Exception("Got to end of standalone asset but didn't find the expected end bytes, read likely did not succeed");
57+
58+
return this;
59+
}
60+
61+
public override void Write(EndianWriter writer, bool standalone, DirectoryMeta parent, DirectoryMeta.Entry? entry)
62+
{
63+
writer.WriteUInt32(BitConverter.IsLittleEndian ? (uint)((altRevision << 16) | revision) : (uint)((revision << 16) | altRevision));
64+
65+
base.Write(writer, false, parent, entry);
66+
67+
writer.WriteUInt32(numPhrases);
68+
foreach (BAMPhrase phrase in mPhrases)
69+
{
70+
phrase.Write(writer);
71+
}
72+
73+
if (standalone)
74+
writer.WriteBlock(new byte[4] { 0xAD, 0xDE, 0xAD, 0xDE });
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)