Mother2GbaTranslation/tools/RenderCastRoll/RenderTools.cs

133 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
namespace RenderCastRoll
{
public class Render
{
public int Y { get; set; }
public int Center_X { get; set; }
public string Text { get; set; }
public int Font { get; set; }
public string Separate_file_name { get; set; }
}
public class RenderRoot
{
public List<Render> Renders { get; set; }
}
public class RenderFont
{
public byte[] font;
public byte[] fontWidth;
public RenderFont(string folder, string fontName)
{
font = File.ReadAllBytes(folder + "m2-font-" + fontName + ".bin");
fontWidth = File.ReadAllBytes(folder + "m2-widths-" + fontName + ".bin");
}
}
public class _1bppTile
{
UInt64 tile;
public _1bppTile() : this(0) { }
public _1bppTile(UInt64 val)
{
tile = val;
}
public byte getRow(int i)
{
return (byte)((tile >> (i * 8)) & 0xFF);
}
public void setRow(int i, byte val)
{
UInt64 mask = ~((UInt64)(0xFF) << (i * 8));
tile = (tile & mask) | ((UInt64)val << (i * 8));
}
public UInt64 getColumn(int i)
{
UInt64 mask = (UInt64)(0x0101010101010101 << i);
return mask & tile;
}
public void setColumn(int i, UInt64 val)
{
UInt64 mask = ~(UInt64)(0x0101010101010101 << i);
tile = (tile & mask) | val;
}
public bool Equals(_1bppTile t)
{
return this.tile == t.tile;
}
public _1bppTile rotateX()
{
_1bppTile newTile = new _1bppTile(tile);
for (int row = 0; row < 8; row++)
{
byte val = newTile.getRow(row);
byte newVal = 0;
for (int i = 0; i < 8; i++)
newVal |= (byte)(((val >> i) & 1) << (7 - i));
newTile.setRow(row, newVal);
}
return newTile;
}
public _1bppTile rotateY()
{
_1bppTile newTile = new _1bppTile(tile);
for (int column = 0; column < 8; column++)
{
UInt64 val = newTile.getColumn(column);
UInt64 newVal = 0;
for (int i = 0; i < 8; i++)
newVal |= ((val >> (i * 8)) & 0xFF) << ((7 - i) * 8);
newTile.setColumn(column, newVal);
}
return newTile;
}
public override String ToString()
{
String str = "";
for (int i = 0; i < 8; i++)
str += getRow(i).ToString("X") + " ";
return str;
}
}
public class WritingBuffer
{
public static readonly int yLength = 3;
public _1bppTile[,] tiles;
public ushort[,] arrangements;
public int used;
public int startPos;
public WritingBuffer()
{
used = 0;
startPos = 0;
tiles = new _1bppTile[yLength, 0x20];
arrangements = new ushort[yLength, 0x20];
for (int i = 0; i < yLength; i++)
for (int j = 0; j < 0x20; j++)
{
tiles[i, j] = new _1bppTile();
arrangements[i, j] = 0x3FF; //Empty tile
}
}
}
}