fixed appmenu and controls

master
REDxEYE 4 years ago
parent fb6948182b
commit f3184e692e

@ -1,6 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
using Ionic.Zip;
using static DotNetCTFDumper.MMFParser.Data.ChunkList; using static DotNetCTFDumper.MMFParser.Data.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders namespace DotNetCTFDumper.MMFParser.ChunkLoaders
@ -19,9 +21,9 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public AppMenu(Chunk chunk) : base(chunk) public AppMenu(Chunk chunk) : base(chunk)
{ {
} }
public override void Print(bool ext) public override void Print(bool ext)
{ {
} }
public override string[] GetReadableData() public override string[] GetReadableData()
@ -31,65 +33,90 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read() public override void Read()
{ {
var currentPosition = Reader.Tell(); long currentPosition = Reader.Tell();
var headerSize = Reader.ReadUInt32(); uint headerSize = Reader.ReadUInt32();
var menuOffset = Reader.ReadInt32(); int menuOffset = Reader.ReadInt32();
var menuSize = Reader.ReadInt32(); int menuSize = Reader.ReadInt32();
if (menuSize == 0) return; if (menuSize == 0) return;
var accelOffset = Reader.ReadInt32(); int accelOffset = Reader.ReadInt32();
var accelSize = Reader.ReadInt32(); int accelSize = Reader.ReadInt32();
Reader.Seek(currentPosition + menuOffset); Reader.Seek(currentPosition + menuOffset);
Reader.Skip(4); Reader.Skip(4);
Load(Reader); Load(Reader);
Reader.Seek(currentPosition + accelOffset); Reader.Seek(currentPosition + accelOffset);
for (int i = 0; i < accelSize/8; i++) for (int i = 0; i < accelSize / 8; i++)
{ {
AccelShift = new List<byte>(); AccelShift = new List<byte>();
AccelKey = new List<short>(); AccelKey = new List<short>();
AccelId = new List<short>(); AccelId = new List<short>();
AccelShift.Add(Reader.ReadByte());; AccelShift.Add(Reader.ReadByte());
;
Reader.Skip(1); Reader.Skip(1);
AccelKey.Add(Reader.ReadInt16()); AccelKey.Add(Reader.ReadInt16());
AccelId.Add(Reader.ReadInt16()); AccelId.Add(Reader.ReadInt16());
Reader.Skip(2); Reader.Skip(2);
} }
}
public void Write(ByteWriter writer)
{
writer.WriteInt32(20);
writer.WriteInt32(20);
writer.WriteInt32(0);
ByteWriter menuDataWriter = new ByteWriter(new MemoryStream());
foreach (AppMenuItem item in Items)
{
item.Write(menuDataWriter);
}
writer.WriteUInt32((uint) (24 + menuDataWriter.BaseStream.Position));
writer.WriteInt32(AccelKey.Count * 8);
writer.WriteInt32(0);
writer.WriteWriter(menuDataWriter);
for (Int32 i = 0; i < AccelKey.Count; i++)
{
writer.WriteInt8(AccelShift[i]);
writer.WriteInt8(0);
writer.WriteInt16(AccelKey[i]);
writer.WriteInt16(AccelId[i]);
writer.WriteInt8(0);
}
} }
public void Load(ByteReader reader) public void Load(ByteReader reader)
{ {
while(true) while (true)
{ {
var newItem = new AppMenuItem(reader); AppMenuItem newItem = new AppMenuItem(reader);
newItem.Read(); newItem.Read();
Items.Add(newItem); Items.Add(newItem);
if (newItem.Name.Contains("About")) break; if (newItem.Name.Contains("About")) break;
if (ByteFlag.GetFlag((uint) newItem.Flags,4)) if (ByteFlag.GetFlag((uint) newItem.Flags, 4))
{ {
Load(reader); Load(reader);
} }
if (ByteFlag.GetFlag((uint) newItem.Flags, 7)) if (ByteFlag.GetFlag((uint) newItem.Flags, 7))
{ {
break; break;
} }
} }
} }
} }
public class AppMenuItem : ChunkLoader public class AppMenuItem : ChunkLoader
{ {
public string Name = ""; public string Name = "";
public int Flags = 0; public short Flags = 0;
public int Id = 0; public short Id = 0;
public string Mnemonic = ""; public string Mnemonic = null;
public AppMenuItem(ByteReader reader) : base(reader) public AppMenuItem(ByteReader reader) : base(reader)
{ {
} }
@ -97,6 +124,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public AppMenuItem(Chunk chunk) : base(chunk) public AppMenuItem(Chunk chunk) : base(chunk)
{ {
} }
public override void Print(bool ext) public override void Print(bool ext)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@ -109,30 +137,46 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read() public override void Read()
{ {
uint flags = (uint) Reader.ReadInt16(); Flags = Reader.ReadInt16();
if (!ByteFlag.GetFlag(flags,4)) if (!ByteFlag.GetFlag((uint) Flags, 4))
{ {
Id = Reader.ReadInt16(); Id = Reader.ReadInt16();
} }
Name = Reader.ReadWideString(); Name = Reader.ReadWideString();
for (int i = 0; i < Name.Length; i++) for (int i = 0; i < Name.Length; i++)
{ {
if(Name[i]=='&') if (Name[i] == '&')
{ {
Mnemonic = Name[i + 1].ToString().ToUpper(); Mnemonic = Name[i + 1].ToString().ToUpper();
} }
Name = Name.Replace("&", ""); Name = Name.Replace("&", "");
} }
Console.WriteLine(Name); Console.WriteLine(Name);
} }
public void Load() public void Load()
{ {
}
public void Write(ByteWriter writer)
{
writer.WriteInt16(Flags);
if (!ByteFlag.GetFlag((uint) Flags, 4))
{
writer.WriteInt16(Id);
}
String MName = Name;
if (Mnemonic != null)
{
MName = MName.Replace(Mnemonic, "&" + Mnemonic);
}
writer.AutoWriteUnicode(MName);
} }
} }
}
}

@ -97,6 +97,10 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
writer.WriteInt32(Button2); writer.WriteInt32(Button2);
writer.WriteInt32(Button3); writer.WriteInt32(Button3);
writer.WriteInt32(Button4); writer.WriteInt32(Button4);
for (int i = 0; i < 8; i++)
{
writer.WriteInt32(0);
}
} }

Loading…
Cancel
Save