* Removed unneeded -g flag from Makefile.
* Aircraft now prevents collision against other aircraft if state == STATE_TAXIING. * Game: new event handlers for new Aircraft collision prevention algorithm. * Font: although not compulsory, _blend_effect_lum should be volatile. * Other minor changes.
This commit is contained in:
parent
0d7af34486
commit
6629a61c3b
|
@ -6,26 +6,28 @@
|
|||
#For example:
|
||||
14:55
|
||||
#Aircraft arrival (or departure) must be set relative to initial time, in HH:MM format.
|
||||
ARRIVAL;PHX1802;100;00:10;0;360
|
||||
ARRIVAL;PHX2015;100;00:10;0;360
|
||||
ARRIVAL;PHX2016;100;00:40;0;360
|
||||
ARRIVAL;PHX2017;100;00:50;0;360
|
||||
ARRIVAL;PHX2018;100;01:40;0;360
|
||||
ARRIVAL;PHX2019;100;01:20;0;360
|
||||
ARRIVAL;PHX2020;100;02:00;0;360
|
||||
ARRIVAL;PHX2021;100;00:05;0;360
|
||||
ARRIVAL;PHX2022;100;00:15;0;360
|
||||
ARRIVAL;PHX2023;100;00:45;0;360
|
||||
ARRIVAL;PHX2024;100;01:45;0;360
|
||||
ARRIVAL;PHX2025;100;01:20;0;360
|
||||
ARRIVAL;PHX2026;100;01:10;0;360
|
||||
DEPARTURE;PHX1000;100;00:05;19;180
|
||||
DEPARTURE;PHX1001;100;00:15;19;180
|
||||
DEPARTURE;PHX1002;100;00:30;19;180
|
||||
DEPARTURE;PHX1003;100;00:45;19;180
|
||||
DEPARTURE;PHX1004;100;01:10;19;180
|
||||
DEPARTURE;PHX1280;100;01:30;19;180
|
||||
DEPARTURE;PHX1332;100;00:50;21;180
|
||||
DEPARTURE;PHX1333;100;01:00;19;180
|
||||
DEPARTURE;PHX1334;100;01:15;21;180
|
||||
DEPARTURE;PHX1336;100;01:20;21;180
|
||||
#ARRIVAL;PHX1802;100;00:10;0;360
|
||||
#ARRIVAL;PHX2015;100;00:10;0;360
|
||||
#ARRIVAL;PHX2016;100;00:40;0;360
|
||||
#ARRIVAL;PHX2017;100;00:50;0;360
|
||||
#ARRIVAL;PHX2018;100;01:40;0;360
|
||||
#ARRIVAL;PHX2019;100;01:20;0;360
|
||||
#ARRIVAL;PHX2020;100;02:00;0;360
|
||||
#ARRIVAL;PHX2021;100;00:05;0;360
|
||||
#ARRIVAL;PHX2022;100;00:15;0;360
|
||||
#ARRIVAL;PHX2023;100;00:45;0;360
|
||||
#ARRIVAL;PHX2024;100;01:45;0;360
|
||||
#ARRIVAL;PHX2025;100;01:20;0;360
|
||||
#ARRIVAL;PHX2026;100;01:10;0;360
|
||||
#DEPARTURE;PHX1000;100;00:05;19;180
|
||||
#DEPARTURE;PHX1001;100;00:15;19;180
|
||||
#DEPARTURE;PHX1002;100;00:30;19;180
|
||||
#DEPARTURE;PHX1003;100;00:45;19;180
|
||||
#DEPARTURE;PHX1004;100;01:10;19;180
|
||||
#DEPARTURE;PHX1280;100;01:30;19;180
|
||||
#DEPARTURE;PHX1332;100;00:50;21;180
|
||||
#DEPARTURE;PHX1333;100;01:00;19;180
|
||||
#DEPARTURE;PHX1334;100;01:15;21;180
|
||||
#DEPARTURE;PHX1336;100;01:20;21;180
|
||||
ARRIVAL;PHX2026;120;00:05;0;360
|
||||
ARRIVAL;PHX2026;80;00:10;0;360
|
||||
|
|
|
@ -80,6 +80,7 @@ static void AircraftAttitude(TYPE_AIRCRAFT_DATA* ptrAircraft);
|
|||
static void AircraftUpdateSpriteFromData(TYPE_AIRCRAFT_DATA* ptrAircraft);
|
||||
static void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft);
|
||||
static bool AircraftCheckCollision(TYPE_AIRCRAFT_DATA* ptrRefAircraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft);
|
||||
static bool AircraftCheckPath(TYPE_AIRCRAFT_DATA* ptrAicraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft);
|
||||
|
||||
void AircraftInit(void)
|
||||
{
|
||||
|
@ -234,6 +235,7 @@ void AircraftHandler(void)
|
|||
{
|
||||
TYPE_AIRCRAFT_DATA* ptrAircraft = &AircraftData[i];
|
||||
uint8_t j;
|
||||
bool collision_warning = false;
|
||||
|
||||
if (ptrAircraft->State == STATE_IDLE)
|
||||
{
|
||||
|
@ -250,40 +252,102 @@ void AircraftHandler(void)
|
|||
{
|
||||
TYPE_AIRCRAFT_DATA* ptrOtherAircraft = &AircraftData[j];
|
||||
|
||||
if (ptrOtherAircraft->State == STATE_IDLE)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i == j)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if (j < i)
|
||||
else
|
||||
{
|
||||
// Collision already calculated.
|
||||
continue;
|
||||
// Check whether aircraft should stop in order to avoid collision against
|
||||
// other aircraft.
|
||||
// WARNING: only STATE_TAXIING can be used to automatically stop an aircraft
|
||||
// when calling GameStopFlight() or GameResumeFlightFromAutoStop().
|
||||
collision_warning = AircraftCheckPath(ptrAircraft, ptrOtherAircraft);
|
||||
}
|
||||
|
||||
if (AircraftData[j].State == STATE_IDLE)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (j > i)
|
||||
{
|
||||
if (AircraftCheckCollision(ptrAircraft, ptrOtherAircraft) == true)
|
||||
{
|
||||
GameAircraftCollision(ptrAircraft->FlightDataIdx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Collision already calculated.
|
||||
}
|
||||
|
||||
if (AircraftCheckCollision(ptrAircraft, ptrOtherAircraft) == true)
|
||||
{
|
||||
GameAircraftCollision(ptrAircraft->FlightDataIdx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (collision_warning == true)
|
||||
{
|
||||
GameStopFlight(ptrAircraft->FlightDataIdx);
|
||||
}
|
||||
else
|
||||
{
|
||||
GameResumeFlightFromAutoStop(ptrAircraft->FlightDataIdx);
|
||||
}
|
||||
|
||||
|
||||
ptrAircraft->State = GameGetFlightDataStateFromIdx(ptrAircraft->FlightDataIdx);
|
||||
}
|
||||
}
|
||||
|
||||
bool AircraftCheckPath(TYPE_AIRCRAFT_DATA* ptrAircraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft)
|
||||
{
|
||||
uint16_t currentTile = AircraftGetTileFromFlightDataIndex(ptrAircraft->FlightDataIdx);
|
||||
uint16_t nextTile = 0; // Keep compiler happy
|
||||
uint16_t otherAircraft_currentTile = AircraftGetTileFromFlightDataIndex(ptrOtherAircraft->FlightDataIdx);
|
||||
|
||||
switch (ptrAircraft->Direction)
|
||||
{
|
||||
case AIRCRAFT_DIR_EAST:
|
||||
nextTile = currentTile + 1;
|
||||
break;
|
||||
|
||||
case AIRCRAFT_DIR_WEST:
|
||||
nextTile = currentTile - 1;
|
||||
break;
|
||||
|
||||
case AIRCRAFT_DIR_NORTH:
|
||||
nextTile = currentTile - GameGetLevelColumns();
|
||||
break;
|
||||
|
||||
case AIRCRAFT_DIR_SOUTH:
|
||||
nextTile = currentTile - GameGetLevelColumns();
|
||||
break;
|
||||
|
||||
case AIRCRAFT_DIR_NO_DIRECTION:
|
||||
// Fall through
|
||||
default:
|
||||
Serial_printf("AircraftCheckPath: Undefined direction\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( (otherAircraft_currentTile == nextTile)
|
||||
||
|
||||
(otherAircraft_currentTile == currentTile) )
|
||||
{
|
||||
if (ptrOtherAircraft->Speed == 0)
|
||||
{
|
||||
// Make ptrAircraft stop if ptrOtherAircraft is nearby and not moving!
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -300,6 +364,10 @@ void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft)
|
|||
ptrAircraft->Speed = AircraftSpeedsTable[AIRCRAFT_SPEED_GROUND];
|
||||
break;
|
||||
|
||||
case STATE_USER_STOPPED:
|
||||
// Fall through
|
||||
case STATE_AUTO_STOPPED:
|
||||
// Fall through
|
||||
case STATE_READY_FOR_TAKEOFF:
|
||||
// Fall through
|
||||
case STATE_UNBOARDING:
|
||||
|
@ -688,21 +756,6 @@ TYPE_AIRCRAFT_DATA* AircraftFromFlightDataIndex(uint8_t index)
|
|||
}
|
||||
|
||||
return &AircraftData[idx];
|
||||
|
||||
/*uint8_t i;
|
||||
TYPE_AIRCRAFT_DATA* ptrAircraft;
|
||||
|
||||
for (i = 0; i < GAME_MAX_AIRCRAFT; i++)
|
||||
{
|
||||
ptrAircraft = &AircraftData[i];
|
||||
|
||||
if (ptrAircraft->FlightDataIdx == index)
|
||||
{
|
||||
return ptrAircraft;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;*/
|
||||
}
|
||||
|
||||
void AircraftFromFlightDataIndexAddTargets(uint8_t index, uint16_t* targets)
|
||||
|
|
Binary file not shown.
|
@ -24,7 +24,7 @@
|
|||
* *************************************/
|
||||
|
||||
static char _internal_text[FONT_INTERNAL_TEXT_BUFFER_MAX_SIZE];
|
||||
static unsigned char _blend_effect_lum;
|
||||
static volatile unsigned char _blend_effect_lum;
|
||||
|
||||
bool FontLoadImage(char* strPath, TYPE_FONT * ptrFont)
|
||||
{
|
||||
|
@ -107,6 +107,8 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...)
|
|||
|
||||
va_list ap;
|
||||
|
||||
// Do not print anything if either 1Hz or 2Hz flags are configured
|
||||
// and 1/2Hz signal has not been yet emitted by Gfx.
|
||||
if (ptrFont->flags & FONT_1HZ_FLASH)
|
||||
{
|
||||
if (Gfx1HzFlash() == false)
|
||||
|
@ -149,7 +151,7 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...)
|
|||
y += ptrFont->char_h;
|
||||
break;
|
||||
default:
|
||||
if ( (ptrFont->flags & FONT_WRAP_LINE) && (ptrFont->max_ch_wrap != 0) )
|
||||
if ( (ptrFont->flags & FONT_WRAP_LINE) && (ptrFont->max_ch_wrap != 0) )
|
||||
{
|
||||
if (++line_count >= ptrFont->max_ch_wrap)
|
||||
{
|
||||
|
|
|
@ -2344,21 +2344,20 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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];
|
||||
FL_STATE* ptrAircraftState = &FlightData.State[ptrPlayer->FlightDataSelectedAircraft];
|
||||
|
||||
if (*AircraftState == STATE_TAXIING)
|
||||
if (*ptrAircraftState == STATE_TAXIING)
|
||||
{
|
||||
*AircraftState = STATE_STOPPED;
|
||||
*ptrAircraftState = STATE_USER_STOPPED;
|
||||
}
|
||||
else if (*AircraftState == STATE_STOPPED)
|
||||
else if ( (*ptrAircraftState == STATE_USER_STOPPED)
|
||||
||
|
||||
(*ptrAircraftState == STATE_AUTO_STOPPED) )
|
||||
{
|
||||
*AircraftState = STATE_TAXIING;
|
||||
*ptrAircraftState = STATE_TAXIING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3948,3 +3947,59 @@ void GameAircraftCollision(uint8_t AircraftIdx)
|
|||
GameAircraftCollisionFlag = true;
|
||||
GameAircraftCollisionIdx = AircraftIdx;
|
||||
}
|
||||
|
||||
/* *******************************************************************************************
|
||||
*
|
||||
* @name: void GameAircraftCollision(uint8_t AircraftIdx)
|
||||
*
|
||||
* @author: Xavier Del Campo
|
||||
*
|
||||
* @param:
|
||||
*
|
||||
* uint8_t AircraftIdx:
|
||||
* Index from FlightData.
|
||||
*
|
||||
* @brief:
|
||||
* Event triggered by Aircraft when aircraft A is getting close to non-moving aircraft B
|
||||
* and a security stop must be done in order to avoid collision.
|
||||
*
|
||||
* *******************************************************************************************/
|
||||
|
||||
void GameStopFlight(uint8_t AircraftIdx)
|
||||
{
|
||||
FL_STATE* ptrState = &FlightData.State[AircraftIdx];
|
||||
|
||||
if (*ptrState == STATE_TAXIING)
|
||||
{
|
||||
// Only allow auto stop under taxi
|
||||
*ptrState = STATE_AUTO_STOPPED;
|
||||
}
|
||||
}
|
||||
|
||||
/* *******************************************************************************************
|
||||
*
|
||||
* @name: void GameAircraftCollision(uint8_t AircraftIdx)
|
||||
*
|
||||
* @author: Xavier Del Campo
|
||||
*
|
||||
* @param:
|
||||
*
|
||||
* uint8_t AircraftIdx:
|
||||
* Index from FlightData.
|
||||
*
|
||||
* @brief:
|
||||
* Event triggered by Aircraft when aircraft A is no longer getting close to aircraft B, so
|
||||
* that taxiing can be resumed.
|
||||
*
|
||||
* *******************************************************************************************/
|
||||
|
||||
void GameResumeFlightFromAutoStop(uint8_t AircraftIdx)
|
||||
{
|
||||
FL_STATE* ptrState = &FlightData.State[AircraftIdx];
|
||||
|
||||
if (*ptrState == STATE_AUTO_STOPPED)
|
||||
{
|
||||
// Only recovery to STATE_TAXIING is allowed.
|
||||
*ptrState = STATE_TAXIING;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,4 +46,6 @@ bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos);
|
|||
void GameRemoveFlight(uint8_t idx, bool successful);
|
||||
void GameCalculateRemainingAircraft(void);
|
||||
void GameAircraftCollision(uint8_t AircraftIdx);
|
||||
void GameStopFlight(uint8_t AicraftIdx);
|
||||
void GameResumeFlightFromAutoStop(uint8_t AircraftIdx);
|
||||
#endif //__GAME_HEADER__
|
||||
|
|
|
@ -602,7 +602,7 @@ 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)
|
||||
if (ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] == STATE_USER_STOPPED)
|
||||
{
|
||||
GfxDrawButton(AIRCRAFT_STOP_X, AIRCRAFT_STOP_Y, PAD_L1);
|
||||
FontPrintText(&SmallFont, AIRCRAFT_STOP_TEXT_X, AIRCRAFT_STOP_TEXT_Y, "Resume taxiing");
|
||||
|
@ -863,7 +863,9 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight
|
|||
"Holding" );
|
||||
break;
|
||||
|
||||
case STATE_STOPPED:
|
||||
case STATE_USER_STOPPED:
|
||||
// Fall through
|
||||
case STATE_AUTO_STOPPED:
|
||||
FontPrintText( &SmallFont,
|
||||
AircraftDataDirection_X + AircraftDataState_X_Offset,
|
||||
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
|
|
|
@ -46,7 +46,8 @@ typedef enum t_flstate
|
|||
STATE_CLIMBING,
|
||||
STATE_APPROACH,
|
||||
STATE_FINAL,
|
||||
STATE_STOPPED,
|
||||
STATE_USER_STOPPED,
|
||||
STATE_AUTO_STOPPED,
|
||||
STATE_LANDED
|
||||
}FL_STATE;
|
||||
|
||||
|
@ -203,12 +204,12 @@ typedef struct
|
|||
|
||||
typedef enum t_fontflags
|
||||
{
|
||||
FONT_NOFLAGS = 0,
|
||||
FONT_CENTERED = 0x01,
|
||||
FONT_WRAP_LINE = 0x02,
|
||||
FONT_BLEND_EFFECT = 0x04,
|
||||
FONT_1HZ_FLASH = 0x08,
|
||||
FONT_2HZ_FLASH = 0x10
|
||||
FONT_NOFLAGS = 1 << 0,
|
||||
FONT_CENTERED = 1 << 1,
|
||||
FONT_WRAP_LINE = 1 << 2,
|
||||
FONT_BLEND_EFFECT = 1 << 3,
|
||||
FONT_1HZ_FLASH = 1 << 4,
|
||||
FONT_2HZ_FLASH = 1 << 5
|
||||
}FONT_FLAGS;
|
||||
|
||||
typedef struct t_Font
|
||||
|
@ -220,7 +221,7 @@ typedef struct t_Font
|
|||
char init_ch;
|
||||
uint8_t char_per_row;
|
||||
uint8_t max_ch_wrap;
|
||||
FONT_FLAGS flags;
|
||||
volatile FONT_FLAGS flags;
|
||||
short spr_w;
|
||||
short spr_h;
|
||||
short spr_u;
|
||||
|
|
16
Source/Gfx.c
16
Source/Gfx.c
|
@ -179,18 +179,10 @@ void GfxSetPrimitiveList(void)
|
|||
|
||||
void GfxDrawScene_Fast(void)
|
||||
{
|
||||
enum
|
||||
{
|
||||
FPS_INFO_X = 16,
|
||||
FPS_INFO_Y = 16
|
||||
};
|
||||
|
||||
SystemDevMenu();
|
||||
|
||||
FontSetFlags(&SmallFont, FONT_NOFLAGS);
|
||||
|
||||
FontPrintText(&SmallFont, FPS_INFO_X, FPS_INFO_Y, "%d/%d", SystemGetFPS(), REFRESH_FREQUENCY);
|
||||
|
||||
if (System1SecondTick() == true)
|
||||
{
|
||||
one_second_show = one_second_show? false:true;
|
||||
|
@ -213,10 +205,18 @@ bool GfxReadyForDMATransfer(void)
|
|||
|
||||
void GfxDrawScene(void)
|
||||
{
|
||||
enum
|
||||
{
|
||||
FPS_INFO_X = 16,
|
||||
FPS_INFO_Y = 16
|
||||
};
|
||||
|
||||
while ( (SystemRefreshNeeded() == false)
|
||||
||
|
||||
(GfxIsGPUBusy() == true) );
|
||||
|
||||
FontPrintText(&SmallFont, FPS_INFO_X, FPS_INFO_Y, "%d/%d", SystemGetFPS(), REFRESH_FREQUENCY);
|
||||
|
||||
GfxDrawScene_Fast();
|
||||
|
||||
SystemCyclicHandler();
|
||||
|
|
|
@ -426,8 +426,6 @@ void ISR_LoadMenuVBlank(void)
|
|||
LOADING_BAR_Y + LOADING_BAR_HEIGHT + 8,
|
||||
strCurrentFile );
|
||||
|
||||
//FontSetFlags(&SmallFont, FONT_NOFLAGS);
|
||||
|
||||
GfxDrawScene_Fast();
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ DEFINE += -DNO_INTRO
|
|||
|
||||
# Compiler flags
|
||||
LIBS= -lfixmath
|
||||
CC_FLAGS = -Wall -Werror -c -Os -Wfatal-errors -g
|
||||
CC_FLAGS = -Wall -Werror -c -Os -Wfatal-errors
|
||||
|
||||
# Path definitions
|
||||
PSXSDK_PATH = /usr/local/psxsdk
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#define END_STACK_PATTERN (uint32_t) 0x18022015
|
||||
#define BEGIN_STACK_ADDRESS (uint32_t*) 0x801FFF00
|
||||
#define STACK_SIZE 0x1000
|
||||
#define STACK_SIZE (4 << 10) // 4 KB
|
||||
#define I_MASK (*(volatile unsigned int*)0x1F801074)
|
||||
|
||||
/* *************************************
|
||||
|
|
|
@ -6,26 +6,28 @@
|
|||
#For example:
|
||||
14:55
|
||||
#Aircraft arrival (or departure) must be set relative to initial time, in HH:MM format.
|
||||
ARRIVAL;PHX1802;100;00:10;0;360
|
||||
ARRIVAL;PHX2015;100;00:10;0;360
|
||||
ARRIVAL;PHX2016;100;00:40;0;360
|
||||
ARRIVAL;PHX2017;100;00:50;0;360
|
||||
ARRIVAL;PHX2018;100;01:40;0;360
|
||||
ARRIVAL;PHX2019;100;01:20;0;360
|
||||
ARRIVAL;PHX2020;100;02:00;0;360
|
||||
ARRIVAL;PHX2021;100;00:05;0;360
|
||||
ARRIVAL;PHX2022;100;00:15;0;360
|
||||
ARRIVAL;PHX2023;100;00:45;0;360
|
||||
ARRIVAL;PHX2024;100;01:45;0;360
|
||||
ARRIVAL;PHX2025;100;01:20;0;360
|
||||
ARRIVAL;PHX2026;100;01:10;0;360
|
||||
DEPARTURE;PHX1000;100;00:05;19;180
|
||||
DEPARTURE;PHX1001;100;00:15;19;180
|
||||
DEPARTURE;PHX1002;100;00:30;19;180
|
||||
DEPARTURE;PHX1003;100;00:45;19;180
|
||||
DEPARTURE;PHX1004;100;01:10;19;180
|
||||
DEPARTURE;PHX1280;100;01:30;19;180
|
||||
DEPARTURE;PHX1332;100;00:50;21;180
|
||||
DEPARTURE;PHX1333;100;01:00;19;180
|
||||
DEPARTURE;PHX1334;100;01:15;21;180
|
||||
DEPARTURE;PHX1336;100;01:20;21;180
|
||||
#ARRIVAL;PHX1802;100;00:10;0;360
|
||||
#ARRIVAL;PHX2015;100;00:10;0;360
|
||||
#ARRIVAL;PHX2016;100;00:40;0;360
|
||||
#ARRIVAL;PHX2017;100;00:50;0;360
|
||||
#ARRIVAL;PHX2018;100;01:40;0;360
|
||||
#ARRIVAL;PHX2019;100;01:20;0;360
|
||||
#ARRIVAL;PHX2020;100;02:00;0;360
|
||||
#ARRIVAL;PHX2021;100;00:05;0;360
|
||||
#ARRIVAL;PHX2022;100;00:15;0;360
|
||||
#ARRIVAL;PHX2023;100;00:45;0;360
|
||||
#ARRIVAL;PHX2024;100;01:45;0;360
|
||||
#ARRIVAL;PHX2025;100;01:20;0;360
|
||||
#ARRIVAL;PHX2026;100;01:10;0;360
|
||||
#DEPARTURE;PHX1000;100;00:05;19;180
|
||||
#DEPARTURE;PHX1001;100;00:15;19;180
|
||||
#DEPARTURE;PHX1002;100;00:30;19;180
|
||||
#DEPARTURE;PHX1003;100;00:45;19;180
|
||||
#DEPARTURE;PHX1004;100;01:10;19;180
|
||||
#DEPARTURE;PHX1280;100;01:30;19;180
|
||||
#DEPARTURE;PHX1332;100;00:50;21;180
|
||||
#DEPARTURE;PHX1333;100;01:00;19;180
|
||||
#DEPARTURE;PHX1334;100;01:15;21;180
|
||||
#DEPARTURE;PHX1336;100;01:20;21;180
|
||||
ARRIVAL;PHX2026;120;00:05;0;360
|
||||
ARRIVAL;PHX2026;80;00:10;0;360
|
||||
|
|
Loading…
Reference in New Issue