diff options
| author | XaviDCR92 <xavi.dcr@gmail.com> | 2017-08-18 20:17:13 +0200 |
|---|---|---|
| committer | XaviDCR92 <xavi.dcr@gmail.com> | 2017-08-18 20:17:13 +0200 |
| commit | b1aad213d450beae9920e30d6534680474f8df6f (patch) | |
| tree | ac1f7affa103f70ad08e468e5450de7b21360dfa | |
| parent | 150cc8adc003fea9812a58f1f224ec10a91cd44a (diff) | |
| download | airport-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_SOURCES | 17 | ||||
| -rw-r--r-- | Source/Aircraft.c | 4 | ||||
| -rw-r--r-- | Source/Font.c | 2 | ||||
| -rw-r--r-- | Source/Font.h | 3 | ||||
| -rw-r--r-- | Source/Game.c | 278 | ||||
| -rw-r--r-- | Source/GameGui.c | 25 | ||||
| -rw-r--r-- | Source/GameStructures.h | 1 | ||||
| -rw-r--r-- | Source/LoadMenu.c | 2 | ||||
| -rw-r--r-- | Source/Makefile | 78 | ||||
| -rw-r--r-- | Source/PltParser.c | 2 | ||||
| -rw-r--r-- | Source/Sfx.c | 21 | ||||
| -rw-r--r-- | Source/System.c | 2 |
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 |
