diff --git a/game.h b/game.h index 313531d..aaa9920 100644 --- a/game.h +++ b/game.h @@ -176,7 +176,7 @@ uint8_t LCR_gameGetNextAudioSample(void); #define LCR_GAME_STATE_END 0xff // TODO: move to consts? -#define LCR_MENU_MAX_ITEMS 9 +#define LCR_MENU_MAX_ITEMS 9 // don't change #define LCR_RESOURCE_ITEM_CHUNK (LCR_MENU_MAX_ITEMS - 1) #define LCR_MENU_TABS 4 #define LCR_MENU_STRING_SIZE 16 @@ -202,13 +202,16 @@ struct uint8_t menuSelectedTab; uint8_t menuSelectedItem; +char menuItemNames[LCR_MENU_MAX_ITEMS][LCR_MENU_STRING_SIZE]; +uint8_t menuItemCount; + +const char *menuItemNamePointers[LCR_MENU_MAX_ITEMS]; + struct { int state; ///< -1 if reading external res. f., else pos. // indices and counts are among the resources of the same type - unsigned char loadedItemCount; - char loadedItemNames[LCR_RESOURCE_ITEM_CHUNK * LCR_MENU_STRING_SIZE]; unsigned int firstItemIndex; unsigned int itemsTotal; } resourceFile; @@ -385,6 +388,34 @@ void LCR_gameStartRun(unsigned int mapIndex) LCR_gameResetRun(); } +void LCR_gameEraseMenuItemNames(void) +{ + +for (int i = 0; i < LCR_MENU_MAX_ITEMS; ++i) + for (int j = 0; j < LCR_MENU_STRING_SIZE; ++j) + LCR_game.menuItemNames[i][j] = 0; + +LCR_game.menuItemCount = 0; + +} + +void LCR_gameSetMenuItemStr(uint8_t item, const char *str) +{ + for (int i = 0; i < LCR_MENU_STRING_SIZE - 1; ++i) + { + LCR_game.menuItemNames[item][i] = str[i]; + LCR_game.menuItemNames[item][i + 1] = 0; + } +} + +void LCR_gameLoadMainMenuItems(void) +{ +for (int i = 0; i < 5; ++i) + LCR_gameSetMenuItemStr(i,LCR_texts[4 + i]); + + LCR_game.menuItemCount = 5; +} + void LCR_gameInit(void) { LCR_LOG0("initializing"); @@ -399,8 +430,10 @@ void LCR_gameInit(void) LCR_game.resourceFile.state = 0; -LCR_game.resourceFile.loadedItemCount = 0; -LCR_game.resourceFile.itemsTotal = 0; + for (int i = 0; i < LCR_MENU_MAX_ITEMS; ++i) + LCR_game.menuItemNamePointers[i] = LCR_game.menuItemNames[i]; + + LCR_gameLoadMainMenuItems(); LCR_game.menuSelectedTab = 0; LCR_game.menuSelectedItem = 0; @@ -416,21 +449,20 @@ LCR_game.resourceFile.itemsTotal = 0; LCR_currentMap.blockCount = 0; // means no map loaded } + + /** Loads up to LCR_RESOURCE_ITEM_CHUNK items of given type, starting at given - index (among items of the same type). + index (among items of the same type). This will also load the menu item + names. */ void LCR_gameLoadResourceFileChunk(unsigned int startIndex, char magicNumber) { - LCR_LOG1("loading resources"); - char c; unsigned char state = 0; -for (int i = 0; i < LCR_RESOURCE_ITEM_CHUNK * LCR_MENU_STRING_SIZE; ++i) - LCR_game.resourceFile.loadedItemNames[i] = 0; +LCR_gameEraseMenuItemNames(); - LCR_game.resourceFile.loadedItemCount = 0; LCR_game.resourceFile.firstItemIndex = startIndex; LCR_game.resourceFile.itemsTotal = 0; @@ -473,14 +505,13 @@ for (int i = 0; i < LCR_RESOURCE_ITEM_CHUNK * LCR_MENU_STRING_SIZE; ++i) state >= 1 + LCR_MENU_STRING_SIZE - 1) { state = 255; - LCR_game.resourceFile.loadedItemCount++; + LCR_game.menuItemCount++; - if (LCR_game.resourceFile.loadedItemCount >= LCR_RESOURCE_ITEM_CHUNK) + if (LCR_game.menuItemCount >= LCR_RESOURCE_ITEM_CHUNK) break; } else - LCR_game.resourceFile.loadedItemNames[LCR_MENU_STRING_SIZE * - LCR_game.resourceFile.loadedItemCount + state - 1] = c; + LCR_game.menuItemNames[LCR_game.menuItemCount][state - 1] = c; state++; } @@ -496,6 +527,9 @@ void LCR_gameEnd(void) LCR_LOG0("ending"); } + + + void LCR_gameDraw3DView(void) { LCR_GameUnit carTransform[6]; @@ -581,7 +615,7 @@ void LCR_gameDraw3DView(void) void LCR_gameHandleInput(void) { - int tabSwitchedTo = 0; + int tabSwitchedTo = -1; int scrolled = 0; switch (LCR_game.state) @@ -625,8 +659,7 @@ void LCR_gameHandleInput(void) if (LCR_game.menuSelectedItem < 4) LCR_game.menuSelectedItem++; } - else if (LCR_game.menuSelectedItem < - LCR_game.resourceFile.loadedItemCount - 1) + else if (LCR_game.menuSelectedItem < LCR_game.menuItemCount - 1) LCR_game.menuSelectedItem++; else if (LCR_game.resourceFile.firstItemIndex + LCR_RESOURCE_ITEM_CHUNK < LCR_game.resourceFile.itemsTotal) @@ -687,11 +720,15 @@ void LCR_gameHandleInput(void) break; } - if (tabSwitchedTo || scrolled != 0) + if (tabSwitchedTo == 0) + LCR_gameLoadMainMenuItems(); + else if (tabSwitchedTo > 0 || scrolled != 0) LCR_gameLoadResourceFileChunk( - tabSwitchedTo ? 0 : (LCR_game.resourceFile.firstItemIndex + + (tabSwitchedTo > 0) ? 0 : (LCR_game.resourceFile.firstItemIndex + scrolled * LCR_RESOURCE_ITEM_CHUNK), LCR_game.menuSelectedTab == 1 ? 'M' : 'R'); + + } uint8_t LCR_gameStep(uint32_t time) @@ -804,6 +841,8 @@ uint8_t LCR_gameStep(uint32_t time) if (LCR_game.state == LCR_GAME_STATE_MENU) { + +/* const char *items[LCR_MENU_MAX_ITEMS]; uint8_t itemCount = 1; @@ -819,12 +858,15 @@ if (LCR_game.menuSelectedTab == 0) else { for (int i = 0; i < LCR_game.resourceFile.loadedItemCount; ++i) - items[i + 1] = LCR_game.resourceFile.loadedItemNames + i * LCR_MENU_STRING_SIZE; + items[i + 1] = LCR_game.menuItemNames + i * LCR_MENU_STRING_SIZE; itemCount = LCR_game.resourceFile.loadedItemCount + 1; } +*/ - LCR_rendererDrawMenu(items,itemCount,LCR_game.menuSelectedItem); + LCR_rendererDrawMenu(LCR_texts[LCR_game.menuSelectedTab], + LCR_game.menuItemNamePointers,LCR_game.menuItemCount + 1, + LCR_game.menuSelectedItem); } else LCR_gameDraw3DView(); diff --git a/renderer.h b/renderer.h index 4b92102..84a775d 100644 --- a/renderer.h +++ b/renderer.h @@ -1705,8 +1705,8 @@ void LCR_rendererBlitImage(uint8_t index, unsigned int x, unsigned int y, } } -void LCR_rendererDrawMenu(const char **items, unsigned char itemCount, - char selectedItem) +void LCR_rendererDrawMenu(const char *tabName,const char **items, + unsigned char itemCount,char selectedItem) { int stripHeight = LCR_EFFECTIVE_RESOLUTION_Y / 4; int stripHeight2 = LCR_EFFECTIVE_RESOLUTION_Y / 10; @@ -1750,16 +1750,18 @@ void LCR_rendererDrawMenu(const char **items, unsigned char itemCount, i = stripHeight + (stripHeight2 - LCR_rendererComputeTextHeight(3)) / 2; - for (int j = 0; j < itemCount; ++j) + for (int j = 0; j < itemCount + 1; ++j) { + const char *s = j ? items[j - 1] : tabName; + if (j == selectedItem + 1) for (int y = i - 10; y < i + LCR_rendererComputeTextHeight(3) + 10; ++y) for (int x = LCR_EFFECTIVE_RESOLUTION_X / 4; x < LCR_EFFECTIVE_RESOLUTION_X - LCR_EFFECTIVE_RESOLUTION_X / 4; ++x) LCR_drawPixelXYSafe(x,y,0x5c1b + 4 * ((x & 0x10) == (y & 0x10))); - LCR_rendererDrawText(items[j],(LCR_EFFECTIVE_RESOLUTION_X - - LCR_rendererComputeTextWidth(items[j],3)) / 2,i,0xffff,3); + LCR_rendererDrawText(s,(LCR_EFFECTIVE_RESOLUTION_X - + LCR_rendererComputeTextWidth(s,3)) / 2,i,0xffff,3); if (j == 0) i = stripHeight + stripHeight2;