aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2017-08-18 20:17:13 +0200
committerXaviDCR92 <xavi.dcr@gmail.com>2017-08-18 20:17:13 +0200
commitb1aad213d450beae9920e30d6534680474f8df6f (patch)
treeac1f7affa103f70ad08e468e5450de7b21360dfa
parent150cc8adc003fea9812a58f1f224ec10a91cd44a (diff)
downloadairport-b1aad213d450beae9920e30d6534680474f8df6f.tar.gz
* Added more comments.
* Radio chatter sounds. * Created aircraft state STATE_STOPPED, to be used when L1 is pressed on aircraft selection mode.
-rw-r--r--Sounds/SOUND_SOURCES17
-rw-r--r--Source/Aircraft.c4
-rw-r--r--Source/Font.c2
-rw-r--r--Source/Font.h3
-rw-r--r--Source/Game.c278
-rw-r--r--Source/GameGui.c25
-rw-r--r--Source/GameStructures.h1
-rw-r--r--Source/LoadMenu.c2
-rw-r--r--Source/Makefile78
-rw-r--r--Source/PltParser.c2
-rw-r--r--Source/Sfx.c21
-rw-r--r--Source/System.c2
12 files changed, 362 insertions, 73 deletions
diff --git a/Sounds/SOUND_SOURCES b/Sounds/SOUND_SOURCES
index da49afd..4fca4c7 100644
--- a/Sounds/SOUND_SOURCES
+++ b/Sounds/SOUND_SOURCES
@@ -9,3 +9,20 @@ http://freesound.org/people/Hard3eat/sounds/351780/
CD sound obtained from:
http://freesound.org/people/cmorris035/sounds/207276/
+
+Takeoff1.wav:
+http://freesound.org/people/hannagreen/sounds/346570/
+
+Beep.wav:
+http://freesound.org/people/jobro/sounds/33778/
+
+R C P M 1 A 1
+| | | | | | V
+| | | | | V Message number
+| | | | V A = Approach, D = Departure
+| | | V Voice number
+| | V M = Man, W = Woma
+| V P = Pilot, T = Tower
+| Chatter
+V
+Radio
diff --git a/Source/Aircraft.c b/Source/Aircraft.c
index 0347edd..27a62d0 100644
--- a/Source/Aircraft.c
+++ b/Source/Aircraft.c
@@ -269,6 +269,10 @@ void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft)
{
switch(ptrAircraft->State)
{
+ case STATE_STOPPED:
+ ptrAircraft->Speed = 0;
+ break;
+
case STATE_FINAL:
ptrAircraft->Speed = AircraftSpeedsTable[AIRCRAFT_SPEED_FINAL];
break;
diff --git a/Source/Font.c b/Source/Font.c
index 6da18be..c00de66 100644
--- a/Source/Font.c
+++ b/Source/Font.c
@@ -12,6 +12,8 @@
* *************************************/
#define FONT_INTERNAL_TEXT_BUFFER_MAX_SIZE 200
+#define FONT_DEFAULT_CHAR_SIZE 16
+#define FONT_DEFAULT_INIT_CHAR '!'
/* *************************************
* Local Prototypes
diff --git a/Source/Font.h b/Source/Font.h
index 74547bb..e066d63 100644
--- a/Source/Font.h
+++ b/Source/Font.h
@@ -12,9 +12,6 @@
* Defines
* *************************************/
-#define FONT_DEFAULT_CHAR_SIZE 16
-#define FONT_DEFAULT_INIT_CHAR '!'
-
/* **************************************
* Structs and enums *
* *************************************/
diff --git a/Source/Game.c b/Source/Game.c
index 33bc903..3657a31 100644
--- a/Source/Game.c
+++ b/Source/Game.c
@@ -136,6 +136,14 @@ enum
LAST_TILE_TILESET2 = LAST_TILE_TILESET1
};
+enum
+{
+ SOUND_M1_INDEX = 0,
+ SOUND_W1_INDEX,
+
+ MAX_RADIO_CHATTER_SOUNDS
+}RADIO_CHATTER_VOICE_NUMBERS;
+
/* *************************************
* Local Prototypes
* *************************************/
@@ -211,6 +219,16 @@ static uint8_t GameAircraftCollisionIdx;
static TYPE_BUILDING_DATA GameBuildingData[MAX_BUILDING_ID];
static uint8_t GameAircraftTilemap[GAME_MAX_MAP_SIZE][GAME_MAX_AIRCRAFT_PER_TILE];
+// Radio chatter
+static SsVag ApproachSnds[MAX_RADIO_CHATTER_SOUNDS];
+static SsVag TowerFinalSnds[MAX_RADIO_CHATTER_SOUNDS];
+
+// Takeoff sounds
+static SsVag TakeoffSnd;
+
+// Beep sounds (taxiway/parking accept)
+static SsVag BeepSnd;
+
// Instances for player-specific data
static TYPE_PLAYER PlayerData[MAX_PLAYERS];
@@ -218,18 +236,28 @@ static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\TILESET1.TIM;1" ,
"cdrom:\\DATA\\SPRITES\\GAMEPLN.TIM;1" ,
"cdrom:\\DATA\\SPRITES\\PLNBLUE.CLT;1" ,
"cdrom:\\DATA\\SPRITES\\MOUSE.TIM;1" ,
- "cdrom:\\DATA\\SPRITES\\BLDNGS1.TIM;1" };
+ "cdrom:\\DATA\\SPRITES\\BLDNGS1.TIM;1" ,
+ "cdrom:\\DATA\\SOUNDS\\RCPW1A1.VAG;1" ,
+ "cdrom:\\DATA\\SOUNDS\\RCPM1A1.VAG;1" ,
+ "cdrom:\\DATA\\SOUNDS\\RCTM1F1.VAG;1" ,
+ "cdrom:\\DATA\\SOUNDS\\TAKEOFF1.VAG;1" ,
+ "cdrom:\\DATA\\SOUNDS\\BEEP.VAG;1" };
-static void* GameFileDest[] = { (GsSprite*)&GameTilesetSpr ,
- (GsSprite*)&GamePlaneSpr ,
- NULL,
- (GsSprite*)&GameMouseSpr ,
- (GsSprite*)&GameBuildingSpr };
+static void* GameFileDest[] = { (GsSprite*)&GameTilesetSpr ,
+ (GsSprite*)&GamePlaneSpr ,
+ NULL , // CLT files must use NULL pointers
+ (GsSprite*)&GameMouseSpr ,
+ (GsSprite*)&GameBuildingSpr ,
+ (SsVag*)&ApproachSnds[SOUND_M1_INDEX] ,
+ (SsVag*)&ApproachSnds[SOUND_W1_INDEX] ,
+ (SsVag*)&TowerFinalSnds[SOUND_M1_INDEX] ,
+ (SsVag*)&TakeoffSnd ,
+ (SsVag*)&BeepSnd };
static char* GamePlt[] = { "cdrom:\\DATA\\LEVELS\\LEVEL1.PLT;1" };
-static void* GamePltDest[] = {(TYPE_FLIGHT_DATA*)&FlightData ,};
+static void* GamePltDest[] = {(TYPE_FLIGHT_DATA*)&FlightData };
-static char* GameLevelList[] = { "cdrom:\\DATA\\LEVELS\\LEVEL1.LVL;1"};
+static char* GameLevelList[] = {"cdrom:\\DATA\\LEVELS\\LEVEL1.LVL;1"};
static uint16_t GameLevelBuffer[GAME_MAX_MAP_SIZE];
static uint8_t GameLevelColumns;
@@ -866,13 +894,6 @@ void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
CameraMoveToIsoPos(ptrPlayer, IsoPos);
}
- if(System1SecondTick() == true)
- {
- dprintf("ptrPlayer = 0x%08X\n", ptrPlayer);
- DEBUG_PRINT_VAR(ptrPlayer->ActiveAircraft);
- DEBUG_PRINT_VAR(ptrPlayer->FlightDataPage);
- }
-
GameActiveAircraftList(ptrPlayer, ptrFlightData);
GameStateUnboarding(ptrPlayer, ptrFlightData);
GameStateLockTarget(ptrPlayer, ptrFlightData);
@@ -1181,9 +1202,6 @@ void GameRenderBuildingAircraft(TYPE_PLAYER* ptrPlayer)
GameBuildingSpr.w = GameBuildingData[CurrentBuilding].w;
GameBuildingSpr.h = GameBuildingData[CurrentBuilding].h;
- //DEBUG_PRINT_VAR(buildingIsoPos.x);
- //DEBUG_PRINT_VAR(buildingIsoPos.y);
-
CameraApplyCoordinatesToSprite(ptrPlayer, &GameBuildingSpr);
for(k = 0; k < GAME_MAX_AIRCRAFT_PER_TILE; k++)
@@ -1409,6 +1427,8 @@ void GameAircraftState(uint8_t i)
FlightData.State[i] = STATE_APPROACH;
GameAircraftCreatedFlag = true;
+ SfxPlaySound(&ApproachSnds[SystemRand(SOUND_M1_INDEX, MAX_RADIO_CHATTER_SOUNDS - 1)]);
+
// Create notification request for incoming aircraft
GameGuiBubbleShow();
}
@@ -1908,6 +1928,8 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrF
}
target_tile = GameLevelBuffer[ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx]];
+
+ SfxPlaySound(&BeepSnd);
switch(target_tile)
{
@@ -2021,6 +2043,8 @@ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptr
Serial_printf("target_tile = %d, TILE_PARKING = %d\n",
target_tile,
TILE_PARKING);
+
+ SfxPlaySound(&BeepSnd);
if( (target_tile == TILE_PARKING)
||
@@ -2262,6 +2286,7 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli
case STATE_READY_FOR_TAKEOFF:
ptrFlightData->State[AircraftIdx] = STATE_TAKEOFF;
GameCreateTakeoffWaypoints(ptrPlayer, ptrFlightData, AircraftIdx);
+ SfxPlaySound(&TakeoffSnd);
break;
case STATE_HOLDING_RWY:
@@ -2298,6 +2323,19 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli
Serial_printf("aircraftState = %d\n", aircraftState);
Serial_printf("AircraftIdx = %d\n", AircraftIdx);
}
+ else if(ptrPlayer->PadKeySinglePress_Callback(PAD_L1) == true)
+ {
+ FL_STATE* AircraftState = &FlightData.State[ptrPlayer->FlightDataSelectedAircraft];
+
+ if(*AircraftState == STATE_TAXIING)
+ {
+ *AircraftState = STATE_STOPPED;
+ }
+ else if(*AircraftState == STATE_STOPPED)
+ {
+ *AircraftState = STATE_TAXIING;
+ }
+ }
}
}
@@ -2456,15 +2494,6 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli
// Remember that ptrPlayer->SelectedAircraft contains an index to
// be used with ptrFlightData.
- /*typedef enum t_flstate
-{
- STATE_IDLE = 0,
- STATE_PARKED,
- STATE_TAXIING,
- STATE_APPROACH,
- STATE_FINAL
- }FL_STATE;*/
-
Serial_printf("aircraftIndex = %d\n",aircraftIndex);
if(ptrFlightData->State[aircraftIndex] == STATE_APPROACH)
@@ -2511,6 +2540,8 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli
Serial_printf("Exceeded maximum aircraft number!\n");
return;
}
+
+ SfxPlaySound(&TowerFinalSnds[SystemRand(SOUND_M1_INDEX, MAX_RADIO_CHATTER_SOUNDS - 1)]);
}
else if(ptrFlightData->State[aircraftIndex] == STATE_HOLDING_RWY)
{
@@ -3297,6 +3328,8 @@ void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData
}
Serial_printf("ptrPlayer->UnboardingSequenceIdx = %d\n", ptrPlayer->UnboardingSequenceIdx);
+
+ SfxPlaySound(&BeepSnd);
}
else if(ptrPlayer->PadLastKeySinglePressed_Callback() != 0)
{
@@ -3348,6 +3381,29 @@ void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer)
Serial_printf("\n");
}
+/* *********************************************************************************************************************
+ *
+ * @name: void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData, uint8_t aircraftIdx)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ * TYPE_PLAYER* ptrPlayer:
+ * Pointer to a player structure
+ *
+ * TYPE_FLIGHT_DATA* ptrFlightData:
+ * In the end, pointer to FlightData data table, which contains
+ * information about all available flights.
+ *
+ * uint8_t aircraftIdx:
+ * Index from FlightData.
+ *
+ * @brief:
+ * Given input aircraft from FlightData, it automatically looks for selected runway and creates an array
+ * of waypoints to be then executed by corresponding TYPE_AIRCRAFT_DATA instance.
+ *
+ * *********************************************************************************************************************/
+
void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData, uint8_t aircraftIdx)
{
// Look for aircraft direction by searching TILE_RWY_EXIT
@@ -3415,6 +3471,25 @@ void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli
AircraftAddTargets(AircraftFromFlightDataIndex(aircraftIdx), targets);
}
+/* *******************************************************************************************
+ *
+ * @name: void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntry)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * uint8_t aircraftIdx:
+ * Index from FlightData. Used to determine target tile.
+ *
+ * TYPE_RWY_ENTRY_DATA* ptrRwyEntry:
+ * Instance to be filled with runway data.
+ *
+ * @brief:
+ * Fills a TYPE_RWY_ENTRY_DATA instance with information about runway.
+ *
+ * *******************************************************************************************/
+
void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntry)
{
// Look for aircraft direction by searching TILE_RWY_EXIT
@@ -3484,6 +3559,22 @@ void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntr
}
}
+/* *******************************************************************************************
+ *
+ * @name: bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos:
+ * (x, y, z) coordinate data in an isometric system.
+ *
+ * @return:
+ * Returns true if a (x, y, z) coordinate is inside level coordinates. False otherwise.
+ *
+ * *******************************************************************************************/
+
bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos)
{
short x = (short)fix16_to_int(ptrIsoPos->x);
@@ -3512,6 +3603,28 @@ bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos)
return false;
}
+/* *******************************************************************************************
+ *
+ * @name: void GameRemoveFlight(uint8_t idx, bool successful)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * uint8_t idx:
+ * Index from FlightData.
+ *
+ * bool successful:
+ * False if flight was lost on timeout, true otherwise.
+ *
+ * @brief:
+ * Actions to be performed when a flight ends, both successfully or not (lost flight).
+ *
+ * @remarks:
+ * GameScore is updated here depending on player actions.
+ *
+ * *******************************************************************************************/
+
void GameRemoveFlight(uint8_t idx, bool successful)
{
uint8_t i;
@@ -3623,6 +3736,26 @@ void GameRemoveFlight(uint8_t idx, bool successful)
}
}
+/* *******************************************************************************************
+ *
+ * @name: void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * TYPE_PLAYER* ptrPlayer:
+ * Pointer to a player structure
+ *
+ * TYPE_FLIGHT_DATA* ptrFlightData:
+ * In the end, pointer to FlightData data table, which contains
+ * information about all available flights.
+ *
+ * @brief:
+ * Rebuilds flight data arrray for a specific player.
+ *
+ * *******************************************************************************************/
+
void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
{
uint8_t i;
@@ -3634,7 +3767,7 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightD
// Clear all pointers for aircraft data first.
// Then, rebuild aircraft list for player.
- lastFlightDataIdx = ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft];
+ lastFlightDataIdx = ptrPlayer->FlightDataSelectedAircraft;
memset(ptrPlayer->ActiveAircraftList, 0, GAME_MAX_AIRCRAFT);
ptrPlayer->ActiveAircraft = 0;
@@ -3650,7 +3783,7 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightD
}
}
- currentFlightDataIdx = ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft];
+ currentFlightDataIdx = ptrPlayer->FlightDataSelectedAircraft;
if(GameAircraftCreatedFlag == true)
{
@@ -3662,7 +3795,7 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightD
{
for(ptrPlayer->SelectedAircraft = 0; ptrPlayer->SelectedAircraft < FlightData.nAircraft; ptrPlayer->SelectedAircraft++)
{
- if(ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft] == lastFlightDataIdx)
+ if(ptrPlayer->FlightDataSelectedAircraft == lastFlightDataIdx)
{
break;
}
@@ -3672,6 +3805,26 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightD
}
}
+/* *******************************************************************************************
+ *
+ * @name: void GameRemainingAircraft(uint8_t i)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * uint8_t i:
+ * Index from FlightData.
+ *
+ * @brief:
+ * Reportedly, it updates FlightData.nRemainingAircraft depending on game status.
+ *
+ * @remarks:
+ * This function is called nActiveAircraft times. See loop inside GameCalculations()
+ * for further reference.
+ *
+ * *******************************************************************************************/
+
void GameRemainingAircraft(uint8_t i)
{
// Reset iterator when starting from first element.
@@ -3687,19 +3840,28 @@ void GameRemainingAircraft(uint8_t i)
}
}
+/* *******************************************************************************************
+ *
+ * @name: void GameFinished(uint8_t i)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * uint8_t i:
+ * Index from FlightData.
+ *
+ * @brief:
+ * Sets GameFinishedFlag if there are no more active aircraft.
+ *
+ * @remarks:
+ * This function is called nActiveAircraft times. See loop inside GameCalculations()
+ * for further reference.
+ *
+ * *******************************************************************************************/
+
void GameFinished(uint8_t i)
{
- /*uint8_t i;
-
- for(i = 0; i < FlightData.nAircraft; i++)
- {
- if(FlightData.Finished[i] == false)
- {
- // At least one aircraft still not finished
- return false;
- }
- }*/
-
if(i == 0)
{
GameFinishedFlag = true;
@@ -3711,11 +3873,45 @@ void GameFinished(uint8_t i)
}
}
+/* *******************************************************************************************
+ *
+ * @name: void GameMinimumSpawnTimeout(void)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * uint8_t i:
+ * Index from FlightData.
+ *
+ * @brief:
+ * Callback automatically executed on GameSpawnMinTime expired. spawnMinTimeFlag is used
+ * to set a minimum time between flight ended and flight spawn.
+ *
+ * *******************************************************************************************/
+
void GameMinimumSpawnTimeout(void)
{
spawnMinTimeFlag = false;
}
+/* *******************************************************************************************
+ *
+ * @name: void GameAircraftCollision(uint8_t AircraftIdx)
+ *
+ * @author: Xavier Del Campo
+ *
+ * @param:
+ *
+ * uint8_t AircraftIdx:
+ * Index from FlightData.
+ *
+ * @brief:
+ * Sets GameAircraftCollisionFlag when two or more aircraft collide. This flag is then
+ * checked by Game().
+ *
+ * *******************************************************************************************/
+
void GameAircraftCollision(uint8_t AircraftIdx)
{
GameAircraftCollisionFlag = true;
diff --git a/Source/GameGui.c b/Source/GameGui.c
index 237ef0e..c049ebd 100644
--- a/Source/GameGui.c
+++ b/Source/GameGui.c
@@ -82,6 +82,14 @@ enum
enum
{
+ AIRCRAFT_STOP_X = 192,
+ AIRCRAFT_STOP_TEXT_X = AIRCRAFT_STOP_X + 16,
+ AIRCRAFT_STOP_Y = AIRCRAFT_LOCK_TARGET_Y,
+ AIRCRAFT_STOP_TEXT_Y = AIRCRAFT_STOP_Y + 4
+};
+
+enum
+{
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R0 = NORMAL_LUMINANCE,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R1 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R2 = 0,
@@ -593,6 +601,16 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData
{
FontPrintText(&SmallFont, AIRCRAFT_LOCK_TARGET_TEXT_X, AIRCRAFT_LOCK_TARGET_TEXT_Y, "Lock target");
}
+
+ if(ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] == STATE_STOPPED)
+ {
+ GfxDrawButton(AIRCRAFT_STOP_X, AIRCRAFT_STOP_Y, PAD_L1);
+ FontPrintText(&SmallFont, AIRCRAFT_STOP_TEXT_X, AIRCRAFT_STOP_TEXT_Y, "Resume taxiing");
+ }
+ else if(ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] == STATE_TAXIING)
+ {
+ FontPrintText(&SmallFont, AIRCRAFT_STOP_TEXT_X, AIRCRAFT_STOP_TEXT_Y, "Stop immediately");
+ }
}
else
{
@@ -843,6 +861,13 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Holding" );
break;
+
+ case STATE_STOPPED:
+ FontPrintText( &SmallFont,
+ AircraftDataDirection_X + AircraftDataState_X_Offset,
+ AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
+ "Stopped" );
+ break;
default:
break;
diff --git a/Source/GameStructures.h b/Source/GameStructures.h
index 726bba0..c7082d8 100644
--- a/Source/GameStructures.h
+++ b/Source/GameStructures.h
@@ -46,6 +46,7 @@ typedef enum t_flstate
STATE_CLIMBING,
STATE_APPROACH,
STATE_FINAL,
+ STATE_STOPPED,
STATE_LANDED
}FL_STATE;
diff --git a/Source/LoadMenu.c b/Source/LoadMenu.c
index d7ea80a..9595cc5 100644
--- a/Source/LoadMenu.c
+++ b/Source/LoadMenu.c
@@ -426,7 +426,7 @@ void ISR_LoadMenuVBlank(void)
LOADING_BAR_Y + LOADING_BAR_HEIGHT + 8,
strCurrentFile );
- FontSetFlags(&SmallFont, FONT_NOFLAGS);
+ //FontSetFlags(&SmallFont, FONT_NOFLAGS);
GfxDrawScene_Fast();
}
diff --git a/Source/Makefile b/Source/Makefile
index d2d7a4d..7393dd1 100644
--- a/Source/Makefile
+++ b/Source/Makefile
@@ -1,46 +1,77 @@
+# Project-wise definitions
+PROJECT = AIRPORT
+
+# GNU Toolchain definitions
CC = psx-gcc
+LINKER = psx-gcc
+GNU_SIZE = mipsel-unknown-elf-size
+
+# Custom define flags for GCC
DEFINE= -DFIXMATH_FAST_SIN -D_PAL_MODE_
DEFINE += -DPSXSDK_DEBUG
DEFINE += -DNO_CDDA
DEFINE += -DNO_INTRO
-#DEFINE += -DSERIAL_INTERFACE
-PSXSDK_PATH = /usr/local/psxsdk
+# Compiler flags
LIBS= -lfixmath
CC_FLAGS = -Wall -Werror -c -Os -Wfatal-errors
-LINKER = psx-gcc
+
+# Path definitions
+PSXSDK_PATH = /usr/local/psxsdk
PATH := $(PATH):$(PSXSDK_PATH)/bin/
+PROJECT_DIR = ~/$(PROJECT)
-PROJECT = AIRPORT
-PROJECT_DIR = ~/Airport
+#Uncomment this DEFINE below to use Airport together with OpenSend + QPSXSerial toolchain.
+#DEFINE += -DSERIAL_INTERFACE
+# PSXSDK tools definitions
+# ELF2EXE:
ELF2EXE = elf2exe
ELF2EXE_FLAGS = -mark="A homebrew game created with PSXSDK"
LICENSE_FILE = /usr/local/psxsdk/share/licenses/infoeur.dat
-PSXSDK_DIR = /usr/local/psxsdk/bin
-
+# PCSX-R
EMULATOR_DIR = ~/pcsxr
EMULATOR = pcsxr.exe
-SOUND_INTERFACE =
+# Uncomment the line below if you get no sound output under Linux.
+#SOUND_INTERFACE += padsp
EMULATOR_FLAGS = -nogui -psxout
+
+# Objects definition
+# Compiled objects list
OBJ_DIR = Obj
SRC_DIR = .
+OBJECTS = $(addprefix $(OBJ_DIR)/,main.o System.o Menu.o Gfx.o Pad.o MainMenuBtnAni.o \
+ LoadMenu.o GameGui.o Sfx.o Camera.o EndAnimation.o \
+ PSXSDKIntro.o PltParser.o Game.o Font.o MemCard.o \
+ Aircraft.o Serial.o Timer.o)
+
+# Source dependencies:
+DEPS = $(OBJECTS:.o=.d)
+
+# CD-DA objects:
MUSIC_TRACKS = --track=../Bin/TRACK01.bin --track=../Bin/TRACK02.bin --track=../Bin/TRACK03.bin
FFMPEG = ffmpeg
FFMPEG_DIR = ../Music/ffmpeg/bin
FFMPEG_FLAGS = -f s16le -acodec pcm_s16le
-GNU_SIZE = mipsel-unknown-elf-size
-
-OBJECTS = $(addprefix $(OBJ_DIR)/,main.o System.o Menu.o Gfx.o Pad.o MainMenuBtnAni.o \
- LoadMenu.o GameGui.o Sfx.o Camera.o EndAnimation.o \
- PSXSDKIntro.o PltParser.o Game.o Font.o MemCard.o \
- Aircraft.o Serial.o Timer.o)
-
-DEPS = $(OBJECTS:.o=.d)
-
-build: levels $(PROJECT).bin
+# VAG objects:
+SOURCE_SOUNDS_FOLDER = ../Sounds
+SOUNDS_FOLDER = ../cdimg/DATA/SOUNDS
+SOUND_OBJECTS = $(addprefix $(SOUNDS_FOLDER)/, BELL.VAG \
+ ACCEPT.VAG \
+ TRAYCL.VAG \
+ SPINDISK.VAG \
+ BEEP.VAG \
+ TAKEOFF1.VAG \
+ RCTM1F1.VAG \
+ RCPW1A1.VAG \
+ RCPM1A1.VAG )
+# ------------------------------------
+# Instructions
+# ------------------------------------
+
+build: sounds levels $(PROJECT).bin
rebuild: clean build
@@ -50,6 +81,7 @@ music_objects: $(addprefix ../Music/, TRACK01.bin TRACK02.bin TRACK03.bin)
clean:
rm -f Obj/*.o
+ rm -f ../cdimg/DATA/SOUNDS/*.VAG
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(OBJ_DIR)/%.d
$(CC) $< -o $@ $(DEFINE) $(CC_FLAGS) -MMD
@@ -105,13 +137,11 @@ tiles:
bmp2tim ../Sprites/DepArr.bmp ../cdimg/DATA/SPRITES/DEPARR.TIM 16 -org=552,240 -mpink
bmp2tim ../Sprites/PageUpDn.bmp ../cdimg/DATA/SPRITES/PAGEUPDN.TIM 16 -org=504,240 -mpink
bmp2tim ../Sprites/Bldngs1.bmp ../cdimg/DATA/SPRITES/BLDNGS1.TIM 16 -org=640,128 -mpink
+
+$(SOUNDS_FOLDER)/%.VAG: $(SOURCE_SOUNDS_FOLDER)/%.wav
+ wav2vag $^ $@
-sounds:
- rm -f ../cdimg/DATA/SOUNDS/*.VAG
- wav2vag ../Sounds/Bell.wav ../cdimg/DATA/SOUNDS/BELL.VAG
- wav2vag ../Sounds/Accept.wav ../cdimg/DATA/SOUNDS/ACCEPT.VAG
- wav2vag ../Sounds/TrayCl.wav ../cdimg/DATA/SOUNDS/TRAYCL.VAG
- wav2vag ../Sounds/SpinDisk.wav ../cdimg/DATA/SOUNDS/SPINDISK.VAG
+sounds: $(SOUND_OBJECTS)
levels: LEVEL1.LVL LEVEL1.PLT
diff --git a/Source/PltParser.c b/Source/PltParser.c
index d44e348..8460314 100644
--- a/Source/PltParser.c
+++ b/Source/PltParser.c
@@ -63,8 +63,6 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData)
}
strPltBuffer = SystemGetBufferAddress();
-
- dprintf("%s\n", strPltBuffer);
PltParserResetBuffers(ptrFlightData);
diff --git a/Source/Sfx.c b/Source/Sfx.c
index c0033d0..fc6b11c 100644
--- a/Source/Sfx.c
+++ b/Source/Sfx.c
@@ -30,11 +30,16 @@ static uint16_t SfxCddaVolumeReduction;
void SfxPlaySound(SsVag * sound)
{
- SsPlayVag(sound, sound->cur_voice, MAX_VOLUME - SfxGlobalVolumeReduction, MAX_VOLUME - SfxGlobalVolumeReduction);
+ if(sound->data_size != 0)
+ {
+ SsPlayVag(sound, sound->cur_voice, MAX_VOLUME - SfxGlobalVolumeReduction, MAX_VOLUME - SfxGlobalVolumeReduction);
+ }
}
bool SfxUploadSound(char* file_path, SsVag * vag)
{
+ static size_t SPUBytesUsed;
+
if(SystemLoadFile(file_path) == false)
{
return false;
@@ -51,6 +56,20 @@ bool SfxUploadSound(char* file_path, SsVag * vag)
voiceIndex++;
Serial_printf("SPU voices used = %d\n", voiceIndex);
+
+ SPUBytesUsed += vag->data_size;
+
+ if(SPUBytesUsed != 0)
+ {
+ enum
+ {
+ SPU_MAX_ALLOWED_BYTES = 512 * 1024 // 512 KBytes
+ };
+
+ uint16_t percentage = SPUBytesUsed * 100 / SPU_MAX_ALLOWED_BYTES;
+
+ dprintf("SPU usage: %d%%\n", percentage);
+ }
}
else
{
diff --git a/Source/System.c b/Source/System.c
index 7488028..c9f94af 100644
--- a/Source/System.c
+++ b/Source/System.c
@@ -14,7 +14,7 @@
* Defines
* *************************************/
-#define FILE_BUFFER_SIZE 0x20014
+#define FILE_BUFFER_SIZE 0x4AA60
#define END_STACK_PATTERN (uint32_t) 0x18022015
#define BEGIN_STACK_ADDRESS (uint32_t*) 0x801FFF00