* Reduced tileset sprite size from 64x64 to 64x48.

* Modified rendering functions to keep up with this size reduction.
* Sprites in TIM have been reordered inside VRAM.
* Other minor changes.
This commit is contained in:
XaviDCR92 2017-06-27 00:58:12 +02:00
parent d1f55e8b45
commit f9f9924566
31 changed files with 370 additions and 52327 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

View File

@ -10,6 +10,7 @@
#define AIRCRAFT_SIZE 16 #define AIRCRAFT_SIZE 16
#define AIRCRAFT_SIZE_FIX16 fix16_from_int(AIRCRAFT_SIZE) #define AIRCRAFT_SIZE_FIX16 fix16_from_int(AIRCRAFT_SIZE)
#define AIRCRAFT_INVALID_IDX 0xFF
/* ************************************* /* *************************************
* Structs and enums * Structs and enums
@ -17,9 +18,10 @@
enum enum
{ {
AIRCRAFT_SPRITE_SIZE = 24, AIRCRAFT_SPRITE_W = 24,
AIRCRAFT_SPRITE_H = 16,
AIRCRAFT_SPRITE_VRAM_X = 800, AIRCRAFT_SPRITE_VRAM_X = 800,
AIRCRAFT_SPRITE_VRAM_Y = 304, AIRCRAFT_SPRITE_VRAM_Y = 256,
}; };
enum enum
@ -49,6 +51,7 @@ static TYPE_ISOMETRIC_POS AircraftCenterIsoPos;
static TYPE_CARTESIAN_POS AircraftCenterPos; static TYPE_CARTESIAN_POS AircraftCenterPos;
static char* AircraftLiveryNamesTable[] = {"PHX", NULL}; static char* AircraftLiveryNamesTable[] = {"PHX", NULL};
static AIRCRAFT_LIVERY AircraftLiveryTable[] = {AIRCRAFT_LIVERY_0, AIRCRAFT_LIVERY_UNKNOWN}; static AIRCRAFT_LIVERY AircraftLiveryTable[] = {AIRCRAFT_LIVERY_0, AIRCRAFT_LIVERY_UNKNOWN};
static uint8_t AircraftFlightDataIdx_HashTable[GAME_MAX_AIRCRAFT];
static const fix16_t AircraftSpeedsTable[] = { [AIRCRAFT_SPEED_IDLE] = 0, static const fix16_t AircraftSpeedsTable[] = { [AIRCRAFT_SPEED_IDLE] = 0,
[AIRCRAFT_SPEED_GROUND] = 0x6666, [AIRCRAFT_SPEED_GROUND] = 0x6666,
[AIRCRAFT_SPEED_TAKEOFF] = 0x20000, [AIRCRAFT_SPEED_TAKEOFF] = 0x20000,
@ -79,8 +82,8 @@ void AircraftInit(void)
AircraftSpr.cx = PHX_LIVERY_CLUT_X; AircraftSpr.cx = PHX_LIVERY_CLUT_X;
AircraftSpr.cy = PHX_LIVERY_CLUT_Y; AircraftSpr.cy = PHX_LIVERY_CLUT_Y;
AircraftSpr.w = AIRCRAFT_SPRITE_SIZE; AircraftSpr.w = AIRCRAFT_SPRITE_W;
AircraftSpr.h = AIRCRAFT_SPRITE_SIZE; AircraftSpr.h = AIRCRAFT_SPRITE_H;
/*AircraftSpr.tpage = 28; /*AircraftSpr.tpage = 28;
AircraftSpr.u = 64; AircraftSpr.u = 64;
@ -93,6 +96,10 @@ void AircraftInit(void)
AircraftCenterIsoPos.z = 0; AircraftCenterIsoPos.z = 0;
AircraftCenterPos = GfxIsometricToCartesian(&AircraftCenterIsoPos); AircraftCenterPos = GfxIsometricToCartesian(&AircraftCenterIsoPos);
memset( AircraftFlightDataIdx_HashTable,
AIRCRAFT_INVALID_IDX,
sizeof(AircraftFlightDataIdx_HashTable) / sizeof(AircraftFlightDataIdx_HashTable[0]) );
} }
bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData, bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData,
@ -139,6 +146,7 @@ bool AircraftAddNew( TYPE_FLIGHT_DATA* ptrFlightData,
} }
ptrAircraft->State = ptrFlightData->State[FlightDataIndex]; ptrAircraft->State = ptrFlightData->State[FlightDataIndex];
AircraftFlightDataIdx_HashTable[FlightDataIndex] = AircraftIndex;
ptrAircraft->Direction = AIRCRAFT_DIR_NORTH; // Default to north direction ptrAircraft->Direction = AIRCRAFT_DIR_NORTH; // Default to north direction
@ -499,7 +507,7 @@ void AircraftUpdateSpriteFromData(TYPE_AIRCRAFT_DATA* ptrAircraft)
switch(ptrAircraft->Direction) switch(ptrAircraft->Direction)
{ {
case AIRCRAFT_DIR_NORTH: case AIRCRAFT_DIR_NORTH:
AircraftSpr.v += AircraftSpr.w; AircraftSpr.v += AircraftSpr.h;
AircraftSpr.attribute |= H_FLIP; AircraftSpr.attribute |= H_FLIP;
break; break;
@ -514,7 +522,7 @@ void AircraftUpdateSpriteFromData(TYPE_AIRCRAFT_DATA* ptrAircraft)
break; break;
case AIRCRAFT_DIR_WEST: case AIRCRAFT_DIR_WEST:
AircraftSpr.v += AircraftSpr.w; AircraftSpr.v += AircraftSpr.h;
AircraftSpr.attribute &= ~(H_FLIP); AircraftSpr.attribute &= ~(H_FLIP);
break; break;
@ -572,7 +580,16 @@ uint16_t AircraftGetTileFromFlightDataIndex(uint8_t index)
TYPE_AIRCRAFT_DATA* AircraftFromFlightDataIndex(uint8_t index) TYPE_AIRCRAFT_DATA* AircraftFromFlightDataIndex(uint8_t index)
{ {
uint8_t i; uint8_t idx = AircraftFlightDataIdx_HashTable[index];
if(idx == AIRCRAFT_INVALID_IDX)
{
return NULL;
}
return &AircraftData[idx];
/*uint8_t i;
TYPE_AIRCRAFT_DATA* ptrAircraft; TYPE_AIRCRAFT_DATA* ptrAircraft;
for(i = 0; i < GAME_MAX_AIRCRAFT; i++) for(i = 0; i < GAME_MAX_AIRCRAFT; i++)
@ -585,7 +602,7 @@ TYPE_AIRCRAFT_DATA* AircraftFromFlightDataIndex(uint8_t index)
} }
} }
return NULL; return NULL;*/
} }
void AircraftFromFlightDataIndexAddTargets(uint8_t index, uint16_t* targets) void AircraftFromFlightDataIndexAddTargets(uint8_t index, uint16_t* targets)

View File

@ -39,10 +39,6 @@ void CameraApplyCoordinatesToSprite(TYPE_PLAYER* ptrPlayer, GsSprite * spr)
void CameraApplyCoordinatesToRectangle(TYPE_PLAYER* ptrPlayer, GsRectangle * rect) void CameraApplyCoordinatesToRectangle(TYPE_PLAYER* ptrPlayer, GsRectangle * rect)
{ {
dprintf("Rectangle {%d, %d}\n",
rect->x,
rect->y );
rect->x += (short)ptrPlayer->Camera.X_Offset; rect->x += (short)ptrPlayer->Camera.X_Offset;
rect->y += (short)ptrPlayer->Camera.Y_Offset; rect->y += (short)ptrPlayer->Camera.Y_Offset;
} }

File diff suppressed because it is too large Load Diff

View File

