Finished basic question box
This commit is contained in:
		@@ -11,26 +11,77 @@ uint8_t QUESTION_BOX_OPTION_COUNT;
 | 
			
		||||
uint8_t QUESTION_BOX_OPTION_CURRENT;
 | 
			
		||||
 | 
			
		||||
void questionBoxSetOptions(char *title, char **options, uint8_t count) {
 | 
			
		||||
  uint8_t i;
 | 
			
		||||
  uint8_t i, j;
 | 
			
		||||
  char buffer[TEXTBOX_CHARS_MAX + 1];
 | 
			
		||||
  char spaces[QUESTION_BOX_QUESTION_SPACES];
 | 
			
		||||
  sprintf(buffer, title);
 | 
			
		||||
 | 
			
		||||
  i = 0;
 | 
			
		||||
  QUESTION_BOX_OPTION_CURRENT = 0;
 | 
			
		||||
  QUESTION_BOX_OPTION_COUNT = count;
 | 
			
		||||
 | 
			
		||||
  for(i = 0; i < QUESTION_BOX_QUESTION_SPACES; i++) {
 | 
			
		||||
    spaces[i] = ' ';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // For each row...
 | 
			
		||||
  for(i = 0; i < count; i++) {
 | 
			
		||||
    if((i & 1) == 0) {
 | 
			
		||||
      j = strlen(options[i]);
 | 
			
		||||
      sprintf(buffer, "%s\n %s", buffer, options[i]);
 | 
			
		||||
    } else {
 | 
			
		||||
      sprintf(buffer, "%s %s", buffer, options[i]);
 | 
			
		||||
      j = QUESTION_BOX_QUESTION_SPACES - j;
 | 
			
		||||
      spaces[j + 1] = '\0';
 | 
			
		||||
      sprintf(buffer, "%s%s%s", buffer, spaces, options[i]);
 | 
			
		||||
      spaces[j + 1] = ' ';
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  conversationTextboxSetText(buffer);
 | 
			
		||||
 | 
			
		||||
  // Modify the textbox state
 | 
			
		||||
  TEXTBOX_STATE |= TEXTBOX_STATE_IS_QUESTION;
 | 
			
		||||
 | 
			
		||||
  // Repurpose old array and draw arrow
 | 
			
		||||
  spaces[0] = QUESTION_BOX_CURSOR - TEXTBOX_FONT_START + FONT_DATA_POSITION;
 | 
			
		||||
  set_bkg_tiles(0x01, TEXTBOX_WIN_Y + 0x02, 1, 1, spaces);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void questionBoxUpdate() {
 | 
			
		||||
  
 | 
			
		||||
  uint8_t tiles[1];
 | 
			
		||||
  uint8_t i;
 | 
			
		||||
 | 
			
		||||
  if((TEXTBOX_STATE & (TEXTBOX_STATE_VISIBLE|TEXTBOX_STATE_IS_QUESTION)) == 0) return;
 | 
			
		||||
 | 
			
		||||
  // Detect input
 | 
			
		||||
  if(INPUT_PRESSED & J_RIGHT) {
 | 
			
		||||
    QUESTION_BOX_OPTION_CURRENT++;
 | 
			
		||||
  } else if(INPUT_PRESSED & J_LEFT) {
 | 
			
		||||
    QUESTION_BOX_OPTION_CURRENT--;
 | 
			
		||||
  } else if(INPUT_PRESSED & J_UP) {
 | 
			
		||||
    QUESTION_BOX_OPTION_CURRENT -= 2;
 | 
			
		||||
  } else if(INPUT_PRESSED & J_DOWN) {
 | 
			
		||||
    QUESTION_BOX_OPTION_CURRENT += 2;
 | 
			
		||||
  } else {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Bound.
 | 
			
		||||
  QUESTION_BOX_OPTION_CURRENT = QUESTION_BOX_OPTION_CURRENT % QUESTION_BOX_OPTION_COUNT;
 | 
			
		||||
 | 
			
		||||
  // Decide where to render arrow
 | 
			
		||||
  for(i = 0; i < QUESTION_BOX_OPTION_COUNT; i++) {
 | 
			
		||||
    if(i == QUESTION_BOX_OPTION_CURRENT) {
 | 
			
		||||
      tiles[0] = QUESTION_BOX_CURSOR - TEXTBOX_FONT_START + FONT_DATA_POSITION;
 | 
			
		||||
    } else {
 | 
			
		||||
      tiles[0] = ' ' - TEXTBOX_FONT_START + FONT_DATA_POSITION;
 | 
			
		||||
    }
 | 
			
		||||
    set_bkg_tiles(
 | 
			
		||||
      0x01 + ((i % 0x02) * QUESTION_BOX_QUESTION_SPACES),
 | 
			
		||||
      TEXTBOX_WIN_Y + 0x02 + (i / 0x02),
 | 
			
		||||
      1, 1,
 | 
			
		||||
      tiles
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -15,6 +15,8 @@
 | 
			
		||||
#include "textbox.h"
 | 
			
		||||
 | 
			
		||||
#define QUESTION_BOX_OPTIONS_MAX ((TEXTBOX_CHAR_ROWS-1)*2)
 | 
			
		||||
#define QUESTION_BOX_CURSOR '>'
 | 
			
		||||
#define QUESTION_BOX_QUESTION_SPACES 9
 | 
			
		||||
 | 
			
		||||
extern uint8_t QUESTION_BOX_OPTION_COUNT;
 | 
			
		||||
extern uint8_t QUESTION_BOX_OPTION_CURRENT;
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ void conversationTextboxSetText(char *text) {
 | 
			
		||||
      
 | 
			
		||||
      // 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 - 1)) {
 | 
			
		||||
      if(k >= (rowStart + TEXTBOX_CHARS_PER_ROW + 1)) {
 | 
			
		||||
        stateFlags |= 1 << 0;
 | 
			
		||||
      }
 | 
			
		||||
    } else if(c == '\n') {
 | 
			
		||||
@@ -70,7 +70,7 @@ void conversationTextboxSetText(char *text) {
 | 
			
		||||
      i++;
 | 
			
		||||
      rowStart = i;// Update the row start (Should this be i+1?)
 | 
			
		||||
      //TODO: can I optimize the next line by using rowStart somehow?
 | 
			
		||||
      j = ((j / TEXTBOX_CHARS_PER_ROW) + 1) * TEXTBOX_CHARS_PER_ROW;// Update destination character position.
 | 
			
		||||
      j = ((j / TEXTBOX_CHARS_PER_ROW)+1) * TEXTBOX_CHARS_PER_ROW;// Update destination character position.
 | 
			
		||||
      TEXTBOX_ROW_COUNT++;
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
@@ -109,7 +109,7 @@ inline void conversationTextboxUpdate() {
 | 
			
		||||
  // Have we finished scrolling?
 | 
			
		||||
  if(TEXTBOX_STATE & TEXTBOX_STATE_SCROLLED) {
 | 
			
		||||
    // Is the user trying to go to the next line?
 | 
			
		||||
    if(INPUT_STATE & J_A) {
 | 
			
		||||
    if(INPUT_PRESSED & J_A) {
 | 
			
		||||
      // First, lets figure out if there's any more text to reveal or not.
 | 
			
		||||
      if((TEXTBOX_ROW_COUNT - TEXTBOX_ROW_CURRENT) < TEXTBOX_TILES_ROWS) {
 | 
			
		||||
        TEXTBOX_STATE &= ~TEXTBOX_STATE_VISIBLE;
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
 | 
			
		||||
#define TEXTBOX_STATE_VISIBLE (1 << 0)
 | 
			
		||||
#define TEXTBOX_STATE_SCROLLED (1 << 1)
 | 
			
		||||
#define TEXTBOX_STATE_IS_QUESTION (1 << 2)
 | 
			
		||||
 | 
			
		||||
#define TEXTBOX_WIDTH_IN_TILES 20
 | 
			
		||||
#define TEXTBOX_HEIGHT_IN_TILES 5
 | 
			
		||||
 
 | 
			
		||||
@@ -8,3 +8,5 @@
 | 
			
		||||
#include "input.h"
 | 
			
		||||
 | 
			
		||||
uint8_t INPUT_STATE = 0x00;
 | 
			
		||||
uint8_t INPUT_PRESSED = 0x00;
 | 
			
		||||
uint8_t INPUT_LAST = 0x00;
 | 
			
		||||
@@ -8,4 +8,6 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "libs.h"
 | 
			
		||||
 | 
			
		||||
extern uint8_t INPUT_STATE;
 | 
			
		||||
extern uint8_t INPUT_STATE;
 | 
			
		||||
extern uint8_t INPUT_PRESSED;
 | 
			
		||||
extern uint8_t INPUT_LAST;
 | 
			
		||||
							
								
								
									
										26
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								src/main.c
									
									
									
									
									
								
							@@ -159,7 +159,6 @@ inline void mainDebugDraw() {
 | 
			
		||||
 | 
			
		||||
void main() {
 | 
			
		||||
  int16_t j;
 | 
			
		||||
  
 | 
			
		||||
  uint8_t filled[GB_BACKGROUND_COLUMNS*GB_BACKGROUND_ROWS];
 | 
			
		||||
 | 
			
		||||
  // Set up the GAMEBOY's registers.
 | 
			
		||||
@@ -171,15 +170,12 @@ void main() {
 | 
			
		||||
 | 
			
		||||
  // Init the random seed
 | 
			
		||||
  initarand(DIV_REG);
 | 
			
		||||
  
 | 
			
		||||
  // Prepare time and input
 | 
			
		||||
  INPUT_STATE = joypad();
 | 
			
		||||
 | 
			
		||||
  // Init things
 | 
			
		||||
  commonTilesInit();
 | 
			
		||||
  conversationTextboxInit();
 | 
			
		||||
  // conversationQueueInit();
 | 
			
		||||
  // pokerInit();
 | 
			
		||||
  conversationQueueInit();
 | 
			
		||||
  pokerInit();
 | 
			
		||||
 | 
			
		||||
  // Fill screen white
 | 
			
		||||
  for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) filled[j] = COMMON_TILE_3;
 | 
			
		||||
@@ -187,24 +183,23 @@ void main() {
 | 
			
		||||
  SCX_REG = 0x00;
 | 
			
		||||
  SCY_REG = 0x00;
 | 
			
		||||
 | 
			
		||||
  // Alright begin the game logic here.
 | 
			
		||||
  char *options[2] = {
 | 
			
		||||
    "Yes", "No"
 | 
			
		||||
  };
 | 
			
		||||
  questionBoxSetOptions("Title", options, 0x02);
 | 
			
		||||
 | 
			
		||||
  // Now turn the screen on
 | 
			
		||||
  DISPLAY_ON;
 | 
			
		||||
  enable_interrupts();
 | 
			
		||||
  wait_vbl_done();
 | 
			
		||||
 | 
			
		||||
  // Begin game
 | 
			
		||||
  conversationQueueNext();
 | 
			
		||||
 | 
			
		||||
  // Begin the loop
 | 
			
		||||
  while(1) {
 | 
			
		||||
    // Perform non-graphical code updates
 | 
			
		||||
    wait_vbl_done();
 | 
			
		||||
 | 
			
		||||
    // Update the input state
 | 
			
		||||
    INPUT_LAST = INPUT_STATE;
 | 
			
		||||
    INPUT_STATE = joypad();
 | 
			
		||||
    INPUT_PRESSED = (~INPUT_LAST) & INPUT_STATE;
 | 
			
		||||
 | 
			
		||||
    // Tick time.
 | 
			
		||||
    timeUpdate();
 | 
			
		||||
@@ -212,15 +207,12 @@ void main() {
 | 
			
		||||
    // Update conversation pause effect
 | 
			
		||||
    conversationPauseUpdate();
 | 
			
		||||
 | 
			
		||||
    // Update question box.
 | 
			
		||||
    // Update question box and textbox
 | 
			
		||||
    questionBoxUpdate();
 | 
			
		||||
 | 
			
		||||
    // Update conversation textbox
 | 
			
		||||
    conversationTextboxUpdate();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Update conversation fade effect
 | 
			
		||||
    conversationFadeUpdate();
 | 
			
		||||
    // mainDebugDraw();
 | 
			
		||||
    mainDebugDraw();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user