aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2017-05-28 04:22:03 +0200
committerXaviDCR92 <xavi.dcr@gmail.com>2017-05-28 04:22:03 +0200
commit5286033a40475cf24224797db63a9b5ced044f94 (patch)
tree41b38054e3d56628cbaac3679f0e83f9b31539fa /Source
parent5430bd30906ca270bceec5912b94d81f0f854769 (diff)
downloadairport-5286033a40475cf24224797db63a9b5ced044f94.tar.gz
* Takeoff barely implemented. Stil a lot of work to do.
* Added new runway holding point tiles. * Bugfixes in last key single pressed.
Diffstat (limited to 'Source')
-rw-r--r--Source/Aircraft.c8
-rw-r--r--Source/Aircraft.h1
-rw-r--r--Source/Game.c223
-rw-r--r--Source/GameGui.c6
-rw-r--r--Source/GameStructures.h3
-rw-r--r--Source/Pad.c22
6 files changed, 210 insertions, 53 deletions
diff --git a/Source/Aircraft.c b/Source/Aircraft.c
index 74a664e..088167b 100644
--- a/Source/Aircraft.c
+++ b/Source/Aircraft.c
@@ -235,6 +235,8 @@ void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft)
break;
case STATE_TAXIING:
+ // Fall through
+ case STATE_READY_FOR_TAKEOFF:
ptrAircraft->Speed = AircraftSpeedsTable[AIRCRAFT_SPEED_TAXIING];
break;
@@ -481,3 +483,9 @@ void AircraftFromFlightDataIndexAddTargets(uint8_t index, uint16_t* targets)
{
AircraftAddTargets(AircraftFromFlightDataIndex(index), targets);
}
+
+AIRCRAFT_DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft)
+{
+ return ptrAircraft->Direction;
+}
+
diff --git a/Source/Aircraft.h b/Source/Aircraft.h
index 76a9471..6ee6693 100644
--- a/Source/Aircraft.h
+++ b/Source/Aircraft.h
@@ -23,6 +23,7 @@ void AircraftAddTargets(TYPE_AIRCRAFT_DATA* ptrAircraft, uint16_t* targets);
TYPE_ISOMETRIC_POS AircraftGetIsoPos(uint8_t FlightDataIdx);
uint16_t AircraftGetTileFromFlightDataIndex(uint8_t index);
bool AircraftRemove(uint8_t aircraftIdx);
+AIRCRAFT_DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft);
bool AircraftAddNew( TYPE_FLIGHT_DATA * ptrFlightData,
uint8_t FlightDataIndex,
uint16_t* targets );
diff --git a/Source/Game.c b/Source/Game.c
index 292cc44..d13598e 100644
--- a/Source/Game.c
+++ b/Source/Game.c
@@ -59,8 +59,8 @@ enum
TILE_RESERVED_3,
TILE_AIRPORT_BUILDING,
TILE_PLANE,
- TILE_RESERVED_4,
- TILE_RESERVED_5,
+ TILE_RWY_HOLDING_POINT,
+ TILE_RWY_HOLDING_POINT_2,
TILE_RWY_EXIT,
TILE_GATE,
TILE_RESERVED_6,
@@ -88,6 +88,7 @@ enum
SCORE_REWARD_TAXIING = 200,
SCORE_REWARD_FINAL = 400,
SCORE_REWARD_UNLOADING = 300,
+ SCORE_REWARD_TAKEOFF = 200,
SCORE_REWARD_FINISH_FLIGHT = 1000
};
@@ -134,6 +135,7 @@ static bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightDa
static void GameDrawMouse(TYPE_PLAYER* ptrPlayer);
static void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData);
static void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer);
+static void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData, uint8_t aircraftIdx);
/* *************************************
* Global Variables
@@ -155,6 +157,7 @@ static TYPE_FLIGHT_DATA FlightData;
static uint16_t GameRwyArray[GAME_MAX_RWY_LENGTH];
static uint16_t GameUsedRwy[GAME_MAX_RUNWAYS];
static uint16_t GameSelectedTile;
+static bool firstLevelRender; // Used to avoid reentrance on GameRenderLevel()
// Instances for player-specific data
TYPE_PLAYER PlayerData[MAX_PLAYERS];
@@ -609,6 +612,8 @@ void GameGraphics(void)
// Fading from black effect on startup.
GfxIncreaseGlobalLuminance(1);
}
+
+ firstLevelRender = true;
for(i = 0; i < MAX_PLAYERS ; i++)
{
@@ -784,7 +789,6 @@ void GameAircraftState(void)
}
}
-
void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
{
uint16_t i;
@@ -795,7 +799,8 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
bool used_rwy;
uint8_t aux_id;
GsSprite * ptrTileset;
- static unsigned char rwy_sine = 0;
+ const uint8_t rwy_sine_step = 24;
+ static unsigned char rwy_sine = rwy_sine_step;
static bool rwy_sine_decrease = false;
TYPE_ISOMETRIC_POS tileIsoPos;
TYPE_CARTESIAN_POS tileCartPos;
@@ -813,6 +818,34 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
dprintf("\n");*/
}
+
+ if(firstLevelRender == true)
+ {
+ firstLevelRender = false;
+
+ if(rwy_sine_decrease == false)
+ {
+ if(rwy_sine < 240)
+ {
+ rwy_sine += rwy_sine_step;
+ }
+ else
+ {
+ rwy_sine_decrease = true;
+ }
+ }
+ else
+ {
+ if(rwy_sine > rwy_sine_step)
+ {
+ rwy_sine -= rwy_sine_step;
+ }
+ else
+ {
+ rwy_sine_decrease = false;
+ }
+ }
+ }
for(i = 0 ; i < GameLevelSize; i++)
{
@@ -924,32 +957,6 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
ptrTileset->b = NORMAL_LUMINANCE;
}
- if(System100msTick() == true)
- {
- if(rwy_sine_decrease == false)
- {
- if(rwy_sine < 255)
- {
- rwy_sine++;
- }
- else
- {
- rwy_sine_decrease = true;
- }
- }
- else
- {
- if(rwy_sine > (NORMAL_LUMINANCE >> 2))
- {
- rwy_sine--;
- }
- else
- {
- rwy_sine_decrease = false;
- }
- }
- }
-
// TODO: Isometric -> Cartesian conversion
tileIsoPos.x = columns << (TILE_SIZE_BIT_SHIFT);
tileIsoPos.y = rows << (TILE_SIZE_BIT_SHIFT);
@@ -1148,13 +1155,13 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptr
switch(target_tile)
{
- case TILE_RWY_START_1:
+ case TILE_RWY_HOLDING_POINT:
// Fall through
- case TILE_RWY_START_1 | TILE_MIRROR_FLAG:
+ case TILE_RWY_HOLDING_POINT | TILE_MIRROR_FLAG:
// Fall through
- case TILE_RWY_START_2:
+ case TILE_RWY_HOLDING_POINT_2:
// Fall through
- case TILE_RWY_START_2 | TILE_MIRROR_FLAG:
+ case TILE_RWY_HOLDING_POINT_2 | TILE_MIRROR_FLAG:
AircraftFromFlightDataIndexAddTargets(ptrPlayer->FlightDataSelectedAircraft, ptrPlayer->Waypoints);
dprintf("Added these targets to aircraft %d:\n", ptrPlayer->FlightDataSelectedAircraft);
@@ -1165,11 +1172,15 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptr
dprintf("\n");
- ptrPlayer->SelectTaxiwayParking = false;
// Clear waypoints array.
memset(ptrPlayer->Waypoints, 0, sizeof(uint16_t) * PLAYER_MAX_WAYPOINTS);
+
+ // Reset state and auxiliar variables
ptrPlayer->WaypointIdx = 0;
ptrPlayer->LastWaypointIdx = 0;
+ ptrPlayer->LockedAircraft = 0;
+ ptrPlayer->LockTarget = false;
+ ptrPlayer->SelectTaxiwayRunway = false;
ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] = STATE_TAXIING;
GameScore += SCORE_REWARD_TAXIING;
@@ -1402,6 +1413,11 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFl
// Generate first unboarding key sequence
GameGenerateUnboardingSequence(ptrPlayer);
break;
+
+ case STATE_READY_FOR_TAKEOFF:
+ ptrFlightData->State[AircraftIdx] = STATE_TAKEOFF;
+ GameCreateTakeoffWaypoints(ptrPlayer, ptrFlightData, AircraftIdx);
+ break;
default:
dprintf("Incompatible state %d!\n",aircraftState);
@@ -1561,6 +1577,38 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFl
return;
}
}
+ else if(ptrFlightData->State[aircraftIndex] == STATE_READY_FOR_TAKEOFF)
+ {
+ AIRCRAFT_DIRECTION aircraftDir = AircraftGetDirection(AircraftFromFlightDataIndex(aircraftIndex));
+ uint16_t rwyTile = 0;
+
+ switch(aircraftDir)
+ {
+ case AIRCRAFT_DIR_EAST:
+ rwyTile = AircraftGetTileFromFlightDataIndex(aircraftIndex) - GameLevelColumns;
+ break;
+
+ case AIRCRAFT_DIR_WEST:
+ rwyTile = AircraftGetTileFromFlightDataIndex(aircraftIndex) + GameLevelColumns;
+ break;
+
+ case AIRCRAFT_DIR_NORTH:
+ rwyTile = AircraftGetTileFromFlightDataIndex(aircraftIndex) + 1;
+ break;
+
+ case AIRCRAFT_DIR_SOUTH:
+ rwyTile = AircraftGetTileFromFlightDataIndex(aircraftIndex) - 1;
+ break;
+
+ case AIRCRAFT_DIR_NO_DIRECTION:
+ // Fall through
+ default:
+ break;
+
+ }
+ ptrFlightData->State[aircraftIndex] = STATE_TAKEOFF;
+ GameScore += SCORE_REWARD_TAKEOFF;
+ }
}
short GameGetXFromTile_short(uint16_t tile)
@@ -1621,7 +1669,18 @@ FL_STATE GameTargetsReached(uint16_t firstTarget, uint8_t index)
break;
case STATE_TAXIING:
- FlightData.State[index] = STATE_UNBOARDING;
+ if(FlightData.FlightDirection[index] == DEPARTURE)
+ {
+ FlightData.State[index] = STATE_HOLDING_RWY;
+ }
+ else if(FlightData.FlightDirection[index] == ARRIVAL)
+ {
+ FlightData.State[index] = STATE_UNBOARDING;
+ }
+ break;
+
+ case STATE_TAKEOFF:
+ FlightData.State[index] = STATE_CLIMBING;
break;
default:
@@ -1693,11 +1752,11 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
// water, buildings...), then false is returned.
uint8_t AcceptedTiles[] = { TILE_ASPHALT, TILE_ASPHALT_WITH_BORDERS,
- TILE_PARKING, TILE_RWY_START_1,
- TILE_RWY_START_2, TILE_RWY_MID,
+ TILE_PARKING, TILE_RWY_MID,
TILE_RWY_EXIT, TILE_TAXIWAY_CORNER_GRASS,
TILE_TAXIWAY_CORNER_GRASS_2, TILE_TAXIWAY_GRASS,
- TILE_TAXIWAY_INTERSECT_GRASS};
+ TILE_TAXIWAY_INTERSECT_GRASS,
+ TILE_RWY_HOLDING_POINT, TILE_RWY_HOLDING_POINT_2 };
uint8_t i;
uint8_t j;
@@ -2053,3 +2112,89 @@ void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer)
dprintf("\n");
}
+
+void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData, uint8_t aircraftIdx)
+{
+ // Look for aircraft direction by searching TILE_RWY_EXIT
+ AIRCRAFT_DIRECTION aircraftDir = AIRCRAFT_DIR_NO_DIRECTION;
+ uint16_t currentTile = AircraftGetTileFromFlightDataIndex(aircraftIdx);
+ uint16_t targets[AIRCRAFT_MAX_TARGETS] = {0};
+ uint8_t targetsIdx = 0;
+ uint16_t runwayTile = 0;
+ uint16_t i;
+
+ if( (currentTile > GameLevelColumns) && ( (currentTile + GameLevelColumns) < (sizeof(GameLevelBuffer) / sizeof(GameLevelBuffer[0]) ) ) )
+ {
+ if(GameLevelBuffer[currentTile + 1] == TILE_RWY_EXIT)
+ {
+ aircraftDir = AIRCRAFT_DIR_EAST;
+ runwayTile = currentTile + 1;
+ }
+ else if(GameLevelBuffer[currentTile - 1] == TILE_RWY_EXIT)
+ {
+ aircraftDir = AIRCRAFT_DIR_WEST;
+ runwayTile = currentTile - 1;
+ }
+ else if(GameLevelBuffer[currentTile + GameLevelColumns] == TILE_RWY_EXIT)
+ {
+ aircraftDir = AIRCRAFT_DIR_SOUTH;
+ runwayTile = currentTile + GameLevelColumns;
+ }
+ else if(GameLevelBuffer[currentTile - GameLevelColumns] == TILE_RWY_EXIT)
+ {
+ aircraftDir = AIRCRAFT_DIR_NORTH;
+ runwayTile = currentTile - GameLevelColumns;
+ }
+ else
+ {
+ dprintf("GameCreateTakeoffWaypoints(): could not determine aircraft direction.\n");
+ return;
+ }
+
+ targets[targetsIdx++] = runwayTile;
+
+ dprintf("Direction = ");
+
+ switch(aircraftDir)
+ {
+ case AIRCRAFT_DIR_EAST:
+ dprintf("EAST\n");
+ break;
+
+ case AIRCRAFT_DIR_WEST:
+ dprintf("WEST\n");
+ break;
+
+ case AIRCRAFT_DIR_NORTH:
+ dprintf("NORTH\n");
+ break;
+
+ case AIRCRAFT_DIR_SOUTH:
+ dprintf("SOUTH\n");
+ for(i = (runwayTile + 1); (i < (runwayTile + GameLevelColumns)) && GameLevelBuffer[i] != TILE_RWY_EXIT; i++)
+ {
+ targets[targetsIdx++] = i;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ dprintf("Waypoints for takeoff added = ");
+
+ for(i = 0; i < AIRCRAFT_MAX_TARGETS; i++)
+ {
+ dprintf("%d ", targets[i]);
+ }
+
+ dprintf("\n");
+
+ AircraftAddTargets(AircraftFromFlightDataIndex(aircraftIdx), targets);
+
+ }
+ else
+ {
+ dprintf("GameCreateTakeoffWaypoints(): Invalid index for tile.\n");
+ }
+}
diff --git a/Source/GameGui.c b/Source/GameGui.c
index 98cc14a..cff81f8 100644
--- a/Source/GameGui.c
+++ b/Source/GameGui.c
@@ -869,18 +869,18 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFligh
"Approach" );
break;
- case STATE_FINAL:
+ case STATE_READY_FOR_TAKEOFF:
FontPrintText( &SmallFont,
AircraftDataDirection_X + AircraftDataState_X_Offset,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
- "Landing" );
+ "Takeoff" );
break;
case STATE_LANDED:
FontPrintText( &SmallFont,
AircraftDataDirection_X + AircraftDataState_X_Offset,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
- "Arrived" );
+ "Landed" );
break;
case STATE_PARKED:
diff --git a/Source/GameStructures.h b/Source/GameStructures.h
index 9129b87..cb4f1d3 100644
--- a/Source/GameStructures.h
+++ b/Source/GameStructures.h
@@ -37,7 +37,10 @@ typedef enum t_flstate
STATE_PARKED,
STATE_UNBOARDING,
STATE_TAXIING,
+ STATE_HOLDING_RWY,
+ STATE_READY_FOR_TAKEOFF,
STATE_TAKEOFF,
+ STATE_CLIMBING,
STATE_APPROACH,
STATE_FINAL,
STATE_LANDED
diff --git a/Source/Pad.c b/Source/Pad.c
index 00849e1..ef56f08 100644
--- a/Source/Pad.c
+++ b/Source/Pad.c
@@ -270,6 +270,17 @@ bool UpdatePads(void)
PadCheatHandler(PAD_ONE);
PadCheatHandler(PAD_TWO);
+
+ // Get now-old pad data
+ previous_pad1 = pad1;
+ previous_pad2 = pad2;
+
+ PSX_ReadPad(&pad1,&pad2);
+
+ if(PadOneConnected() == false)
+ {
+ return false;
+ }
if(!(previous_pad1 & pad1) )
{
@@ -289,17 +300,6 @@ bool UpdatePads(void)
pad2_last_key_single_pressed = 0;
}
- // Get now-old pad data
- previous_pad1 = pad1;
- previous_pad2 = pad2;
-
- PSX_ReadPad(&pad1,&pad2);
-
- if(PadOneConnected() == false)
- {
- return false;
- }
-
return true;
}