aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2017-06-04 14:00:56 +0200
committerXaviDCR92 <xavi.dcr@gmail.com>2017-06-04 14:00:56 +0200
commitc43347edb7d422b902360a44a7bd0b0a20f941f2 (patch)
treeb035366227e938bbeded6c807235ea3f45d6ea9b /Source
parent219d958538aecfec4dace7f3b31dcfa193667b27 (diff)
downloadairport-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.c81
-rw-r--r--Source/Game.h1
-rw-r--r--Source/GameGui.c37
-rw-r--r--Source/GameStructures.h1
-rw-r--r--Source/MemCard.c2
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);