diff options
| author | XaviDCR92 <xavi.dcr@gmail.com> | 2017-06-04 14:00:56 +0200 |
|---|---|---|
| committer | XaviDCR92 <xavi.dcr@gmail.com> | 2017-06-04 14:00:56 +0200 |
| commit | c43347edb7d422b902360a44a7bd0b0a20f941f2 (patch) | |
| tree | b035366227e938bbeded6c807235ea3f45d6ea9b /Source | |
| parent | 219d958538aecfec4dace7f3b31dcfa193667b27 (diff) | |
| download | airport-c43347edb7d422b902360a44a7bd0b0a20f941f2.tar.gz | |
* 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.
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Game.c | 81 | ||||
| -rw-r--r-- | Source/Game.h | 1 | ||||
| -rw-r--r-- | Source/GameGui.c | 37 | ||||
| -rw-r--r-- | Source/GameStructures.h | 1 | ||||
| -rw-r--r-- | Source/MemCard.c | 2 |
5 files changed, 110 insertions, 12 deletions
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);
|
