diff --git a/assets.h b/assets.h index 659eb74..e233eb1 100644 --- a/assets.h +++ b/assets.h @@ -44,6 +44,8 @@ static const char *LCR_texts[] = "loading" }; +// TODO: define string for CLI arguments for frontends? + static const char *LCR_internalDataFile = "Mtestmap;" "52123 1 :*H1k0" diff --git a/game.h b/game.h index 39b98b9..bf459f2 100644 --- a/game.h +++ b/game.h @@ -207,7 +207,7 @@ static inline void LCR_drawPixelXYSafe(unsigned int x, unsigned int y, #include "assets.h" #include "renderer.h" -#define LCR_MENU_MAX_ITEMS 9 // don't change +#define LCR_MENU_MAX_ITEMS 9 // don't change #define LCR_RESOURCE_ITEM_CHUNK (LCR_MENU_MAX_ITEMS - 1) #define LCR_MENU_TABS 4 @@ -576,6 +576,29 @@ char LCR_gameGetNextDataStrChar(void) return c != LCR_RESOURCE_FILE_SEPARATOR ? c : 0; } +unsigned int LCR_countData(char magicNumber) +{ + unsigned int result = 0; + + LCR_gameRewindDataFile(); + + while (1) + { + char c = LCR_gameGetNextDataFileChar(); + + if (c == magicNumber) + result++; + + while (c != 0 && c != LCR_RESOURCE_FILE_SEPARATOR) + c = LCR_gameGetNextDataFileChar(); + + if (c == 0) + break; + } + + return result; +} + /** Seeks to the Nth data string in the global data file, after the magic number, so that the name is now available for reading. @@ -761,9 +784,12 @@ void LCR_gameInit(int argc, const char **argv) LCR_game.nextRenderFrameTime = 0; LCR_game.nextRacingTickTime = 0; LCR_game.cameraMode = LCR_CAMERA_MODE_DRIVE; + LCR_currentMap.blockCount = 0; // means no map loaded LCR_LOG2("parsing arguments"); + uint8_t quickLoad = 0; + while (argc) // parse arguments { argc--; @@ -774,6 +800,9 @@ void LCR_gameInit(int argc, const char **argv) case 'c': LCR_game.cameraMode = (argv[argc][2] - '0') % 4; break; case 'm': LCR_game.musicOn = argv[argc][2] != '0'; break; case 's': LCR_audio.on = argv[argc][2] != '0'; break; + case 'M': quickLoad = 1; break; + case 'R': quickLoad = 2; break; + case 'P': quickLoad = 3; break; // TODO @@ -783,9 +812,23 @@ void LCR_gameInit(int argc, const char **argv) } } - LCR_gameLoadMainMenuItems(); - LCR_gameSetState(LCR_GAME_STATE_MENU); - LCR_currentMap.blockCount = 0; // means no map loaded + if (quickLoad == 1) + { + LCR_gameLoadMap(LCR_countData('M') - 1); + LCR_gameSetState(LCR_GAME_STATE_LOADING); + LCR_game.menu.selectedTab = 1; + } + else if (quickLoad == 2 || quickLoad == 3) + { + LCR_gameLoadReplay(LCR_countData('R') - 1); + LCR_gameSetState(LCR_GAME_STATE_LOADING); + LCR_game.menu.selectedTab = quickLoad; + } + else + { + LCR_gameLoadMainMenuItems(); + LCR_gameSetState(LCR_GAME_STATE_MENU); + } } /** @@ -1151,14 +1194,14 @@ void LCR_gameHandleInput(void) LCR_gameLoadMainMenuItems(); break; - case 1: + case 1: // maps LCR_gameLoadMap(LCR_game.dataFile.firstItemIndex + LCR_game.menu.selectedItem); LCR_gameSetState(LCR_GAME_STATE_LOADING); break; - case 2: - case 3: + case 2: // view replay + case 3: // play against replay { int mapIndex = LCR_gameLoadReplay(LCR_game.dataFile.firstItemIndex + LCR_game.menu.selectedItem); @@ -1258,12 +1301,12 @@ void LCR_gameHandleInput(void) uint8_t LCR_gameStep(uint32_t time) { + LCR_LOG2("game step (start)"); + uint32_t sleep = 0; int paused = LCR_game.state == LCR_GAME_STATE_MENU || LCR_game.state == LCR_GAME_STATE_RUN_STARTING; - LCR_LOG2("game step (start)"); - LCR_game.time = time; for (int i = 0; i < LCR_KEYS_TOTAL; ++i) @@ -1321,12 +1364,12 @@ LCR_replayOutputStr(_LCR_gameDataCharWrite); if (events & LCR_RACING_EVENT_CRASH_SMALL) { LCR_audioPlaySound(LCR_SOUND_CRASH_SMALL); - LCR_LOG1("crash (small)"); + LCR_LOG2("crash (small)"); } else if (events & LCR_RACING_EVENT_CRASH_BIG) { LCR_audioPlaySound(LCR_SOUND_CRASH_BIG); - LCR_LOG1("crash (big)"); + LCR_LOG2("crash (big)"); } int engineIntensity = LCR_carSpeedKMH() * 2; @@ -1343,7 +1386,8 @@ LCR_replayOutputStr(_LCR_gameDataCharWrite); sleep = (3 * (LCR_game.nextRacingTickTime - time)) / 4; // handle rendering: - if (time >= LCR_game.nextRenderFrameTime) + if (time >= LCR_game.nextRenderFrameTime || + LCR_game.state == LCR_GAME_STATE_LOADING) { LCR_LOG2("rendering next frame");