diff --git a/game.h b/game.h index 55eeaf5..7ce7864 100644 --- a/game.h +++ b/game.h @@ -189,6 +189,10 @@ struct uint8_t controlMode; uint8_t debugDraw; uint8_t musicVolume; + uint8_t keyStates[LCR_KEYS_TOTAL]; /**< Assures unchanging key states + during a single frame, hold number of + frames for which the key has been + continuously held. */ struct { @@ -226,11 +230,6 @@ static inline void LCR_drawPixelXYSafe(unsigned int x, unsigned int y, #include "renderer.h" #include "audio.h" -uint8_t LCR_keyStates[LCR_KEYS_TOTAL]; /**< Assures unchanging key states - during a single frame, holds - number of frames for which the key - has been continuously held. */ - void LCR_drawPixelXYUnsafe(unsigned int x, unsigned int y, uint16_t color) { @@ -370,7 +369,6 @@ LCR_seekResourceByIndex(0); // TODO LCR_mapLoadFromStr(LCR_gameGetNextResourceStrChar); LCR_rendererLoadMap(); LCR_gameResetRun(); - LCR_racingRestart(); } void LCR_gameInit(void) @@ -378,7 +376,7 @@ void LCR_gameInit(void) LCR_LOG0("initializing"); for (int i = 0; i < LCR_KEYS_TOTAL; ++i) - LCR_keyStates[i] = 0; + LCR_game.keyStates[i] = 0; LCR_rendererInit(); LCR_racingInit(); @@ -402,12 +400,8 @@ for (int i = 0; i < LCR_RESOURCE_ITEM_CHUNK; ++i) LCR_game.musicVolume = 255; LCR_game.nextRenderFrameTime = 0; LCR_game.nextRacingTickTime = 0; - LCR_game.controlMode = LCR_CONTROL_MODE_FREECAM; + LCR_game.controlMode = LCR_CONTROL_MODE_DRIVE; LCR_gameStartRun(); - -LCR_game.state = LCR_GAME_STATE_RUN; - - } /** @@ -447,99 +441,153 @@ void LCR_gameDraw3DView(void) LCR_rendererDraw(); - int val = LCR_carSpeedKMH(); - - if (val < 5) // don't show tiny oscillations when still - val = 0; - - char str[6]; - - str[0] = val >= 100 ? '0' + (val / 100) % 10 : ' '; - str[1] = val >= 10 ? '0' + (val / 10) % 10 : ' '; - str[2] = '0' + val % 10; - str[3] = 0; - - LCR_rendererDrawText(str, - LCR_EFFECTIVE_RESOLUTION_X - - LCR_rendererComputeTextWidth(str,2) - 20, - LCR_EFFECTIVE_RESOLUTION_Y - - LCR_rendererComputeTextHeight(2) - 20,0,2); - - val = LCR_racingGetRunTimeMS() / 1000; // seconds - - str[3] = '0' + (val % 60) / 10; - str[4] = '0' + val % 10; - - val = (val / 60) % 100; // minutes - - str[0] = '0' + val / 10; - str[1] = '0' + val % 10; - str[2] = '\''; - str[5] = 0; - - LCR_rendererDrawText(str,20,LCR_EFFECTIVE_RESOLUTION_Y - - LCR_rendererComputeTextHeight(2) - 20,0,2); - #if LCR_SETTING_DEBUG_PHYSICS_DRAW LCR_GameUnit camTr[7]; LCR_rendererGetCameraTransform(camTr,camTr + 3,camTr + 6); LCR_physicsDebugDraw(camTr,camTr + 3,camTr[6]); #endif + + // GUI/HUD: + + char str[6]; + + switch (LCR_game.state) + { + case LCR_GAME_STATE_RUN_STARTING: + str[0] = '0' + LCR_SETTING_COUNTDOWN_SECONDS - + (LCR_game.time - LCR_game.stateStartTime) / 1000; + str[1] = 0; + + LCR_rendererDrawText(str, + (LCR_EFFECTIVE_RESOLUTION_X - LCR_rendererComputeTextWidth(str,8)) / 2, + LCR_EFFECTIVE_RESOLUTION_Y / 2,0x0707,8); + break; + + default: + { + int val = LCR_carSpeedKMH(); + + if (val < 5) // don't show tiny oscillations when still + val = 0; + + str[0] = val >= 100 ? '0' + (val / 100) % 10 : ' '; + str[1] = val >= 10 ? '0' + (val / 10) % 10 : ' '; + str[2] = '0' + val % 10; + str[3] = 0; + + LCR_rendererDrawText(str, + LCR_EFFECTIVE_RESOLUTION_X - + LCR_rendererComputeTextWidth(str,2) - 20, + LCR_EFFECTIVE_RESOLUTION_Y - + LCR_rendererComputeTextHeight(2) - 20,0,2); + + val = LCR_racingGetRunTimeMS() / 1000; // seconds + + str[3] = '0' + (val % 60) / 10; + str[4] = '0' + val % 10; + + val = (val / 60) % 100; // minutes + + str[0] = '0' + val / 10; + str[1] = '0' + val % 10; + str[2] = '\''; + str[5] = 0; + + LCR_rendererDrawText(str,20,LCR_EFFECTIVE_RESOLUTION_Y - + LCR_rendererComputeTextHeight(2) - 20,0,2); + + break; + } + } } uint8_t LCR_gameStep(uint32_t time) { uint32_t sleep = 0; + int paused = 0; LCR_LOG2("game step start"); LCR_game.time = time; for (int i = 0; i < LCR_KEYS_TOTAL; ++i) - LCR_keyStates[i] = LCR_keyPressed(i) ? - (LCR_keyStates[i] < 255 ? LCR_keyStates[i] + 1 : 255) : 0; + LCR_game.keyStates[i] = LCR_keyPressed(i) ? + (LCR_game.keyStates[i] < 255 ? LCR_game.keyStates[i] + 1 : 255) : 0; - if (LCR_keyStates[LCR_KEY_B] == 1) + switch (LCR_game.state) + { + case LCR_GAME_STATE_MENU: + paused = 1; + + if (LCR_game.keyStates[LCR_KEY_B] == 1) + LCR_gameSetState(LCR_GAME_STATE_RUN); + + break; + + case LCR_GAME_STATE_RUN_STARTING: + paused = 1; + + if (LCR_game.time - LCR_game.stateStartTime + >= 1000 * LCR_SETTING_COUNTDOWN_SECONDS) + LCR_gameSetState(LCR_GAME_STATE_RUN); + + // fall through + default: + if (LCR_game.keyStates[LCR_KEY_B] == 1) + LCR_gameSetState(LCR_GAME_STATE_MENU); + else if (LCR_game.keyStates[LCR_KEY_A] == 1) + LCR_gameResetRun(); + + break; + } + + + +/* + if (LCR_game.keyStates[LCR_KEY_B] == 1) LCR_game.controlMode = LCR_game.controlMode == LCR_CONTROL_MODE_FREECAM ? LCR_CONTROL_MODE_DRIVE : LCR_CONTROL_MODE_FREECAM; - else if (LCR_keyStates[LCR_KEY_B] == 30) + else if (LCR_game.keyStates[LCR_KEY_B] == 30) LCR_gameResetRun(); - +*/ LCR_GameUnit offsets[5]; for (int i = 0; i < 5; ++i) offsets[i] = 0; - +/* if (LCR_game.controlMode == LCR_CONTROL_MODE_FREECAM) { - if (LCR_keyStates[LCR_KEY_A]) + if (LCR_game.keyStates[LCR_KEY_A]) { - if (LCR_keyStates[LCR_KEY_UP]) + if (LCR_game.keyStates[LCR_KEY_UP]) offsets[4] = LCR_FREE_CAMERA_TURN_STEP; - else if (LCR_keyStates[LCR_KEY_DOWN]) + else if (LCR_game.keyStates[LCR_KEY_DOWN]) offsets[4] -= LCR_FREE_CAMERA_TURN_STEP; - if (LCR_keyStates[LCR_KEY_RIGHT]) + if (LCR_game.keyStates[LCR_KEY_RIGHT]) offsets[3] -= LCR_FREE_CAMERA_TURN_STEP; - else if (LCR_keyStates[LCR_KEY_LEFT]) + else if (LCR_game.keyStates[LCR_KEY_LEFT]) offsets[3] = LCR_FREE_CAMERA_TURN_STEP; } else { - if (LCR_keyStates[LCR_KEY_UP]) + if (LCR_game.keyStates[LCR_KEY_UP]) offsets[0] = LCR_FREE_CAMERA_STEP; - else if (LCR_keyStates[LCR_KEY_DOWN]) + else if (LCR_game.keyStates[LCR_KEY_DOWN]) offsets[0] -= LCR_FREE_CAMERA_STEP; - if (LCR_keyStates[LCR_KEY_RIGHT]) + if (LCR_game.keyStates[LCR_KEY_RIGHT]) offsets[1] = LCR_FREE_CAMERA_STEP; - else if (LCR_keyStates[LCR_KEY_LEFT]) + else if (LCR_game.keyStates[LCR_KEY_LEFT]) offsets[1] -= LCR_FREE_CAMERA_STEP; } LCR_rendererMoveCamera(offsets,offsets + 3); } +*/ + + // handle simulation: while (time >= LCR_game.nextRacingTickTime) { LCR_LOG2("gonna step racing engine"); @@ -547,12 +595,12 @@ uint8_t LCR_gameStep(uint32_t time) if (LCR_game.controlMode != LCR_CONTROL_MODE_FREECAM) input = - (LCR_keyStates[LCR_KEY_UP] ? LCR_RACING_INPUT_FORW : 0) | - (LCR_keyStates[LCR_KEY_RIGHT] ? LCR_RACING_INPUT_RIGHT : 0) | - (LCR_keyStates[LCR_KEY_DOWN] ? LCR_RACING_INPUT_BACK : 0) | - (LCR_keyStates[LCR_KEY_LEFT] ? LCR_RACING_INPUT_LEFT : 0); + (LCR_game.keyStates[LCR_KEY_UP] ? LCR_RACING_INPUT_FORW : 0) | + (LCR_game.keyStates[LCR_KEY_RIGHT] ? LCR_RACING_INPUT_RIGHT : 0) | + (LCR_game.keyStates[LCR_KEY_DOWN] ? LCR_RACING_INPUT_BACK : 0) | + (LCR_game.keyStates[LCR_KEY_LEFT] ? LCR_RACING_INPUT_LEFT : 0); - uint32_t events = LCR_racingStep(input); + uint32_t events = paused ? 0 : LCR_racingStep(input); if (events & LCR_RACING_EVENT_CP_TAKEN) { @@ -586,6 +634,7 @@ uint8_t LCR_gameStep(uint32_t time) sleep = (3 * (LCR_game.nextRacingTickTime - time)) / 4; + // handle rendering: if (time >= LCR_game.nextRenderFrameTime) { LCR_LOG2("gonna render next frame"); diff --git a/settings.h b/settings.h index 813ee3d..a60cc3b 100644 --- a/settings.h +++ b/settings.h @@ -182,4 +182,9 @@ #define LCR_SETTING_ENABLE_RESOURCE_FILE 1 #endif +#ifndef LCR_SETTING_COUNTDOWN_SECONDS + /** Run start countdown length in seconds. */ + #define LCR_SETTING_COUNTDOWN_SECONDS 3 +#endif + #endif // guard