fixed appmenu and controls

master
REDxEYE 4 years ago
parent fb6948182b
commit f3184e692e

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

Loading…
Cancel
Save