Working on textbox code.
This commit is contained in:
@@ -7,24 +7,18 @@
|
|||||||
|
|
||||||
#include "textbox.h"
|
#include "textbox.h"
|
||||||
|
|
||||||
char TEXTBOX_TEXT[TEXTBOX_BUFFER_MAX];
|
char TEXTBOX_TEXTS[TEXTBOX_SCROLL_ROWS_MAX * TEXTBOX_CHARS_PER_ROW];
|
||||||
uint8_t TEXTBOX_ROW_COUNT;
|
uint8_t TEXTBOX_ROW_COUNT;
|
||||||
uint8_t TEXTBOX_ROW_CURRENT;
|
uint8_t TEXTBOX_ROW_CURRENT;
|
||||||
|
|
||||||
uint8_t TEXTBOX_TEXT_LENGTH;
|
|
||||||
uint8_t TEXTBOX_STATE;
|
uint8_t TEXTBOX_STATE;
|
||||||
uint8_t TEXTBOX_SCROLL;
|
uint8_t TEXTBOX_SCROLL;
|
||||||
uint8_t TEXTBOX_CHAR_POSITION;
|
|
||||||
|
|
||||||
inline void conversationTextboxInit() {
|
inline void conversationTextboxInit() {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uint8_t TEXTBOX_TILES[TEXTBOX_TILES_MAX];
|
uint8_t TEXTBOX_TILES[TEXTBOX_TILES_MAX];
|
||||||
|
|
||||||
// Reset textbox state
|
// Reset textbox state
|
||||||
TEXTBOX_TEXT[0] = '\0';
|
|
||||||
TEXTBOX_STATE = 0;
|
TEXTBOX_STATE = 0;
|
||||||
TEXTBOX_TEXT_LENGTH = 0;
|
|
||||||
TEXTBOX_SCROLL = 0;
|
|
||||||
|
|
||||||
// Setup window data
|
// Setup window data
|
||||||
move_win(7, SCREENHEIGHT - (TEXTBOX_HEIGHT_IN_TILES * 8));
|
move_win(7, SCREENHEIGHT - (TEXTBOX_HEIGHT_IN_TILES * 8));
|
||||||
@@ -55,26 +49,56 @@ inline void conversationTextboxInit() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void conversationTextboxSetText(char *text, uint8_t length) {
|
void conversationTextboxSetText(char *text) {
|
||||||
uint8_t i, j;
|
uint8_t i, j, k, rowStart, stateFlags;
|
||||||
char c;
|
char c, c2;
|
||||||
uint8_t TEXTBOX_TILES[TEXTBOX_CHAR_ROWS * TEXTBOX_CHARS_PER_ROW];
|
uint8_t TEXTBOX_TILES[TEXTBOX_CHAR_ROWS * TEXTBOX_CHARS_PER_ROW];
|
||||||
|
|
||||||
TEXTBOX_TEXT_LENGTH = 0;
|
for(i = 0; i < TEXTBOX_SCROLL_ROWS_MAX * TEXTBOX_CHARS_PER_ROW; i++) {
|
||||||
i = 0;
|
TEXTBOX_TEXTS[i] = '4';
|
||||||
|
|
||||||
while((c = text[i]) != '\0') {
|
|
||||||
TEXTBOX_TEXT[i] = c;
|
|
||||||
TEXTBOX_TEXT_LENGTH++;
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset textbox state
|
// Reset textbox state
|
||||||
TEXTBOX_STATE = TEXTBOX_STATE_VISIBLE;
|
TEXTBOX_STATE = TEXTBOX_STATE_VISIBLE;
|
||||||
TEXTBOX_SCROLL = 0;
|
TEXTBOX_SCROLL = 0;
|
||||||
TEXTBOX_CHAR_POSITION = 0;
|
TEXTBOX_ROW_CURRENT = 0;
|
||||||
|
|
||||||
// Fill blank characters
|
// Copy source text to buffer, also determine wordwrapping here.
|
||||||
|
i = 0, j = 0, rowStart = 0, stateFlags = 0;
|
||||||
|
while((c = text[i]) != '\0') {
|
||||||
|
if(c == ' ') {
|
||||||
|
// Scan ahead and look at how many chars remain to the next space
|
||||||
|
k = i;
|
||||||
|
while((c2 = text[++k]) != '\0') {
|
||||||
|
if(c2 == '\n' || c2 == ' ') break;
|
||||||
|
if((k - rowStart) >= TEXTBOX_CHARS_PER_ROW) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// IF that number is less than the remaining chars on the current row,
|
||||||
|
// then treat this space like a newline.
|
||||||
|
if(k == (rowStart + TEXTBOX_CHARS_PER_ROW)) {
|
||||||
|
stateFlags |= 1 << 0;
|
||||||
|
}
|
||||||
|
} else if(c == '\n') {
|
||||||
|
stateFlags |= 1 << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do we need to newline?
|
||||||
|
if((stateFlags & (1 << 0)) != 0) {
|
||||||
|
stateFlags &= ~(1 << 0);
|
||||||
|
rowStart += TEXTBOX_CHARS_PER_ROW;
|
||||||
|
j = rowStart;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEXTBOX_TEXTS[j] = c;
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we have organized the string nicely we can prep for rendering. Fill the
|
||||||
|
// tiles with blank chars.
|
||||||
for(j = 0; j < TEXTBOX_CHAR_ROWS; j++) {
|
for(j = 0; j < TEXTBOX_CHAR_ROWS; j++) {
|
||||||
for(i = 0; i < TEXTBOX_CHARS_PER_ROW ; i++) {
|
for(i = 0; i < TEXTBOX_CHARS_PER_ROW ; i++) {
|
||||||
TEXTBOX_TILES[i + (j * TEXTBOX_CHARS_PER_ROW)] = TEXTBOX_TILE_BLANK;
|
TEXTBOX_TILES[i + (j * TEXTBOX_CHARS_PER_ROW)] = TEXTBOX_TILE_BLANK;
|
||||||
@@ -92,45 +116,50 @@ void conversationTextboxSetText(char *text, uint8_t length) {
|
|||||||
|
|
||||||
inline void conversationTextboxUpdate() {
|
inline void conversationTextboxUpdate() {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
char c;
|
||||||
|
|
||||||
// Is the textbox visible?
|
// Is the textbox visible?
|
||||||
if(!(TEXTBOX_STATE & TEXTBOX_STATE_VISIBLE)) return;
|
if(!(TEXTBOX_STATE & TEXTBOX_STATE_VISIBLE)) return;
|
||||||
|
|
||||||
// Has the textbox finished scrolling?
|
// Has the textbox finished scrolling?
|
||||||
if(TEXTBOX_STATE & TEXTBOX_STATE_SCROLLED) {
|
// if(TEXTBOX_STATE & TEXTBOX_STATE_SCROLLED) {
|
||||||
// Is the player attempting to close the textbox?
|
// // Is the player attempting to close the textbox?
|
||||||
if(INPUT_STATE & J_A) {
|
// if(INPUT_STATE & J_A) {
|
||||||
TEXTBOX_STATE &= ~TEXTBOX_STATE_VISIBLE;
|
// TEXTBOX_STATE &= ~TEXTBOX_STATE_VISIBLE;
|
||||||
HIDE_WIN;
|
// HIDE_WIN;
|
||||||
conversationQueueNext();
|
// conversationQueueNext();
|
||||||
}
|
// }
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Move to the next character.
|
// Move to the next character.
|
||||||
if(TEXTBOX_TEXT[TEXTBOX_SCROLL] == ' ') {
|
i = TEXTBOX_ROW_CURRENT * TEXTBOX_CHARS_PER_ROW;
|
||||||
// Whitespace, do nothing.
|
c = TEXTBOX_TEXTS[i+TEXTBOX_SCROLL];
|
||||||
TEXTBOX_CHAR_POSITION++;
|
|
||||||
} else if(TEXTBOX_TEXT[TEXTBOX_SCROLL] == '\n') {
|
|
||||||
// Newline character, move the next tile to the next row.
|
|
||||||
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++;
|
|
||||||
}
|
|
||||||
TEXTBOX_SCROLL++;
|
|
||||||
|
|
||||||
// Update state. TODO: I actually don't really need this state, it's just here
|
// while((c = TEXTBOX_TEXTS[i+TEXTBOX_SCROLL]) == ' ') {
|
||||||
// incase I want to check if the state has scrolled later on? Doubt it though.
|
// TEXTBOX_SCROLL++;
|
||||||
if(TEXTBOX_SCROLL == TEXTBOX_TEXT_LENGTH) {
|
|
||||||
TEXTBOX_STATE |= TEXTBOX_STATE_SCROLLED;
|
// if(TEXTBOX_SCROLL == TEXTBOX_CHARS_MAX) {
|
||||||
|
// c = '\0';
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
if(TEXTBOX_SCROLL == TEXTBOX_CHARS_MAX) {
|
||||||
|
// TEXTBOX_
|
||||||
|
} else if(c != '\0') {
|
||||||
|
set_win_tiles(
|
||||||
|
1 + (TEXTBOX_SCROLL % TEXTBOX_CHARS_PER_ROW),
|
||||||
|
1 + (TEXTBOX_SCROLL / TEXTBOX_CHARS_PER_ROW),
|
||||||
|
1, 1,
|
||||||
|
0x04
|
||||||
|
);
|
||||||
|
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.
|
||||||
|
// if(TEXTBOX_SCROLL == TEXTBOX_TEXT_LENGTH) {
|
||||||
|
// TEXTBOX_STATE |= TEXTBOX_STATE_SCROLLED;
|
||||||
|
// }
|
||||||
}
|
}
|
@@ -39,19 +39,19 @@
|
|||||||
#define TEXTBOX_TILES_ROWS 3
|
#define TEXTBOX_TILES_ROWS 3
|
||||||
#define TEXTBOX_TILE_BLANK COMMON_TILE_3
|
#define TEXTBOX_TILE_BLANK COMMON_TILE_3
|
||||||
|
|
||||||
|
#define TEXTBOX_SCROLL_ROWS_MAX 9
|
||||||
|
|
||||||
|
// STR_ ## name ## _DATA, STR_ ## name ## _LENGTH
|
||||||
#define conversationTextboxString(name) conversationTextboxSetText(\
|
#define conversationTextboxString(name) conversationTextboxSetText(\
|
||||||
STR_ ## name ## _DATA, STR_ ## name ## _LENGTH\
|
STR_ ## name ## _DATA\
|
||||||
)
|
)
|
||||||
|
|
||||||
extern char TEXTBOX_TEXT[TEXTBOX_BUFFER_MAX];
|
extern char TEXTBOX_TEXTS[TEXTBOX_SCROLL_ROWS_MAX * TEXTBOX_CHARS_PER_ROW];
|
||||||
extern uint8_t TEXTBOX_ROW_COUNT;
|
extern uint8_t TEXTBOX_ROW_COUNT;
|
||||||
extern uint8_t TEXTBOX_ROW_CURRENT;
|
extern uint8_t TEXTBOX_ROW_CURRENT;
|
||||||
|
|
||||||
extern uint8_t TEXTBOX_TEXT_LENGTH;
|
|
||||||
extern uint8_t TEXTBOX_STATE;
|
extern uint8_t TEXTBOX_STATE;
|
||||||
extern uint8_t TEXTBOX_SCROLL;
|
extern uint8_t TEXTBOX_SCROLL;
|
||||||
extern uint8_t TEXTBOX_CHAR_POSITION;
|
|
||||||
|
|
||||||
inline void conversationTextboxInit();
|
inline void conversationTextboxInit();
|
||||||
void conversationTextboxSetText(char *text, uint8_t length);
|
void conversationTextboxSetText(char *text);
|
||||||
inline void conversationTextboxUpdate();
|
inline void conversationTextboxUpdate();
|
@@ -166,10 +166,10 @@ void main() {
|
|||||||
|
|
||||||
// Alright begin the game logic here.
|
// Alright begin the game logic here.
|
||||||
// conversationQueueNext();
|
// conversationQueueNext();
|
||||||
char DEBUG_TEXT[] = "HEY";
|
char DEBUG_TEXT[] = "Hello World\nThe quick brown fox jumps over the lazy dog. How now brown cow? The fitness gram pacer test is a";
|
||||||
uint8_t DEBUG_TEXT_LENGTH = 3;
|
// uint8_t DEBUG_TEXT_LENGTH = strlen(DEBUG_TEXT);
|
||||||
for(j = 0; j < DEBUG_TEXT_LENGTH; j++) DEBUG_TEXT[j] = DEBUG_TEXT[j] - 33 + 4;
|
// for(j = 0; j < DEBUG_TEXT_LENGTH; j++) DEBUG_TEXT[j] = DEBUG_TEXT[j] - 33 + 4;
|
||||||
conversationTextboxSetText(DEBUG_TEXT, DEBUG_TEXT_LENGTH);
|
conversationTextboxSetText(DEBUG_TEXT);
|
||||||
|
|
||||||
// Begin the loop
|
// Begin the loop
|
||||||
while(1) {
|
while(1) {
|
||||||
|
Reference in New Issue
Block a user