pk3DS/pk3DS.Core/Structures/Script.cs
Kurt e40d3ce554 Style updates
makes it easier to look at
still looks yuck ;)
2018-08-08 20:56:32 -07:00

58 lines
2.7 KiB
C#

using System;
using System.Linq;
namespace pk3DS.Core
{
public class Script
{
public int Length => BitConverter.ToInt32(Raw, 0x00);
public uint Magic => BitConverter.ToUInt32(Raw, 0x04);
// case 0x0A0AF1E0: code = read_code_block(f); break;
// case 0x0A0AF1EF: debug = read_debug_block(f); break;
public bool Debug => Magic == 0x0A0AF1EF;
public ushort PtrOffset => BitConverter.ToUInt16(Raw, 0x08);
public ushort PtrCount => BitConverter.ToUInt16(Raw, 0x0A);
public int ScriptInstructionStart => BitConverter.ToInt32(Raw, 0x0C);
public int ScriptMovementStart => BitConverter.ToInt32(Raw, 0x10);
public int FinalOffset => BitConverter.ToInt32(Raw, 0x14);
public int AllocatedMemory => BitConverter.ToInt32(Raw, 0x18);
// Generated Attributes
public int CompressedLength => Length - ScriptInstructionStart;
public byte[] CompressedBytes => Raw.Skip(ScriptInstructionStart).ToArray();
public int DecompressedLength => FinalOffset - ScriptInstructionStart;
public uint[] DecompressedInstructions => Scripts.quickDecompress(CompressedBytes, DecompressedLength/4);
public uint[] ScriptCommands => DecompressedInstructions.Take((ScriptMovementStart - ScriptInstructionStart) / 4).ToArray();
public uint[] MoveCommands => DecompressedInstructions.Skip((ScriptMovementStart - ScriptInstructionStart) / 4).ToArray();
public string[] ParseScript => Scripts.parseScript(ScriptCommands);
public string[] ParseMoves => Scripts.parseMovement(MoveCommands);
public string Info => "Data Start: 0x" + ScriptInstructionStart.ToString("X4")
+ Environment.NewLine + "Movement Offset: 0x" + ScriptMovementStart.ToString("X4")
+ Environment.NewLine + "Total Used Size: 0x" + FinalOffset.ToString("X4")
+ Environment.NewLine + "Reserved Size: 0x" + AllocatedMemory.ToString("X4")
+ Environment.NewLine + "Compressed Len: 0x" + CompressedLength.ToString("X4")
+ Environment.NewLine + "Decompressed Len: 0x" + DecompressedLength.ToString("X4")
+ Environment.NewLine + "Compression Ratio: " +
((DecompressedLength - CompressedLength)/(decimal)DecompressedLength).ToString("p1");
public byte[] Raw;
public Script(byte[] data = null)
{
Raw = data ?? new byte[0];
// sub_51AAFC
if ((Raw[8] & 1) != 0)
throw new ArgumentException("Multi-environment script!?");
}
public byte[] Write()
{
return Raw;
}
}
}