Improve character's max length that can be written to Lumine Hall

This commit is contained in:
Lorenzo Carletti 2020-08-20 07:22:15 +02:00
parent fd444588ce
commit 9e34083ac1
2 changed files with 70 additions and 65 deletions

View File

@ -43,12 +43,7 @@ void readLumineCharacter(byte chr, int *Tiles, unsigned short *hallAddress, int
//Reads a character. Handles special cases.
//The valid characters are printed to the Tiles 1bpp buffer that stores the VWF form of the text.
//This is then converted (when it makes sense to do so) to arrangements by printLumineTiles.
int tileWidth = 2;
int tileHeight = 2;
int chosenLen;
int renderedLen;
byte *glyphRows;
int AlternativeTiles[4];
int AlternativeTiles[SIDE_BUFFER_SIZE][4];
switch(chr)
{
case END:
@ -66,20 +61,42 @@ void readLumineCharacter(byte chr, int *Tiles, unsigned short *hallAddress, int
readLumineCharacterName(pc_names+(chr-PC_START)*(PC_NAME_SIZE + 2), Tiles, AlternativeTiles, hallAddress, length, currPos, currLen);
return;
default:
chosenLen = m2_widths_table[0][chr] & 0xFF;
renderedLen = m2_widths_table[0][chr] >> 8;
glyphRows = &m2_font_table[0][chr * tileWidth * tileHeight * 8];
printLumineCharacter(chr, Tiles, AlternativeTiles, hallAddress, length, currPos, currLen);
}
}
void printLumineCharacter(byte chr, int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], unsigned short *hallAddress, int length, int *currPos, int *currLen)
{
//Function that gets a character and then prints it to the Tiles buffer.
//If the buffer is full, it uses the AlternativeTiles side-buffer and then prints Tiles to the arrangements.
//The same happens to any AlternativeTiles side-buffer that gets full
int tileWidth = 2;
int tileHeight = 2;
int chosenLen = m2_widths_table[LUMINE_FONT][chr] & 0xFF;
int renderedLen = m2_widths_table[LUMINE_FONT][chr] >> 8;
byte *glyphRows = &m2_font_table[LUMINE_FONT][chr * tileWidth * tileHeight * 8];
if(chosenLen <= 0)
return;
if(((*currLen) + chosenLen) >= 8)
{
setTilesToBlank(AlternativeTiles);
for(int i = 0; i < SIDE_BUFFER_SIZE; i++)
setTilesToBlank(AlternativeTiles[i]);
if(renderedLen > 0)
printLumineCharacterInMultiTiles(Tiles, AlternativeTiles, glyphRows, renderedLen, *currLen);
printLumineTiles(Tiles, hallAddress, length, *currPos);
(*currPos)++;
copyTiles(Tiles, AlternativeTiles);
int fullAlternatives = (((*currLen) + chosenLen) >> 3) - 1;
for(int i = 0; i < fullAlternatives; i++)
{
printLumineTiles(AlternativeTiles[i], hallAddress, length, *currPos);
(*currPos)++;
}
copyTiles(Tiles, AlternativeTiles, fullAlternatives);
(*currLen) = ((*currLen) + chosenLen) & 7;
}
else
@ -102,48 +119,23 @@ void printEmptyLumineTile(int *Tiles, unsigned short *hallAddress, int length, i
}
}
void readLumineCharacterName(byte* str, int *Tiles, int* AlternativeTiles, unsigned short *hallAddress, int length, int *currPos, int *currLen)
void readLumineCharacterName(byte* str, int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], unsigned short *hallAddress, int length, int *currPos, int *currLen)
{
//Reads a playable character's name.
//The characters are printed to the Tiles 1bpp buffer that stores the VWF form of the text.
//This is then converted (when it makes sense to do so) to arrangements by printLumineTiles.
//This is separate in order to avoid recursive issues caused by user's tinkering
int tileWidth = 2;
int tileHeight = 2;
int chosenLen;
int renderedLen;
byte *glyphRows;
for(int i = 0; i < PC_NAME_SIZE; i++)
{
if(*(str + 1) == 0xFF)
return;
byte chr = decode_character(*(str++));
chosenLen = m2_widths_table[0][chr] & 0xFF;
renderedLen = m2_widths_table[0][chr] >> 8;
glyphRows = &m2_font_table[0][chr * tileWidth * tileHeight * 8];
if(chosenLen <= 0)
continue;
if(((*currLen) + chosenLen) >= 8)
{
setTilesToBlank(AlternativeTiles);
if(renderedLen > 0)
printLumineCharacterInMultiTiles(Tiles, AlternativeTiles, glyphRows, renderedLen, *currLen);
printLumineTiles(Tiles, hallAddress, length, *currPos);
(*currPos)++;
copyTiles(Tiles, AlternativeTiles);
(*currLen) = ((*currLen) + chosenLen) & 7;
}
else
{
if(renderedLen > 0)
printLumineCharacterInSingleTiles(Tiles, glyphRows, renderedLen, *currLen);
(*currLen) += chosenLen;
}
printLumineCharacter(chr, Tiles, AlternativeTiles, hallAddress, length, currPos, currLen);
}
}
void printLumineCharacterInMultiTiles(int *Tiles, int *AlternativeTiles, byte *glyphRows, int glyphLen, int currLen)
void printLumineCharacterInMultiTiles(int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], byte *glyphRows, int glyphLen, int currLen)
{
//Prints a character to the tiles 1bpp buffer.
//The part that goes beyond the tiles buffer will be printed to the AlternativeTiles buffer
@ -154,26 +146,38 @@ void printLumineCharacterInMultiTiles(int *Tiles, int *AlternativeTiles, byte *g
for(int dTileY = 0; dTileY < tileHeight; dTileY++)
{
int tileIndex = dTileY * 2;
for(int half = 0; half < 2; half++)
int renderedWidth = glyphLen;
int currSelected = 0;
int dTileX = 0;
int *currTile = Tiles;
int *currAlt = AlternativeTiles[currSelected];
while(renderedWidth > 0)
{
int tile = Tiles[tileIndex + half];
int alternativeTile = AlternativeTiles[tileIndex + half];
int endingTile = 0;
int endingAlternativeTile = 0;
for(int row = 0; row < 4; row++)
for(int half = 0; half < 2; half++)
{
unsigned short canvasRow = ((tile >> (8 * row))&0xFF) | (((alternativeTile >> (8 * row))&0xFF) << 8);
unsigned short glyphRow = 0;
if(row + (half * 4) - startY >= 0)
glyphRow = glyphRows[row + (half * 4) - startY + (dTileY * 8 * tileWidth)] << currLen;
else if(dTileY == 1)
glyphRow = glyphRows[row + (half * 4) - startY + 8] << currLen;
canvasRow |= glyphRow;
endingTile |= (canvasRow & 0xFF) << (8 * row);
endingAlternativeTile |= ((canvasRow >> 8) & 0xFF) << (8 * row);
int tile = currTile[tileIndex + half];
int alternativeTile = currAlt[tileIndex + half];
int endingTile = 0;
int endingAlternativeTile = 0;
for(int row = 0; row < 4; row++)
{
unsigned short canvasRow = ((tile >> (8 * row))&0xFF) | (((alternativeTile >> (8 * row))&0xFF) << 8);
unsigned short glyphRow = 0;
if(row + (half * 4) - startY >= 0)
glyphRow = glyphRows[row + (half * 4) - startY + (dTileY * 8 * tileWidth) + (dTileX * 8)] << currLen;
else if(dTileY == 1)
glyphRow = glyphRows[row + (half * 4) - startY + 8 + (dTileX * 8)] << currLen;
canvasRow |= glyphRow;
endingTile |= (canvasRow & 0xFF) << (8 * row);
endingAlternativeTile |= ((canvasRow >> 8) & 0xFF) << (8 * row);
}
currTile[tileIndex + half] = endingTile;
currAlt[tileIndex + half] = endingAlternativeTile;
}
Tiles[tileIndex + half] = endingTile;
AlternativeTiles[tileIndex + half] = endingAlternativeTile;
renderedWidth -= 8;
currTile = AlternativeTiles[dTileX];
currAlt = AlternativeTiles[dTileX + 1];
dTileX++;
}
}
}
@ -209,10 +213,10 @@ void printLumineCharacterInSingleTiles(int *Tiles, byte *glyphRows, int glyphLen
}
}
void copyTiles(int *Tiles, int* AlternativeTiles)
void copyTiles(int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], int indexMatrix)
{
for(int i = 0; i < 4; i++)
Tiles[i] = AlternativeTiles[i];
Tiles[i] = AlternativeTiles[indexMatrix][i];
}
void setTilesToBlank(int *Tiles)
@ -241,7 +245,6 @@ void printLumineTiles(int *Tiles, unsigned short *hallAddress, int length, int c
start += length;
}
}
}
void printVoidLumineTiles(unsigned short *hallAddress, int length, int currPos)
@ -259,7 +262,6 @@ void printVoidLumineTiles(unsigned short *hallAddress, int length, int currPos)
start += length;
}
}
}
int getCharWidth(byte chr)
@ -277,7 +279,7 @@ int getCharWidth(byte chr)
case PC_START+3:
return getPCWidth(pc_names+(chr-PC_START)*(PC_NAME_SIZE + 2));
default:
return m2_widths_table[0][chr] & 0xFF;
return m2_widths_table[LUMINE_FONT][chr] & 0xFF;
}
}
@ -293,7 +295,7 @@ int getPCWidth(byte* pc_ptr)
if(chr == 0xFF)
return length;
chr = decode_character(*(pc_ptr+i));
length += m2_widths_table[0][chr] & 0xFF;
length += m2_widths_table[LUMINE_FONT][chr] & 0xFF;
}
return length;
}

