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.
143 lines
3.6 KiB
C#
143 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using NetMFAPatcher.MMFParser.ChunkLoaders.Banks;
|
|
using NetMFAPatcher.Utils;
|
|
using static NetMFAPatcher.MMFParser.Data.ChunkList;
|
|
|
|
namespace NetMFAPatcher.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(ByteIO 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()
|
|
{
|
|
var currentPosition = Reader.Tell();
|
|
var headerSize = Reader.ReadUInt32();
|
|
var menuOffset = Reader.ReadInt32();
|
|
var menuSize = Reader.ReadInt32();
|
|
if (menuSize == 0) return;
|
|
var accelOffset = Reader.ReadInt32();
|
|
var 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 Load(ByteIO reader)
|
|
{
|
|
while(true)
|
|
{
|
|
var 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 int Flags = 0;
|
|
public int Id = 0;
|
|
public string Mnemonic = "";
|
|
public AppMenuItem(ByteIO 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()
|
|
{
|
|
uint flags = (uint) Reader.ReadInt16();
|
|
if (!ByteFlag.GetFlag(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()
|
|
{
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}
|