Optimizing
This commit is contained in:
@@ -11,10 +11,11 @@ char *TEXTBOX_TEXT;
|
||||
uint8_t TEXTBOX_TEXT_LENGTH;
|
||||
uint8_t TEXTBOX_STATE;
|
||||
uint8_t TEXTBOX_SCROLL;
|
||||
uint8_t TEXTBOX_TILES[TEXTBOX_TILES_MAX];
|
||||
uint8_t TEXTBOX_CHAR_POSITION;
|
||||
|
||||
void conversationTextboxInit() {
|
||||
inline void conversationTextboxInit() {
|
||||
uint8_t i;
|
||||
uint8_t TEXTBOX_TILES[TEXTBOX_TILES_MAX];
|
||||
|
||||
// Reset textbox state
|
||||
TEXTBOX_TEXT = NULL;
|
||||
@@ -42,36 +43,44 @@ void conversationTextboxInit() {
|
||||
TEXTBOX_TILES[TEXTBOX_WIDTH_IN_TILES * i] = BORDER_TILE_CENTER_LEFT;
|
||||
TEXTBOX_TILES[TEXTBOX_WIDTH_IN_TILES * (i+1) - 1] = BORDER_TILE_CENTER_RIGHT;
|
||||
}
|
||||
|
||||
// Setup tiles.
|
||||
set_win_tiles(
|
||||
0, 0,
|
||||
TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES,
|
||||
TEXTBOX_TILES
|
||||
);
|
||||
}
|
||||
|
||||
void conversationTextboxSetText(char *text, uint8_t length) {
|
||||
uint8_t i, j;
|
||||
uint8_t TEXTBOX_TILES[TEXTBOX_CHAR_ROWS * TEXTBOX_CHARS_PER_ROW];
|
||||
|
||||
// Reset textbox state
|
||||
TEXTBOX_TEXT = text;
|
||||
TEXTBOX_TEXT_LENGTH = length;
|
||||
TEXTBOX_STATE = TEXTBOX_STATE_VISIBLE;
|
||||
TEXTBOX_SCROLL = 0;
|
||||
TEXTBOX_CHAR_POSITION = 0;
|
||||
|
||||
// Fill blank characters
|
||||
for(j = 0; j < TEXTBOX_CHAR_ROWS; j++) {
|
||||
for(i = 0; i < TEXTBOX_CHARS_PER_ROW ; i++) {
|
||||
TEXTBOX_TILES[(i+1) + ((j + 1) * TEXTBOX_WIDTH_IN_TILES)] = (
|
||||
TEXTBOX_TILE_BLANK
|
||||
);
|
||||
TEXTBOX_TILES[i + (j * TEXTBOX_CHARS_PER_ROW)] = TEXTBOX_TILE_BLANK;
|
||||
}
|
||||
}
|
||||
|
||||
set_win_tiles(
|
||||
0, 0,
|
||||
TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES,
|
||||
1, 1,
|
||||
TEXTBOX_WIDTH_IN_TILES - 0x02, TEXTBOX_HEIGHT_IN_TILES - 0x02,
|
||||
TEXTBOX_TILES
|
||||
);
|
||||
|
||||
// Show the window layer.
|
||||
SHOW_WIN;
|
||||
}
|
||||
|
||||
void conversationTextboxUpdate() {
|
||||
uint8_t i, j;
|
||||
inline void conversationTextboxUpdate() {
|
||||
uint8_t i;
|
||||
|
||||
// Is the textbox visible?
|
||||
if(!(TEXTBOX_STATE & TEXTBOX_STATE_VISIBLE)) return;
|
||||
@@ -88,35 +97,25 @@ void conversationTextboxUpdate() {
|
||||
}
|
||||
|
||||
// Move to the next character.
|
||||
TEXTBOX_SCROLL++;
|
||||
j = TEXTBOX_WIDTH_IN_TILES + 1;
|
||||
for(i = 0; i < TEXTBOX_SCROLL; i++) {
|
||||
if(TEXTBOX_TEXT[TEXTBOX_SCROLL] == ' ') {
|
||||
// Whitespace, do nothing.
|
||||
if(TEXTBOX_TEXT[i] == ' ') {
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
|
||||
TEXTBOX_CHAR_POSITION++;
|
||||
} else if(TEXTBOX_TEXT[TEXTBOX_SCROLL] == '\n') {
|
||||
// Newline character, move the next tile to the next row.
|
||||
if(TEXTBOX_TEXT[i] == '\n') {
|
||||
j = (
|
||||
(j / TEXTBOX_WIDTH_IN_TILES)*TEXTBOX_WIDTH_IN_TILES
|
||||
) + TEXTBOX_WIDTH_IN_TILES + 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Reveal the next character
|
||||
TEXTBOX_TILES[j] = TEXTBOX_TEXT[i];
|
||||
j++;
|
||||
TEXTBOX_CHAR_POSITION = (
|
||||
(TEXTBOX_CHAR_POSITION / TEXTBOX_CHARS_PER_ROW) + 1
|
||||
) * TEXTBOX_CHARS_PER_ROW;
|
||||
} else {
|
||||
// Reveal the next character. TODO: I'll optimize this.
|
||||
set_win_tiles(
|
||||
1 + (TEXTBOX_CHAR_POSITION % TEXTBOX_CHARS_PER_ROW),
|
||||
1 + (TEXTBOX_CHAR_POSITION / TEXTBOX_CHARS_PER_ROW),
|
||||
1, 1,
|
||||
TEXTBOX_TEXT + TEXTBOX_SCROLL
|
||||
);
|
||||
TEXTBOX_CHAR_POSITION++;
|
||||
}
|
||||
|
||||
// Update the window tilemap
|
||||
set_win_tiles(
|
||||
0, 0,
|
||||
TEXTBOX_WIDTH_IN_TILES,
|
||||
TEXTBOX_HEIGHT_IN_TILES,
|
||||
TEXTBOX_TILES
|
||||
);
|
||||
TEXTBOX_SCROLL++;
|
||||
|
||||
// Update state. TODO: I actually don't really need this state, it's just here
|
||||
// incase I want to check if the state has scrolled later on? Doubt it though.
|
||||
|
Reference in New Issue
Block a user