View File

@ -5,6 +5,8 @@
#include "locs.h"
#include "vwf.h"
#define LUMINE_FONT 0
#define SIDE_BUFFER_SIZE 2
#define START_Y 2
#define END 0xFF
#define BLANK 0xFE
@ -20,10 +22,11 @@ void printLumineTiles(int *Tiles, unsigned short *hallAddress, int length, int c
void printVoidLumineTiles(unsigned short *hallAddress, int length, int currPos);
void printEmptyLumineTile(int *Tiles, unsigned short *hallAddress, int length, int currPos, int currLen);
void readLumineCharacter(byte chr, int *Tiles, unsigned short *hallAddress, int length, int *currPos, int *currLen);
void readLumineCharacterName(byte* str, int *Tiles, int* AlternativeTiles, unsigned short *hallAddress, int length, int *currPos, int *currLen);
void printLumineCharacterInMultiTiles(int *Tiles, int *AlternativeTiles, byte *glyphRows, int glyphLen, int currLen);
void readLumineCharacterName(byte* str, int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], unsigned short *hallAddress, int length, int *currPos, int *currLen);
void printLumineCharacterInMultiTiles(int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], byte *glyphRows, int glyphLen, int currLen);
void printLumineCharacterInSingleTiles(int *Tiles, byte *glyphRows, int glyphLen, int currLen);
void copyTiles(int *Tiles, int* AlternativeTiles);
void copyTiles(int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], int indexMatrix);
void printLumineCharacter(byte chr, int *Tiles, int AlternativeTiles[SIDE_BUFFER_SIZE][4], unsigned short *hallAddress, int length, int *currPos, int *currLen);
extern unsigned short* m2_get_hall_address();