From c43347edb7d422b902360a44a7bd0b0a20f941f2 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Sun, 4 Jun 2017 14:00:56 +0200 Subject: * Bugfix: index for selectedAircraft is recalculated when a new aircraft is spawned. * Initial implementation for minimum spawn time in parkings. * GfxIsGPUBusy() check added for MemCard. --- Source/Game.c | 81 +++++++++++++++++++++++++++++++++++++++++++++---- Source/Game.h | 1 + Source/GameGui.c | 37 ++++++++++++++++++---- Source/GameStructures.h | 1 + Source/MemCard.c | 2 ++ 5 files changed, 110 insertions(+), 12 deletions(-) (limited to 'Source') diff --git a/Source/Game.c b/Source/Game.c index 97cc9d5..84114c4 100644 --- a/Source/Game.c +++ b/Source/Game.c @@ -25,6 +25,8 @@ #define GAME_INVALID_TILE_SELECTION ( (uint16_t)0xFFFF ) +#define GAME_MINIMUM_PARKING_SPAWN_TIME 20 // 2 seconds + /* ************************************** * Structs and enums * * *************************************/ @@ -147,6 +149,8 @@ static void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer); static void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData, uint8_t aircraftIdx); static void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntry); static void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData); +static void GameRemainingAircraft(void); +static void GameMinimumSpawnTimeout(void); /* ************************************* * Global Variables @@ -168,7 +172,10 @@ static TYPE_FLIGHT_DATA FlightData; static uint16_t GameRwyArray[GAME_MAX_RWY_LENGTH]; static uint16_t GameUsedRwy[GAME_MAX_RUNWAYS]; static uint16_t GameSelectedTile; -static bool firstLevelRender; // Used to avoid reentrance on GameRenderLevel() +static bool firstLevelRender; // Used to avoid reentrance issues on GameRenderLevel() +static TYPE_TIMER* GameSpawnMinTime; +static bool spawnMinTimeFlag; +static bool GameAircraftCreatedFlag; // Instances for player-specific data TYPE_PLAYER PlayerData[MAX_PLAYERS]; @@ -352,6 +359,7 @@ void GameInit(void) firstActiveAircraft = 0; lastActiveAircraft = 0; + GameAircraftCreatedFlag = false; if(GameTwoPlayersActive() == true) { @@ -371,6 +379,10 @@ void GameInit(void) GameMouseSpr.g = NORMAL_LUMINANCE; GameMouseSpr.b = NORMAL_LUMINANCE; + GameSpawnMinTime = SystemCreateTimer(GAME_MINIMUM_PARKING_SPAWN_TIME, false, &GameMinimumSpawnTimeout); + + spawnMinTimeFlag = true; + GameScore = 0; GameGetRunwayArray(); @@ -383,7 +395,7 @@ void GameInit(void) GfxSetGlobalLuminance(0); - track = SystemRand(GAMEPLAY_FIRST_TRACK,GAMEPLAY_LAST_TRACK); + track = SystemRand(GAMEPLAY_FIRST_TRACK, GAMEPLAY_LAST_TRACK); SfxPlayTrack(track); } @@ -437,6 +449,7 @@ void GameCalculations(void) GameActiveAircraft(); GameFirstLastAircraftIndex(); GameGuiCalculateSlowScore(); + GameRemainingAircraft(); AircraftHandler(); for(i = 0 ; i < MAX_PLAYERS ; i++) @@ -770,7 +783,9 @@ void GameAircraftState(void) && (FlightData.State[i] == STATE_IDLE) && - (FlightData.RemainingTime[i] > 0) ) + (FlightData.RemainingTime[i] > 0) + /* && + (spawnMinTimeFlag == true) */) { if( (FlightData.FlightDirection[i] == DEPARTURE) && @@ -802,6 +817,8 @@ void GameAircraftState(void) { FlightData.State[i] = STATE_PARKED; + GameAircraftCreatedFlag = true; + // Create notification request for incoming aircraft FlightData.NotificationRequest[i] = true; @@ -822,6 +839,7 @@ void GameAircraftState(void) { dprintf("Flight %d set to STATE_APPROACH.\n", i); FlightData.State[i] = STATE_APPROACH; + GameAircraftCreatedFlag = true; // Create notification request for incoming aircraft FlightData.NotificationRequest[i] = true; } @@ -832,9 +850,6 @@ void GameAircraftState(void) (FlightData.RemainingTime[i] == 0) ) { // Player(s) lost a flight! - DEBUG_PRINT_VAR(i); - DEBUG_PRINT_VAR(FlightData.State[i]); - DEBUG_PRINT_VAR(FlightData.RemainingTime[i]); GameRemoveFlight(i, false); } } @@ -2518,10 +2533,18 @@ void GameRemoveFlight(uint8_t idx, bool successful) GameScore = (GameScore < LOST_FLIGHT_PENALTY)? 0 : (GameScore - LOST_FLIGHT_PENALTY); } + if(ptrPlayer->SelectedAircraft >= j) + { + ptrPlayer->SelectedAircraft--; // Check pending + } + FlightData.Passengers[ptrPlayer->ActiveAircraftList[j]] = 0; FlightData.State[ptrPlayer->ActiveAircraftList[j]] = STATE_IDLE; FlightData.Finished[ptrPlayer->ActiveAircraftList[j]] = true; + spawnMinTimeFlag = false; + SystemTimerRestart(GameSpawnMinTime); + return; } } @@ -2537,9 +2560,15 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlight { uint8_t i; uint8_t j = 0; + + uint8_t currentFlightDataIdx; + uint8_t lastFlightDataIdx; // Clear all pointers for aircraft data first. // Then, rebuild aircraft list for player. + + lastFlightDataIdx = ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft]; + memset(ptrPlayer->ActiveAircraftList, 0, GAME_MAX_AIRCRAFT); ptrPlayer->ActiveAircraft = 0; @@ -2553,6 +2582,41 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlight ptrPlayer->ActiveAircraft++; } } + + currentFlightDataIdx = ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft]; + + if(GameAircraftCreatedFlag == true) + { + GameAircraftCreatedFlag = false; + + if(ptrPlayer->ActiveAircraft > 1) + { + if(currentFlightDataIdx != lastFlightDataIdx) + { + for(ptrPlayer->SelectedAircraft = 0; ptrPlayer->SelectedAircraft < GAME_MAX_AIRCRAFT; ptrPlayer->SelectedAircraft++) + { + if(ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft] == lastFlightDataIdx) + { + break; + } + } + } + } + } +} + +void GameRemainingAircraft(void) +{ + uint8_t i; + FlightData.nRemainingAircraft = FlightData.nAircraft; + + for(i = 0; i < FlightData.nAircraft; i++) + { + if(FlightData.Finished[i] == true) + { + FlightData.nRemainingAircraft--; + } + } } bool GameFinished(void) @@ -2570,3 +2634,8 @@ bool GameFinished(void) return GameGuiFinishedDialog(&PlayerData[PLAYER_ONE]); } + +void GameMinimumSpawnTimeout(void) +{ + spawnMinTimeFlag = true; +} diff --git a/Source/Game.h b/Source/Game.h index 094b99a..3087cae 100644 --- a/Source/Game.h +++ b/Source/Game.h @@ -52,4 +52,5 @@ FL_STATE GameGetFlightDataStateFromIdx(uint8_t FlightDataIdx); uint32_t GameGetScore(void); bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos); void GameRemoveFlight(uint8_t idx, bool successful); +void GameCalculateRemainingAircraft(void); #endif //__GAME_HEADER__ diff --git a/Source/GameGui.c b/Source/GameGui.c index 4e6efdc..ce5c3af 100644 --- a/Source/GameGui.c +++ b/Source/GameGui.c @@ -346,6 +346,14 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightDat { short y_offset; uint8_t page_aircraft; + + enum + { + GAME_GUI_REMAINING_AIRCRAFT_X = AIRCRAFT_DATA_GSGPOLY4_X0 + 8, + GAME_GUI_REMAINING_AIRCRAFT_Y = AIRCRAFT_DATA_GSGPOLY4_Y2 - 16, + GAME_GUI_REMAINING_AIRCRAFT_X_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER + 8, + GAME_GUI_REMAINING_AIRCRAFT_Y_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_Y2_2PLAYER - 16 + }; if(ptrPlayer->ShowAircraftData == true) { @@ -394,6 +402,23 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightDat } GsSortGPoly4(&AircraftDataGPoly4); + + if(GameTwoPlayersActive() == true) + { + FontPrintText( &SmallFont, + GAME_GUI_REMAINING_AIRCRAFT_X_2PLAYER, + GAME_GUI_REMAINING_AIRCRAFT_Y_2PLAYER, + "Rem. aircraft: %d", + ptrFlightData->nRemainingAircraft ); + } + else + { + FontPrintText( &SmallFont, + GAME_GUI_REMAINING_AIRCRAFT_X, + GAME_GUI_REMAINING_AIRCRAFT_Y, + "Remaining aircraft: %d", + ptrFlightData->nRemainingAircraft ); + } if(ptrPlayer->ActiveAircraft != 0) { @@ -504,7 +529,7 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightDat { FontPrintText(&SmallFont, AIRCRAFT_LOCK_TARGET_TEXT_X, AIRCRAFT_LOCK_TARGET_TEXT_Y, "Lock target"); } - } + } else { if(GameTwoPlayersActive() == true) @@ -889,11 +914,11 @@ bool GameGuiFinishedDialog(TYPE_PLAYER* ptrPlayer) GsSortGPoly4(&PauseRect); FontPrintText( &SmallFont, - AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER + - ( (AIRCRAFT_DATA_GSGPOLY4_X1_2PLAYER - AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER) >> 2), - AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER + - ( (AIRCRAFT_DATA_GSGPOLY4_Y2_2PLAYER - AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER) >> 1), - "All flights finished!" ); + AIRCRAFT_DATA_GSGPOLY4_X0 + + ( (AIRCRAFT_DATA_GSGPOLY4_X1 - AIRCRAFT_DATA_GSGPOLY4_X0) >> 2), + AIRCRAFT_DATA_GSGPOLY4_Y0 + + ( (AIRCRAFT_DATA_GSGPOLY4_Y2 - AIRCRAFT_DATA_GSGPOLY4_Y0) >> 1), + "Level finished!" ); GfxDrawScene_Slow(); diff --git a/Source/GameStructures.h b/Source/GameStructures.h index 4d88c48..9da7436 100644 --- a/Source/GameStructures.h +++ b/Source/GameStructures.h @@ -77,6 +77,7 @@ typedef struct t_flightData uint8_t Parking[GAME_MAX_AIRCRAFT]; uint16_t RemainingTime[GAME_MAX_AIRCRAFT]; uint8_t nAircraft; + uint8_t nRemainingAircraft; uint8_t ActiveAircraft; FL_STATE State[GAME_MAX_AIRCRAFT]; bool NotificationRequest[GAME_MAX_AIRCRAFT]; diff --git a/Source/MemCard.c b/Source/MemCard.c index 5050957..f55facf 100644 --- a/Source/MemCard.c +++ b/Source/MemCard.c @@ -708,6 +708,8 @@ bool MemCardReadSector(TYPE_BLOCK_DATA * ptrBlockData, int sector) " 0 and 511 are allowed!\n", sector); return false; } + + while(GfxIsGPUBusy() == true); result = McReadSector(ptrBlockData->Slot, sector, DataBuffer); -- cgit v1.2.3