aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Aircraft.c94
-rw-r--r--Source/Aircraft.h2
-rw-r--r--Source/Font.c4
-rw-r--r--Source/Font.h4
-rw-r--r--Source/Game.c81
-rw-r--r--Source/Game.h3
-rw-r--r--Source/GameGui.c95
-rw-r--r--Source/GameGui.h9
-rw-r--r--Source/GameStructures.h19
-rw-r--r--Source/Gfx.c6
-rw-r--r--Source/Gfx.h4
-rw-r--r--Source/LoadMenu.c12
-rw-r--r--Source/LoadMenu.h2
-rw-r--r--Source/MapEditor/MapEditor.pro.user4
-rw-r--r--Source/Menu.c2
-rw-r--r--Source/PSXSDKIntro.c4
-rw-r--r--Source/PltParser.c89
-rw-r--r--Source/PltParser.h3
-rw-r--r--Source/Sfx.c2
-rw-r--r--Source/Sfx.h2
-rw-r--r--Source/System.c25
-rw-r--r--Source/System.h8
22 files changed, 358 insertions, 116 deletions
diff --git a/Source/Aircraft.c b/Source/Aircraft.c
index 468adba..b43fd0d 100644
--- a/Source/Aircraft.c
+++ b/Source/Aircraft.c
@@ -9,6 +9,7 @@
* *************************************/
#define AIRCRAFT_SIZE 16
+#define AIRCRAFT_SIZE_FIX16 fix16_from_int(AIRCRAFT_SIZE)
/* *************************************
* Structs and enums
@@ -46,7 +47,7 @@ static uint8_t AircraftIndex;
static GsSprite AircraftSpr;
static TYPE_ISOMETRIC_POS AircraftCenterIsoPos;
static TYPE_CARTESIAN_POS AircraftCenterPos;
-static char * AircraftLiveryNamesTable[] = {"PHX", NULL};
+static char* AircraftLiveryNamesTable[] = {"PHX", NULL};
static AIRCRAFT_LIVERY AircraftLiveryTable[] = {AIRCRAFT_LIVERY_0, AIRCRAFT_LIVERY_UNKNOWN};
static const fix16_t AircraftSpeedsTable[] = { [AIRCRAFT_SPEED_IDLE] = 0,
[AIRCRAFT_SPEED_GROUND] = 0x6666,
@@ -59,10 +60,11 @@ static const fix16_t AircraftSpeedsTable[] = { [AIRCRAFT_SPEED_IDLE] = 0,
* *************************************/
static void AircraftDirection(TYPE_AIRCRAFT_DATA* ptrAircraft);
-static AIRCRAFT_LIVERY AircraftLiveryFromFlightNumber(char * strFlightNumber);
+static AIRCRAFT_LIVERY AircraftLiveryFromFlightNumber(char* strFlightNumber);
static void AircraftAttitude(TYPE_AIRCRAFT_DATA* ptrAircraft);
static void AircraftUpdateSpriteFromData(TYPE_AIRCRAFT_DATA* ptrAircraft);
static void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft);
+static bool AircraftCheckCollision(TYPE_AIRCRAFT_DATA* ptrRefAircraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft);
void AircraftInit(void)
{
@@ -93,7 +95,7 @@ void AircraftInit(void)
AircraftCenterPos = GfxIsometricToCartesian(&AircraftCenterIsoPos);
}
-bool AircraftAddNew( TYPE_FLIGHT_DATA * ptrFlightData,
+bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData,
uint8_t FlightDataIndex,
uint16_t* targets )
{
@@ -165,7 +167,7 @@ bool AircraftAddNew( TYPE_FLIGHT_DATA * ptrFlightData,
return true;
}
-AIRCRAFT_LIVERY AircraftLiveryFromFlightNumber(char * strFlightNumber)
+AIRCRAFT_LIVERY AircraftLiveryFromFlightNumber(char* strFlightNumber)
{
int32_t liveryIndex;
char strLivery[4];
@@ -215,6 +217,7 @@ void AircraftHandler(void)
for(i = 0; i < GAME_MAX_AIRCRAFT; i++)
{
TYPE_AIRCRAFT_DATA* ptrAircraft = &AircraftData[i];
+ uint8_t j;
if(ptrAircraft->State == STATE_IDLE)
{
@@ -225,6 +228,27 @@ void AircraftHandler(void)
AircraftAttitude(ptrAircraft);
AircraftSpeed(ptrAircraft);
+ for(j = 0; j < GAME_MAX_AIRCRAFT; j++)
+ {
+ TYPE_AIRCRAFT_DATA* ptrOtherAircraft = &AircraftData[j];
+
+ if(i == j)
+ {
+ continue;
+ }
+
+ if(AircraftData[j].State == STATE_IDLE)
+ {
+ continue;
+ }
+
+ if(AircraftCheckCollision(ptrAircraft, ptrOtherAircraft) == true)
+ {
+ GameAircraftCollision(ptrAircraft->FlightDataIdx);
+ break;
+ }
+ }
+
ptrAircraft->State = GameGetFlightDataStateFromIdx(ptrAircraft->FlightDataIdx);
}
}
@@ -267,27 +291,52 @@ void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft)
void AircraftRender(TYPE_PLAYER* ptrPlayer)
{
- TYPE_AIRCRAFT_DATA* ptrAircraft;
- TYPE_CARTESIAN_POS cartPos;
-
uint8_t i;
for(i = 0; i < GAME_MAX_AIRCRAFT; i++)
{
- ptrAircraft = &AircraftData[i];
-
+ TYPE_AIRCRAFT_DATA* ptrAircraft = &AircraftData[i];
+ TYPE_CARTESIAN_POS cartPos;
+ TYPE_ISOMETRIC_FIX16_POS shadowIsoPos = { .x = ptrAircraft->IsoPos.x,
+ .y = ptrAircraft->IsoPos.y,
+ .z = 0 };
+ TYPE_CARTESIAN_POS shadowCartPos;
+
if(ptrAircraft->State == STATE_IDLE)
{
continue;
}
+ AircraftUpdateSpriteFromData(ptrAircraft);
+
+ if(ptrAircraft->IsoPos.z > 0)
+ {
+ // Draw aircraft shadow
+
+ shadowCartPos = GfxIsometricFix16ToCartesian(&shadowIsoPos);
+
+ // Aircraft position is referred to aircraft center
+ AircraftSpr.x = shadowCartPos.x - (AircraftSpr.w >> 1);
+ AircraftSpr.y = shadowCartPos.y - (AircraftSpr.h >> 1);
+
+ CameraApplyCoordinatesToSprite(ptrPlayer, &AircraftSpr);
+
+ AircraftSpr.r = 0;
+ AircraftSpr.g = 0;
+ AircraftSpr.b = 0;
+
+ AircraftSpr.attribute |= ENABLE_TRANS | TRANS_MODE(0);
+
+ GfxSortSprite(&AircraftSpr);
+ }
+
cartPos = GfxIsometricFix16ToCartesian(&ptrAircraft->IsoPos);
// Aircraft position is referred to aircraft center
AircraftSpr.x = cartPos.x - (AircraftSpr.w >> 1);
AircraftSpr.y = cartPos.y - (AircraftSpr.h >> 1);
- AircraftUpdateSpriteFromData(ptrAircraft);
+ AircraftSpr.attribute &= ~(ENABLE_TRANS | TRANS_MODE(0));
CameraApplyCoordinatesToSprite(ptrPlayer, &AircraftSpr);
@@ -569,3 +618,28 @@ bool AircraftMoving(uint8_t index)
return (bool)ptrAircraft->Speed;
}
+
+bool AircraftCheckCollision(TYPE_AIRCRAFT_DATA* ptrRefAircraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft)
+{
+// Here I have used an old macro that I found on nextvolume's source code for "A Small Journey", IIRC.
+// Totally fool-proof, so I dint' want to complicate things!
+#define check_bb_collision(x1,y1,w1,h1,x2,y2,w2,h2) (!( ((x1)>=(x2)+(w2)) || ((x2)>=(x1)+(w1)) || \
+ ((y1)>=(y2)+(h2)) || ((y2)>=(y1)+(h1)) ))
+
+ if(check_bb_collision( ptrRefAircraft->IsoPos.x,
+ ptrRefAircraft->IsoPos.y,
+ AIRCRAFT_SIZE_FIX16,
+ AIRCRAFT_SIZE_FIX16,
+ ptrOtherAircraft->IsoPos.x,
+ ptrOtherAircraft->IsoPos.y,
+ AIRCRAFT_SIZE_FIX16,
+ AIRCRAFT_SIZE_FIX16 ) != 0)
+ {
+ if(ptrRefAircraft->IsoPos.z == ptrOtherAircraft->IsoPos.z)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/Source/Aircraft.h b/Source/Aircraft.h
index 8a7f75c..8bf041c 100644
--- a/Source/Aircraft.h
+++ b/Source/Aircraft.h
@@ -27,7 +27,7 @@ uint16_t* AircraftGetTargets(uint8_t index);
bool AircraftMoving(uint8_t index);
uint8_t AircraftGetTargetIdx(uint8_t index);
AIRCRAFT_DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft);
-bool AircraftAddNew( TYPE_FLIGHT_DATA * ptrFlightData,
+bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData,
uint8_t FlightDataIndex,
uint16_t* targets );
diff --git a/Source/Font.c b/Source/Font.c
index 0754376..6a90061 100644
--- a/Source/Font.c
+++ b/Source/Font.c
@@ -21,7 +21,7 @@
static char _internal_text[FONT_INTERNAL_TEXT_BUFFER_MAX_SIZE];
static unsigned char _blend_effect_lum;
-bool FontLoadImage(char * strPath, TYPE_FONT * ptrFont)
+bool FontLoadImage(char* strPath, TYPE_FONT * ptrFont)
{
if(GfxSpriteFromFile(strPath, &ptrFont->spr) == false)
{
@@ -88,7 +88,7 @@ void FontCyclic(void)
_blend_effect_lum -= 8;
}
-void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char * str, ...)
+void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...)
{
uint16_t i;
uint16_t line_count = 0;
diff --git a/Source/Font.h b/Source/Font.h
index 73d4645..18ea4b2 100644
--- a/Source/Font.h
+++ b/Source/Font.h
@@ -26,9 +26,9 @@
* Global prototypes
* *************************************/
-bool FontLoadImage(char * strPath, TYPE_FONT * ptrFont);
+bool FontLoadImage(char* strPath, TYPE_FONT * ptrFont);
void FontSetSize(TYPE_FONT * ptrFont, short size);
-void FontPrintText(TYPE_FONT *ptrFont, short x, short y, char * str, ...);
+void FontPrintText(TYPE_FONT *ptrFont, short x, short y, char* str, ...);
void FontSetInitChar(TYPE_FONT * ptrFont, char c);
void FontSetFlags(TYPE_FONT * ptrFont, FONT_FLAGS flags);
void FontCyclic(void);
diff --git a/Source/Game.c b/Source/Game.c
index 84114c4..4b642a6 100644
--- a/Source/Game.c
+++ b/Source/Game.c
@@ -120,35 +120,35 @@ static bool GamePause(void);
static bool GameFinished(void);
static void GameEmergencyMode(void);
static void GameCalculations(void);
-static void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
+static void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static void GamePlayerAddWaypoint(TYPE_PLAYER* ptrPlayer);
static void GamePlayerAddWaypoint_Ex(TYPE_PLAYER* ptrPlayer, uint16_t tile);
static void GameGraphics(void);
static void GameRenderLevel(TYPE_PLAYER* ptrPlayer);
-//static void GameLoadPilots(char * strPath);
+//static void GameLoadPilots(char* strPath);
static void GameClock(void);
static void GameClockFlights(void);
static void GameAircraftState(void);
static void GameActiveAircraft(void);
-static void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
+static void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static void GameFirstLastAircraftIndex(void);
-static void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
-static void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
-static void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
-static void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
+static void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
+static void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
+static void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
+static void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static void GameStateLockTarget(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static TYPE_ISOMETRIC_POS GameSelectAircraft(TYPE_PLAYER* ptrPlayer);
static void GameSelectAircraftWaypoint(TYPE_PLAYER* ptrPlayer);
static void GameGetRunwayArray(void);
static void GameGetSelectedRunwayArray(uint16_t rwyHeader);
-static void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
+static void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static void GameDrawMouse(TYPE_PLAYER* ptrPlayer);
static void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
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 GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static void GameRemainingAircraft(void);
static void GameMinimumSpawnTimeout(void);
@@ -176,11 +176,13 @@ static bool firstLevelRender; // Used to avoid reentrance issues on GameRenderLe
static TYPE_TIMER* GameSpawnMinTime;
static bool spawnMinTimeFlag;
static bool GameAircraftCreatedFlag;
+static bool GameAircraftCollisionFlag;
+static uint8_t GameAircraftCollisionIdx;
// Instances for player-specific data
TYPE_PLAYER PlayerData[MAX_PLAYERS];
-static char * GameFileList[] = { "cdrom:\\DATA\\SPRITES\\TILESET1.TIM;1" ,
+static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\TILESET1.TIM;1" ,
"cdrom:\\DATA\\SPRITES\\TILESET2.TIM;1" ,
"cdrom:\\DATA\\LEVELS\\LEVEL1.PLT;1" ,
"cdrom:\\DATA\\SPRITES\\GAMEPLN.TIM;1" ,
@@ -194,7 +196,7 @@ static void * GameFileDest[] = { (GsSprite*)&GameTilesetSpr ,
NULL ,
(GsSprite*)&GameMouseSpr };
-static char * GameLevelList[] = { "cdrom:\\DATA\\LEVELS\\LEVEL1.LVL;1"};
+static char* GameLevelList[] = { "cdrom:\\DATA\\LEVELS\\LEVEL1.LVL;1"};
static uint8_t GameLevelBuffer[GAME_MAX_MAP_SIZE];
static uint8_t GameLevelColumns;
@@ -222,12 +224,19 @@ void Game(bool two_players)
{
if(GameFinished() == true)
{
+ // Exit game on level finished.
break;
}
if(GamePause() == true)
{
- // Exit game
+ // Exit game if player desires to exit.
+ break;
+ }
+
+ if(GameAircraftCollisionFlag == true)
+ {
+ GameGuiAircraftCollision(&PlayerData[PLAYER_ONE]);
break;
}
@@ -360,6 +369,8 @@ void GameInit(void)
firstActiveAircraft = 0;
lastActiveAircraft = 0;
GameAircraftCreatedFlag = false;
+ GameAircraftCollisionFlag = false;
+ GameAircraftCollisionIdx = 0;
if(GameTwoPlayersActive() == true)
{
@@ -556,7 +567,7 @@ uint8_t GameGetLastActiveAircraft(void)
return lastActiveAircraft;
}
-void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
ptrPlayer->SelectedTile = 0; // Reset selected tile if no states
// which use this are currently active.
@@ -564,6 +575,12 @@ void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
ptrPlayer->FlightDataSelectedAircraft = ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft];
+ if(GameAircraftCollisionFlag == true)
+ {
+ TYPE_ISOMETRIC_POS IsoPos = AircraftGetIsoPos(GameAircraftCollisionIdx);
+ CameraMoveToIsoPos(ptrPlayer, IsoPos);
+ }
+
GameActiveAircraftList(ptrPlayer, ptrFlightData);
GameStateUnboarding(ptrPlayer, ptrFlightData);
GameStateLockTarget(ptrPlayer, ptrFlightData);
@@ -633,7 +650,7 @@ void GameGraphics(void)
int i;
bool split_screen = false;
- while(GfxIsGPUBusy() == true);
+ while( (SystemRefreshNeeded() == false) || (GfxIsGPUBusy() == true) );
if(TwoPlayersActive == true)
{
@@ -1103,7 +1120,7 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
}
}
- // TODO: Isometric -> Cartesian conversion
+ // Isometric -> Cartesian conversion
tileIsoPos.x = columns << (TILE_SIZE_BIT_SHIFT);
tileIsoPos.y = rows << (TILE_SIZE_BIT_SHIFT);
tileIsoPos.z = 0;
@@ -1117,12 +1134,6 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
ptrTileset->x -= TILE_SIZE >> 1;
ptrTileset->y -= TILE_SIZE >> 2;
- /*ptrTileset->x = columns << (TILE_SIZE_BIT_SHIFT - 1);
- ptrTileset->x -= rows << (TILE_SIZE_BIT_SHIFT - 1);
-
- ptrTileset->y = rows << (TILE_SIZE_BIT_SHIFT - 2);
- ptrTileset->y += columns << (TILE_SIZE_BIT_SHIFT - 2);*/
-
if(columns < GameLevelColumns -1 )
{
columns++;
@@ -1163,14 +1174,6 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
ptrTileset->attribute &= ~(H_FLIP);
}
}
-
- /*if(PadOneKeyReleased(PAD_CROSS) == true)
- {
- for(i = 0; i < GameLevelSize; i++)
- {
- dprintf("Tile number %d, ID: %d\n",i,GameLevelBuffer[i]);
- }
- }*/
}
void GameSetTime(uint8_t hour, uint8_t minutes)
@@ -1194,7 +1197,7 @@ void GameActiveAircraft(void)
}
}
-void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
if(ptrPlayer->ShowAircraftData == true)
{
@@ -1256,7 +1259,7 @@ void GameStateLockTarget(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData
}
}
-void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
TYPE_ISOMETRIC_POS IsoPos = CameraGetIsoPos(ptrPlayer);
uint8_t i;
@@ -1343,7 +1346,7 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptr
}
}
-void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
TYPE_ISOMETRIC_POS IsoPos = CameraGetIsoPos(ptrPlayer);
uint8_t i;
@@ -1428,7 +1431,7 @@ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * pt
}
}
-void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t i;
bool success;
@@ -1533,7 +1536,7 @@ void GameGetRunwayArray(void)
dprintf("\n");
}
-void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t AircraftIdx = ptrPlayer->FlightDataSelectedAircraft;
FL_STATE aircraftState = ptrFlightData->State[AircraftIdx];
@@ -1690,7 +1693,7 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader)
GameGetSelectedRunwayArray(0);
}
-void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
uint16_t assignedRwy = GameRwy[ptrPlayer->SelectedRunway];
uint8_t aircraftIndex = ptrPlayer->FlightDataSelectedAircraft;
@@ -2556,7 +2559,7 @@ void GameRemoveFlight(uint8_t idx, bool successful)
}
}
-void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t i;
uint8_t j = 0;
@@ -2639,3 +2642,9 @@ void GameMinimumSpawnTimeout(void)
{
spawnMinTimeFlag = true;
}
+
+void GameAircraftCollision(uint8_t AircraftIdx)
+{
+ GameAircraftCollisionFlag = true;
+ GameAircraftCollisionIdx = AircraftIdx;
+}
diff --git a/Source/Game.h b/Source/Game.h
index 3087cae..9720af9 100644
--- a/Source/Game.h
+++ b/Source/Game.h
@@ -36,7 +36,7 @@ extern TYPE_PLAYER PlayerData[];
* *************************************/
void Game(bool two_players);
-char * GetGameLevelTitle(void);
+char* GetGameLevelTitle(void);
void GameSetTime(uint8_t hour, uint8_t minutes);
bool GameTwoPlayersActive(void);
uint8_t GameGetFirstActiveAircraft(void);
@@ -53,4 +53,5 @@ uint32_t GameGetScore(void);
bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos);
void GameRemoveFlight(uint8_t idx, bool successful);
void GameCalculateRemainingAircraft(void);
+void GameAircraftCollision(uint8_t AircraftIdx);
#endif //__GAME_HEADER__
diff --git a/Source/GameGui.c b/Source/GameGui.c
index ce5c3af..c69747a 100644
--- a/Source/GameGui.c
+++ b/Source/GameGui.c
@@ -148,12 +148,18 @@ enum
{
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X = 96,
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y = 112,
+
+ AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X_2PLAYER = 48,
+ AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y_2PLAYER = 112,
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_U = 44,
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_V = 48,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X = 280,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y,
+
+ AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X_2PLAYER = 128,
+ AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y_2PLAYER = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y_2PLAYER,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_U = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_U + 8,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_V = 48,
@@ -172,7 +178,7 @@ enum
* Local prototypes *
* *************************************/
-static void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
+static void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static void GameGuiClearPassengersLeft(void);
/* **************************************
@@ -188,7 +194,7 @@ static GsSprite SecondDisplay;
static TYPE_TIMER* ShowAircraftPassengersTimer;
static bool GameGuiClearPassengersLeft_Flag;
-static char * GameFileList[] = {"cdrom:\\DATA\\SPRITES\\BUBBLE.TIM;1" ,
+static char* GameFileList[] = {"cdrom:\\DATA\\SPRITES\\BUBBLE.TIM;1" ,
"cdrom:\\DATA\\FONTS\\FONT_1.FNT;1" ,
"cdrom:\\DATA\\SPRITES\\ARROWS.TIM;1" };
@@ -256,6 +262,9 @@ void GameGuiInit(void)
PauseRect.attribute |= ENABLE_TRANS | TRANS_MODE(0);
ShowAircraftPassengersTimer = SystemCreateTimer(20, true, GameGuiClearPassengersLeft);
+
+ ArrowsSpr.w = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
+ ArrowsSpr.h = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
slowScore = 0;
}
@@ -288,11 +297,14 @@ bool GameGuiPauseDialog(TYPE_PLAYER* ptrPlayer)
return false;
}
-void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
- while(ptrPlayer->ActiveAircraft < ptrPlayer->SelectedAircraft)
+ if(ptrPlayer->ActiveAircraft != 0)
{
- ptrPlayer->SelectedAircraft--;
+ while(ptrPlayer->ActiveAircraft <= ptrPlayer->SelectedAircraft)
+ {
+ ptrPlayer->SelectedAircraft--;
+ }
}
while(ptrPlayer->ActiveAircraft < (uint8_t)(GAME_GUI_AIRCRAFT_DATA_MAX_PAGE * ptrPlayer->FlightDataPage) )
@@ -342,7 +354,7 @@ void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFli
}
}
-void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
short y_offset;
uint8_t page_aircraft;
@@ -487,32 +499,42 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightDat
if(ptrPlayer->ActiveAircraft > (GAME_GUI_AIRCRAFT_DATA_MAX_PAGE * (ptrPlayer->FlightDataPage + 1) ) )
{
- ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X;
- ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y;
-
- ArrowsSpr.attribute |= GFX_1HZ_FLASH;
-
+ if(GameTwoPlayersActive() == true)
+ {
+ ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X_2PLAYER;
+ ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y_2PLAYER;
+ }
+ else
+ {
+ ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X;
+ ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y;
+ }
+
ArrowsSpr.u = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_U;
ArrowsSpr.v = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_V;
-
- ArrowsSpr.w = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
- ArrowsSpr.h = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
+
+ ArrowsSpr.attribute |= GFX_1HZ_FLASH;
GfxSortSprite(&ArrowsSpr);
}
if(ptrPlayer->FlightDataPage != 0)
{
- ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X;
- ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y;
-
- ArrowsSpr.attribute |= GFX_1HZ_FLASH;
-
+ if(GameTwoPlayersActive() == true)
+ {
+ ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X_2PLAYER;
+ ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y_2PLAYER;
+ }
+ else
+ {
+ ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X;
+ ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y;
+ }
+
ArrowsSpr.u = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_U;
ArrowsSpr.v = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_V;
- ArrowsSpr.w = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
- ArrowsSpr.h = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
+ ArrowsSpr.attribute |= GFX_1HZ_FLASH;
GfxSortSprite(&ArrowsSpr);
}
@@ -555,7 +577,7 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightDat
}
-void GameGuiBubble(TYPE_FLIGHT_DATA * ptrFlightData)
+void GameGuiBubble(TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t i;
static uint16_t BubbleVibrationTimer;
@@ -658,7 +680,7 @@ void GameGuiShowPassengersLeft(TYPE_PLAYER* ptrPlayer)
}
}
-void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData)
+void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t init_flight = ptrPlayer->FlightDataPage * GAME_GUI_AIRCRAFT_DATA_MAX_PAGE;
uint8_t i;
@@ -897,10 +919,6 @@ bool GameGuiFinishedDialog(TYPE_PLAYER* ptrPlayer)
GfxSaveDisplayData(&SecondDisplay);
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
-
- //DrawFBRect(0, 0, X_SCREEN_RESOLUTION, VRAM_H, 0, 0, 0);
-
- while(GfxIsGPUBusy() == true);
do
{
@@ -926,3 +944,26 @@ bool GameGuiFinishedDialog(TYPE_PLAYER* ptrPlayer)
return false;
}
+
+void GameGuiAircraftCollision(TYPE_PLAYER* ptrPlayer)
+{
+ GfxSaveDisplayData(&SecondDisplay);
+
+ GfxSetGlobalLuminance(NORMAL_LUMINANCE);
+
+ do
+ {
+ GfxSortSprite(&SecondDisplay);
+
+ GsSortGPoly4(&PauseRect);
+
+ FontPrintText( &SmallFont,
+ AIRCRAFT_DATA_GSGPOLY4_X0 + 8,
+ AIRCRAFT_DATA_GSGPOLY4_Y0 +
+ ( (AIRCRAFT_DATA_GSGPOLY4_Y2 - AIRCRAFT_DATA_GSGPOLY4_Y0) >> 1),
+ "Collision between aircraft!" );
+
+ GfxDrawScene_Slow();
+
+ }while(ptrPlayer->PadKeySinglePress_Callback(PAD_CROSS) == false);
+}
diff --git a/Source/GameGui.h b/Source/GameGui.h
index 3e9ca87..649522a 100644
--- a/Source/GameGui.h
+++ b/Source/GameGui.h
@@ -30,14 +30,15 @@
void GameGuiInit(void);
bool GameGuiPauseDialog(TYPE_PLAYER* ptrPlayer);
bool GameGuiShowAircraftDataSpecialConditions(TYPE_PLAYER* ptrPlayer);
-void GameGuiBubble(TYPE_FLIGHT_DATA * ptrFlightData);
+void GameGuiBubble(TYPE_FLIGHT_DATA* ptrFlightData);
void GameGuiClock(uint8_t hour, uint8_t min);
-void GameGuiActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
-void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
+void GameGuiActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
+void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
void GameGuiCalculateSlowScore(void);
void GameGuiShowScore(void);
void GameGuiDrawUnboardingSequence(TYPE_PLAYER* ptrPlayer);
-void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightData);
+void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
bool GameGuiFinishedDialog(TYPE_PLAYER* ptrPlayer);
+void GameGuiAircraftCollision(TYPE_PLAYER* ptrPlayer);
#endif //__GAME_GUI_HEADER__
diff --git a/Source/GameStructures.h b/Source/GameStructures.h
index 9da7436..faf5d38 100644
--- a/Source/GameStructures.h
+++ b/Source/GameStructures.h
@@ -7,6 +7,7 @@
#define GAME_MAX_AIRCRAFT 32
#define GAME_MAX_CHARACTERS 8
+#define GAME_MAX_PARKING 32
#define CHEAT_ARRAY_SIZE 16
#define AIRCRAFT_MAX_TARGETS 32
#define PLAYER_MAX_WAYPOINTS AIRCRAFT_MAX_TARGETS
@@ -47,6 +48,13 @@ typedef enum t_flstate
STATE_LANDED
}FL_STATE;
+typedef enum t_LevelDifficulty
+{
+ LEVEL_DIFFICULTY_EASY = 0,
+ LEVEL_DIFFICULTY_MEDIUM,
+ LEVEL_DIFFICULTY_HARD
+}LEVEL_DIFFICULTY;
+
typedef struct t_isopos
{
short x;
@@ -231,4 +239,15 @@ typedef struct t_Cheat
void (*Callback)(void);
}TYPE_CHEAT;
+// TYPE_PLT_CONFIG is used for PLT file generation.
+typedef struct t_PltConfig
+{
+ uint8_t MaxTime; // Minutes
+ uint8_t nRunway;
+ uint8_t ParkingArray[GAME_MAX_PARKING];
+ LEVEL_DIFFICULTY Level;
+ bool TwoPlayers;
+ uint8_t maxLostFlights;
+}TYPE_PLT_CONFIG;
+
#endif // __GAME_STRUCTURES__HEADER__
diff --git a/Source/Gfx.c b/Source/Gfx.c
index 3f9c81d..a55d667 100644
--- a/Source/Gfx.c
+++ b/Source/Gfx.c
@@ -315,7 +315,7 @@ bool GfxIsGPUBusy(void)
return (GsIsDrawing() || gfx_busy || (GfxReadyForDMATransfer() == false) );
}
-bool GfxSpriteFromFile(char * fname, GsSprite * spr)
+bool GfxSpriteFromFile(char* fname, GsSprite * spr)
{
GsImage gsi;
@@ -336,7 +336,7 @@ bool GfxSpriteFromFile(char * fname, GsSprite * spr)
return true;
}
-bool GfxCLUTFromFile(char * fname)
+bool GfxCLUTFromFile(char* fname)
{
GsImage gsi;
@@ -465,6 +465,8 @@ void GfxSaveDisplayData(GsSprite *spr)
spr->r = NORMAL_LUMINANCE;
spr->g = NORMAL_LUMINANCE;
spr->b = NORMAL_LUMINANCE;
+
+ while(GfxIsGPUBusy() == true);
}
bool Gfx1HzFlash(void)
diff --git a/Source/Gfx.h b/Source/Gfx.h
index bbd041f..409c971 100644
--- a/Source/Gfx.h
+++ b/Source/Gfx.h
@@ -52,10 +52,10 @@ void GfxDrawScene_Fast(void);
bool GfxReadyForDMATransfer(void);
// Fills a GsSprite structure with information from a TIM file.
-bool GfxSpriteFromFile(char * fname, GsSprite * spr);
+bool GfxSpriteFromFile(char* fname, GsSprite * spr);
// Reportedly, loads CLUT data from a TIM image (image data is discarded)
-bool GfxCLUTFromFile(char * fname);
+bool GfxCLUTFromFile(char* fname);
// Returns true if current object is within screen limits, false otherwise.
bool GfxIsInsideScreenArea(short x, short y, short w, short h);
diff --git a/Source/LoadMenu.c b/Source/LoadMenu.c
index 7c90cba..b7e0a92 100644
--- a/Source/LoadMenu.c
+++ b/Source/LoadMenu.c
@@ -72,7 +72,7 @@ static void LoadMenuInit(void);
static void ISR_LoadMenuVBlank(void);
static bool LoadMenuISRHasEnded(void);
static bool LoadMenuISRHasStarted(void);
-static void LoadMenuLoadFileList( char * fileList[], void * dest[],
+static void LoadMenuLoadFileList( char* fileList[], void * dest[],
uint8_t szFileList, uint8_t szDestList);
/* *************************************
@@ -85,14 +85,14 @@ static GsSprite LoadMenuTitleSpr;
static GsLine LoadMenuBarLines[LOADING_BAR_N_LINES];
static GsRectangle LoadMenuBarRect;
-static char * LoadMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\PLANE.TIM;1",
+static char* LoadMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\PLANE.TIM;1",
"cdrom:\\DATA\\SPRITES\\LOADING.TIM;1",
"cdrom:\\DATA\\FONTS\\FONT_2.FNT;1" };
static void * LoadMenuDest[] = {(GsSprite*)&LoadMenuPlaneSpr,
(GsSprite*)&LoadMenuTitleSpr,
(TYPE_FONT*)&SmallFont };
-static char * strCurrentFile;
+static char* strCurrentFile;
// Flags to communicate with ISR state
// * startup_flag: background fades in from black to blue.
@@ -414,7 +414,7 @@ bool LoadMenuISRHasStarted(void)
return isr_started;
}
-void LoadMenu( char * fileList[],
+void LoadMenu( char* fileList[],
void * dest[],
uint8_t szFileList , uint8_t szDestList)
{
@@ -430,11 +430,11 @@ void LoadMenu( char * fileList[],
}
-void LoadMenuLoadFileList( char * fileList[], void * dest[],
+void LoadMenuLoadFileList( char* fileList[], void * dest[],
uint8_t szFileList, uint8_t szDestList)
{
char aux_file_name[100];
- char * extension;
+ char* extension;
short x_increment;
uint8_t fileLoadedCount;
diff --git a/Source/LoadMenu.h b/Source/LoadMenu.h
index a49219e..1fc1754 100644
--- a/Source/LoadMenu.h
+++ b/Source/LoadMenu.h
@@ -19,7 +19,7 @@
* Global prototypes
* *************************************/
-void LoadMenu( char * fileList[],
+void LoadMenu( char* fileList[],
void * dest[],
uint8_t szFileList , uint8_t szDestList);
diff --git a/Source/MapEditor/MapEditor.pro.user b/Source/MapEditor/MapEditor.pro.user
index 6ccb145..c6dedd7 100644
--- a/Source/MapEditor/MapEditor.pro.user
+++ b/Source/MapEditor/MapEditor.pro.user
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.0.3, 2016-11-12T03:25:30. -->
+<!-- Written by QtCreator 4.0.3, 2017-06-06T05:55:51. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -292,7 +292,7 @@
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">MapEditor.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
- <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">C:/cygwin/home/Xavier/Airport/Source/MapEditor</value>
+ <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
diff --git a/Source/Menu.c b/Source/Menu.c
index d2d1122..5e6ac72 100644
--- a/Source/Menu.c
+++ b/Source/Menu.c
@@ -113,7 +113,7 @@ static SsVag AcceptSnd;
static TYPE_CHEAT TestCheat;
static TYPE_CHEAT StackCheckCheat;
-static char * MainMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\MAINMENU.TIM;1" ,
+static char* MainMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\MAINMENU.TIM;1" ,
"cdrom:\\DATA\\SOUNDS\\BELL.VAG;1" ,
"cdrom:\\DATA\\SOUNDS\\ACCEPT.VAG;1" ,
"cdrom:\\DATA\\SPRITES\\PSXDISK.TIM;1" ,
diff --git a/Source/PSXSDKIntro.c b/Source/PSXSDKIntro.c
index 9c81132..d46157b 100644
--- a/Source/PSXSDKIntro.c
+++ b/Source/PSXSDKIntro.c
@@ -124,8 +124,8 @@ static bool PSXSDKIntroStringEvent;
static bool PSXSDKIntroClose;
// Text
-static char * strPSXSDKIntro = {"MADE WITH PSXSDK"};
-static char * strPSXSDKIntroAuthor = {"BY NEXTVOLUME"};
+static char* strPSXSDKIntro = {"MADE WITH PSXSDK"};
+static char* strPSXSDKIntroAuthor = {"BY NEXTVOLUME"};
/* *************************************
* Global variables
diff --git a/Source/PltParser.c b/Source/PltParser.c
index f88964c..61f066d 100644
--- a/Source/PltParser.c
+++ b/Source/PltParser.c
@@ -38,18 +38,18 @@ enum
/* *************************************
* Local Prototypes
* *************************************/
-static void PltParserResetBuffers(TYPE_FLIGHT_DATA * ptrFlightData);
+static void PltParserResetBuffers(TYPE_FLIGHT_DATA* ptrFlightData);
-bool PltParserLoadFile(char * strPath, TYPE_FLIGHT_DATA * ptrFlightData)
+bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t i;
uint8_t j;
uint8_t aircraftIndex;
bool first_line_read = false;
- char * buffer;
+ char* buffer;
char lineBuffer[LINE_MAX_CHARACTERS];
- char * lineBufferPtr;
- char * pltBufferSavePtr;
+ char* lineBufferPtr;
+ char* pltBufferSavePtr;
char strHour[PLT_HOUR_MINUTE_CHARACTERS];
char strMinutes[PLT_HOUR_MINUTE_CHARACTERS];
uint8_t* strPltBuffer;
@@ -239,7 +239,7 @@ bool PltParserLoadFile(char * strPath, TYPE_FLIGHT_DATA * ptrFlightData)
return true;
}
-void PltParserResetBuffers(TYPE_FLIGHT_DATA * ptrFlightData)
+void PltParserResetBuffers(TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t i;
@@ -257,3 +257,80 @@ void PltParserResetBuffers(TYPE_FLIGHT_DATA * ptrFlightData)
memset(ptrFlightData->Parking,0,GAME_MAX_AIRCRAFT);
memset(ptrFlightData->Finished,0,GAME_MAX_AIRCRAFT);
}
+
+uint8_t* PltParserGenerateFile(TYPE_PLT_CONFIG* ptrPltConfig)
+{
+ enum
+ {
+ MIN_AIRCRAFT_TIMELAPSE_MIN_SECONDS_EASY = 30,
+ MIN_AIRCRAFT_TIMELAPSE_MAX_SECONDS_EASY = 45,
+ MIN_AIRCRAFT_TIMELAPSE_MIN_SECONDS_MEDIUM = 20,
+ MIN_AIRCRAFT_TIMELAPSE_MAX_SECONDS_MEDIUM = 30,
+ MIN_AIRCRAFT_TIMELAPSE_MIN_SECONDS_HARD = 10,
+ MIN_AIRCRAFT_TIMELAPSE_MAX_SECONDS_HARD = 20,
+ };
+
+ enum
+ {
+ MIN_AIRCRAFT_EASY = 5,
+ MAX_AIRCRAFT_EASY = 10,
+ MIN_AIRCRAFT_MEDIUM = 10,
+ MAX_AIRCRAFT_MEDIUM = GAME_MAX_AIRCRAFT >> 1,
+ MIN_AIRCRAFT_HARD = 20,
+ MAX_AIRCRAFT_HARD = GAME_MAX_AIRCRAFT,
+ };
+
+ typedef enum t_Hour
+ {
+ MIN_HOUR = 0,
+ MAX_HOUR = 23
+ }TYPE_HOUR;
+
+ typedef enum t_Minute
+ {
+ MIN_MINUTE = 0,
+ MAX_MINUTE = 59
+ }TYPE_MINUTE;
+
+ uint8_t* PltBuffer = SystemGetBufferAddress();
+ uint8_t minAircraftTime;
+ uint8_t maxAircraftTime;
+ uint8_t nAircraft;
+ uint8_t i;
+ TYPE_HOUR InitialHour;
+ TYPE_MINUTE InitialMinutes;
+ char auxBuffer[32] = {0};
+
+ switch(ptrPltConfig->Level)
+ {
+ case LEVEL_DIFFICULTY_EASY:
+ minAircraftTime = MIN_AIRCRAFT_TIMELAPSE_MIN_SECONDS_EASY;
+ maxAircraftTime = MIN_AIRCRAFT_TIMELAPSE_MAX_SECONDS_EASY;
+ nAircraft = SystemRand(MIN_AIRCRAFT_EASY, MAX_AIRCRAFT_EASY);
+ break;
+
+ case LEVEL_DIFFICULTY_MEDIUM:
+ minAircraftTime = MIN_AIRCRAFT_TIMELAPSE_MIN_SECONDS_MEDIUM;
+ maxAircraftTime = MIN_AIRCRAFT_TIMELAPSE_MAX_SECONDS_MEDIUM;
+ nAircraft = SystemRand(MIN_AIRCRAFT_MEDIUM, MAX_AIRCRAFT_MEDIUM);
+ break;
+
+ case LEVEL_DIFFICULTY_HARD:
+ minAircraftTime = MIN_AIRCRAFT_TIMELAPSE_MIN_SECONDS_HARD;
+ maxAircraftTime = MIN_AIRCRAFT_TIMELAPSE_MAX_SECONDS_HARD;
+ nAircraft = SystemRand(MIN_AIRCRAFT_HARD, MAX_AIRCRAFT_HARD);
+ break;
+ }
+
+ SystemClearBuffer();
+
+ // At this point, PltBuffer is filled with zeros. Start generating PLT file.
+
+ InitialHour = SystemRand(MIN_HOUR, MAX_HOUR);
+
+ InitialMinutes = SystemRand(MIN_MINUTE, MAX_MINUTE);
+
+ snprintf(auxBuffer, 32, "%d:%d\n", InitialHour, InitialMinutes);
+
+ return PltBuffer;
+}
diff --git a/Source/PltParser.h b/Source/PltParser.h
index f7bf78d..514e79d 100644
--- a/Source/PltParser.h
+++ b/Source/PltParser.h
@@ -21,7 +21,8 @@
* Global prototypes
* *************************************/
-bool PltParserLoadFile(char * strPath, TYPE_FLIGHT_DATA * ptrFlightData);
+bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData);
+uint8_t* PltParserGenerateFile(TYPE_PLT_CONFIG* ptrPltConfig);
/* *************************************
* Global variables
diff --git a/Source/Sfx.c b/Source/Sfx.c
index 260c7a5..1c1a8dc 100644
--- a/Source/Sfx.c
+++ b/Source/Sfx.c
@@ -28,7 +28,7 @@ void SfxPlaySound(SsVag * sound)
SsPlayVag(sound, sound->cur_voice, MAX_VOLUME, MAX_VOLUME);
}
-bool SfxUploadSound(char * file_path, SsVag * vag)
+bool SfxUploadSound(char* file_path, SsVag * vag)
{
if(SystemLoadFile(file_path) == false)
{
diff --git a/Source/Sfx.h b/Source/Sfx.h
index 1e5025b..f687353 100644
--- a/Source/Sfx.h
+++ b/Source/Sfx.h
@@ -30,7 +30,7 @@ typedef enum t_musicTracks
* *************************************/
void SfxPlaySound(SsVag * sound);
-bool SfxUploadSound(char * file_path, SsVag * vag);
+bool SfxUploadSound(char* file_path, SsVag * vag);
void SfxPlayTrack(MUSIC_TRACKS track);
void SfxStopMusic(void);
diff --git a/Source/System.c b/Source/System.c
index 48533c1..6645682 100644
--- a/Source/System.c
+++ b/Source/System.c
@@ -346,7 +346,7 @@ void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step)
/* ****************************************************************************************
*
- * @name bool SystemLoadFileToBuffer(char * fname, uint8_t* buffer, uint32_t szBuffer)
+ * @name bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer)
*
* @author: Xavier Del Campo
*
@@ -357,7 +357,7 @@ void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step)
*
* ****************************************************************************************/
-bool SystemLoadFileToBuffer(char * fname, uint8_t* buffer, uint32_t szBuffer)
+bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer)
{
FILE *f;
int32_t size;
@@ -414,7 +414,7 @@ bool SystemLoadFileToBuffer(char * fname, uint8_t* buffer, uint32_t szBuffer)
/* ****************************************************************************************
*
- * @name bool SystemLoadFile(char *fname)
+ * @name bool SystemLoadFile(char*fname)
*
* @author: Xavier Del Campo
*
@@ -424,7 +424,7 @@ bool SystemLoadFileToBuffer(char * fname, uint8_t* buffer, uint32_t szBuffer)
*
* ****************************************************************************************/
-bool SystemLoadFile(char *fname)
+bool SystemLoadFile(char*fname)
{
return SystemLoadFileToBuffer(fname,file_buffer,sizeof(file_buffer));
}
@@ -446,6 +446,21 @@ uint8_t* SystemGetBufferAddress(void)
/* ******************************************************************
*
+ * @name void SystemClearBuffer(void)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @return: Fills internal buffer with zeros
+ *
+ * *****************************************************************/
+
+void SystemClearBuffer(void)
+{
+ memset(file_buffer, 0, sizeof(file_buffer));
+}
+
+/* ******************************************************************
+ *
* @name void SystemWaitCycles(uint32_t cycles)
*
* @author: Xavier Del Campo
@@ -788,7 +803,7 @@ void SystemSetStackPattern(void)
*ptrStack = END_STACK_PATTERN;
}
-int32_t SystemIndexOfStringArray(char * str, char ** array)
+int32_t SystemIndexOfStringArray(char* str, char** array)
{
int32_t i;
diff --git a/Source/System.h b/Source/System.h
index dda7c01..2030117 100644
--- a/Source/System.h
+++ b/Source/System.h
@@ -34,10 +34,10 @@ void SystemSetRandSeed(void);
bool SystemRefreshNeeded(void);
// Loads a file into system's internal buffer
-bool SystemLoadFile(char *fname);
+bool SystemLoadFile(char*fname);
// Loads a file into desired buffer
-bool SystemLoadFileToBuffer(char * fname, uint8_t* buffer, uint32_t szBuffer);
+bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer);
// Clears VSync flag after each frame
void SystemDisableScreenRefresh(void);
@@ -116,7 +116,7 @@ void SystemCheckStack(void);
// Looks for string "str" inside a string array pointed to by "array".
// Returns index inside string array on success, -1 if not found.
-int32_t SystemIndexOfStringArray(char * str, char ** array);
+int32_t SystemIndexOfStringArray(char* str, char** array);
// Function overload for uint16_t data type.
int32_t SystemIndexOf_U16(uint16_t value, uint16_t* array, uint32_t sz);
@@ -126,6 +126,8 @@ int32_t SystemIndexOf_U8(uint8_t value, uint8_t* array, uint32_t from, uint32_t
void SystemCyclicHandler(void);
+void SystemClearBuffer(void);
+
/* **************************************
* Global Variables *
* **************************************/