From 67cfc8b2c23177f036eda97f3423d062ba0c3e90 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Fri, 29 Dec 2017 23:19:43 +0100 Subject: [PATCH] * RWY_DIR and AIRCRAFT_DIRECTION have been joint into a single enum. * Game.c: new prototypes GameGetParkingDirection() and GameGetRunwayDirection(). * Slight optimizations into GameRenderLevel(). * Added some comment headers into Gfx.c. --- Bin/AIRPORT.bin | Bin 1693440 -> 1693440 bytes Source/Aircraft.c | 76 ++++---- Source/Aircraft.h | 5 +- Source/Camera.c | 4 - Source/Camera.h | 3 - Source/EndAnimation.c | 5 - Source/EndAnimation.h | 4 - Source/Exe/AIRPORT.elf | Bin 327440 -> 327508 bytes Source/Exe/AIRPORT.iso | Bin 1474560 -> 1474560 bytes Source/Game.c | 287 ++++++++++++++-------------- Source/Game.h | 15 -- Source/GameGui.c | 5 - Source/GameStructures.h | 14 +- Source/Gfx.c | 178 ++++++++++++++--- Source/Gfx.h | 1 + Source/Global_Inc.h | 1 - Source/LoadMenu.c | 10 +- Source/MainMenuBtnAni.c | 4 - Source/MainMenuBtnAni.h | 4 - Source/MapEditor/MapEditor.pro.user | 2 +- Source/MapEditor/mainwindow.cpp | 30 ++- Source/MapEditor/mainwindow.h | 1 + Source/MapEditor/mainwindow.ui | 52 +++-- Source/MapEditor/settings.ini | 2 +- Source/Menu.c | 29 +-- Source/Menu.h | 4 - Source/PSXSDKIntro.c | 6 - Source/PSXSDKIntro.h | 4 - Source/Pad.c | 2 - Source/PltParser.c | 3 +- Source/PltParser.h | 5 - Source/Sfx.c | 4 - Source/Sfx.h | 4 - Source/System.c | 58 +----- Source/System.h | 4 - Source/main.c | 13 +- Sprites/ARROW.bmp | Bin 822 -> 822 bytes cdimg/DATA/SPRITES/ARROW.TIM | Bin 532 -> 532 bytes 38 files changed, 442 insertions(+), 397 deletions(-) diff --git a/Bin/AIRPORT.bin b/Bin/AIRPORT.bin index 50adee2ca812b85e36f64e875ca3f20d08f8e3ce..66eae84902e10f51c561ac0fcafa947784aa720d 100644 GIT binary patch delta 31568 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 T6@@DrR}3y|ZRLd6sYU+}lob|# delta 31262 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 diff --git a/Source/Aircraft.c b/Source/Aircraft.c index 423eb13..7ecd8af 100644 --- a/Source/Aircraft.c +++ b/Source/Aircraft.c @@ -118,7 +118,8 @@ void AircraftInit(void) bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData, uint8_t FlightDataIndex, - uint16_t* targets ) + uint16_t* targets, + DIRECTION direction ) { TYPE_AIRCRAFT_DATA* ptrAircraft = &AircraftData[AircraftIndex]; uint8_t level_columns = GameGetLevelColumns(); @@ -141,12 +142,9 @@ bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData, if (ptrFlightData->FlightDirection[FlightDataIndex] == ARRIVAL) { - RWY_DIR rwyDir = GameGetRunwayDirection(ptrAircraft->Target[0]); - // Calculate direction automatically. - - switch (rwyDir) + switch (direction) { - case RWY_DIR_EAST: + case DIR_EAST: ptrAircraft->IsoPos.x = 0; ptrAircraft->IsoPos.y = targets[0] / level_columns; @@ -157,11 +155,9 @@ bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData, ptrAircraft->IsoPos.z = targets[0] % level_columns; ptrAircraft->IsoPos.z <<= TILE_SIZE_BIT_SHIFT - 1; ptrAircraft->IsoPos.z = fix16_from_int(ptrAircraft->IsoPos.z); - - ptrAircraft->Direction = AIRCRAFT_DIR_EAST; break; - case RWY_DIR_SOUTH: + case DIR_SOUTH: ptrAircraft->IsoPos.x = targets[0] % level_columns; ptrAircraft->IsoPos.x <<= TILE_SIZE_BIT_SHIFT; ptrAircraft->IsoPos.x += TILE_SIZE >> 1; // Adjust to tile center @@ -172,24 +168,30 @@ bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData, ptrAircraft->IsoPos.z = targets[0] / level_columns; ptrAircraft->IsoPos.z <<= TILE_SIZE_BIT_SHIFT - 1; ptrAircraft->IsoPos.z = fix16_from_int(ptrAircraft->IsoPos.z); - - ptrAircraft->Direction = AIRCRAFT_DIR_SOUTH; break; - case RWY_INVALID_DIR: + case NO_DIRECTION: // Fall through default: - Serial_printf("Invalid runway direction %d for inbound flight.\n", rwyDir); + Serial_printf("Invalid runway direction %d for inbound flight.\n", direction); return false; } } else if (ptrFlightData->FlightDirection[FlightDataIndex] == DEPARTURE) { + if (direction == NO_DIRECTION) + { + Serial_printf("Invalid direction for outbound flight.\n"); + return false; + } + ptrAircraft->IsoPos.x = GameGetXFromTile(ptrFlightData->Parking[FlightDataIndex]); ptrAircraft->IsoPos.y = GameGetYFromTile(ptrFlightData->Parking[FlightDataIndex]); ptrAircraft->IsoPos.z = 0; } + ptrAircraft->Direction = direction; + ptrAircraft->State = ptrFlightData->State[FlightDataIndex]; AircraftFlightDataIdx_HashTable[FlightDataIndex] = AircraftIndex; @@ -206,6 +208,8 @@ bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData, Serial_printf(" %d", ptrAircraft->Target[i]); } + Serial_printf("\n\tDirection: %d\n", ptrAircraft->Direction); + Serial_printf("\nLivery: %d\n", ptrAircraft->Livery ); Serial_printf("Aircraft position: {%d, %d, %d}\n", @@ -332,23 +336,23 @@ bool AircraftCheckPath(TYPE_AIRCRAFT_DATA* ptrAircraft, TYPE_AIRCRAFT_DATA* ptrO switch (ptrAircraft->Direction) { - case AIRCRAFT_DIR_EAST: + case DIR_EAST: nextTile = currentTile + 1; break; - case AIRCRAFT_DIR_WEST: + case DIR_WEST: nextTile = currentTile - 1; break; - case AIRCRAFT_DIR_NORTH: + case DIR_NORTH: nextTile = currentTile - GameGetLevelColumns(); break; - case AIRCRAFT_DIR_SOUTH: + case DIR_SOUTH: nextTile = currentTile + GameGetLevelColumns(); break; - case AIRCRAFT_DIR_NO_DIRECTION: + case NO_DIRECTION: // Fall through default: Serial_printf("AircraftCheckPath: Undefined direction\n"); @@ -508,11 +512,13 @@ void AircraftRender(TYPE_PLAYER* ptrPlayer, uint8_t aircraftIdx) } else if (AircraftSpr.x > X_SCREEN_RESOLUTION) { - ArrowSpr.x = X_SCREEN_RESOLUTION - ArrowSpr.w; + ArrowSpr.x = X_SCREEN_RESOLUTION - ArrowSpr.w; + ArrowSpr.mx = ArrowSpr.w >> 1; + ArrowSpr.my = ArrowSpr.h >> 1; } else { - ArrowSpr.x = AircraftSpr.x; + ArrowSpr.x = AircraftSpr.x; } if (AircraftSpr.y < 0) @@ -569,7 +575,7 @@ void AircraftDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) } else { - ptrAircraft->Direction = AIRCRAFT_DIR_EAST; + ptrAircraft->Direction = DIR_EAST; ptrAircraft->IsoPos.x += ptrAircraft->Speed; } } @@ -581,7 +587,7 @@ void AircraftDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) } else { - ptrAircraft->Direction = AIRCRAFT_DIR_WEST; + ptrAircraft->Direction = DIR_WEST; ptrAircraft->IsoPos.x -= ptrAircraft->Speed; } } @@ -600,7 +606,7 @@ void AircraftDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) } else { - ptrAircraft->Direction = AIRCRAFT_DIR_SOUTH; + ptrAircraft->Direction = DIR_SOUTH; ptrAircraft->IsoPos.y += ptrAircraft->Speed; } } @@ -612,7 +618,7 @@ void AircraftDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) } else { - ptrAircraft->Direction = AIRCRAFT_DIR_NORTH; + ptrAircraft->Direction = DIR_NORTH; ptrAircraft->IsoPos.y -= ptrAircraft->Speed; } } @@ -640,23 +646,23 @@ void AircraftDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) // STATE_CLIMBING switch(ptrAircraft->Direction) { - case AIRCRAFT_DIR_EAST: + case DIR_EAST: ptrAircraft->IsoPos.x += ptrAircraft->Speed; break; - case AIRCRAFT_DIR_WEST: + case DIR_WEST: ptrAircraft->IsoPos.x -= ptrAircraft->Speed; break; - case AIRCRAFT_DIR_NORTH: + case DIR_NORTH: ptrAircraft->IsoPos.y -= ptrAircraft->Speed; break; - case AIRCRAFT_DIR_SOUTH: + case DIR_SOUTH: ptrAircraft->IsoPos.y += ptrAircraft->Speed; break; - case AIRCRAFT_DIR_NO_DIRECTION: + case NO_DIRECTION: // Fall through default: return; @@ -695,27 +701,27 @@ void AircraftUpdateSpriteFromData(TYPE_AIRCRAFT_DATA* ptrAircraft) switch(ptrAircraft->Direction) { - case AIRCRAFT_DIR_NORTH: + case DIR_NORTH: AircraftSpr.v += AircraftSpr.h; AircraftSpr.attribute |= H_FLIP; break; - case AIRCRAFT_DIR_SOUTH: + case DIR_SOUTH: AircraftSpr.v += 0; AircraftSpr.attribute |= H_FLIP; break; - case AIRCRAFT_DIR_EAST: + case DIR_EAST: AircraftSpr.v += 0; AircraftSpr.attribute &= ~(H_FLIP); break; - case AIRCRAFT_DIR_WEST: + case DIR_WEST: AircraftSpr.v += AircraftSpr.h; AircraftSpr.attribute &= ~(H_FLIP); break; - case AIRCRAFT_DIR_NO_DIRECTION: + case NO_DIRECTION: // Fall through default: break; @@ -791,7 +797,7 @@ void AircraftFromFlightDataIndexAddTargets(uint8_t index, uint16_t* targets) AircraftAddTargets(AircraftFromFlightDataIndex(index), targets); } -AIRCRAFT_DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) +DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) { return ptrAircraft->Direction; } diff --git a/Source/Aircraft.h b/Source/Aircraft.h index 4569044..c9add38 100644 --- a/Source/Aircraft.h +++ b/Source/Aircraft.h @@ -24,9 +24,10 @@ bool AircraftRemove(uint8_t aircraftIdx); uint16_t* AircraftGetTargets(uint8_t index); bool AircraftMoving(uint8_t index); uint8_t AircraftGetTargetIdx(uint8_t index); -AIRCRAFT_DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft); +DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft); bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData, uint8_t FlightDataIndex, - uint16_t* targets ); + uint16_t* targets, + DIRECTION direction ); #endif //AIRCRAFT_HEADER__ diff --git a/Source/Camera.c b/Source/Camera.c index 657fcab..f55ee4f 100644 --- a/Source/Camera.c +++ b/Source/Camera.c @@ -1,7 +1,6 @@ /* ************************************* * Includes * *************************************/ - #include "Camera.h" #include "Game.h" #include "System.h" @@ -10,7 +9,6 @@ /* ************************************* * Defines * *************************************/ - #define SPEED_CALCULATION_TIME 3 #define MAX_CAMERA_SPEED 5 #define MIN_CAMERA_SPEED 1 @@ -20,14 +18,12 @@ /* ************************************* * Local Variables * *************************************/ - static int32_t Camera_Max_X_Offset; static int32_t Camera_Max_Y_Offset; /* ************************************* * Local Prototypes * *************************************/ - static void CameraUpdateSpeed(TYPE_PLAYER* ptrPlayer); static bool CameraSpecialConditions(TYPE_PLAYER* ptrPlayer); diff --git a/Source/Camera.h b/Source/Camera.h index aed0bce..9d958ed 100644 --- a/Source/Camera.h +++ b/Source/Camera.h @@ -4,18 +4,15 @@ /* ************************************* * Includes * *************************************/ - #include "Global_Inc.h" #include "GameStructures.h" /* ************************************* * Defines * *************************************/ - /* ************************************* * Global prototypes * *************************************/ - void CameraInit(TYPE_PLAYER* ptrPlayer); void CameraHandler(TYPE_PLAYER* ptrPlayer); void CameraApplyCoordinatesToSprite(TYPE_PLAYER* ptrPlayer, GsSprite * spr); diff --git a/Source/EndAnimation.c b/Source/EndAnimation.c index 582dc17..75edc85 100644 --- a/Source/EndAnimation.c +++ b/Source/EndAnimation.c @@ -1,7 +1,6 @@ /* ************************************* * Includes * *************************************/ - #include "EndAnimation.h" #include "Global_Inc.h" #include "Gfx.h" @@ -10,11 +9,9 @@ /* ************************************* * Defines * *************************************/ - /* ************************************* * Structs and enums * *************************************/ - enum { END_ANIMATION_FADEOUT_STEP = 8, @@ -39,7 +36,6 @@ enum /* ************************************* * Local Prototypes * *************************************/ - static void EndAnimationSquares(void); static void EndAnimationFadeOut(void); static void EndAnimationLine(void); @@ -47,7 +43,6 @@ static void EndAnimationLine(void); /* ************************************* * Local Variables * *************************************/ - static GsRectangle EndAnimationRect; static GsSprite EndAnimationDisplay; diff --git a/Source/EndAnimation.h b/Source/EndAnimation.h index 6e83be8..83a4f02 100644 --- a/Source/EndAnimation.h +++ b/Source/EndAnimation.h @@ -4,19 +4,15 @@ /* ************************************** * Includes * * **************************************/ - /* ************************************** * Defines * * **************************************/ - /* ************************************** * Global Prototypes * * **************************************/ - void EndAnimation(void); /* ************************************** * Global Variables * * **************************************/ - #endif // END_SCREEN_HEADER__ diff --git a/Source/Exe/AIRPORT.elf b/Source/Exe/AIRPORT.elf index 3fc6f3d18aaab461d603d474caedf8982c7e9d2e..6d595ed098d81426ff8d60f4274237c973e2f8c9 100644 GIT binary patch delta 44728 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 M=%ISye!SQJ0%)jBr2qf` delta 44638 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 QqsmL8%S&Unmd4ut9}_T|)&Kwi diff --git a/Source/Game.c b/Source/Game.c index 42308f3..4389e5f 100644 --- a/Source/Game.c +++ b/Source/Game.c @@ -43,7 +43,7 @@ typedef struct t_rwyentrydata { - AIRCRAFT_DIRECTION Direction; + DIRECTION Direction; uint16_t rwyEntryTile; int8_t rwyStep; uint16_t rwyHeader; @@ -191,6 +191,8 @@ static void GameBuildingsInit(void); static void GameGetAircraftTilemap(uint8_t i); static bool GameWaypointCheckExisting(TYPE_PLAYER* ptrPlayer, uint16_t temp_tile); static void GameDrawBackground(TYPE_PLAYER* ptrPlayer); +static DIRECTION GameGetRunwayDirection(uint16_t rwyHeader); +static DIRECTION GameGetParkingDirection(uint16_t parkingTile); /* ************************************* * Global Variables @@ -1568,7 +1570,7 @@ void GameAircraftState(uint8_t i) Serial_printf("Target assigned = %d\n", target[0]); - if (AircraftAddNew(&FlightData, i, target) == false) + if (AircraftAddNew(&FlightData, i, target, GameGetParkingDirection(GameLevelBuffer[target[0]])) == false) { Serial_printf("Exceeded maximum aircraft number!\n"); return; @@ -1618,7 +1620,6 @@ void GameAircraftState(uint8_t i) * or ptrPlayer->InvalidPath != false. * * ******************************************************************************************/ - void GameRenderLevel(TYPE_PLAYER* ptrPlayer) { uint16_t i; @@ -1632,23 +1633,6 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) TYPE_ISOMETRIC_POS tileIsoPos; TYPE_CARTESIAN_POS tileCartPos; - //uint16_t init_timer_value = 0; - //uint16_t end_timer_value = 0; - - // Prepare runway to be painted in blue if player is on runway selection mode - if (ptrPlayer->SelectRunway != false) - { - - /*Serial_printf("Runway array:\n"); - - for (j = 0; j < GAME_MAX_RWY_LENGTH; j++) - { - Serial_printf("%d ",ptrPlayer->RwyArray[j]); - } - - Serial_printf("\n");*/ - } - for (i = 0 ; i < GameLevelSize; i++) { // GameLevelBuffer bits explanation: @@ -1660,9 +1644,17 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) // | | | | | | | | | | | | V Tile, bit 2 // | | | | | | | | | | | V Tile, bit 3 // | | | | | | | | | | V Tile, bit 4 - // | | | | V Tile, bit 5 - // | | V Tile, bit 6 - // | Tile mirror flag + // | | | | | | | | | V Tile, bit 5 + // | | | | | | | | V Tile, bit 6 + // | | | | | | | V Tile mirror flag + // | | | | | | V Building, bit 0 + // | | | | | V Building, bit 1 + // | | | | V Building, bit 2 + // | | | V Building, bit 3 + // | | V Building, bit 4 + // | V Building, bit 5 + // V Building, bit 6 + // Building, bit 7 uint8_t CurrentTile = (uint8_t)(GameLevelBuffer[i] & 0x00FF); @@ -1740,72 +1732,71 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) ptrTileset->g = NORMAL_LUMINANCE; ptrTileset->b = NORMAL_LUMINANCE; - if ( (ptrPlayer->SelectRunway != false) - && - (i != 0) - && - (SystemContains_u16(i, ptrPlayer->RwyArray, GAME_MAX_RWY_LENGTH) != false) ) - { - - if (used_rwy != false) - { - ptrTileset->r = rwy_sine; - ptrTileset->b = NORMAL_LUMINANCE >> 2; - ptrTileset->g = NORMAL_LUMINANCE >> 2; - } - else - { - ptrTileset->r = NORMAL_LUMINANCE >> 2; - ptrTileset->g = NORMAL_LUMINANCE >> 2; - ptrTileset->b = rwy_sine; - } - } - else if ( ( (ptrPlayer->SelectTaxiwayParking != false) - || - (ptrPlayer->SelectTaxiwayRunway != false) ) - && - (i != 0) ) - { - if (( (SystemContains_u16(i, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) != false) - || - (i == ptrPlayer->SelectedTile) ) - && - (ptrPlayer->SelectedTile != GAME_INVALID_TILE_SELECTION) ) - { - if (ptrPlayer->InvalidPath != false) - { - ptrTileset->r = rwy_sine; - ptrTileset->b = NORMAL_LUMINANCE >> 2; - ptrTileset->g = NORMAL_LUMINANCE >> 2; - } - else - { - ptrTileset->r = NORMAL_LUMINANCE >> 2; - ptrTileset->g = NORMAL_LUMINANCE >> 2; - ptrTileset->b = rwy_sine; - } - } - else if ( (ptrPlayer->SelectTaxiwayRunway != false) - && - ( (CurrentTile == TILE_RWY_HOLDING_POINT) - || - (CurrentTile == TILE_RWY_HOLDING_POINT_2) ) ) - { - ptrTileset->r = NORMAL_LUMINANCE >> 2; - ptrTileset->g = rwy_sine; - ptrTileset->b = NORMAL_LUMINANCE >> 2; - } - else if ( (ptrPlayer->SelectTaxiwayParking != false) - && - ( (CurrentTile == TILE_PARKING) - || - (CurrentTile == TILE_PARKING_2) ) ) - { - ptrTileset->r = NORMAL_LUMINANCE >> 2; - ptrTileset->g = rwy_sine; - ptrTileset->b = NORMAL_LUMINANCE >> 2; - } - } + if (i != 0) + { + if (ptrPlayer->SelectRunway != false) + { + if (SystemContains_u16(i, ptrPlayer->RwyArray, GAME_MAX_RWY_LENGTH) != false) + { + if (used_rwy != false) + { + ptrTileset->r = rwy_sine; + ptrTileset->b = NORMAL_LUMINANCE >> 2; + ptrTileset->g = NORMAL_LUMINANCE >> 2; + } + else + { + ptrTileset->r = NORMAL_LUMINANCE >> 2; + ptrTileset->g = NORMAL_LUMINANCE >> 2; + ptrTileset->b = rwy_sine; + } + } + } + else if ( (ptrPlayer->SelectTaxiwayParking != false) + || + (ptrPlayer->SelectTaxiwayRunway != false) ) + { + if (( (SystemContains_u16(i, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) != false) + || + (i == ptrPlayer->SelectedTile) ) + && + (ptrPlayer->SelectedTile != GAME_INVALID_TILE_SELECTION) ) + { + if (ptrPlayer->InvalidPath != false) + { + ptrTileset->r = rwy_sine; + ptrTileset->b = NORMAL_LUMINANCE >> 2; + ptrTileset->g = NORMAL_LUMINANCE >> 2; + } + else + { + ptrTileset->r = NORMAL_LUMINANCE >> 2; + ptrTileset->g = NORMAL_LUMINANCE >> 2; + ptrTileset->b = rwy_sine; + } + } + else if ( (ptrPlayer->SelectTaxiwayRunway != false) + && + ( (CurrentTile == TILE_RWY_HOLDING_POINT) + || + (CurrentTile == TILE_RWY_HOLDING_POINT_2) ) ) + { + ptrTileset->r = NORMAL_LUMINANCE >> 2; + ptrTileset->g = rwy_sine; + ptrTileset->b = NORMAL_LUMINANCE >> 2; + } + else if ( (ptrPlayer->SelectTaxiwayParking != false) + && + ( (CurrentTile == TILE_PARKING) + || + (CurrentTile == TILE_PARKING_2) ) ) + { + ptrTileset->r = NORMAL_LUMINANCE >> 2; + ptrTileset->g = rwy_sine; + ptrTileset->b = NORMAL_LUMINANCE >> 2; + } + } + } if (ptrTileset != NULL) { @@ -1827,8 +1818,6 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) CurrentTile = aux_id; } - // Serial_printf("Tile %d, attribute 0x%X\n",i,ptrTileset->attribute); - GfxSortSprite(ptrTileset); if (ptrTileset->attribute & H_FLIP) @@ -1836,12 +1825,6 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) ptrTileset->attribute &= ~(H_FLIP); } } - - /*dprintf("GameRenderLevel execution time = %d\t" - "end_timer_value = 0x%04X\tinit_timer_value = 0x%04X\n", - end_timer_value - init_timer_value, - end_timer_value, - init_timer_value );*/ } /* ******************************************************************* @@ -1858,7 +1841,6 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) * To be used on GameInit() after PLT file parsing. * * *******************************************************************/ - void GameSetTime(uint8_t hour, uint8_t minutes) { GameHour = hour; @@ -1884,7 +1866,6 @@ void GameSetTime(uint8_t hour, uint8_t minutes) * executed GAME_MAX_AIRCRAFT times on each cycle. * * *******************************************************************/ - void GameActiveAircraft(uint8_t i) { // Reset iterator when i == 0. @@ -2493,36 +2474,74 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli /* ************************************************************************************************** * - * @name: RWY_DIR GameGetRunwayDirection(uint16_t rwyHeader) + * @name: DIRECTION GameGetParkingDirection(uint16_t parkingTile) * * @author: Xavier Del Campo * - * @brief: - * Depending on runway header, runway direction is returned. + * @return: + * Depending on tile number, parking direction is returned. * * **************************************************************************************************/ -RWY_DIR GameGetRunwayDirection(uint16_t rwyHeader) +DIRECTION GameGetParkingDirection(uint16_t parkingTile) +{ + DEBUG_PRINT_VAR(parkingTile); + DEBUG_PRINT_VAR(TILE_PARKING); + DEBUG_PRINT_VAR(TILE_PARKING | TILE_MIRROR_FLAG); + DEBUG_PRINT_VAR(TILE_PARKING_2); + DEBUG_PRINT_VAR(TILE_PARKING_2 | TILE_MIRROR_FLAG); + switch (parkingTile) + { + case TILE_PARKING: + return DIR_WEST; + + case TILE_PARKING | TILE_MIRROR_FLAG: + return DIR_NORTH; + + case TILE_PARKING_2: + return DIR_EAST; + + case TILE_PARKING_2 | TILE_MIRROR_FLAG: + return DIR_SOUTH; + + default: + break; + } + + return NO_DIRECTION; +} + +/* ************************************************************************************************** + * + * @name: DIRECTION GameGetRunwayDirection(uint16_t rwyHeader) + * + * @author: Xavier Del Campo + * + * @return: + * Depending on tile number, runway direction is returned. + * + * **************************************************************************************************/ +DIRECTION GameGetRunwayDirection(uint16_t rwyHeader) { switch(GameLevelBuffer[rwyHeader]) { case TILE_RWY_START_1: - return RWY_DIR_EAST; + return DIR_EAST; case TILE_RWY_START_2: - return RWY_DIR_WEST; + return DIR_WEST; case TILE_RWY_START_1 | TILE_MIRROR_FLAG: - return RWY_DIR_SOUTH; + return DIR_SOUTH; case TILE_RWY_START_2 | TILE_MIRROR_FLAG: - return RWY_DIR_NORTH; + return DIR_NORTH; default: Serial_printf("Unknown direction for tile %d\n",rwyHeader); break; } - return RWY_INVALID_DIR; + return NO_DIRECTION; } /* ************************************************************************************************** @@ -2555,7 +2574,7 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s { static uint16_t last_tile = 0; static uint8_t i = 0; - static RWY_DIR dir; + static DIRECTION dir; if (sz != (GAME_MAX_RWY_LENGTH * sizeof(uint16_t) )) { @@ -2581,7 +2600,7 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s dir = GameGetRunwayDirection(rwyHeader); - if (dir == RWY_INVALID_DIR) + if (dir == NO_DIRECTION) { return; } @@ -2612,23 +2631,23 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s switch(dir) { - case RWY_DIR_EAST: + case DIR_EAST: last_tile++; break; - case RWY_DIR_WEST: + case DIR_WEST: last_tile--; break; - case RWY_DIR_NORTH: + case DIR_NORTH: last_tile -= GameLevelColumns; break; - case RWY_DIR_SOUTH: + case DIR_SOUTH: last_tile += GameLevelColumns; break; - case RWY_INVALID_DIR: + case NO_DIRECTION: // Fall through default: Serial_printf("Invalid runway direction.\n"); @@ -2731,7 +2750,8 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli if (AircraftAddNew( ptrFlightData, aircraftIndex, - targets ) == false) + targets, + GameGetRunwayDirection(assignedRwy) ) == false) { Serial_printf("Exceeded maximum aircraft number!\n"); return; @@ -3196,21 +3216,6 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) y_diff = (uint16_t)abs( (ptrPlayer->SelectedTile / GameLevelColumns) - (ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx] / GameLevelColumns) ); - /*Serial_printf("SelectedTile = %d, ptrPlayer->Waypoints[%d] = %d\n", - ptrPlayer->SelectedTile, - 0, - ptrPlayer->Waypoints[0] ); - - Serial_printf("X = abs(%d - %d)\n", - ptrPlayer->SelectedTile % GameLevelColumns, - (ptrPlayer->Waypoints[0] % GameLevelColumns) ); - - Serial_printf("Y = abs(%d - %d)\n", - ptrPlayer->SelectedTile / GameLevelColumns, - (ptrPlayer->Waypoints[0] / GameLevelColumns) ); - - Serial_printf("Diff = {%d, %d}\n", x_diff, y_diff);*/ - // At this point, we have to update current waypoints list. // ptrPlayer->Waypoints[ptrPlayer->WaypointIdx - 1] points to the last inserted point, // so now we have to determine how many points need to be created. @@ -3610,7 +3615,7 @@ void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli // Look for aircraft direction by searching TILE_RWY_EXIT //uint16_t currentTile = AircraftGetTileFromFlightDataIndex(aircraftIdx); //uint8_t targetsIdx = 0; - AIRCRAFT_DIRECTION aircraftDir = AircraftGetDirection(AircraftFromFlightDataIndex(aircraftIdx)); + DIRECTION aircraftDir = AircraftGetDirection(AircraftFromFlightDataIndex(aircraftIdx)); int8_t rwyStep = 0; uint16_t currentTile = 0; uint16_t targets[AIRCRAFT_MAX_TARGETS] = {0}; @@ -3618,22 +3623,22 @@ void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli switch(aircraftDir) { - case AIRCRAFT_DIR_EAST: + case DIR_EAST: //Serial_printf("EAST\n"); rwyStep = 1; break; - case AIRCRAFT_DIR_WEST: + case DIR_WEST: //Serial_printf("WEST\n"); rwyStep = -1; break; - case AIRCRAFT_DIR_NORTH: + case DIR_NORTH: //Serial_printf("NORTH\n"); rwyStep = -GameLevelColumns; break; - case AIRCRAFT_DIR_SOUTH: + case DIR_SOUTH: //Serial_printf("SOUTH\n"); rwyStep = GameLevelColumns; break; @@ -3704,32 +3709,32 @@ void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntr { if (GameLevelBuffer[currentTile + 1] == TILE_RWY_EXIT) { - ptrRwyEntry->Direction = AIRCRAFT_DIR_EAST; + ptrRwyEntry->Direction = DIR_EAST; ptrRwyEntry->rwyStep = GameLevelColumns; step = -1; } else if (GameLevelBuffer[currentTile - 1] == TILE_RWY_EXIT) { - ptrRwyEntry->Direction = AIRCRAFT_DIR_WEST; + ptrRwyEntry->Direction = DIR_WEST; ptrRwyEntry->rwyStep = -GameLevelColumns; step = 1; } else if (GameLevelBuffer[currentTile + GameLevelColumns] == TILE_RWY_EXIT) { - ptrRwyEntry->Direction = AIRCRAFT_DIR_SOUTH; + ptrRwyEntry->Direction = DIR_SOUTH; ptrRwyEntry->rwyStep = 1; step = GameLevelColumns; } else if (GameLevelBuffer[currentTile - GameLevelColumns] == TILE_RWY_EXIT) { - ptrRwyEntry->Direction = AIRCRAFT_DIR_NORTH; + ptrRwyEntry->Direction = DIR_NORTH; ptrRwyEntry->rwyStep = -1; step = -GameLevelColumns; } else { ptrRwyEntry->rwyEntryTile = 0; - ptrRwyEntry->Direction = AIRCRAFT_DIR_NO_DIRECTION; + ptrRwyEntry->Direction = NO_DIRECTION; ptrRwyEntry->rwyStep = 0; Serial_printf("GameCreateTakeoffWaypoints(): could not determine aircraft direction.\n"); return; diff --git a/Source/Game.h b/Source/Game.h index 1196193..b5a191e 100644 --- a/Source/Game.h +++ b/Source/Game.h @@ -4,14 +4,12 @@ /* ************************************* * Includes * *************************************/ - #include "Global_Inc.h" #include "GameStructures.h" /* ************************************* * Defines * *************************************/ - #define PLAYER_ONE 0 #define PLAYER_TWO 1 #define MAX_PLAYERS (PLAYER_TWO + 1) @@ -23,26 +21,14 @@ /* ************************************* * Structs and enums * *************************************/ - -typedef enum t_rwydir -{ - RWY_DIR_EAST = 0, - RWY_DIR_WEST, - RWY_DIR_NORTH, - RWY_DIR_SOUTH, - RWY_INVALID_DIR, -}RWY_DIR; - /* ************************************* * Global variables * *************************************/ - extern bool GameStartupFlag; /* ************************************* * Global prototypes * *************************************/ - void Game(bool two_players); void GameSetTime(uint8_t hour, uint8_t minutes); bool GameTwoPlayersActive(void); @@ -61,6 +47,5 @@ void GameCalculateRemainingAircraft(void); void GameAircraftCollision(uint8_t AircraftIdx); void GameStopFlight(uint8_t AicraftIdx); void GameResumeFlightFromAutoStop(uint8_t AircraftIdx); -RWY_DIR GameGetRunwayDirection(uint16_t rwyHeader); #endif //GAME_HEADER__ diff --git a/Source/GameGui.c b/Source/GameGui.c index 9ced819..ec40b1a 100644 --- a/Source/GameGui.c +++ b/Source/GameGui.c @@ -562,11 +562,6 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData y_offset = (short)(page_aircraft * AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H); - /*Serial_printf("ptrPlayer->ActiveAircraft = %d\n",ptrPlayer->ActiveAircraft); - Serial_printf("ptrPlayer->SelectedAircraft = %d\n",ptrPlayer->SelectedAircraft); - Serial_printf("ptrPlayer->FlightDataPage = %d\n",ptrPlayer->FlightDataPage); - Serial_printf("y_offset = %d\n",y_offset);*/ - if (GameTwoPlayersActive() != false) { SelectedAircraftGPoly4.y[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0_2PLAYER; diff --git a/Source/GameStructures.h b/Source/GameStructures.h index 82218a0..115255f 100644 --- a/Source/GameStructures.h +++ b/Source/GameStructures.h @@ -102,12 +102,12 @@ typedef enum t_livery typedef enum t_direction { - AIRCRAFT_DIR_NO_DIRECTION = 0, - AIRCRAFT_DIR_NORTH, - AIRCRAFT_DIR_SOUTH, - AIRCRAFT_DIR_EAST, - AIRCRAFT_DIR_WEST, -}AIRCRAFT_DIRECTION; + NO_DIRECTION = 0, + DIR_NORTH, + DIR_SOUTH, + DIR_EAST, + DIR_WEST, +}DIRECTION; typedef enum t_aircraftAttitude { @@ -120,7 +120,7 @@ typedef enum t_aircraftAttitude typedef struct t_aircraftData { AIRCRAFT_LIVERY Livery; - AIRCRAFT_DIRECTION Direction; + DIRECTION Direction; AIRCRAFT_ATTITUDE Attitude; FL_STATE State; // Target tile (used to calculate direction and movement) diff --git a/Source/Gfx.c b/Source/Gfx.c index 7a89027..42ea352 100644 --- a/Source/Gfx.c +++ b/Source/Gfx.c @@ -17,7 +17,6 @@ #define DOUBLE_BUFFERING_SWAP_Y 256 #define UPLOAD_IMAGE_FLAG 1 #define MAX_LUMINANCE 0xFF -#define ROTATE_BIT_SHIFT 12 #define GPUSTAT (*(volatile unsigned int*)0x1F801814) #define D2_CHCR (*(volatile unsigned int*)0x1F8010A8) @@ -252,41 +251,78 @@ void GfxDrawScene_Fast(void) GsDrawList(); } +/* ********************************************************************** + * + * @name: bool GfxReadyForDMATransfer(void) + * + * @author: Xavier Del Campo + * + * @return: + * true when a DMA transfer can be executed. Returns false otherwise. + * + * **********************************************************************/ bool GfxReadyForDMATransfer(void) { return ( (GPUSTAT & 1<<28) && !(D2_CHCR & 1<<24) ); } +/* ********************************************************************** + * + * @name: void GfxDrawScene(void) + * + * @author: Xavier Del Campo + * + * @brief: + * Renders all queued primitives and performs system-related actions. + * + * **********************************************************************/ void GfxDrawScene(void) { - enum - { - FPS_INFO_X = 16, - FPS_INFO_Y = 16 - }; - - while ( (SystemRefreshNeeded() == false) + while ( (SystemRefreshNeeded() == false) || (GfxIsGPUBusy() != false) ); - //~ FontPrintText(&SmallFont, FPS_INFO_X, FPS_INFO_Y, "%d/%d", SystemGetFPS(), REFRESH_FREQUENCY); - - if (MainMenuGetBCNGWLogo() != NULL) - { - GfxSortSprite(MainMenuGetBCNGWLogo()); - } - GfxDrawScene_Fast(); SystemCyclicHandler(); } +/* ********************************************************************** + * + * @name: void GfxDrawScene_Slow(void) + * + * @author: Xavier Del Campo + * + * @brief: + * Slow, blocking function which ensures GPU is ready again before + * exiting. + * + * @remarks: + * Blocking function. To be used only when absolutely needed. + * + * **********************************************************************/ void GfxDrawScene_Slow(void) { GfxDrawScene(); while (GfxIsGPUBusy() != false); } +/* ********************************************************************** + * + * @name: void GfxSortSprite(GsSprite * spr) + * + * @author: Xavier Del Campo + * + * @brief: + * Reportedly, adds a sprite to primitive list. Internal flags + * (e.g.: 1 Hz flash) are checked and special tasks are performed. + * Also, global_lum is applied to sprite's RGB values. + * + * @remarks: + * It is checked sprite fits into screen beforehand. Use GsSortSprite() + * if you need to skip this check. + * + * **********************************************************************/ void GfxSortSprite(GsSprite * spr) { uint8_t aux_r = spr->r; @@ -298,7 +334,7 @@ void GfxSortSprite(GsSprite * spr) bool has_1hz_flash = spr->attribute & GFX_1HZ_FLASH; bool has_2hz_flash = spr->attribute & GFX_2HZ_FLASH; - if ( (spr->w <= 0) || (spr->h <= 0) ) + if ( (spr->w <= 0) || (spr->h <= 0) ) { // Invalid width or heigth return; @@ -385,16 +421,48 @@ void GfxSortSprite(GsSprite * spr) spr->b = aux_b; } +/* ********************************************************************** + * + * @name: void GfxSortSprite(GsSprite * spr) + * + * @author: Xavier Del Campo + * + * @return: + * Returns global_lum value, a global variable used to dim all drawn + * sprites as needed. + * + * **********************************************************************/ uint8_t GfxGetGlobalLuminance(void) { return global_lum; } +/* ********************************************************************** + * + * @name: void GfxSetGlobalLuminance(uint8_t value) + * + * @author: Xavier Del Campo + * + * @return: + * Sets global_lum value, a global variable used to dim all drawn + * sprites as needed. + * + * **********************************************************************/ void GfxSetGlobalLuminance(uint8_t value) { global_lum = value; } +/* ********************************************************************** + * + * @name: void GfxIncreaseGlobalLuminance(int8_t step) + * + * @author: Xavier Del Campo + * + * @return: + * Increases global_lum in steps given by user, avoiding overflow. + * + * **********************************************************************/ void GfxIncreaseGlobalLuminance(int8_t step) { if ( ( (global_lum + step) < MAX_LUMINANCE ) @@ -409,16 +477,53 @@ void GfxIncreaseGlobalLuminance(int8_t step) } } +/* ********************************************************************** + * + * @name: int GfxRotateFromDegrees(int deg) + * + * @author: Xavier Del Campo + * + * @brief: + * Performs automatic conversion between PSX rotate units and degrees. + * + * @return: + * PSX rotate units to rotate (1 degree == 4096 rotate units). + * + * **********************************************************************/ int GfxRotateFromDegrees(int deg) { return deg << ROTATE_BIT_SHIFT; } +/* ********************************************************************** + * + * @name: bool GfxIsGPUBusy(void) + * + * @author: Xavier Del Campo + * + * @return: + * true if GPU can't be used, false otherwise. + * + * **********************************************************************/ bool GfxIsGPUBusy(void) { return (GsIsDrawing() || gfx_busy || (GfxReadyForDMATransfer() == false) ); } +/* ********************************************************************** + * + * @name: bool GfxSpriteFromFile(char* fname, GsSprite * spr) + * + * @author: Xavier Del Campo + * + * @brief: + * Given input file path, it loads file contents into a GsSprite + * instance. + * + * @return: + * false if an error happened, true otherwise. + * + * **********************************************************************/ bool GfxSpriteFromFile(char* fname, GsSprite * spr) { GsImage gsi; @@ -438,15 +543,23 @@ bool GfxSpriteFromFile(char* fname, GsSprite * spr) gfx_busy = false; - DEBUG_PRINT_VAR(spr->tpage); - DEBUG_PRINT_VAR(spr->u); - DEBUG_PRINT_VAR(spr->v); - DEBUG_PRINT_VAR(spr->w); - DEBUG_PRINT_VAR(spr->h); - return true; } +/* ********************************************************************** + * + * @name: bool GfxCLUTFromFile(char* fname) + * + * @author: Xavier Del Campo + * + * @brief: + * Given input file path, it loads file contents and uploads CLUT + * data into VRAM. + * + * @return: + * false if an error happened, true otherwise. + * + * **********************************************************************/ bool GfxCLUTFromFile(char* fname) { GsImage gsi; @@ -469,6 +582,17 @@ bool GfxCLUTFromFile(char* fname) return true; } +/* ********************************************************************** + * + * @name: bool GfxIsInsideScreenArea(short x, short y, short w, short h) + * + * @author: Xavier Del Campo + * + * @return: + * true if polygon determined by XYWH data is inside screen area, + * false otherwise. + * + * **********************************************************************/ bool GfxIsInsideScreenArea(short x, short y, short w, short h) { if ( ( (x + w) >= 0) @@ -485,6 +609,16 @@ bool GfxIsInsideScreenArea(short x, short y, short w, short h) return false; } +/* ********************************************************************** + * + * @name: bool GfxIsSpriteInsideScreenArea(GsSprite * spr) + * + * @author: Xavier Del Campo + * + * @return: + * true if sprite is inside screen area, false otherwise. + * + * **********************************************************************/ bool GfxIsSpriteInsideScreenArea(GsSprite * spr) { return GfxIsInsideScreenArea(spr->x, spr->y, spr->w, spr->h); diff --git a/Source/Gfx.h b/Source/Gfx.h index 0bbce7b..48cc2db 100644 --- a/Source/Gfx.h +++ b/Source/Gfx.h @@ -22,6 +22,7 @@ #define GFX_1HZ_FLASH (1<<7) #define GFX_2HZ_FLASH (1<<8) #define FULL_LUMINANCE 0xFF +#define ROTATE_BIT_SHIFT 12 // 4096 = 2^12 /* ************************************* * Global prototypes diff --git a/Source/Global_Inc.h b/Source/Global_Inc.h index 9585cc1..cb36f80 100644 --- a/Source/Global_Inc.h +++ b/Source/Global_Inc.h @@ -4,7 +4,6 @@ /* ************************************* * Includes * *************************************/ - #include #include #include diff --git a/Source/LoadMenu.c b/Source/LoadMenu.c index d0d5fc5..e7914a9 100644 --- a/Source/LoadMenu.c +++ b/Source/LoadMenu.c @@ -490,14 +490,14 @@ void LoadMenuLoadFileList( const char* fileList[], void* dest[], //Restore original file path in order to load file strncpy(strCurrentFile, aux_file_name, 100); - if (strncmp(extension,"TIM",3) == 0) + if (strncmp(extension, "TIM", 3) == 0) { if (GfxSpriteFromFile(strCurrentFile, dest[fileLoadedCount]) == false) { Serial_printf("Could not load image file \"%s\"!\n", strCurrentFile); } } - else if (strncmp(extension,"CLT",3) == 0) + else if (strncmp(extension, "CLT", 3) == 0) { if (dest[fileLoadedCount] != NULL) { @@ -509,21 +509,21 @@ void LoadMenuLoadFileList( const char* fileList[], void* dest[], Serial_printf("Could not load CLUT file \"%s\"!\n", strCurrentFile); } } - else if (strncmp(extension,"VAG",3) == 0) + else if (strncmp(extension, "VAG", 3) == 0) { if (SfxUploadSound(strCurrentFile, dest[fileLoadedCount]) == false) { Serial_printf("Could not load sound file \"%s\"!\n", strCurrentFile); } } - else if (strncmp(extension,"FNT",3) == 0) + else if (strncmp(extension, "FNT", 3) == 0) { if (FontLoadImage(strCurrentFile, dest[fileLoadedCount]) == false) { Serial_printf("Could not load font file \"%s\"!\n", strCurrentFile); } } - else if (strncmp(extension,"PLT",3) == 0) + else if (strncmp(extension, "PLT", 3) == 0) { if (PltParserLoadFile(strCurrentFile, dest[fileLoadedCount]) == false) { diff --git a/Source/MainMenuBtnAni.c b/Source/MainMenuBtnAni.c index fd01220..f9d9923 100644 --- a/Source/MainMenuBtnAni.c +++ b/Source/MainMenuBtnAni.c @@ -1,21 +1,17 @@ /* ************************************* * Includes * *************************************/ - #include "MainMenuBtnAni.h" /* ************************************* * Defines * *************************************/ - /* ************************************* * Global prototypes * *************************************/ - /* ************************************* * Global variables * *************************************/ - short MainMenuBtnAni[] = { 0, diff --git a/Source/MainMenuBtnAni.h b/Source/MainMenuBtnAni.h index 8204f02..f4bb763 100644 --- a/Source/MainMenuBtnAni.h +++ b/Source/MainMenuBtnAni.h @@ -5,21 +5,17 @@ /* ************************************* * Includes * *************************************/ - #include "Global_Inc.h" /* ************************************* * Defines * *************************************/ - /* ************************************* * Global prototypes * *************************************/ - /* ************************************* * Global variables * *************************************/ - extern short MainMenuBtnAni[]; extern size_t MainMenuBtnAni_sz; diff --git a/Source/MapEditor/MapEditor.pro.user b/Source/MapEditor/MapEditor.pro.user index 5f8e915..91bb581 100644 --- a/Source/MapEditor/MapEditor.pro.user +++ b/Source/MapEditor/MapEditor.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/Source/MapEditor/mainwindow.cpp b/Source/MapEditor/mainwindow.cpp index 89687eb..ed0bdc9 100644 --- a/Source/MapEditor/mainwindow.cpp +++ b/Source/MapEditor/mainwindow.cpp @@ -12,12 +12,16 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); - connect(ui->LoadMap_Btn, SIGNAL(released()), this, SLOT(onLoadMap())); - connect(ui->CreateMap_Btn, SIGNAL(released()), this, SLOT(onCreateMap())); - connect(ui->saveMap_Btn, SIGNAL(released()), this, SLOT(onSaveMap(void))); - connect(gscene, SIGNAL(positionClicked(QPointF)), this, SLOT(onMapItemClicked(QPointF))); - connect(gscene, SIGNAL(noItemSelected(void)), this, SLOT(onNoItemSelected(void))); - connect(gscene, SIGNAL(updateSelectedItem(void)), this, SLOT(onListItemSelected(void))); + ui->centralWidget->setWindowTitle("Airport Map Editor"); + + connect(ui->LoadMap_Btn, SIGNAL(released()), this, SLOT(onLoadMap())); + connect(ui->CreateMap_Btn, SIGNAL(released()), this, SLOT(onCreateMap())); + connect(ui->saveMap_Btn, SIGNAL(released()), this, SLOT(onSaveMap(void))); + connect(ui->showNumbers_Checkbox, SIGNAL(stateChanged(int)), this, SLOT(onShowNumbers(int))); + + connect(gscene, SIGNAL(positionClicked(QPointF)), this, SLOT(onMapItemClicked(QPointF))); + connect(gscene, SIGNAL(noItemSelected(void)), this, SLOT(onNoItemSelected(void))); + connect(gscene, SIGNAL(updateSelectedItem(void)), this, SLOT(onListItemSelected(void))); appSettings(); loadTilesetData(); @@ -29,6 +33,11 @@ MainWindow::~MainWindow() delete gscene; } +void MainWindow::onShowNumbers(int) +{ + onProcessMapFile(map_buffer); +} + void MainWindow::onMapItemClicked(QPointF pos) { QPoint realPos; @@ -314,6 +323,15 @@ void MainWindow::onProcessMapFile(QByteArray data) it->setX(x); it->setY(y); + + if (ui->showNumbers_Checkbox->isChecked() == true) + { + QGraphicsTextItem* io = new QGraphicsTextItem(); + io->setPos(x + (TILE_SIZE / 4), y); + io->setPlainText(QString::number(i + (j * level_size))); + + gscene->addItem(io); + } } } diff --git a/Source/MapEditor/mainwindow.h b/Source/MapEditor/mainwindow.h index 52bb957..4926772 100644 --- a/Source/MapEditor/mainwindow.h +++ b/Source/MapEditor/mainwindow.h @@ -46,6 +46,7 @@ protected slots: void onNoItemSelected(void); void onListItemSelected(void); void onSaveMap(void); + void onShowNumbers(int); }; #endif // MAINWINDOW_H diff --git a/Source/MapEditor/mainwindow.ui b/Source/MapEditor/mainwindow.ui index 54bcbb4..098a9f8 100644 --- a/Source/MapEditor/mainwindow.ui +++ b/Source/MapEditor/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 920 - 582 + 605 @@ -24,7 +24,38 @@ true - + + + + + + Show numbers on map + + + true + + + + + + + Mirror tile + + + + + + + + + + 640 + 480 + + + + + @@ -49,16 +80,6 @@ - - - - - 640 - 480 - - - - @@ -69,13 +90,6 @@ - - - - Mirror tile - - - diff --git a/Source/MapEditor/settings.ini b/Source/MapEditor/settings.ini index af1583e..dc943fa 100644 --- a/Source/MapEditor/settings.ini +++ b/Source/MapEditor/settings.ini @@ -1,2 +1,2 @@ [app_settings] -last_dir=C:/cygwin/home/Xavier/Airport/Levels/LEVEL2.LVL +last_dir=C:/cygwin/home/Xavier/Airport/Levels/LEVEL2_.LVL diff --git a/Source/Menu.c b/Source/Menu.c index 68c8b86..088d46e 100644 --- a/Source/Menu.c +++ b/Source/Menu.c @@ -124,7 +124,6 @@ static void MenuTestCheat(void); static GsSprite MenuSpr; static GsSprite MenuStarSpr; -static GsSprite BcnGWSpr; static SsVag BellSnd; static SsVag AcceptSnd; static TYPE_CHEAT TestCheat; @@ -138,7 +137,6 @@ static const char* MainMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\MAINMENU.TIM;1" , "cdrom:\\DATA\\SOUNDS\\ACCEPT.VAG;1" , "cdrom:\\DATA\\SPRITES\\BUTTONS.TIM;1" , "cdrom:\\DATA\\SPRITES\\MENUSTAR.TIM;1" , - "cdrom:\\DATA\\SPRITES\\BCNGW.TIM;1" , #ifndef NO_INTRO "cdrom:\\DATA\\SPRITES\\PSXDISK.TIM;1" , "cdrom:\\DATA\\FONTS\\INTROFNT.TIM;1" , @@ -154,7 +152,6 @@ static void* MainMenuDest[] = { (GsSprite*)&MenuSpr , (SsVag*)&AcceptSnd , (GsSprite*)&PSXButtons , (GsSprite*)&MenuStarSpr , - (GsSprite*)&BcnGWSpr , #ifndef NO_INTRO (GsSprite*)&PsxDisk , (GsSprite*)&PSXSDKIntroFont , @@ -246,10 +243,6 @@ void MainMenuInit(void) MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].f = &TwoPlayerMenu; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].i = TWO_PLAYER_BUTTON_INDEX; - // BcnGWSpr.x = X_SCREEN_RESOLUTION - (BcnGWSpr.w << 1); - // BcnGWSpr.y = Y_SCREEN_RESOLUTION - BcnGWSpr.h; - // BcnGWSpr_set = true; - menuLevel = PLAY_OPTIONS_LEVEL; MainMenuMinimumBtn = PLAY_BUTTON_INDEX; @@ -321,18 +314,6 @@ void MenuCheatInit(void) PadAddCheat(&SerialCheat); } -GsSprite* MainMenuGetBCNGWLogo(void) -{ - if (BcnGWSpr_set != false) - { - return &BcnGWSpr; - } - else - { - return NULL; - } -} - void MainMenu(void) { MainMenuInit(); @@ -358,15 +339,6 @@ void MainMenu(void) MenuStarSpr.rotate += ROTATE_ONE; - //DEBUG_PRINT_VAR(MenuStarSpr.x); - //DEBUG_PRINT_VAR(MenuStarSpr.y); - //DEBUG_PRINT_VAR(MenuStarSpr.w); - //DEBUG_PRINT_VAR(MenuStarSpr.h); - //DEBUG_PRINT_VAR(MenuStarSpr.tpage); - //DEBUG_PRINT_VAR(MenuStarSpr.u); - //DEBUG_PRINT_VAR(MenuStarSpr.v); - //GfxSortSprite(&MenuStarSpr); - switch(menuLevel) { case PLAY_OPTIONS_LEVEL: @@ -587,6 +559,7 @@ void MainMenuDrawButton(TYPE_MMBtn * btn) MenuSpr.g = NORMAL_LUMINANCE >> 1; MenuSpr.b = NORMAL_LUMINANCE >> 1; } + break; default: diff --git a/Source/Menu.h b/Source/Menu.h index 2c34ff4..6244602 100644 --- a/Source/Menu.h +++ b/Source/Menu.h @@ -4,18 +4,14 @@ /* ************************************* * Includes * *************************************/ - #include "Gfx.h" /* ************************************* * Defines * *************************************/ - /* ************************************* * Global prototypes * *************************************/ - void MainMenu(void); -GsSprite* MainMenuGetBCNGWLogo(void); #endif //MENU_HEADER__ diff --git a/Source/PSXSDKIntro.c b/Source/PSXSDKIntro.c index ce33727..49e663f 100644 --- a/Source/PSXSDKIntro.c +++ b/Source/PSXSDKIntro.c @@ -1,7 +1,6 @@ /* ************************************* * Includes * *************************************/ - #include "PSXSDKIntro.h" #include "System.h" #include "Gfx.h" @@ -10,11 +9,9 @@ /* ************************************* * Defines * *************************************/ - /* ************************************** * Structs and enums * * *************************************/ - enum { PSX_W = 48, @@ -105,7 +102,6 @@ enum /* ************************************* * Local Prototypes * *************************************/ - static void PSXSDKIntroDrawConsole(void); static void PSXSDKIntroRunTimers(void); static void PSXSDKIntroDrawDisk(void); @@ -115,7 +111,6 @@ static void PSXSDKIntroDrawChar(short x, short y, char ch); /* ************************************* * Local variables * *************************************/ - // Events static bool PSXSDKIntroCloseShellEvent; static bool PSXSDKIntroCloseShellEventReminder; @@ -133,7 +128,6 @@ static char* strPSXSDKIntroAuthor = {"BY NEXTVOLUME"}; /* ************************************* * Global variables * *************************************/ - GsSprite PsxDisk; GsSprite PSXSDKIntroFont; GsSprite GPL_Logo; diff --git a/Source/PSXSDKIntro.h b/Source/PSXSDKIntro.h index 8f62606..a0d662d 100644 --- a/Source/PSXSDKIntro.h +++ b/Source/PSXSDKIntro.h @@ -4,23 +4,19 @@ /* ************************************* * Includes * *************************************/ - #include "Global_Inc.h" /* ************************************* * Defines *************************************/ - /* ************************************* * Global prototypes * *************************************/ - void PSXSDKIntro(void); /* ************************************* * Global variables * *************************************/ - extern GsSprite PsxDisk; extern GsSprite PSXSDKIntroFont; extern GsSprite GPL_Logo; diff --git a/Source/Pad.c b/Source/Pad.c index 7704107..f2b9ca8 100644 --- a/Source/Pad.c +++ b/Source/Pad.c @@ -1,7 +1,6 @@ /* ************************************* * Includes * *************************************/ - #include "Pad.h" #include "System.h" #include "Timer.h" @@ -43,7 +42,6 @@ enum }; - /* ************************************* * Local Prototypes * *************************************/ diff --git a/Source/PltParser.c b/Source/PltParser.c index f9fffb0..8bcbc0f 100644 --- a/Source/PltParser.c +++ b/Source/PltParser.c @@ -23,6 +23,7 @@ /* ************************************* * Local Prototypes * *************************************/ + static void PltParserResetBuffers(TYPE_FLIGHT_DATA* ptrFlightData); bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) @@ -92,7 +93,7 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) int k; dprintf("Buffer: "); - + for (k = 0; k < strlen(buffer); k++) { dprintf("0x%02X ", buffer[k]); diff --git a/Source/PltParser.h b/Source/PltParser.h index 58e3bb1..c622e2c 100644 --- a/Source/PltParser.h +++ b/Source/PltParser.h @@ -4,27 +4,22 @@ /* ************************************* * Includes * *************************************/ - #include "Global_Inc.h" #include "GameStructures.h" /* ************************************* * Defines * *************************************/ - /* ************************************** * Structs and enums * * *************************************/ - /* ************************************* * Global prototypes * *************************************/ - bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData); uint8_t* PltParserGenerateFile(TYPE_PLT_CONFIG* ptrPltConfig); /* ************************************* * Global variables * *************************************/ - #endif //PLT_PARSER__ diff --git a/Source/Sfx.c b/Source/Sfx.c index a79a308..48d6bed 100644 --- a/Source/Sfx.c +++ b/Source/Sfx.c @@ -1,13 +1,11 @@ /* ************************************* * Includes * *************************************/ - #include "Sfx.h" /* ************************************* * Defines * *************************************/ - #define MAX_VOLUME SPU_MAXVOL #define SILENT 0 @@ -16,11 +14,9 @@ /* ************************************* * Local Prototypes * *************************************/ - /* ************************************* * Local Variables * *************************************/ - static uint8_t voiceIndex; static uint16_t SfxGlobalVolumeReduction; diff --git a/Source/Sfx.h b/Source/Sfx.h index 30903aa..4c248c7 100644 --- a/Source/Sfx.h +++ b/Source/Sfx.h @@ -4,18 +4,15 @@ /* ************************************* * Includes * *************************************/ - #include "Global_Inc.h" #include "System.h" /* ************************************* * Defines * *************************************/ - /* ************************************* * Structs and enums * *************************************/ - typedef enum t_musicTracks { INTRO_TRACK = 2, @@ -28,7 +25,6 @@ typedef enum t_musicTracks /* ************************************* * Global prototypes * *************************************/ - void SfxPlaySound(SsVag * sound); bool SfxUploadSound(char* file_path, SsVag * vag); void SfxPlayTrack(MUSIC_TRACKS track); diff --git a/Source/System.c b/Source/System.c index 8530d6c..dc54ecb 100644 --- a/Source/System.c +++ b/Source/System.c @@ -1,7 +1,6 @@ /* ************************************* * Includes * *************************************/ - #include "System.h" #include "Pad.h" #include "Menu.h" @@ -13,7 +12,6 @@ /* ************************************* * Defines * *************************************/ - #define FILE_BUFFER_SIZE (128 << 10) // 128 KB #define END_STACK_PATTERN (uint32_t) 0x18022015 @@ -24,7 +22,6 @@ /* ************************************* * Local Prototypes * *************************************/ - static void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step); static void SystemSetStackPattern(void); static void ISR_RootCounter2(void); @@ -32,7 +29,6 @@ static void ISR_RootCounter2(void); /* ************************************* * Local Variables * *************************************/ - //Buffer to store any kind of files. It supports files up to 128 kB static uint8_t file_buffer[FILE_BUFFER_SIZE]; //Global timer (called by interrupt) @@ -69,7 +65,6 @@ static unsigned char sine_counter; * @remarks: To be called before main loop. * * *******************************************************************/ - void SystemInit(void) { //Reset global timer @@ -134,9 +129,18 @@ void SystemInit(void) static volatile uint16_t u16_0_01seconds_cnt; +/* ******************************************************************* + * + * @name: void ISR_RootCounter2(void) + * + * @author: Xavier Del Campo + * + * @brief: + * Executed on RCnt2 ISR. + * + * *******************************************************************/ void ISR_RootCounter2(void) { - Serial_printf("YO\n"); u16_0_01seconds_cnt++; } @@ -155,7 +159,6 @@ void ISR_RootCounter2(void) * It is recommended to call it once user has pressed any key. * * *******************************************************************/ - void SystemSetRandSeed(void) { if (rand_seed == false) @@ -183,7 +186,6 @@ void SystemSetRandSeed(void) * Reportedly, returns whether rand seed has already been set. * * *******************************************************************/ - bool SystemIsRandSeedSet(void) { return rand_seed; @@ -203,7 +205,6 @@ bool SystemIsRandSeedSet(void) * Returns whether VSync flag has been enabled. * * *******************************************************************/ - bool SystemRefreshNeeded(void) { return refresh_needed; @@ -222,7 +223,6 @@ bool SystemRefreshNeeded(void) * 60 times a second in NTSC mode. * * *******************************************************************/ - void ISR_SystemDefaultVBlank(void) { if (System1SecondTick() != false) @@ -246,7 +246,6 @@ void ISR_SystemDefaultVBlank(void) * Called by Game module in order to calculate frames per second. * * *******************************************************************/ - void SystemAcknowledgeFrame(void) { temp_fps++; @@ -266,7 +265,6 @@ void SystemAcknowledgeFrame(void) * To be called only once, preferibly on SystemCyclic(). * * *******************************************************************/ - void SystemCalculateSine(void) { enum @@ -312,7 +310,6 @@ void SystemCalculateSine(void) * a parabola) function to be used wherever you want. * * *******************************************************************/ - unsigned char SystemGetSineValue(void) { return sine_counter; @@ -331,7 +328,6 @@ unsigned char SystemGetSineValue(void) * Usually called from ISR_SystemDefaultVBlank(). * * *******************************************************************/ - void SystemIncreaseGlobalTimer(void) { global_timer++; @@ -346,7 +342,6 @@ void SystemIncreaseGlobalTimer(void) * @brief: Returns internal global timer value. * * *******************************************************************/ - uint64_t SystemGetGlobalTimer(void) { return global_timer; @@ -361,7 +356,6 @@ uint64_t SystemGetGlobalTimer(void) * @brief: Resets VBlank IRQ flag. * * *******************************************************************/ - void SystemDisableScreenRefresh(void) { refresh_needed = false; @@ -377,7 +371,6 @@ void SystemDisableScreenRefresh(void) * set each second. * * *******************************************************************/ - bool System1SecondTick(void) { return one_second_timer; @@ -393,7 +386,6 @@ bool System1SecondTick(void) * set every 100 milliseconds. * * *******************************************************************/ - bool System100msTick(void) { return hundred_ms_timer; @@ -409,7 +401,6 @@ bool System100msTick(void) * set every 500 milliseconds. * * *******************************************************************/ - bool System500msTick(void) { return five_hundred_ms_timer; @@ -426,7 +417,6 @@ bool System500msTick(void) * @remarks: 1 second, 500 ms and 100 ms ticks get updated here. * * *******************************************************************/ - void SystemRunTimers(void) { static uint64_t last_one_second_tick; @@ -453,7 +443,6 @@ void SystemRunTimers(void) * @brief: Checks if needed time step has been elapsed. If true, flag gets set. * * *******************************************************************************/ - void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step) { if (*timer != false) @@ -480,7 +469,6 @@ void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step) * @return: true if file has been loaded successfully, false otherwise. * * ****************************************************************************************/ - bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) { #ifdef SERIAL_INTERFACE @@ -587,7 +575,6 @@ bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) * @return: true if file has been loaded successfully, false otherwise. * * ****************************************************************************************/ - bool SystemLoadFile(char*fname) { return SystemLoadFileToBuffer(fname,file_buffer,sizeof(file_buffer)); @@ -602,7 +589,6 @@ bool SystemLoadFile(char*fname) * @return: Reportedly, returns internal buffer initial address. * * *****************************************************************/ - uint8_t* SystemGetBufferAddress(void) { return file_buffer; @@ -617,7 +603,6 @@ uint8_t* SystemGetBufferAddress(void) * @return: Fills internal buffer with zeros * * *****************************************************************/ - void SystemClearBuffer(void) { memset(file_buffer, 0, sizeof(file_buffer)); @@ -632,7 +617,6 @@ void SystemClearBuffer(void) * @return: halts program execution for n-"cycles" * * *****************************************************************/ - void SystemWaitCycles(uint32_t cycles) { uint64_t currentTime = global_timer; @@ -652,7 +636,6 @@ void SystemWaitCycles(uint32_t cycles) * you will predictable values otherwise! * * *****************************************************************/ - uint32_t SystemRand(uint32_t min, uint32_t max) { if (rand_seed == false) @@ -674,7 +657,6 @@ uint32_t SystemRand(uint32_t min, uint32_t max) * @remarks: emergency mode is set once that a controller is unplugged. * * ***********************************************************************/ - void SystemSetEmergencyMode(bool value) { emergency_mode = value; @@ -689,7 +671,6 @@ void SystemSetEmergencyMode(bool value) * @return: returns emergency mode flag. * * ***********************************************************************/ - bool SystemGetEmergencyMode(void) { return emergency_mode; @@ -704,7 +685,6 @@ bool SystemGetEmergencyMode(void) * @return: returns system busy flag. * * ***********************************************************************/ - volatile bool SystemIsBusy(void) { return system_busy; @@ -721,7 +701,6 @@ volatile bool SystemIsBusy(void) * @return: true if value is contained inside buffer, false otherwise. * * ****************************************************************************/ - bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz) { size_t i = 0; @@ -749,7 +728,6 @@ bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz) * @return: true if value is contained inside buffer, false otherwise. * * ****************************************************************************/ - bool SystemContains_u16(uint16_t value, uint16_t* buffer, size_t sz) { size_t i = 0; @@ -776,7 +754,6 @@ bool SystemContains_u16(uint16_t value, uint16_t* buffer, size_t sz) * @return: true if they are equal, false otherwise. * * ****************************************************************************************/ - bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz) { size_t i; @@ -801,7 +778,6 @@ bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz) * @brief: Prints stack usage in percentage via dprintf calls. * * ****************************************************************************************/ - void SystemPrintStackPointerAddress(void) { #ifdef PSXSDK_DEBUG // Used to avoid unused variable warning @@ -835,7 +811,6 @@ void SystemPrintStackPointerAddress(void) * overflow has been caused, and application returns to a safe state. * * ****************************************************************************************/ - void SystemCheckStack(void) { uint32_t * ptrStack = BEGIN_STACK_ADDRESS; @@ -863,7 +838,6 @@ void SystemCheckStack(void) * overflow during execution. * * ****************************************************************************************/ - void SystemSetStackPattern(void) { uint32_t * ptrStack = BEGIN_STACK_ADDRESS; @@ -884,7 +858,6 @@ void SystemSetStackPattern(void) * @return Index for a string "str" inside "array". -1 if it could not be found. * * ****************************************************************************************/ - int32_t SystemIndexOfStringArray(char* str, char** array) { int32_t i; @@ -914,7 +887,6 @@ int32_t SystemIndexOfStringArray(char* str, char** array) * @return Index for a variable "value" inside "array". -1 if it could not be found. * * ****************************************************************************************/ - int32_t SystemIndexOf_U16(uint16_t value, uint16_t* array, uint32_t sz) { int32_t i; @@ -943,7 +915,6 @@ int32_t SystemIndexOf_U16(uint16_t value, uint16_t* array, uint32_t sz) * * ****************************************************************************************/ - int32_t SystemIndexOf_U8(uint8_t value, uint8_t* array, uint32_t from, uint32_t sz) { int32_t i; @@ -968,7 +939,6 @@ int32_t SystemIndexOf_U8(uint8_t value, uint8_t* array, uint32_t from, uint32_t * @return: Frames per second * * ****************************************************************************************/ - volatile uint8_t SystemGetFPS(void) { return fps; @@ -984,7 +954,6 @@ volatile uint8_t SystemGetFPS(void) * * * ****************************************************************************************/ - void SystemCyclicHandler(void) { UpdatePads(); @@ -1016,7 +985,6 @@ void SystemCyclicHandler(void) * e.g.: when reading files from CD-ROM. * * ****************************************************************************************/ - void SystemDisableVBlankInterrupt(void) { I_MASK &= ~(0x0001); @@ -1032,7 +1000,6 @@ void SystemDisableVBlankInterrupt(void) * * * ****************************************************************************************/ - void SystemEnableVBlankInterrupt(void) { I_MASK |= (0x0001); @@ -1048,7 +1015,6 @@ void SystemEnableVBlankInterrupt(void) * located at memory address 0x801A0000 * * ****************************************************************************************/ - void SystemReturnToLoader(void) { Serial_printf("Returning to loader...\n"); @@ -1070,7 +1036,6 @@ void SystemReturnToLoader(void) * top of all drawn primitives for debugging/development purposes. * * ****************************************************************************************/ - void SystemDevMenuToggle(void) { devmenu_flag = devmenu_flag? false: true; @@ -1085,7 +1050,6 @@ void SystemDevMenuToggle(void) * @brief: Enables bit 6 from I_MASK (0x1F801074)/IRQ6 RCNT2 (System clock / 8) * * ****************************************************************************************/ - void SystemEnableRCnt2Interrupt(void) { I_MASK |= 1<<6; @@ -1101,7 +1065,6 @@ void SystemEnableRCnt2Interrupt(void) * @brief: Disables bit 6 from I_MASK (0x1F801074)/IRQ6 RCNT2 (System clock / 8) * * ****************************************************************************************/ - void SystemDisableRCnt2Interrupt(void) { I_MASK &= ~(1<<6); @@ -1116,7 +1079,6 @@ void SystemDisableRCnt2Interrupt(void) * @brief: Shows information on top of all drawn primitives for debugging/development purposes. * * ****************************************************************************************/ - void SystemDevMenu(void) { enum diff --git a/Source/System.h b/Source/System.h index aa5aebe..6938d6a 100644 --- a/Source/System.h +++ b/Source/System.h @@ -4,21 +4,18 @@ /* ************************************** * Includes * * **************************************/ - #include "Global_Inc.h" #include "GameStructures.h" /* ************************************** * Defines * * **************************************/ - #define TIMER_PRESCALER_1_SECOND 10 #define TIMER_PRESCALER_1_MINUTE (TIMER_PRESCALER_1_SECOND * 60) /* ************************************** * Global Prototypes * * **************************************/ - // Calls PSXSDK init routines void SystemInit(void); @@ -136,5 +133,4 @@ unsigned char SystemGetSineValue(void); /* ************************************** * Global Variables * * **************************************/ - #endif //SYSTEM_HEADER__ diff --git a/Source/main.c b/Source/main.c index e025f22..d711c5f 100644 --- a/Source/main.c +++ b/Source/main.c @@ -1,7 +1,6 @@ /* ************************************* * Includes * *************************************/ - #include "Global_Inc.h" #include "Menu.h" #include "System.h" @@ -9,11 +8,19 @@ /* ************************************* * Defines * *************************************/ - /* ************************************* * Local Prototypes * *************************************/ - +/* ********************************************************************************************** + * + * @name: int main(void) + * + * @author: Xavier Del Campo + * + * @brief: + * First function to be executed. + * + * **********************************************************************************************/ int main(void) { //System initialization diff --git a/Sprites/ARROW.bmp b/Sprites/ARROW.bmp index 98eb397de80c6e10b9a9b1c4349239354792b7d8..ba862bb6e1b02abf3a11d41a372e0d4c78e2cdac 100644 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTufKf`~YjY>o!h+^4iTZu$KV~N)SQA~z< zVzj^w2P!5*J$@}{h7+^`t9o2k;8IM6dQ2^N49DsVg6fg2AVx76>LFT)G#u^=T35LAq;g-FG4Eu-ooL4lP72F@T1ABd}nBmt!hOE3Tc diff --git a/cdimg/DATA/SPRITES/ARROW.TIM b/cdimg/DATA/SPRITES/ARROW.TIM index 6a14a5e7167531822b70c359847422a66f0c6754..fd2a511912ef2dcd4aec42d3b681d4eb61ea814f 100644 GIT binary patch literal 532 zcmWe&U|?VZVjdt7!}Nhc00>dR5w#;~s3NF5{PIWCrtweX$87?Bd5A1-6Y$F;WU-ro jUmjH!(**qTn6juQ;FrfPi!cGdJZ@Q-37|N`1sNCs1=eWs literal 532 zcmWe&U|?VZVjdt7!}Nhc00>(w2toB!+z_M}x2$^Vs5}EOgmHyXiv=(;fB?G+m@IY` S$g-F!&}AVi5HStnLjVB9>V}5^