@ -39,49 +39,6 @@ typedef struct t_rwyentrydata
uint16_t rwyHeader; uint16_t rwyHeader;
}TYPE_RWY_ENTRY_DATA; }TYPE_RWY_ENTRY_DATA;
enum
{
TILE_GRASS = 0,
TILE_ASPHALT_WITH_BORDERS,
TILE_WATER,
TILE_ASPHALT,
TILE_HANGAR,
TILE_ILS,
TILE_ATC_TOWER,
TILE_ATC_LOC,
TILE_RWY_MID,
TILE_RWY_START_1,
TILE_RWY_START_2,
TILE_PARKING,
TILE_PARKING_2,
TILE_TAXIWAY_INTERSECT_GRASS,
TILE_TAXIWAY_GRASS,
TILE_TAXIWAY_CORNER_GRASS,
LAST_TILE_TILESET1 = TILE_TAXIWAY_CORNER_GRASS
};
enum
{
TILE_HALF_WATER_1 = LAST_TILE_TILESET1 + 1,
TILE_HALF_WATER_2,
TILE_RESERVED_2,
TILE_RESERVED_3,
TILE_AIRPORT_BUILDING,
TILE_PLANE,
TILE_RWY_HOLDING_POINT,
TILE_RWY_HOLDING_POINT_2,
TILE_RWY_EXIT,
TILE_GATE,
TILE_RESERVED_6,
TILE_RESERVED_7,
TILE_TAXIWAY_CORNER_GRASS_2,
LAST_TILE_TILESET2 = TILE_TAXIWAY_CORNER_GRASS_2,
TILE_NOTHING = 0xFF
};
enum enum
{ {
MOUSE_W = 8, MOUSE_W = 8,
@ -110,6 +67,52 @@ enum
UNBOARDING_PASSENGERS_PER_SEQUENCE = 100 UNBOARDING_PASSENGERS_PER_SEQUENCE = 100
}; };
enum
{
BUILDING_HANGAR = 0,
BUILDING_ILS,
BUILDING_ATC_TOWER,
BUILDING_ATC_LOC,
BUILDING_TERMINAL,
BUILDING_TERMINAL_2,
BUILDING_GATE,
LAST_BUILDING = BUILDING_GATE
};
enum
{
TILE_GRASS = 0,
TILE_ASPHALT_WITH_BORDERS,
TILE_WATER,
TILE_ASPHALT,
TILE_RWY_MID,
TILE_RWY_START_1,
TILE_RWY_START_2,
TILE_PARKING,
TILE_PARKING_2,
TILE_TAXIWAY_INTERSECT_GRASS,
TILE_TAXIWAY_GRASS,
TILE_TAXIWAY_CORNER_GRASS,
TILE_HALF_WATER_1,
TILE_HALF_WATER_2,
TILE_RWY_HOLDING_POINT,
TILE_RWY_HOLDING_POINT_2,
TILE_RWY_EXIT,
TILE_TAXIWAY_CORNER_GRASS_2,
LAST_TILE_TILESET1 = TILE_TAXIWAY_CORNER_GRASS_2
};
enum
{
LAST_TILE_TILESET2 = LAST_TILE_TILESET1
};
/* ************************************* /* *************************************
* Local Prototypes * Local Prototypes
* *************************************/ * *************************************/
@ -183,21 +186,19 @@ static uint8_t GameAircraftCollisionIdx;
TYPE_PLAYER PlayerData[MAX_PLAYERS]; TYPE_PLAYER PlayerData[MAX_PLAYERS];
static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\TILESET1.TIM;1" , static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\TILESET1.TIM;1" ,
"cdrom:\\DATA\\SPRITES\\TILESET2.TIM;1" , "cdrom:\\DATA\\LEVELS\\LEVEL1.PLT;1" ,
"cdrom:\\DATA\\LEVELS\\LEVEL1.PLT;1" , "cdrom:\\DATA\\SPRITES\\GAMEPLN.TIM;1" ,
"cdrom:\\DATA\\SPRITES\\GAMEPLN.TIM;1" , "cdrom:\\DATA\\SPRITES\\PLNBLUE.CLT;1" ,
"cdrom:\\DATA\\SPRITES\\PLNBLUE.CLT;1" , "cdrom:\\DATA\\SPRITES\\MOUSE.TIM;1" };
"cdrom:\\DATA\\SPRITES\\MOUSE.TIM;1" };
static void * GameFileDest[] = { (GsSprite*)&GameTilesetSpr , static void * GameFileDest[] = {(GsSprite*)&GameTilesetSpr ,
(GsSprite*)&GameTileset2Spr , (TYPE_FLIGHT_DATA*)&FlightData ,
(TYPE_FLIGHT_DATA*)&FlightData , (GsSprite*)&GamePlaneSpr ,
(GsSprite*)&GamePlaneSpr , NULL ,
NULL , (GsSprite*)&GameMouseSpr };
(GsSprite*)&GameMouseSpr };
static char* GameLevelList[] = { "cdrom:\\DATA\\LEVELS\\LEVEL1.LVL;1"}; static char* GameLevelList[] = { "cdrom:\\DATA\\LEVELS\\LEVEL1.LVL;1"};
static uint8_t GameLevelBuffer[GAME_MAX_MAP_SIZE]; static uint16_t GameLevelBuffer[GAME_MAX_MAP_SIZE];
static uint8_t GameLevelColumns; static uint8_t GameLevelColumns;
static uint8_t GameLevelSize; static uint8_t GameLevelSize;
@ -392,7 +393,7 @@ void GameInit(void)
GameSpawnMinTime = SystemCreateTimer(GAME_MINIMUM_PARKING_SPAWN_TIME, false, &GameMinimumSpawnTimeout); GameSpawnMinTime = SystemCreateTimer(GAME_MINIMUM_PARKING_SPAWN_TIME, false, &GameMinimumSpawnTimeout);
spawnMinTimeFlag = true; spawnMinTimeFlag = false;
GameScore = 0; GameScore = 0;
@ -404,7 +405,7 @@ void GameInit(void)
LoadMenuEnd(); LoadMenuEnd();
GfxSetGlobalLuminance(0); //GfxSetGlobalLuminance(0);
track = SystemRand(GAMEPLAY_FIRST_TRACK, GAMEPLAY_LAST_TRACK); track = SystemRand(GAMEPLAY_FIRST_TRACK, GAMEPLAY_LAST_TRACK);
@ -543,7 +544,7 @@ void GameFirstLastAircraftIndex(void)
bool first_set = false; bool first_set = false;
uint8_t i; uint8_t i;
for(i = 0; i < GAME_MAX_AIRCRAFT ; i++) for(i = 0; i < FlightData.nAircraft ; i++)
{ {
if(FlightData.State[i] != STATE_IDLE) if(FlightData.State[i] != STATE_IDLE)
{ {
@ -552,6 +553,7 @@ void GameFirstLastAircraftIndex(void)
firstActiveAircraft = i; firstActiveAircraft = i;
first_set = true; first_set = true;
} }
lastActiveAircraft = i; lastActiveAircraft = i;
} }
} }
@ -772,8 +774,7 @@ void GameLoadLevel(void)
i = LEVEL_HEADER_SIZE; i = LEVEL_HEADER_SIZE;
memcpy(GameLevelBuffer,&ptrBuffer[i],GameLevelSize); memcpy(GameLevelBuffer, &ptrBuffer[i], GameLevelSize * sizeof(uint16_t)); // 2 bytes per tile
} }
char* GetGameLevelTitle(void) char* GetGameLevelTitle(void)
@ -801,8 +802,8 @@ void GameAircraftState(void)
(FlightData.State[i] == STATE_IDLE) (FlightData.State[i] == STATE_IDLE)
&& &&
(FlightData.RemainingTime[i] > 0) (FlightData.RemainingTime[i] > 0)
/* && &&
(spawnMinTimeFlag == true) */) (spawnMinTimeFlag == false) )
{ {
if( (FlightData.FlightDirection[i] == DEPARTURE) if( (FlightData.FlightDirection[i] == DEPARTURE)
&& &&
@ -811,7 +812,7 @@ void GameAircraftState(void)
uint8_t j; uint8_t j;
bool bParkingBusy = false; bool bParkingBusy = false;
for(j = 0; j < GAME_MAX_AIRCRAFT; j++) for(j = 0; j < FlightData.nAircraft; j++)
{ {
if(AircraftFromFlightDataIndex(j)->State != STATE_IDLE) if(AircraftFromFlightDataIndex(j)->State != STATE_IDLE)
{ {
@ -837,7 +838,6 @@ void GameAircraftState(void)
GameAircraftCreatedFlag = true; GameAircraftCreatedFlag = true;
// Create notification request for incoming aircraft // Create notification request for incoming aircraft
dprintf("1!!!!\n");
GameGuiBubbleShow(); GameGuiBubbleShow();
target[0] = FlightData.Parking[i]; target[0] = FlightData.Parking[i];
@ -859,8 +859,6 @@ void GameAircraftState(void)
FlightData.State[i] = STATE_APPROACH; FlightData.State[i] = STATE_APPROACH;
GameAircraftCreatedFlag = true; GameAircraftCreatedFlag = true;
dprintf("2!!!!\n");
// Create notification request for incoming aircraft // Create notification request for incoming aircraft
GameGuiBubbleShow(); GameGuiBubbleShow();
} }
@ -892,6 +890,7 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
static bool rwy_sine_decrease = false; static bool rwy_sine_decrease = false;
TYPE_ISOMETRIC_POS tileIsoPos; TYPE_ISOMETRIC_POS tileIsoPos;
TYPE_CARTESIAN_POS tileCartPos; TYPE_CARTESIAN_POS tileCartPos;
GsRectangle rct = {0};
// Prepare runway to be painted in blue if player is on runway selection mode // Prepare runway to be painted in blue if player is on runway selection mode
if(ptrPlayer->SelectRunway == true) if(ptrPlayer->SelectRunway == true)
@ -909,6 +908,8 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
if(firstLevelRender == true) if(firstLevelRender == true)
{ {
// Avoid re-entrance.
firstLevelRender = false; firstLevelRender = false;
if(rwy_sine_decrease == false) if(rwy_sine_decrease == false)
@ -937,32 +938,41 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
for(i = 0 ; i < GameLevelSize; i++) for(i = 0 ; i < GameLevelSize; i++)
{ {
// GameLevelBuffer bits explanation:
// X X X X X X X X
// | | | | | | | |
// | | | | | | | V
// | | | | | | V Tile, bit 0
// | | | | | V Tile, bit 1
// | | | | V Tile, bit 2
// | | | V Tile, bit 3
// | | V Tile, bit 4
// | V Tile, bit 5
// V Tile, bit 6
// Tile mirror flag
uint8_t CurrentTile = (uint8_t)(GameLevelBuffer[i] & 0x00FF);
// Flipped tiles have bit 7 enabled // Flipped tiles have bit 7 enabled
if(GameLevelBuffer[i] & TILE_MIRROR_FLAG) if(CurrentTile & TILE_MIRROR_FLAG)
{ {
flip_id = true; flip_id = true;
aux_id = GameLevelBuffer[i]; aux_id = CurrentTile;
GameLevelBuffer[i] &= ~(TILE_MIRROR_FLAG); CurrentTile &= ~(TILE_MIRROR_FLAG);
} }
else else
{ {
flip_id = false; flip_id = false;
} }
if(GameLevelBuffer[i] == TILE_NOTHING) if(CurrentTile <= LAST_TILE_TILESET1)
{
// Skip empty tiles
continue;
}
if(GameLevelBuffer[i] <= LAST_TILE_TILESET1)
{ {
// Draw using GameTilesetSpr // Draw using GameTilesetSpr
ptrTileset = &GameTilesetSpr; ptrTileset = &GameTilesetSpr;
} }
else if( (GameLevelBuffer[i] > LAST_TILE_TILESET1) else if( (CurrentTile > LAST_TILE_TILESET1)
&& &&
(GameLevelBuffer[i] <= LAST_TILE_TILESET2) ) (CurrentTile <= LAST_TILE_TILESET2) )
{ {
// Draw using GameTileset2Spr // Draw using GameTileset2Spr
ptrTileset = &GameTileset2Spr; ptrTileset = &GameTileset2Spr;
@ -970,15 +980,17 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
else else
{ {
ptrTileset = NULL; ptrTileset = NULL;
continue;
if(flip_id == false) // if(flip_id == false)
{ // {
continue; // continue;
} // }
} }
ptrTileset->w = TILE_SIZE; ptrTileset->w = TILE_SIZE;
ptrTileset->h = TILE_SIZE; ptrTileset->h = TILE_SIZE_H;
used_rwy = false; used_rwy = false;
@ -1044,14 +1056,14 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
} }
else if( (ptrPlayer->SelectTaxiwayRunway == true) else if( (ptrPlayer->SelectTaxiwayRunway == true)
&& &&
( (GameLevelBuffer[i] == TILE_RWY_HOLDING_POINT) ( (CurrentTile == TILE_RWY_HOLDING_POINT)
|| ||
(GameLevelBuffer[i] == TILE_RWY_HOLDING_POINT_2) ) ) (CurrentTile == TILE_RWY_HOLDING_POINT_2) ) )
{ {
uint16_t aircraftTile; uint16_t aircraftTile;
bool bHoldingRwyBusy = false; bool bHoldingRwyBusy = false;
for(j = 0; j < GAME_MAX_AIRCRAFT; j++) for(j = 0; j < FlightData.nAircraft; j++)
{ {
uint16_t* targets = AircraftGetTargets(j); uint16_t* targets = AircraftGetTargets(j);
aircraftTile = AircraftGetTileFromFlightDataIndex(j); aircraftTile = AircraftGetTileFromFlightDataIndex(j);
@ -1092,14 +1104,14 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
} }
else if( (ptrPlayer->SelectTaxiwayParking == true) else if( (ptrPlayer->SelectTaxiwayParking == true)
&& &&
( (GameLevelBuffer[i] == TILE_PARKING) ( (CurrentTile == TILE_PARKING)
|| ||
(GameLevelBuffer[i] == TILE_PARKING_2) ) ) (CurrentTile == TILE_PARKING_2) ) )
{ {
uint16_t aircraftTile; uint16_t aircraftTile;
bool bParkingBusy = false; bool bParkingBusy = false;
for(j = 0; j < GAME_MAX_AIRCRAFT; j++) for(j = 0; j < FlightData.nAircraft; j++)
{ {
aircraftTile = AircraftGetTileFromFlightDataIndex(j); aircraftTile = AircraftGetTileFromFlightDataIndex(j);
@ -1136,9 +1148,16 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
// Set coordinate origin to left upper corner // Set coordinate origin to left upper corner
ptrTileset->x -= TILE_SIZE >> 1; ptrTileset->x -= TILE_SIZE >> 1;
ptrTileset->y -= TILE_SIZE >> 2; //ptrTileset->y -= TILE_SIZE_H >> 2;
rct.x = tileCartPos.x;
rct.y = tileCartPos.y;
rct.r = NORMAL_LUMINANCE;
rct.g = 0;
rct.b = 0;
rct.w = rct.h = 2;
if(columns < GameLevelColumns -1 ) if(columns < (GameLevelColumns - 1) )
{ {
columns++; columns++;
} }
@ -1156,22 +1175,25 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer)
} }
} }
ptrTileset->u = (short)(GameLevelBuffer[i] % COLUMNS_PER_TILESET)<<TILE_SIZE_BIT_SHIFT; ptrTileset->u = (short)(CurrentTile % COLUMNS_PER_TILESET) << TILE_SIZE_BIT_SHIFT;
ptrTileset->v = (short)(GameLevelBuffer[i] / COLUMNS_PER_TILESET)<<TILE_SIZE_BIT_SHIFT; ptrTileset->v = (short)(CurrentTile / COLUMNS_PER_TILESET) * TILE_SIZE_H;
ptrTileset->mx = ptrTileset->u + (TILE_SIZE >> 1); ptrTileset->mx = ptrTileset->u + (TILE_SIZE >> 1);
ptrTileset->my = ptrTileset->v + (TILE_SIZE >> 1); ptrTileset->my = ptrTileset->v + (TILE_SIZE_H >> 1);
if(flip_id == true) if(flip_id == true)
{ {
flip_id = false; flip_id = false;
GameLevelBuffer[i] = aux_id; CurrentTile = aux_id;
} }
// dprintf("Tile %d, attribute 0x%X\n",i,ptrTileset->attribute); // dprintf("Tile %d, attribute 0x%X\n",i,ptrTileset->attribute);
CameraApplyCoordinatesToSprite(ptrPlayer, ptrTileset); CameraApplyCoordinatesToSprite(ptrPlayer, ptrTileset);
GfxSortSprite(ptrTileset); GfxSortSprite(ptrTileset);
CameraApplyCoordinatesToRectangle(ptrPlayer, &rct);
GsSortRectangle(&rct);
if(ptrTileset->attribute & H_FLIP) if(ptrTileset->attribute & H_FLIP)
{ {
@ -1518,7 +1540,7 @@ void GameGetRunwayArray(void)
{ {
if(GameLevelBuffer[i] == TILE_RWY_START_1) if(GameLevelBuffer[i] == TILE_RWY_START_1)
{ {
if(SystemContains_u8(i, GameLevelBuffer, GAME_MAX_RUNWAYS) == false) if(SystemContains_u16(i, GameLevelBuffer, GAME_MAX_RUNWAYS) == false)
{ {
GameRwy[j++] = i; GameRwy[j++] = i;
} }
@ -1812,7 +1834,7 @@ short GameGetXFromTile_short(uint16_t tile)
tile %= GameLevelColumns; tile %= GameLevelColumns;
retVal = (fix16_t)(tile << TILE_SIZE_BIT_SHIFT); retVal = (tile << TILE_SIZE_BIT_SHIFT);
// Always point to tile center // Always point to tile center
retVal += TILE_SIZE >> 1; retVal += TILE_SIZE >> 1;
@ -1826,9 +1848,11 @@ short GameGetYFromTile_short(uint16_t tile)
tile /= GameLevelColumns; tile /= GameLevelColumns;
retVal = (fix16_t)(tile << TILE_SIZE_BIT_SHIFT); //retVal = (fix16_t)(tile << TILE_SIZE_BIT_SHIFT);
retVal = (tile << TILE_SIZE_BIT_SHIFT);
// Always point to tile center // Always point to tile center
//retVal += TILE_SIZE >> 1;
retVal += TILE_SIZE >> 1; retVal += TILE_SIZE >> 1;
return retVal; return retVal;
@ -1950,7 +1974,7 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
// If one of these tiles do not belong to desired tiles (i.e.: grass, // If one of these tiles do not belong to desired tiles (i.e.: grass,
// water, buildings...), then false is returned. // water, buildings...), then false is returned.
uint8_t AcceptedTiles[] = { TILE_ASPHALT, TILE_ASPHALT_WITH_BORDERS, uint8_t AcceptedTiles[] = { TILE_ASPHALT_WITH_BORDERS,
TILE_PARKING, TILE_RWY_MID, TILE_PARKING, TILE_RWY_MID,
TILE_RWY_EXIT, TILE_TAXIWAY_CORNER_GRASS, TILE_RWY_EXIT, TILE_TAXIWAY_CORNER_GRASS,
TILE_TAXIWAY_CORNER_GRASS_2, TILE_TAXIWAY_GRASS, TILE_TAXIWAY_CORNER_GRASS_2, TILE_TAXIWAY_GRASS,
@ -2019,7 +2043,7 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false) if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false)
{ {
for(i = 0; i < GAME_MAX_AIRCRAFT; i++) for(i = 0; i < FlightData.nAircraft; i++)
{ {
if( (ptrFlightData->State[i] != STATE_IDLE) if( (ptrFlightData->State[i] != STATE_IDLE)
&& &&
@ -2054,7 +2078,7 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false) if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false)
{ {
for(i = 0; i < GAME_MAX_AIRCRAFT; i++) for(i = 0; i < FlightData.nAircraft; i++)
{ {
if( (ptrFlightData->State[i] != STATE_IDLE) if( (ptrFlightData->State[i] != STATE_IDLE)
&& &&
@ -2092,7 +2116,7 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false) if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false)
{ {
for(i = 0; i < GAME_MAX_AIRCRAFT; i++) for(i = 0; i < FlightData.nAircraft; i++)
{ {
if( (ptrFlightData->State[i] != STATE_IDLE) if( (ptrFlightData->State[i] != STATE_IDLE)
&& &&
@ -2128,7 +2152,7 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData)
if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false) if(SystemContains_u16(temp_tile, ptrPlayer->Waypoints, PLAYER_MAX_WAYPOINTS) == false)
{ {
for(i = 0; i < GAME_MAX_AIRCRAFT; i++) for(i = 0; i < FlightData.nAircraft; i++)
{ {
if( (ptrFlightData->State[i] != STATE_IDLE) if( (ptrFlightData->State[i] != STATE_IDLE)
&& &&
@ -2228,7 +2252,7 @@ void GameDrawMouse(TYPE_PLAYER* ptrPlayer)
FL_STATE GameGetFlightDataStateFromIdx(uint8_t FlightDataIdx) FL_STATE GameGetFlightDataStateFromIdx(uint8_t FlightDataIdx)
{ {
if(FlightDataIdx >= GAME_MAX_AIRCRAFT) if(FlightDataIdx >= FlightData.nAircraft)
{ {
return STATE_IDLE; // Error: could cause buffer overrun return STATE_IDLE; // Error: could cause buffer overrun
} }
@ -2549,7 +2573,7 @@ void GameRemoveFlight(uint8_t idx, bool successful)
FlightData.State[ptrPlayer->ActiveAircraftList[j]] = STATE_IDLE; FlightData.State[ptrPlayer->ActiveAircraftList[j]] = STATE_IDLE;
FlightData.Finished[ptrPlayer->ActiveAircraftList[j]] = true; FlightData.Finished[ptrPlayer->ActiveAircraftList[j]] = true;
spawnMinTimeFlag = false; spawnMinTimeFlag = true;
SystemTimerRestart(GameSpawnMinTime); SystemTimerRestart(GameSpawnMinTime);
return; return;
@ -2644,7 +2668,7 @@ bool GameFinished(void)
void GameMinimumSpawnTimeout(void) void GameMinimumSpawnTimeout(void)
{ {
spawnMinTimeFlag = true; spawnMinTimeFlag = false;
} }
void GameAircraftCollision(uint8_t AircraftIdx) void GameAircraftCollision(uint8_t AircraftIdx)

View File

@ -22,6 +22,7 @@
#define MAX_PLAYERS (PLAYER_TWO + 1) #define MAX_PLAYERS (PLAYER_TWO + 1)
#define TILE_SIZE 64 #define TILE_SIZE 64
#define TILE_SIZE_H 48
#define TILE_SIZE_BIT_SHIFT 6 #define TILE_SIZE_BIT_SHIFT 6
/* ************************************* /* *************************************

View File

@ -95,8 +95,8 @@ enum
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B2, AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B2,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP = 8, AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP = 8,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0 = AIRCRAFT_DATA_GSGPOLY4_X0 + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP, AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0 = AIRCRAFT_DATA_GSGPOLY4_X0 + 24,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1 = AIRCRAFT_DATA_GSGPOLY4_X1 - AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP, AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1 = AIRCRAFT_DATA_GSGPOLY4_X1 - 24,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X2 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0, AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X2 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1, AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1,
@ -137,34 +137,38 @@ enum
AIRCRAFT_DATA_PASSENGERS_X_2PLAYER = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X_2PLAYER + 64, AIRCRAFT_DATA_PASSENGERS_X_2PLAYER = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X_2PLAYER + 64,
AIRCRAFT_DATA_PASSENGERS_Y_2PLAYER = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y_2PLAYER, AIRCRAFT_DATA_PASSENGERS_Y_2PLAYER = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y_2PLAYER,
AIRCRAFT_DATA_REMAINING_TIME_X = AIRCRAFT_DATA_DIRECTION_X, AIRCRAFT_DATA_REMAINING_TIME_X = AIRCRAFT_DATA_DIRECTION_X + 24,
AIRCRAFT_DATA_REMAINING_TIME_Y = AIRCRAFT_DATA_DIRECTION_Y + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP, AIRCRAFT_DATA_REMAINING_TIME_Y = AIRCRAFT_DATA_DIRECTION_Y + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
AIRCRAFT_DATA_REMAINING_TIME_X_2PLAYER = AIRCRAFT_DATA_DIRECTION_X_2PLAYER, AIRCRAFT_DATA_REMAINING_TIME_X_2PLAYER = AIRCRAFT_DATA_DIRECTION_X_2PLAYER + 24,
AIRCRAFT_DATA_REMAINING_TIME_Y_2PLAYER = AIRCRAFT_DATA_DIRECTION_Y_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP AIRCRAFT_DATA_REMAINING_TIME_Y_2PLAYER = AIRCRAFT_DATA_DIRECTION_Y_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
}; };
enum enum
{ {
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X = 96, AIRCRAFT_DEPARTURE_ARRIVAL_ICON_SIZE = 16,
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y = 112, AIRCRAFT_ARRIVAL_ICON_U = 0,
AIRCRAFT_DEPARTURE_ICON_U = 16
};
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X_2PLAYER = 48, enum
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y_2PLAYER = 112, {
AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_X = 100,
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_U = 44, AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y = 112,
AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_V = 48,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X = 280,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X_2PLAYER = 128, AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_X_2PLAYER = 48,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y_2PLAYER = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y_2PLAYER, AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y_2PLAYER = 112,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_U = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_U + 8, AIRCRAFT_DATA_FLIGHT_PAGE_UP_X = 268,
AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_V = 48, AIRCRAFT_DATA_FLIGHT_PAGE_UP_Y = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y,
AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE = 8 AIRCRAFT_DATA_FLIGHT_PAGE_UP_X_2PLAYER = 128,
AIRCRAFT_DATA_FLIGHT_PAGE_UP_Y_2PLAYER = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y_2PLAYER,
AIRCRAFT_DATA_FLIGHT_PAGE_UP_U = 16,
AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_U = 0,
AIRCRAFT_DATA_FLIGHT_PAGEUPDN_SIZE = 16
}; };
enum enum
@ -190,21 +194,24 @@ static void GameGuiBubbleStopVibration(void);
static GsSprite BubbleSpr; static GsSprite BubbleSpr;
static GsGPoly4 AircraftDataGPoly4; static GsGPoly4 AircraftDataGPoly4;
static GsGPoly4 SelectedAircraftGPoly4; static GsGPoly4 SelectedAircraftGPoly4;
static GsSprite ArrowsSpr;
static GsGPoly4 PauseRect; static GsGPoly4 PauseRect;
static GsSprite SecondDisplay; static GsSprite SecondDisplay;
static GsSprite DepArrSpr;
static GsSprite PageUpDownSpr;
static TYPE_TIMER* ShowAircraftPassengersTimer; static TYPE_TIMER* ShowAircraftPassengersTimer;
static bool GameGuiClearPassengersLeft_Flag; static bool GameGuiClearPassengersLeft_Flag;
static bool GameGuiBubbleShowFlag; static bool GameGuiBubbleShowFlag;
static bool GameGuiBubbleVibrationFlag; static bool GameGuiBubbleVibrationFlag;
static char* GameFileList[] = {"cdrom:\\DATA\\SPRITES\\BUBBLE.TIM;1" , static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\BUBBLE.TIM;1" ,
"cdrom:\\DATA\\FONTS\\FONT_1.FNT;1" , "cdrom:\\DATA\\FONTS\\FONT_1.FNT;1" ,
"cdrom:\\DATA\\SPRITES\\ARROWS.TIM;1" }; "cdrom:\\DATA\\SPRITES\\DEPARR.TIM;1" ,
"cdrom:\\DATA\\SPRITES\\PAGEUPDN.TIM;1" };
static void * GameFileDest[] = {(GsSprite*)&BubbleSpr , static void * GameFileDest[] = {(GsSprite*)&BubbleSpr ,
(TYPE_FONT*)&RadioFont , (TYPE_FONT*)&RadioFont ,
(GsSprite*)&ArrowsSpr }; (GsSprite*)&DepArrSpr ,
(GsSprite*)&PageUpDownSpr };
static uint32_t slowScore; // It will update slowly to actual score value static uint32_t slowScore; // It will update slowly to actual score value
@ -265,10 +272,9 @@ void GameGuiInit(void)
PauseRect.attribute |= ENABLE_TRANS | TRANS_MODE(0); PauseRect.attribute |= ENABLE_TRANS | TRANS_MODE(0);
PageUpDownSpr.w = AIRCRAFT_DATA_FLIGHT_PAGEUPDN_SIZE;
ShowAircraftPassengersTimer = SystemCreateTimer(20, true, GameGuiClearPassengersLeft); ShowAircraftPassengersTimer = SystemCreateTimer(20, true, GameGuiClearPassengersLeft);
ArrowsSpr.w = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
ArrowsSpr.h = AIRCRAFT_DATA_FLIGHT_ARROWS_SIZE;
slowScore = 0; slowScore = 0;
@ -364,6 +370,7 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData
{ {
short y_offset; short y_offset;
uint8_t page_aircraft; uint8_t page_aircraft;
short orig_pageupdn_u;
enum enum
{ {
@ -502,47 +509,51 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData
SelectedAircraftGPoly4.y[3] += y_offset; SelectedAircraftGPoly4.y[3] += y_offset;
GsSortGPoly4(&SelectedAircraftGPoly4); GsSortGPoly4(&SelectedAircraftGPoly4);
PageUpDownSpr.attribute |= GFX_1HZ_FLASH;
if(ptrPlayer->ActiveAircraft > (GAME_GUI_AIRCRAFT_DATA_MAX_PAGE * (ptrPlayer->FlightDataPage + 1) ) ) if(ptrPlayer->ActiveAircraft > (GAME_GUI_AIRCRAFT_DATA_MAX_PAGE * (ptrPlayer->FlightDataPage + 1) ) )
{ {
orig_pageupdn_u = PageUpDownSpr.u;
PageUpDownSpr.u = orig_pageupdn_u + AIRCRAFT_DATA_FLIGHT_PAGE_UP_U;
if(GameTwoPlayersActive() == true) if(GameTwoPlayersActive() == true)
{ {
ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X_2PLAYER; PageUpDownSpr.x = AIRCRAFT_DATA_FLIGHT_PAGE_UP_X_2PLAYER;
ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y_2PLAYER; PageUpDownSpr.y = AIRCRAFT_DATA_FLIGHT_PAGE_UP_Y_2PLAYER;
} }
else else
{ {
ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_X; PageUpDownSpr.x = AIRCRAFT_DATA_FLIGHT_PAGE_UP_X;
ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_Y; PageUpDownSpr.y = AIRCRAFT_DATA_FLIGHT_PAGE_UP_Y;
} }
ArrowsSpr.u = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_U; GfxSortSprite(&PageUpDownSpr);
ArrowsSpr.v = AIRCRAFT_DATA_FLIGHT_RIGHT_ARROW_V;
ArrowsSpr.attribute |= GFX_1HZ_FLASH; PageUpDownSpr.u = orig_pageupdn_u;
GfxSortSprite(&ArrowsSpr);
} }
if(ptrPlayer->FlightDataPage != 0) if(ptrPlayer->FlightDataPage != 0)
{ {
orig_pageupdn_u = PageUpDownSpr.u;
PageUpDownSpr.u = orig_pageupdn_u + AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_U;
if(GameTwoPlayersActive() == true) if(GameTwoPlayersActive() == true)
{ {
ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X_2PLAYER; PageUpDownSpr.x = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_X_2PLAYER;
ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y_2PLAYER; PageUpDownSpr.y = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y_2PLAYER;
} }
else else
{ {
ArrowsSpr.x = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_X; PageUpDownSpr.x = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_X;
ArrowsSpr.y = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_Y; PageUpDownSpr.y = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y;
} }
GfxSortSprite(&PageUpDownSpr);
ArrowsSpr.u = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_U; PageUpDownSpr.u = orig_pageupdn_u;
ArrowsSpr.v = AIRCRAFT_DATA_FLIGHT_LEFT_ARROW_V;
ArrowsSpr.attribute |= GFX_1HZ_FLASH;
GfxSortSprite(&ArrowsSpr);
} }
GameGuiShowAircraftData(ptrPlayer, ptrFlightData); GameGuiShowAircraftData(ptrPlayer, ptrFlightData);
@ -693,11 +704,12 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight
short AircraftDataDirection_Y; short AircraftDataDirection_Y;
short AircraftDataFlightNumber_X; short AircraftDataFlightNumber_X;
short AircraftDataFlightNumber_Y; short AircraftDataFlightNumber_Y;
short AircraftDataPassengers_X; //short AircraftDataPassengers_X;
short AircraftDataPassengers_Y; //short AircraftDataPassengers_Y;
short AircraftDataState_X_Offset; short AircraftDataState_X_Offset;
short AircraftDataRemainingTime_X; short AircraftDataRemainingTime_X;
short AircraftDataRemainingTime_Y; short AircraftDataRemainingTime_Y;
short orig_DepArr_u = DepArrSpr.u;
if(GameTwoPlayersActive() == true) if(GameTwoPlayersActive() == true)
{ {
@ -705,9 +717,9 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight
AircraftDataDirection_Y = AIRCRAFT_DATA_DIRECTION_Y_2PLAYER; AircraftDataDirection_Y = AIRCRAFT_DATA_DIRECTION_Y_2PLAYER;
AircraftDataFlightNumber_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X_2PLAYER; AircraftDataFlightNumber_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X_2PLAYER;
AircraftDataFlightNumber_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y_2PLAYER; AircraftDataFlightNumber_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y_2PLAYER;
AircraftDataPassengers_X = AIRCRAFT_DATA_PASSENGERS_X_2PLAYER; //AircraftDataPassengers_X = AIRCRAFT_DATA_PASSENGERS_X_2PLAYER;
AircraftDataPassengers_Y = AIRCRAFT_DATA_PASSENGERS_Y_2PLAYER; //AircraftDataPassengers_Y = AIRCRAFT_DATA_PASSENGERS_Y_2PLAYER;
AircraftDataState_X_Offset = 54; AircraftDataState_X_Offset = 24;
AircraftDataRemainingTime_X = AIRCRAFT_DATA_REMAINING_TIME_X_2PLAYER; AircraftDataRemainingTime_X = AIRCRAFT_DATA_REMAINING_TIME_X_2PLAYER;
AircraftDataRemainingTime_Y = AIRCRAFT_DATA_REMAINING_TIME_Y_2PLAYER; AircraftDataRemainingTime_Y = AIRCRAFT_DATA_REMAINING_TIME_Y_2PLAYER;
} }
@ -717,9 +729,9 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight
AircraftDataDirection_Y = AIRCRAFT_DATA_DIRECTION_Y; AircraftDataDirection_Y = AIRCRAFT_DATA_DIRECTION_Y;
AircraftDataFlightNumber_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X; AircraftDataFlightNumber_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X;
AircraftDataFlightNumber_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y; AircraftDataFlightNumber_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y;
AircraftDataPassengers_X = AIRCRAFT_DATA_PASSENGERS_X; //AircraftDataPassengers_X = AIRCRAFT_DATA_PASSENGERS_X;
AircraftDataPassengers_Y = AIRCRAFT_DATA_PASSENGERS_Y; //AircraftDataPassengers_Y = AIRCRAFT_DATA_PASSENGERS_Y;
AircraftDataState_X_Offset = 88; AircraftDataState_X_Offset = 24;
AircraftDataRemainingTime_X = AIRCRAFT_DATA_REMAINING_TIME_X; AircraftDataRemainingTime_X = AIRCRAFT_DATA_REMAINING_TIME_X;
AircraftDataRemainingTime_Y = AIRCRAFT_DATA_REMAINING_TIME_Y; AircraftDataRemainingTime_Y = AIRCRAFT_DATA_REMAINING_TIME_Y;
} }
@ -739,34 +751,27 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight
AircraftDataFlightNumber_X, AircraftDataFlightNumber_X,
AircraftDataFlightNumber_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j), AircraftDataFlightNumber_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
ptrFlightData->strFlightNumber[ptrPlayer->ActiveAircraftList[i]] ); ptrFlightData->strFlightNumber[ptrPlayer->ActiveAircraftList[i]] );
DepArrSpr.x = AircraftDataDirection_X;
DepArrSpr.y = AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j);
DepArrSpr.w = AIRCRAFT_DEPARTURE_ARRIVAL_ICON_SIZE;
switch(ptrFlightData->FlightDirection[ptrPlayer->ActiveAircraftList[i]]) switch(ptrFlightData->FlightDirection[ptrPlayer->ActiveAircraftList[i]])
{ {
case ARRIVAL: case ARRIVAL:
FontPrintText( &SmallFont, DepArrSpr.u = orig_DepArr_u + AIRCRAFT_ARRIVAL_ICON_U;
AircraftDataDirection_X,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Arrival" );
break; break;
case DEPARTURE: case DEPARTURE:
if(GameTwoPlayersActive() == true) DepArrSpr.u = orig_DepArr_u + AIRCRAFT_DEPARTURE_ICON_U;
{
FontPrintText( &SmallFont,
AircraftDataDirection_X,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Depart." );
}
else
{
FontPrintText( &SmallFont,
AircraftDataDirection_X,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Departure" );
}
break; break;
default: default:
break; break;
} }
GfxSortSprite(&DepArrSpr);
DepArrSpr.u = orig_DepArr_u;
FontSetFlags(&SmallFont, FONT_2HZ_FLASH); FontSetFlags(&SmallFont, FONT_2HZ_FLASH);
@ -820,16 +825,16 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight
FontSetFlags(&SmallFont, FONT_NOFLAGS); FontSetFlags(&SmallFont, FONT_NOFLAGS);
FontPrintText( &SmallFont, /*FontPrintText( &SmallFont,
AircraftDataPassengers_X, AircraftDataPassengers_X,
AircraftDataPassengers_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j), AircraftDataPassengers_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"%d pax.", "%d pax.",
ptrFlightData->Passengers[ptrPlayer->ActiveAircraftList[i]] ); ptrFlightData->Passengers[ptrPlayer->ActiveAircraftList[i]] );*/
FontPrintText( &SmallFont, FontPrintText( &SmallFont,
AircraftDataRemainingTime_X, AircraftDataRemainingTime_X,
AircraftDataRemainingTime_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j), AircraftDataRemainingTime_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"%d sec.", "%ds",
ptrFlightData->RemainingTime[ptrPlayer->ActiveAircraftList[i]] ); ptrFlightData->RemainingTime[ptrPlayer->ActiveAircraftList[i]] );
} }
} }

View File

@ -35,6 +35,31 @@ enum
BUTTON_CIRCLE_U = 16, BUTTON_CIRCLE_U = 16,
BUTTON_CIRCLE_V = 0, BUTTON_CIRCLE_V = 0,
BUTTON_DIRECTION_U = 64,
BUTTON_DIRECTION_V = 0,
BUTTON_LR_U = 80,
BUTTON_LR_V = 0,
BUTTON_LR_SIZE = 24,
LETTER_SIZE = 8,
LETTER_L1_U = 104,
LETTER_L1_V = 0,
LETTER_L2_U = 112,
LETTER_L2_V = 0,
LETTER_R1_U = 104,
LETTER_R1_V = 8,
LETTER_R2_U = 112,
LETTER_R2_V = 8,
LETTER_OFFSET_INSIDE_BUTTON_LR_X = 8,
LETTER_OFFSET_INSIDE_BUTTON_LR_Y = 6
}; };
enum enum
@ -212,6 +237,10 @@ void GfxSortSprite(GsSprite * spr)
{ {
return; return;
} }
else if(has_1hz_flash && Gfx1HzFlash() == false)
{
return;
}
if(global_lum != NORMAL_LUMINANCE) if(global_lum != NORMAL_LUMINANCE)
{ {
@ -332,6 +361,12 @@ bool GfxSpriteFromFile(char* fname, GsSprite * spr)
GsSpriteFromImage(spr,&gsi,UPLOAD_IMAGE_FLAG); GsSpriteFromImage(spr,&gsi,UPLOAD_IMAGE_FLAG);
gfx_busy = false; 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; return true;
} }
@ -379,6 +414,16 @@ bool GfxIsSpriteInsideScreenArea(GsSprite * spr)
return GfxIsInsideScreenArea(spr->x, spr->y, spr->w, spr->h); return GfxIsInsideScreenArea(spr->x, spr->y, spr->w, spr->h);
} }
void GfxButtonSetFlags(uint8_t flags)
{
PSXButtons.attribute |= flags;
}
void GfxButtonRemoveFlags(uint8_t flags)
{
PSXButtons.attribute &= ~flags;
}
void GfxDrawButton(short x, short y, unsigned short btn) void GfxDrawButton(short x, short y, unsigned short btn)
{ {
static bool first_entered = true; static bool first_entered = true;
@ -401,6 +446,8 @@ void GfxDrawButton(short x, short y, unsigned short btn)
PSXButtons.x = x; PSXButtons.x = x;
PSXButtons.y = y; PSXButtons.y = y;
PSXButtons.mx = PSXButtons.w >> 1;
PSXButtons.my = PSXButtons.h >> 1;
switch(btn) switch(btn)
{ {
@ -423,13 +470,46 @@ void GfxDrawButton(short x, short y, unsigned short btn)
PSXButtons.u = BUTTON_CIRCLE_U; PSXButtons.u = BUTTON_CIRCLE_U;
PSXButtons.v = BUTTON_CIRCLE_V; PSXButtons.v = BUTTON_CIRCLE_V;
break; break;
case PAD_RIGHT:
PSXButtons.u = BUTTON_DIRECTION_U;
PSXButtons.v = BUTTON_DIRECTION_V;
break;
case PAD_UP:
PSXButtons.u = BUTTON_DIRECTION_U;
PSXButtons.v = BUTTON_DIRECTION_V;
PSXButtons.rotate = 90 << ROTATE_BIT_SHIFT;
break;
case PAD_DOWN:
PSXButtons.u = BUTTON_DIRECTION_U;
PSXButtons.v = BUTTON_DIRECTION_V;
PSXButtons.rotate = 270 << ROTATE_BIT_SHIFT;
break;
case PAD_LEFT:
PSXButtons.u = BUTTON_DIRECTION_U;
PSXButtons.v = BUTTON_DIRECTION_V;
PSXButtons.attribute |= H_FLIP;
break;
case PAD_L1: case PAD_L1:
// Fall through
case PAD_L2: case PAD_L2:
// Fall through
case PAD_R1: case PAD_R1:
// Fall through
case PAD_R2: case PAD_R2:
PSXButtons.u = BUTTON_LR_U;
PSXButtons.v = BUTTON_LR_V;
PSXButtons.w = BUTTON_LR_SIZE;
break;
case PAD_SELECT: case PAD_SELECT:
// Fall through
case PAD_START: case PAD_START:
// Fall through
default: default:
// Set null width and height so that sprite doesn't get sorted // Set null width and height so that sprite doesn't get sorted
PSXButtons.w = 0; PSXButtons.w = 0;
@ -441,6 +521,9 @@ void GfxDrawButton(short x, short y, unsigned short btn)
PSXButtons.v += orig_v; PSXButtons.v += orig_v;
GfxSortSprite(&PSXButtons); GfxSortSprite(&PSXButtons);
PSXButtons.attribute &= ~H_FLIP;
PSXButtons.rotate = 0;
} }
void GfxSaveDisplayData(GsSprite *spr) void GfxSaveDisplayData(GsSprite *spr)
@ -538,7 +621,7 @@ TYPE_ISOMETRIC_POS GfxCartesianToIsometric(TYPE_CARTESIAN_POS * ptrCartPos)
IsoPos.x = ptrCartPos->x + (ptrCartPos->y << 1); IsoPos.x = ptrCartPos->x + (ptrCartPos->y << 1);
IsoPos.y = (ptrCartPos->y << 1) - ptrCartPos->x; IsoPos.y = (ptrCartPos->y << 1) - ptrCartPos->x;
// Explicitely suppose z = 0 // Explicitly suppose z = 0
IsoPos.z = 0; IsoPos.z = 0;
return IsoPos; return IsoPos;

View File

@ -76,6 +76,10 @@ void GfxSetGlobalLuminance(uint8_t value);
void GfxIncreaseGlobalLuminance(int8_t step); void GfxIncreaseGlobalLuminance(int8_t step);
void GfxButtonSetFlags(uint8_t flags);
void GfxButtonRemoveFlags(uint8_t flags);
int GfxRotateFromDegrees(int deg); int GfxRotateFromDegrees(int deg);
void GfxDrawButton(short x, short y, unsigned short btn); void GfxDrawButton(short x, short y, unsigned short btn);

View File

@ -88,6 +88,7 @@ static GsRectangle LoadMenuBarRect;
static char* LoadMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\PLANE.TIM;1", static char* LoadMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\PLANE.TIM;1",
"cdrom:\\DATA\\SPRITES\\LOADING.TIM;1", "cdrom:\\DATA\\SPRITES\\LOADING.TIM;1",
"cdrom:\\DATA\\FONTS\\FONT_2.FNT;1" }; "cdrom:\\DATA\\FONTS\\FONT_2.FNT;1" };
static void * LoadMenuDest[] = {(GsSprite*)&LoadMenuPlaneSpr, static void * LoadMenuDest[] = {(GsSprite*)&LoadMenuPlaneSpr,
(GsSprite*)&LoadMenuTitleSpr, (GsSprite*)&LoadMenuTitleSpr,
(TYPE_FONT*)&SmallFont }; (TYPE_FONT*)&SmallFont };
@ -387,8 +388,8 @@ void ISR_LoadMenuVBlank(void)
LoadMenuPlaneSpr.w = PLANE_SIZE; LoadMenuPlaneSpr.w = PLANE_SIZE;
LoadMenuPlaneSpr.h = PLANE_SIZE; LoadMenuPlaneSpr.h = PLANE_SIZE;
LoadMenuPlaneSpr.u = PLANE_U; //LoadMenuPlaneSpr.u = PLANE_U;
LoadMenuPlaneSpr.v = PLANE_V; //LoadMenuPlaneSpr.v = PLANE_V;
GsSortSprite(&LoadMenuPlaneSpr); GsSortSprite(&LoadMenuPlaneSpr);

View File

@ -2,9 +2,9 @@ CC = psx-gcc
DEFINE= -DFIXMATH_FAST_SIN -D_PAL_MODE_ DEFINE= -DFIXMATH_FAST_SIN -D_PAL_MODE_
DEFINE += -DPSXSDK_DEBUG DEFINE += -DPSXSDK_DEBUG
DEFINE += -DNO_CDDA DEFINE += -DNO_CDDA
#DEFINE += -DNO_INTRO DEFINE += -DNO_INTRO
LIBS= -lfixmath LIBS= -lfixmath
CC_FLAGS = -Wall -Werror -c -Os CC_FLAGS = -Wall -Werror -c -Os -Wfatal-errors
LINKER = psx-gcc LINKER = psx-gcc
PROJECT = AIRPORT PROJECT = AIRPORT
@ -84,17 +84,18 @@ tiles:
bmp2tim ../Sprites/Tileset2.bmp ../cdimg/DATA/SPRITES/TILESET2.TIM 16 -org=640,0 -mpink bmp2tim ../Sprites/Tileset2.bmp ../cdimg/DATA/SPRITES/TILESET2.TIM 16 -org=640,0 -mpink
bmp2tim ../Sprites/MainMenu.bmp ../cdimg/DATA/SPRITES/MAINMENU.TIM 16 -org=768,384 -mpink bmp2tim ../Sprites/MainMenu.bmp ../cdimg/DATA/SPRITES/MAINMENU.TIM 16 -org=768,384 -mpink
bmp2tim ../Sprites/Loading.bmp ../cdimg/DATA/SPRITES/LOADING.TIM 4 -mpink -org=768,256 -clut=384,496 bmp2tim ../Sprites/Loading.bmp ../cdimg/DATA/SPRITES/LOADING.TIM 4 -mpink -org=768,256 -clut=384,496
bmp2tim ../Sprites/Plane.bmp ../cdimg/DATA/SPRITES/PLANE.TIM 16 -org=768,288 -mpink bmp2tim ../Sprites/Plane.bmp ../cdimg/DATA/SPRITES/PLANE.TIM 16 -org=536,240 -mpink
bmp2tim ../Sprites/Buttons.bmp ../cdimg/DATA/SPRITES/BUTTONS.TIM 16 -org=784,288 -mpink bmp2tim ../Sprites/Buttons.bmp ../cdimg/DATA/SPRITES/BUTTONS.TIM 16 -org=384,240 -mpink
bmp2tim ../Sprites/GamePln.bmp ../cdimg/DATA/SPRITES/GAMEPLN.TIM 8 -mpink -org=800,304 -clut=384,497 bmp2tim ../Sprites/GamePln.bmp ../cdimg/DATA/SPRITES/GAMEPLN.TIM 8 -mpink -org=800,256 -clut=384,497
bmp2tim ../Sprites/GamePln_Blue.bmp ../cdimg/DATA/SPRITES/PLNBLUE.CLT 8 -mpink -clut=384,501 bmp2tim ../Sprites/GamePln_Blue.bmp ../cdimg/DATA/SPRITES/PLNBLUE.CLT 8 -mpink -clut=384,501
bmp2tim ../Sprites/Bubble.bmp ../cdimg/DATA/SPRITES/BUBBLE.TIM 8 -org=848,288 -mpink -clut=384,498 bmp2tim ../Sprites/Bubble.bmp ../cdimg/DATA/SPRITES/BUBBLE.TIM 8 -org=584,240 -mpink -clut=384,498
bmp2tim ../Sprites/Font_1_4bit.bmp ../cdimg/DATA/FONTS/FONT_1.FNT 4 -org=960,256 -mpink -clut=384,500 bmp2tim ../Sprites/Font_1_4bit.bmp ../cdimg/DATA/FONTS/FONT_1.FNT 4 -org=960,256 -mpink -clut=384,500
bmp2tim ../Sprites/Font_2_4bit.bmp ../cdimg/DATA/FONTS/FONT_2.FNT 4 -org=768,304 -mpink -clut=384,499 bmp2tim ../Sprites/Font_2_4bit.bmp ../cdimg/DATA/FONTS/FONT_2.FNT 4 -org=768,288 -mpink -clut=384,499
bmp2tim ../Sprites/Arrows.bmp ../cdimg/DATA/SPRITES/ARROWS.TIM 16 -org=812,304 -mpink
bmp2tim ../Sprites/GPL_4bit.bmp ../cdimg/DATA/SPRITES/GPL.TIM 4 -org=384,174 -mpink -clut=384,502 bmp2tim ../Sprites/GPL_4bit.bmp ../cdimg/DATA/SPRITES/GPL.TIM 4 -org=384,174 -mpink -clut=384,502
bmp2tim ../Sprites/OpSrc_8bit.bmp ../cdimg/DATA/SPRITES/OPENSRC.TIM 8 -org=464,0 -mpink -clut=384,503 bmp2tim ../Sprites/OpSrc_8bit.bmp ../cdimg/DATA/SPRITES/OPENSRC.TIM 8 -org=464,0 -mpink -clut=384,503
bmp2tim ../Sprites/Mouse.bmp ../cdimg/DATA/SPRITES/MOUSE.TIM 16 -org=828,304 -mpink bmp2tim ../Sprites/Mouse.bmp ../cdimg/DATA/SPRITES/MOUSE.TIM 16 -org=596,240 -mpink
bmp2tim ../Sprites/DepArr.bmp ../cdimg/DATA/SPRITES/DEPARR.TIM 16 -org=552,240 -mpink
bmp2tim ../Sprites/PageUpDn.bmp ../cdimg/DATA/SPRITES/PAGEUPDN.TIM 16 -org=504,240 -mpink
sounds: sounds:
rm -f ../cdimg/DATA/SOUNDS/*.VAG rm -f ../cdimg/DATA/SOUNDS/*.VAG

View File

@ -19,13 +19,15 @@
typedef enum typedef enum
{ {
PLAY_OPTIONS_LEVEL = 0, PLAY_OPTIONS_LEVEL = 0,
ONE_TWO_PLAYERS_LEVEL ONE_TWO_PLAYERS_LEVEL,
OPTIONS_LEVEL
}MainMenuLevel; }MainMenuLevel;
enum enum
{ {
MAIN_MENU_PLAY_OPTIONS_LEVEL_BUTTONS = 2, MAIN_MENU_PLAY_OPTIONS_LEVEL_BUTTONS = 2,
MAIN_MENU_ONE_TWO_PLAYERS_LEVEL_BUTTONS = 2 MAIN_MENU_ONE_TWO_PLAYERS_LEVEL_BUTTONS = 2,
MAIN_MENU_OPTIONS_LEVEL_BUTTONS = 1
}; };
typedef enum typedef enum
@ -260,10 +262,10 @@ void MainMenu(void)
GfxSetGlobalLuminance(NORMAL_LUMINANCE); GfxSetGlobalLuminance(NORMAL_LUMINANCE);
while(1) while(1)
{ {
while(GfxIsGPUBusy() == true);
MainMenuButtonHandler(); MainMenuButtonHandler();
while(GfxIsGPUBusy() == true);
switch(menuLevel) switch(menuLevel)
{ {

View File

@ -21,11 +21,16 @@
* Local Variables * Local Variables
* *************************************/ * *************************************/
static uint8_t voiceIndex = 0; static uint8_t voiceIndex;
static uint16_t SfxGlobalVolumeReduction;
#ifndef NO_CDDA
static uint16_t SfxCddaVolumeReduction;
#endif // NO_CDDA
void SfxPlaySound(SsVag * sound) void SfxPlaySound(SsVag * sound)
{ {
SsPlayVag(sound, sound->cur_voice, MAX_VOLUME, MAX_VOLUME); SsPlayVag(sound, sound->cur_voice, MAX_VOLUME - SfxGlobalVolumeReduction, MAX_VOLUME - SfxGlobalVolumeReduction);
} }
bool SfxUploadSound(char* file_path, SsVag * vag) bool SfxUploadSound(char* file_path, SsVag * vag)
@ -56,7 +61,7 @@ bool SfxUploadSound(char* file_path, SsVag * vag)
void SfxPlayTrack(MUSIC_TRACKS track) void SfxPlayTrack(MUSIC_TRACKS track)
{ {
#ifndef NO_CDDA #ifndef NO_CDDA
SsCdVol(0x7FFF,0x7FFF); SsCdVol(0x7FFF - SfxCddaVolumeReduction,0x7FFF - SfxCddaVolumeReduction);
SsEnableCd(); SsEnableCd();
CdPlayTrack(track); CdPlayTrack(track);
dprintf("Track number %d playing...\n",track); dprintf("Track number %d playing...\n",track);

View File

@ -722,9 +722,21 @@ void SystemUserTimersHandler(void)
void SystemTimerRestart(TYPE_TIMER* timer) void SystemTimerRestart(TYPE_TIMER* timer)
{ {
timer->time = timer->orig_time; timer->time = timer->orig_time;
dprintf("Time set to %d seconds, timer 0x%08X\n", timer->time, timer);
} }
/* *********************************************************************
*
* @name void SystemTimerRemove(TYPE_TIMER* timer)
*
* @author: Xavier Del Campo
*
* @brief: Resets timer parameters to default values so timer instance
* can be recycled.
*
* @remarks:
*
* *********************************************************************/
void SystemTimerRemove(TYPE_TIMER* timer) void SystemTimerRemove(TYPE_TIMER* timer)
{ {
timer->time = 0; timer->time = 0;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.