You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
4.8 KiB
C#
182 lines
4.8 KiB
C#
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
|
|
{
|
|
public class AppMenu : ChunkLoader
|
|
{
|
|
public List<AppMenuItem> Items = new List<AppMenuItem>();
|
|
public List<byte> AccelShift;
|
|
public List<short> AccelKey;
|
|
public List<short> AccelId;
|
|
|
|
public AppMenu(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public AppMenu(Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
long currentPosition = Reader.Tell();
|
|
uint headerSize = Reader.ReadUInt32();
|
|
int menuOffset = Reader.ReadInt32();
|
|
int menuSize = Reader.ReadInt32();
|
|
if (menuSize == 0) return;
|
|
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++)
|
|
{
|
|
AccelShift = new List<byte>();
|
|
AccelKey = new List<short>();
|
|
AccelId = new List<short>();
|
|
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)
|
|
{
|
|
AppMenuItem newItem = new AppMenuItem(reader);
|
|
newItem.Read();
|
|
Items.Add(newItem);
|
|
|
|
if (newItem.Name.Contains("About")) break;
|
|
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 short Flags = 0;
|
|
public short Id = 0;
|
|
public string Mnemonic = null;
|
|
|
|
public AppMenuItem(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public AppMenuItem(Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
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] == '&')
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
} |