Skip to content

Commit 34b9b02

Browse files
authored
Merge pull request #11 from rjkiv/ham3
Add support for several DC3 specific objects
2 parents 7e3dd4b + 9b2b813 commit 34b9b02

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
{
@@ -455,6 +456,11 @@ public void Write(EndianWriter writer)
455456

456457
writer.WriteInt32((entries.Count * 2) + 4);
457458
writer.WriteUInt32(stringTableSize);
459+
460+
if (revision >= 32)
461+
{
462+
writer.WriteBoolean(false);
463+
}
458464

459465
writer.WriteInt32((int)entries.Count);
460466

@@ -717,11 +723,13 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
717723
Debug.WriteLine("Reading entry ObjectDir " + entry.name.value);
718724
entry.isProxy = true;
719725
entry.obj = new ObjectDir(0).Read(reader, true, this, entry);
720-
721-
dir = new DirectoryMeta();
722-
dir.platform = platform;
723-
dir.Read(reader);
724-
entry.dir = dir;
726+
if (((ObjectDir)entry.obj).inlineProxy && ((ObjectDir)entry.obj).proxyPath.value != "")
727+
{
728+
dir = new DirectoryMeta();
729+
dir.platform = platform;
730+
dir.Read(reader);
731+
entry.dir = dir;
732+
}
725733
break;
726734
case "OverdriveMeterDir":
727735
Debug.WriteLine("Reading entry OverdriveMeterDir " + entry.name.value);
@@ -956,6 +964,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
956964
Debug.WriteLine("Reading entry BandSwatch " + entry.name.value);
957965
entry.obj = new BandSwatch().Read(reader, true, this, entry);
958966
break;
967+
case "BustAMoveData":
968+
Debug.WriteLine("Reading entry BustAMoveData " + entry.name.value);
969+
entry.obj = new BustAMoveData().Read(reader, true, this, entry);
970+
break;
959971
case "Cam":
960972
Debug.WriteLine("Reading entry Cam " + entry.name.value);
961973
entry.obj = new RndCam().Read(reader, true, this, entry);
@@ -1024,6 +1036,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
10241036
Debug.WriteLine("Reading entry ColorPalette " + entry.name.value);
10251037
entry.obj = new ColorPalette().Read(reader, true, this, entry);
10261038
break;
1039+
case "DancerSequence":
1040+
Debug.WriteLine("Reading entry DancerSequence " + entry.name.value);
1041+
entry.obj = new DancerSequence().Read(reader, true, this, entry);
1042+
break;
10271043
case "Environ":
10281044
Debug.WriteLine("Reading entry Environ " + entry.name.value);
10291045
entry.obj = new RndEnviron().Read(reader, true, this, entry);
@@ -1041,6 +1057,22 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
10411057
Debug.WriteLine("Reading entry Group " + entry.name.value);
10421058
entry.obj = new RndGroup().Read(reader, true, this, entry);
10431059
break;
1060+
case "HamBattleData":
1061+
Debug.WriteLine("Reading entry HamBattleData " + entry.name.value);
1062+
entry.obj = new HamBattleData().Read(reader, true, this, entry);
1063+
break;
1064+
case "HamMove":
1065+
Debug.WriteLine("Reading entry HamMove " + entry.name.value);
1066+
entry.obj = new HamMove().Read(reader, true, this, entry);
1067+
break;
1068+
case "HamPartyJumpData":
1069+
Debug.WriteLine("Reading entry HamPartyJumpData " + entry.name.value);
1070+
entry.obj = new HamPartyJumpData().Read(reader, true, this, entry);
1071+
break;
1072+
case "HamSupereasyData":
1073+
Debug.WriteLine("Reading entry HamSupereasyData " + entry.name.value);
1074+
entry.obj = new HamSupereasyData().Read(reader, true, this, entry);
1075+
break;
10441076
case "InlineHelp":
10451077
Debug.WriteLine("Reading entry InlineHelp " + entry.name.value);
10461078
entry.obj = new InlineHelp().Read(reader, true, this, entry);
@@ -1065,6 +1097,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
10651097
Debug.WriteLine("Reading entry MotionBlur " + entry.name.value);
10661098
entry.obj = new RndMotionBlur().Read(reader, true, this, entry);
10671099
break;
1100+
case "MoveGraph":
1101+
Debug.WriteLine("Reading entry MoveGraph " + entry.name.value);
1102+
entry.obj = new MoveGraph().Read(reader, true, this, entry);
1103+
break;
10681104
case "Object":
10691105
Debug.WriteLine("Reading entry Object " + entry.name.value);
10701106
entry.obj = new Object().Read(reader, true, this, entry);
@@ -1095,6 +1131,10 @@ public void ReadEntry(EndianReader reader, DirectoryMeta.Entry entry)
10951131
Debug.WriteLine("Reading entry PostProc " + entry.name.value);
10961132
entry.obj = new RndPostProc().Read(reader, true, this, entry);
10971133
break;
1134+
case "PracticeSection":
1135+
Debug.WriteLine("Reading entry PracticeSection " + entry.name.value);
1136+
entry.obj = new PracticeSection().Read(reader, true, this, entry);
1137+
break;
10981138
case "PropAnim":
10991139
Debug.WriteLine("Reading entry PropAnim " + entry.name.value);
11001140
entry.obj = new RndPropAnim().Read(reader, true, this, entry);
@@ -1344,12 +1384,18 @@ public void WriteEntry(EndianWriter writer, DirectoryMeta.Entry entry)
13441384
case "MoveDir":
13451385
((MoveDir)entry.obj).Write(writer, true, this, entry);
13461386
entry.isProxy = false;
1347-
entry.dir.Write(writer);
1387+
if (entry.dir != null)
1388+
{
1389+
entry.dir.Write(writer);
1390+
}
13481391
break;
13491392
case "ObjectDir":
13501393
((ObjectDir)entry.obj).Write(writer, true, this, entry);
1351-
entry.isProxy = false;
1352-
entry.dir.Write(writer);
1394+
if (entry.dir != null)
1395+
{
1396+
entry.isProxy = false;
1397+
entry.dir.Write(writer);
1398+
}
13531399
break;
13541400
case "OverdriveMeterDir":
13551401
((OverdriveMeterDir)entry.obj).Write(writer, true, this, entry);
@@ -1696,6 +1742,30 @@ public void WriteEntry(EndianWriter writer, DirectoryMeta.Entry entry)
16961742
case "WorldReflection":
16971743
((WorldReflection)entry.obj).Write(writer, true, this, entry);
16981744
break;
1745+
case "DancerSequence":
1746+
((DancerSequence)entry.obj).Write(writer, true, this, entry);
1747+
break;
1748+
case "MoveGraph":
1749+
((MoveGraph)entry.obj).Write(writer, true, this, entry);
1750+
break;
1751+
case "HamMove":
1752+
((HamMove)entry.obj).Write(writer, true, this, entry);
1753+
break;
1754+
case "BustAMoveData":
1755+
((BustAMoveData)entry.obj).Write(writer, true, this, entry);
1756+
break;
1757+
case "PracticeSection":
1758+
((PracticeSection)entry.obj).Write(writer, true, this, entry);
1759+
break;
1760+
case "HamBattleData":
1761+
((HamBattleData)entry.obj).Write(writer, true, this, entry);
1762+
break;
1763+
case "HamPartyJumpData":
1764+
((HamPartyJumpData)entry.obj).Write(writer, true, this, entry);
1765+
break;
1766+
case "HamSupereasyData":
1767+
((HamSupereasyData)entry.obj).Write(writer, true, this, entry);
1768+
break;
16991769
// re-enable when the class is 100%
17001770
//case "CharClip":
17011771
// 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)