diff options
| author | XaviDCR92 <xavi.dcr@gmail.com> | 2017-09-16 01:44:42 +0200 |
|---|---|---|
| committer | XaviDCR92 <xavi.dcr@gmail.com> | 2017-09-16 01:44:42 +0200 |
| commit | 0d7af34486f15d8f31f8474f17cad698923cadcb (patch) | |
| tree | a8489b916733589bbf90f25f3d654ade9353e4a1 /Source | |
| parent | f2a6798f1da7231facec93305f8c157f1a56f072 (diff) | |
| download | airport-0d7af34486f15d8f31f8474f17cad698923cadcb.tar.gz | |
* Trimmed ending whitespaces.
* Makefile now generates output TIM files automatically, using 'cat whatever.flags' files as flags for bmp2tim.
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Aircraft.c | 22 | ||||
| -rw-r--r-- | Source/Aircraft.h | 2 | ||||
| -rw-r--r-- | Source/EndAnimation.c | 84 | ||||
| -rw-r--r-- | Source/EndAnimation.h | 4 | ||||
| -rw-r--r-- | Source/Exe/AIRPORT.elf | bin | 488544 -> 487972 bytes | |||
| -rw-r--r-- | Source/Font.c | 46 | ||||
| -rw-r--r-- | Source/Game.c | 992 | ||||
| -rw-r--r-- | Source/GameGui.c | 226 | ||||
| -rw-r--r-- | Source/GameStructures.h | 6 | ||||
| -rw-r--r-- | Source/Gfx.c | 148 | ||||
| -rw-r--r-- | Source/LoadMenu.c | 186 | ||||
| -rw-r--r-- | Source/LoadMenu.h | 4 | ||||
| -rw-r--r-- | Source/Makefile | 105 | ||||
| -rw-r--r-- | Source/MemCard.c | 462 | ||||
| -rw-r--r-- | Source/MemCard.h | 24 | ||||
| -rw-r--r-- | Source/Menu.c | 200 | ||||
| -rw-r--r-- | Source/PSXSDKIntro.c | 154 | ||||
| -rw-r--r-- | Source/Pad.c | 124 | ||||
| -rw-r--r-- | Source/Pad.h | 2 | ||||
| -rw-r--r-- | Source/PltParser.c | 68 | ||||
| -rw-r--r-- | Source/Serial.c | 2 | ||||
| -rw-r--r-- | Source/Sfx.c | 18 | ||||
| -rw-r--r-- | Source/Sfx.h | 2 | ||||
| -rw-r--r-- | Source/System.c | 458 | ||||
| -rw-r--r-- | Source/System.h | 4 | ||||
| -rw-r--r-- | Source/Timer.c | 52 | ||||
| -rw-r--r-- | Source/Timer.h | 2 | ||||
| -rw-r--r-- | Source/main.c | 4 |
28 files changed, 1697 insertions, 1704 deletions
diff --git a/Source/Aircraft.c b/Source/Aircraft.c index bc61403..cb99c09 100644 --- a/Source/Aircraft.c +++ b/Source/Aircraft.c @@ -58,7 +58,7 @@ static char* AircraftLiveryNamesTable[] = {"PHX", NULL}; static AIRCRAFT_LIVERY AircraftLiveryTable[] = {AIRCRAFT_LIVERY_0, AIRCRAFT_LIVERY_UNKNOWN};
static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\ARROW.TIM;1" };
-
+
static void* GameFileDest[] = { (GsSprite*)&ArrowSpr };
// Used to quickly link FlightData indexes against AircraftData indexes.
@@ -239,7 +239,7 @@ void AircraftHandler(void) {
continue;
}
-
+
AircraftDirection(ptrAircraft);
AircraftAttitude(ptrAircraft);
AircraftSpeed(ptrAircraft);
@@ -249,7 +249,7 @@ void AircraftHandler(void) for (j = 0; j < GAME_MAX_AIRCRAFT; j++)
{
TYPE_AIRCRAFT_DATA* ptrOtherAircraft = &AircraftData[j];
-
+
if (i == j)
{
continue;
@@ -331,7 +331,7 @@ void AircraftRender(TYPE_PLAYER* ptrPlayer, uint8_t aircraftIdx) shadowIsoPos.x = ptrAircraft->IsoPos.x;
shadowIsoPos.y = ptrAircraft->IsoPos.y;
shadowIsoPos.z = 0;
-
+
if (ptrAircraft->State == STATE_IDLE)
{
return;
@@ -376,7 +376,7 @@ void AircraftRender(TYPE_PLAYER* ptrPlayer, uint8_t aircraftIdx) {
static uint8_t aircraft_sine;
static bool aircraft_sine_decrease;
-
+
if (aircraft_sine_decrease == false)
{
if (aircraft_sine < 240)
@@ -434,10 +434,10 @@ void AircraftRender(TYPE_PLAYER* ptrPlayer, uint8_t aircraftIdx) {
ArrowSpr.y = AircraftSpr.y;
}
-
+
GfxSortSprite(&ArrowSpr);
}
-
+
}
else
{
@@ -533,7 +533,7 @@ void AircraftDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) {
ptrAircraft->IsoPos.x = targetPos.x;
ptrAircraft->IsoPos.y = targetPos.y;
-
+
if (ptrAircraft->Target[++ptrAircraft->TargetIdx] == 0)
{
Serial_printf("All targets reached!\n");
@@ -718,21 +718,21 @@ AIRCRAFT_DIRECTION AircraftGetDirection(TYPE_AIRCRAFT_DATA* ptrAircraft) uint16_t* AircraftGetTargets(uint8_t index)
{
TYPE_AIRCRAFT_DATA* ptrAircraft = AircraftFromFlightDataIndex(index);
-
+
return ptrAircraft->Target;
}
uint8_t AircraftGetTargetIdx(uint8_t index)
{
TYPE_AIRCRAFT_DATA* ptrAircraft = AircraftFromFlightDataIndex(index);
-
+
return ptrAircraft->TargetIdx;
}
bool AircraftMoving(uint8_t index)
{
TYPE_AIRCRAFT_DATA* ptrAircraft = AircraftFromFlightDataIndex(index);
-
+
return (bool)ptrAircraft->Speed;
}
diff --git a/Source/Aircraft.h b/Source/Aircraft.h index aef7d52..0fb141c 100644 --- a/Source/Aircraft.h +++ b/Source/Aircraft.h @@ -11,7 +11,7 @@ /* *************************************
* Global prototypes
* *************************************/
-
+
void AircraftInit(void);
void AircraftHandler(void);
void AircraftRender(TYPE_PLAYER* ptrPlayer, uint8_t aircraftIdx);
diff --git a/Source/EndAnimation.c b/Source/EndAnimation.c index 3907d6e..c60bf30 100644 --- a/Source/EndAnimation.c +++ b/Source/EndAnimation.c @@ -18,18 +18,18 @@ enum { END_ANIMATION_FADEOUT_STEP = 8, - + END_ANIMATION_LINE_STEP = 2, - + END_ANIMATION_SQUARES_SIZE_BITSHIFT = 5, END_ANIMATION_SQUARES_SIZE = 32, END_ANIMATION_SQUARES_PER_COLUMN = 8, END_ANIMATION_SQUARES_PER_ROW = 12, END_ANIMATION_SQUARES_TOTAL = END_ANIMATION_SQUARES_PER_COLUMN * END_ANIMATION_SQUARES_PER_ROW, - + END_ANIMATION_SQUARES_TOTAL_MAX_INDEX = END_ANIMATION_SQUARES_TOTAL - 1, - + END_ANIMATION_SQUARES = 0, END_ANIMATION_FADEOUT, END_ANIMATION_LINE, @@ -54,11 +54,11 @@ static GsSprite EndAnimationDisplay; void EndAnimation(void) { uint8_t randIndex = 0; - + GfxSaveDisplayData(&EndAnimationDisplay); - + GfxSetGlobalLuminance(NORMAL_LUMINANCE); - + if (SystemIsRandSeedSet() == false) { // Set default end animation @@ -67,25 +67,25 @@ void EndAnimation(void) else { randIndex = rand() % (END_ANIMATION_MAX_RAND_VALUE + 1); - + switch(randIndex) { case END_ANIMATION_SQUARES: EndAnimationSquares(); break; - + case END_ANIMATION_FADEOUT: EndAnimationFadeOut(); break; - + case END_ANIMATION_LINE: EndAnimationLine(); break; - + default: break; } - + SfxStopMusic(); } } @@ -93,26 +93,26 @@ void EndAnimation(void) void EndAnimationFadeOut(void) { uint8_t i; - + while (1) { if ( GfxGetGlobalLuminance() > 0) { GfxSetGlobalLuminance(GfxGetGlobalLuminance() - END_ANIMATION_FADEOUT_STEP); - + GfxSortSprite(&EndAnimationDisplay);; GfxDrawScene_Slow(); } else { GsSortCls(0,0,0); - + for (i = 0 ; i < 2 ; i++) { // Draw two frames to ensure black display GfxDrawScene_Slow(); } - + break; } } @@ -121,35 +121,35 @@ void EndAnimationFadeOut(void) void EndAnimationLine(void) { short rectIndex = 0; - + do { GfxSortSprite(&EndAnimationDisplay); - + // Draw upper half rectangle - + EndAnimationRect.x = 0; EndAnimationRect.y = 0; - + EndAnimationRect.w = X_SCREEN_RESOLUTION; EndAnimationRect.h = rectIndex; - + GsSortRectangle(&EndAnimationRect); - + EndAnimationRect.x = 0; EndAnimationRect.y = Y_SCREEN_RESOLUTION - rectIndex; - + EndAnimationRect.w = X_SCREEN_RESOLUTION; EndAnimationRect.h = rectIndex; - + GsSortRectangle(&EndAnimationRect); - + GfxDrawScene_Slow(); - + rectIndex += END_ANIMATION_LINE_STEP; - + }while (rectIndex <= (X_SCREEN_RESOLUTION >> 1) ); - + } void EndAnimationSquares(void) @@ -159,38 +159,38 @@ void EndAnimationSquares(void) bool sqPos[END_ANIMATION_SQUARES_TOTAL]; uint16_t sqCounter = END_ANIMATION_SQUARES_TOTAL; uint16_t maxIndex = END_ANIMATION_SQUARES_TOTAL_MAX_INDEX; - + EndAnimationRect.w = END_ANIMATION_SQUARES_SIZE; EndAnimationRect.h = END_ANIMATION_SQUARES_SIZE; - + EndAnimationRect.r = 0; EndAnimationRect.g = 0; EndAnimationRect.b = 0; - + memset(sqPos, false , END_ANIMATION_SQUARES_TOTAL); - + for (i = 0; i < END_ANIMATION_SQUARES_TOTAL ; i++) { - + do { randInd = SystemRand(0,maxIndex); - + /*Serial_printf("randInd = %d\t",randInd); Serial_printf("sqPos[randInd] = %d\n", sqPos[randInd]);*/ - + if (sqPos[randInd] == false) { sqPos[randInd] = true; sqCounter--; - + while (sqPos[maxIndex] == true) { // Lower maximum value for rand() so that it's // easier to spot new empty index on next iteration. maxIndex--; } - + break; } else @@ -200,11 +200,11 @@ void EndAnimationSquares(void) break; } } - + }while (1); - + GfxSortSprite(&EndAnimationDisplay); - + if (sqCounter != 0) { for (j = 0; j < END_ANIMATION_SQUARES_TOTAL ; j++) @@ -214,10 +214,10 @@ void EndAnimationSquares(void) EndAnimationRect.x = ((j) << END_ANIMATION_SQUARES_SIZE_BITSHIFT) - (short)( (j / END_ANIMATION_SQUARES_PER_ROW) * X_SCREEN_RESOLUTION); - + EndAnimationRect.y = (short) (j/ END_ANIMATION_SQUARES_PER_ROW) << END_ANIMATION_SQUARES_SIZE_BITSHIFT; - + GsSortRectangle(&EndAnimationRect); } } diff --git a/Source/EndAnimation.h b/Source/EndAnimation.h index 9ba13a0..3ac015b 100644 --- a/Source/EndAnimation.h +++ b/Source/EndAnimation.h @@ -2,7 +2,7 @@ #define __END_SCREEN_HEADER__ /* ************************************** - * Includes * + * Includes * * **************************************/ /* ************************************** @@ -16,7 +16,7 @@ void EndAnimation(void); /* ************************************** - * Global Variables * + * Global Variables * * **************************************/ #endif // __END_SCREEN_HEADER__ diff --git a/Source/Exe/AIRPORT.elf b/Source/Exe/AIRPORT.elf Binary files differindex a09afcd..b4f52e1 100644 --- a/Source/Exe/AIRPORT.elf +++ b/Source/Exe/AIRPORT.elf diff --git a/Source/Font.c b/Source/Font.c index 52a8cca..5907594 100644 --- a/Source/Font.c +++ b/Source/Font.c @@ -32,36 +32,36 @@ bool FontLoadImage(char* strPath, TYPE_FONT * ptrFont) {
return false;
}
-
+
ptrFont->spr_w = ptrFont->spr.w;
ptrFont->spr_h = ptrFont->spr.h;
ptrFont->spr_u = ptrFont->spr.u;
ptrFont->spr_v = ptrFont->spr.v;
-
+
//Now set default values to font
-
+
ptrFont->char_w = FONT_DEFAULT_CHAR_SIZE;
ptrFont->char_h = FONT_DEFAULT_CHAR_SIZE;
-
+
ptrFont->spr.attribute |= COLORMODE(COLORMODE_4BPP);
ptrFont->spr.attribute &= COLORMODE(~(COLORMODE_8BPP | COLORMODE_16BPP | COLORMODE_24BPP));
ptrFont->spr.r = NORMAL_LUMINANCE;
ptrFont->spr.g = NORMAL_LUMINANCE;
ptrFont->spr.b = NORMAL_LUMINANCE;
-
+
//At this point, spr.w and spr.h = real w/h
ptrFont->char_per_row = (uint8_t)(ptrFont->spr_w / ptrFont->char_w);
ptrFont->max_ch_wrap = 0;
-
+
ptrFont->spr.w = ptrFont->char_w;
ptrFont->spr.h = ptrFont->char_h;
-
+
ptrFont->flags = FONT_NOFLAGS;
-
+
ptrFont->init_ch = FONT_DEFAULT_INIT_CHAR;
-
+
Serial_printf("Sprite CX = %d, sprite CY = %d\n",ptrFont->spr.cx, ptrFont->spr.cy);
-
+
return true;
}
@@ -79,11 +79,11 @@ void FontSetSize(TYPE_FONT * ptrFont, short size) {
ptrFont->char_w = size;
ptrFont->char_h = size;
-
+
//At this point, spr.w and spr.h = real w/h
ptrFont->char_per_row = (uint8_t)(ptrFont->spr_w / ptrFont->char_w);
ptrFont->max_ch_wrap = 0;
-
+
ptrFont->spr.w = ptrFont->char_w;
ptrFont->spr.h = ptrFont->char_h;
}
@@ -104,9 +104,9 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...) uint16_t line_count = 0;
int result;
short orig_x = x;
-
+
va_list ap;
-
+
if (ptrFont->flags & FONT_1HZ_FLASH)
{
if (Gfx1HzFlash() == false)
@@ -121,24 +121,24 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...) return;
}
}
-
+
va_start(ap, str);
-
+
result = vsnprintf( _internal_text,
FONT_INTERNAL_TEXT_BUFFER_MAX_SIZE,
str,
ap );
-
+
for (i = 0; i < result ; i++)
{
char _ch = _internal_text[i];
-
+
if (_ch == '\0')
{
// End of string
break;
}
-
+
switch(_ch)
{
case ' ':
@@ -158,7 +158,7 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...) y += ptrFont->char_h;
}
}
-
+
ptrFont->spr.x = x;
ptrFont->spr.y = y;
ptrFont->spr.w = ptrFont->char_w;
@@ -167,7 +167,7 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...) ptrFont->spr.u += ptrFont->spr_u; // Add original offset for image
ptrFont->spr.v = (short)( (_ch - ptrFont->init_ch) / ptrFont->char_per_row) * ptrFont->char_h;
ptrFont->spr.v += ptrFont->spr_v; // Add original offset for image
-
+
if (ptrFont->flags & FONT_BLEND_EFFECT)
{
ptrFont->spr.r += 8;
@@ -188,13 +188,13 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...) Serial_printf("Char: %c, spr.u = %d, spr.v = %d\n",str[i],ptrFont->spr.u, ptrFont->spr.v);
Serial_printf("Sprite CX = %d, sprite CY = %d\n",ptrFont->spr.cx, ptrFont->spr.cy);*/
//Serial_printf("Sprite rgb={%d,%d,%d}\n",ptrFont->spr.r, ptrFont->spr.g, ptrFont->spr.b);
-
+
GfxSortSprite(&ptrFont->spr);
x += ptrFont->char_spacing;
break;
}
}
-
+
if (ptrFont->flags & FONT_BLEND_EFFECT)
{
ptrFont->spr.r = _blend_effect_lum;
diff --git a/Source/Game.c b/Source/Game.c index 102b9f3..2fc14ad 100644 --- a/Source/Game.c +++ b/Source/Game.c @@ -102,7 +102,7 @@ enum LAST_BUILDING = BUILDING_GATE, MAX_BUILDING_ID }; - + enum { TILE_GRASS = 0, @@ -127,12 +127,12 @@ enum TILE_RWY_EXIT, TILE_TAXIWAY_CORNER_GRASS_2, - + LAST_TILE_TILESET1 = TILE_TAXIWAY_CORNER_GRASS_2 }; enum -{ +{ LAST_TILE_TILESET2 = LAST_TILE_TILESET1 }; @@ -243,7 +243,7 @@ static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\TILESET1.TIM;1" , "cdrom:\\DATA\\SOUNDS\\RCTM1F1.VAG;1" , "cdrom:\\DATA\\SOUNDS\\TAKEOFF1.VAG;1" , "cdrom:\\DATA\\SOUNDS\\BEEP.VAG;1" }; - + static void* GameFileDest[] = { (GsSprite*)&GameTilesetSpr , (GsSprite*)&GamePlaneSpr , NULL , // CLT files must use NULL pointers @@ -257,10 +257,10 @@ static void* GameFileDest[] = { (GsSprite*)&GameTilesetSpr , static char* GamePlt[] = { "cdrom:\\DATA\\LEVELS\\LEVEL1.PLT;1" }; static void* GamePltDest[] = {(TYPE_FLIGHT_DATA*)&FlightData }; - + static char* GameLevelList[] = {"cdrom:\\DATA\\LEVELS\\LEVEL1.LVL;1"}; static uint16_t GameLevelBuffer[GAME_MAX_MAP_SIZE]; - + static uint8_t GameLevelColumns; static uint8_t GameLevelSize; @@ -277,59 +277,59 @@ static bool TwoPlayersActive; bool GameFinishedFlag; /* *************************************************************************************** - * + * * @name: void Game(bool two_players) - * + * * @author: Xavier Del Campo * * @brief: * Game main loop. Called by "Menu" module. - * + * * @remarks: - * + * * ***************************************************************************************/ void Game(bool two_players) -{ +{ TwoPlayersActive = two_players; GameInit(); - + while (1) { if (GameExit() == true) { break; } - + GameEmergencyMode(); - + GameCalculations(); - + GameGraphics(); - + if (GameStartupFlag == true) { GameStartupFlag = false; } } - + GfxDisableSplitScreen(); - + EndAnimation(); } /* *************************************************************************************** - * + * * @name: bool GameExit(void) - * + * * @author: Xavier Del Campo * * @brief: * Evaluates special conditions which end current game and return to main menu. - * + * * @returns: * True if game has to be exitted, false otherwise. - * + * * ***************************************************************************************/ bool GameExit(void) @@ -362,16 +362,16 @@ bool GameExit(void) } /* *************************************************************************************** - * + * * @name: bool GamePause(void) - * + * * @author: Xavier Del Campo * * @brief: * When PAD_START is pressed, it draws a rectangle on top of the screen and the game halts. - * + * * @remarks: - * + * * ***************************************************************************************/ bool GamePause(void) @@ -379,12 +379,12 @@ bool GamePause(void) TYPE_PLAYER* ptrPlayer; uint8_t i; bool pause_flag = false; - + if (GameStartupFlag == true) { return false; } - + for (i = 0 ; i < MAX_PLAYERS ; i++) { ptrPlayer = &PlayerData[i]; @@ -400,30 +400,30 @@ bool GamePause(void) } } } - + if (pause_flag == true) - { + { // Blocking function: // * Returns true if player pointed to by ptrPlayer wants to exit game // * Returns false if player pointed to by ptrPlayer wants to resume game return GameGuiPauseDialog(ptrPlayer); } - + return false; } /* *************************************************************************************** - * + * * @name: void GameInit(void) - * + * * @author: Xavier Del Campo * * @brief: * Game basic parameters initialization. - * + * * @remarks: * Tilesets and buildings are only loaded on first game. Then, only PLT is loaded. - * + * * ***************************************************************************************/ void GameInit(void) @@ -431,7 +431,7 @@ void GameInit(void) uint8_t i; uint32_t track; static bool firstLoad = true; - + GameStartupFlag = true; if (firstLoad == true) @@ -448,17 +448,17 @@ void GameInit(void) GamePltDest, sizeof(GamePlt) / sizeof(GamePlt[0]), sizeof(GamePltDest) / sizeof(GamePltDest[0]) ); - + GameLoadLevel(); - + GameGuiInit(); GameBuildingsInit(); - + memset(GameRwy,0,GAME_MAX_RUNWAYS * sizeof(uint16_t) ); - + memset(GameUsedRwy,0,GAME_MAX_RUNWAYS * sizeof(uint16_t) ); - + PlayerData[PLAYER_ONE].Active = true; PlayerData[PLAYER_ONE].PadKeyPressed_Callback = &PadOneKeyPressed; PlayerData[PLAYER_ONE].PadKeyReleased_Callback = &PadOneKeyReleased; @@ -467,11 +467,11 @@ void GameInit(void) PlayerData[PLAYER_ONE].PadLastKeySinglePressed_Callback = &PadOneGetLastKeySinglePressed; PlayerData[PLAYER_ONE].FlightDataPage = 0; PlayerData[PLAYER_ONE].UnboardingSequenceIdx = 0; - + memset(PlayerData[PLAYER_ONE].UnboardingSequence, 0, GAME_MAX_SEQUENCE_KEYS * sizeof(unsigned short) ); - + PlayerData[PLAYER_TWO].Active = TwoPlayersActive? true : false; - + if (PlayerData[PLAYER_TWO].Active == true) { PlayerData[PLAYER_TWO].PadKeyPressed_Callback = &PadTwoKeyPressed; @@ -481,9 +481,9 @@ void GameInit(void) PlayerData[PLAYER_TWO].PadKeySinglePress_Callback = &PadTwoKeySinglePress; PlayerData[PLAYER_TWO].PadLastKeySinglePressed_Callback = &PadTwoGetLastKeySinglePressed; PlayerData[PLAYER_TWO].UnboardingSequenceIdx = 0; - + memset(PlayerData[PLAYER_TWO].UnboardingSequence, 0, GAME_MAX_SEQUENCE_KEYS * sizeof(unsigned short) ); - + // On 2-player mode, one player controls departure flights and // other player controls arrival flights. PlayerData[PLAYER_ONE].FlightDirection = DEPARTURE; @@ -493,7 +493,7 @@ void GameInit(void) { PlayerData[PLAYER_ONE].FlightDirection = DEPARTURE | ARRIVAL; } - + for (i = 0; i < MAX_PLAYERS ; i++) { CameraInit(&PlayerData[i]); @@ -507,11 +507,11 @@ void GameInit(void) PlayerData[i].WaypointIdx = 0; PlayerData[i].LastWaypointIdx = 0; } - + GameAircraftCreatedFlag = false; GameAircraftCollisionFlag = false; GameAircraftCollisionIdx = 0; - + if (GameTwoPlayersActive() == true) { GameMouseSpr.x = MOUSE_X_2PLAYER; @@ -522,7 +522,7 @@ void GameInit(void) GameMouseSpr.x = MOUSE_X; GameMouseSpr.y = MOUSE_Y; } - + GameMouseSpr.w = MOUSE_W; GameMouseSpr.h = MOUSE_H; GameMouseSpr.attribute = COLORMODE(COLORMODE_16BPP); @@ -535,37 +535,37 @@ void GameInit(void) spawnMinTimeFlag = false; GameScore = 0; - + GameGetRunwayArray(); - + GameSelectedTile = 0; GameFinishedFlag = false; - + AircraftInit(); - + LoadMenuEnd(); - + //GfxSetGlobalLuminance(0); - + track = SystemRand(GAMEPLAY_FIRST_TRACK, GAMEPLAY_LAST_TRACK); - - SfxPlayTrack(track); + + SfxPlayTrack(track); } /* *************************************************************************************** - * + * * @name: void GameBuildingsInit(void) - * + * * @author: Xavier Del Campo * - * + * * @brief: * Reportedly, it initializes coordinate/size data for each building instance. - * + * * @remarks: * - * + * * ***************************************************************************************/ void GameBuildingsInit(void) @@ -621,7 +621,7 @@ void GameBuildingsInit(void) BUILDING_HANGAR_ORIGIN_X = 20, BUILDING_HANGAR_ORIGIN_Y = 11, - + BUILDING_ATC_TOWER_ORIGIN_X = 12, BUILDING_ATC_TOWER_ORIGIN_Y = 20, }; @@ -680,7 +680,7 @@ void GameBuildingsInit(void) GameBuildingData[BUILDING_GATE].IsoPos.x = BUILDING_GATE_OFFSET_X; GameBuildingData[BUILDING_GATE].IsoPos.y = BUILDING_GATE_OFFSET_Y; // z coordinate set to 0 by default. - + /*BUILDING_ILS, BUILDING_ATC_TOWER, BUILDING_ATC_LOC, @@ -690,19 +690,19 @@ void GameBuildingsInit(void) } /* *************************************************************************************** - * + * * @name: void GameEmergencyMode(void) - * + * * @author: Xavier Del Campo * - * + * * @brief: * Draws a blue rectangle on top of the screen whenever one of the two active controllers * (e.g.: pad1 on single player mode, pad1 || pad2 on two player mode) is disconnected. - * + * * @remarks: * See PSX_PollPad(), defined on psx.h, and Pad module for further information. - * + * * ***************************************************************************************/ void GameEmergencyMode(void) @@ -716,10 +716,10 @@ void GameEmergencyMode(void) { ERROR_RECT_X = 32, ERROR_RECT_W = X_SCREEN_RESOLUTION - (ERROR_RECT_X << 1), - + ERROR_RECT_Y = 16, ERROR_RECT_H = Y_SCREEN_RESOLUTION - (ERROR_RECT_Y << 1), - + ERROR_RECT_R = 0, ERROR_RECT_G = 32, ERROR_RECT_B = NORMAL_LUMINANCE @@ -731,7 +731,7 @@ void GameEmergencyMode(void) PAD_DISCONNECTED_TEXT_Y = 48, PAD_DISCONNECTED_TEXT_Y_OFFSET_BITSHIFT = 5 }; - + do { bool enabled = false; @@ -748,10 +748,10 @@ void GameEmergencyMode(void) { // One of the pads has been disconnected during gameplay // Show an error screen until it is disconnected again. - + GsSortCls(0,0,0); GsSortRectangle(&errorRct); - + for (i = 0; i < MAX_PLAYERS; i++) { if (disconnected_players & (1<<i) ) @@ -762,7 +762,7 @@ void GameEmergencyMode(void) "Pad %s disconnected", i? "right" : "left" ); } } - + GfxDrawScene_Slow(); } @@ -790,21 +790,21 @@ void GameEmergencyMode(void) } /* *************************************************************************************** - * + * * @name: void GameGetAircraftTilemap(uint8_t i) - * + * * @author: Xavier Del Campo * * @param: * uint8_t i: * Index for FlightData table. - * + * * @brief: * On each cycle, it creates a 2-dimensional array relating aircraft indexes against * tile numbers. - * + * * @remarks: - * + * * ***************************************************************************************/ void GameGetAircraftTilemap(uint8_t i) @@ -816,7 +816,7 @@ void GameGetAircraftTilemap(uint8_t i) { memset(GameAircraftTilemap, FLIGHT_DATA_INVALID_IDX, sizeof(GameAircraftTilemap) ); } - + if (FlightData.State[i] == STATE_IDLE) { return; @@ -832,26 +832,26 @@ void GameGetAircraftTilemap(uint8_t i) break; } } - + GameAircraftTilemap[tileNr][j] = i; //Serial_printf("GameAircraftTileMap[%d][%d] = %d\n", tileNr, j, GameAircraftTilemap[tileNr][j]); } /* *************************************************************************************** - * + * * @name: void GameCalculations(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * First half of game execution. Executed when GPU is still drawing previous frame. * Calculates all new states and values. - * + * * @remarks: * Since the GPU takes a long time to draw a frame, GameCalculations() should be used * for all CPU-intensive tasks. - * + * * ***************************************************************************************/ void GameCalculations(void) @@ -871,10 +871,10 @@ void GameCalculations(void) GameRemainingAircraft(i); GameGetAircraftTilemap(i); } - + AircraftHandler(); GameGuiCalculateSlowScore(); - + for (i = 0 ; i < MAX_PLAYERS ; i++) { // Run player-specific functions for each player @@ -886,9 +886,9 @@ void GameCalculations(void) } /* *************************************************************************************** - * + * * @name: void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -898,12 +898,12 @@ void GameCalculations(void) * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Calls all routines attached to a player. - * + * * @remarks: - * + * * ***************************************************************************************/ void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) @@ -921,7 +921,7 @@ void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) TYPE_ISOMETRIC_POS IsoPos = AircraftGetIsoPos(GameAircraftCollisionIdx); CameraMoveToIsoPos(ptrPlayer, IsoPos); } - + GameStateUnboarding(ptrPlayer, ptrFlightData); GameStateLockTarget(ptrPlayer, ptrFlightData); GameStateSelectRunway(ptrPlayer, ptrFlightData); @@ -934,16 +934,16 @@ void GamePlayerHandler(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) } /* ******************************************************************* - * + * * @name: void GameClock(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Handles game clock later rendered on GameGui. - * + * * @remarks: - * + * * *******************************************************************/ void GameClock(void) @@ -951,13 +951,13 @@ void GameClock(void) if (System1SecondTick() == true) { GameMinutes++; - + if (GameMinutes >= 60) { GameHour++; GameMinutes = 0; } - + if (GameHour >= 24) { GameHour = 0; @@ -966,24 +966,24 @@ void GameClock(void) } /* ******************************************************************* - * + * * @name: void GameClockFlights(uint8_t i) - * + * * @author: Xavier Del Campo - * + * * @param: * uint8_t i: * Index for FlightData table. - * + * * @brief: * Handles hours/minutes values for all active aircraft. - * + * * @remarks: - * + * * *******************************************************************/ void GameClockFlights(uint8_t i) -{ +{ if (System1SecondTick() == true) { if ( (FlightData.Minutes[i] == 0) @@ -993,7 +993,7 @@ void GameClockFlights(uint8_t i) FlightData.Minutes[i] = 60; FlightData.Hours[i]--; } - + if (FlightData.Minutes[i] > 0) { FlightData.Minutes[i]--; @@ -1009,21 +1009,21 @@ void GameClockFlights(uint8_t i) } /* ******************************************************************* - * + * * @name: void GameGraphics(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Second half of game execution. Once GameCalculations() has ended, * states and new values have been calculated and all primitives are * rendered depending on the obtained results. - * + * * @remarks: * It is advisable to keep CPU usage here, as once this function is * entered, GPU is waiting for primitive data. Always try to move * CPU-intensive operations to GameCalculations(). - * + * * *******************************************************************/ void GameGraphics(void) @@ -1032,14 +1032,14 @@ void GameGraphics(void) bool split_screen = false; SystemAcknowledgeFrame(); - + while ( (SystemRefreshNeeded() == false) || (GfxIsGPUBusy() == true) ); if (TwoPlayersActive == true) { split_screen = true; } - + if (GfxGetGlobalLuminance() < NORMAL_LUMINANCE) { // Fading from black effect on startup. @@ -1049,7 +1049,7 @@ void GameGraphics(void) GsSortCls(0,0,GfxGetGlobalLuminance() >> 1); while (GsIsDrawing()); - + for (i = 0; i < MAX_PLAYERS ; i++) { TYPE_PLAYER* ptrPlayer = &PlayerData[i]; @@ -1060,7 +1060,7 @@ void GameGraphics(void) { GfxSetSplitScreen(i); } - + // Draw half split screen for each player // only if 2-player mode is active. Else, render // the whole screen as usual. @@ -1075,7 +1075,7 @@ void GameGraphics(void) GameRenderBuildingAircraft(ptrPlayer); GameGuiAircraftList(ptrPlayer, &FlightData); - + GameDrawMouse(ptrPlayer); GameGuiDrawUnboardingSequence(ptrPlayer); @@ -1087,18 +1087,18 @@ void GameGraphics(void) } } } - + // Avoid changing drawing environment twice on 1-player mode // as it doesn't make any sense. if (split_screen == true) { GfxDisableSplitScreen(); } - + // Draw common elements for both players (messages, clock...) - + GameGuiBubble(&FlightData); - + GameGuiClock(GameHour,GameMinutes); GameGuiShowScore(); @@ -1112,17 +1112,17 @@ void GameGraphics(void) } /* ******************************************************************* - * + * * @name: void GameGraphics(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Determines rendering order depending on building/aircraft * isometric position data. - * + * * @remarks: - * + * * *******************************************************************/ void GameRenderBuildingAircraft(TYPE_PLAYER* ptrPlayer) @@ -1153,7 +1153,7 @@ void GameRenderBuildingAircraft(TYPE_PLAYER* ptrPlayer) for (j = 0; j < GAME_MAX_AIRCRAFT_PER_TILE; j++) { uint8_t AircraftIdx = GameAircraftTilemap[tileNr][j]; - + TYPE_ISOMETRIC_POS aircraftIsoPos = AircraftGetIsoPos(AircraftIdx); if (AircraftIdx == FLIGHT_DATA_INVALID_IDX) @@ -1220,7 +1220,7 @@ void GameRenderBuildingAircraft(TYPE_PLAYER* ptrPlayer) bool buildingDrawn = false; // Define new coordinates for building. - + GameBuildingSpr.x = buildingCartPos.x - GameBuildingData[CurrentBuilding].orig_x; GameBuildingSpr.y = buildingCartPos.y - GameBuildingData[CurrentBuilding].orig_y; @@ -1241,13 +1241,13 @@ void GameRenderBuildingAircraft(TYPE_PLAYER* ptrPlayer) GameBuildingSpr.u = orig_u; GameBuildingSpr.v = orig_v; - + buildingDrawn = true; } break; } - + if (Aircraft_Y_Data[k] < buildingIsoPos.y) { AircraftRender(ptrPlayer, AircraftRenderOrder[k]); @@ -1260,10 +1260,10 @@ void GameRenderBuildingAircraft(TYPE_PLAYER* ptrPlayer) GameBuildingSpr.u = orig_u; GameBuildingSpr.v = orig_v; - + buildingDrawn = true; } - + AircraftRender(ptrPlayer, AircraftRenderOrder[k]); } } @@ -1282,104 +1282,104 @@ void GameRenderBuildingAircraft(TYPE_PLAYER* ptrPlayer) } /* ******************************************************************* - * + * * @name: void GameLoadLevel(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Loads and parses *.LVL data. - * - * + * + * * @remarks: * Filepath for *.LVL is given by GameLevelList[0]. Do NOT ever move * it from there to avoid problems! - * + * * *******************************************************************/ void GameLoadLevel(void) -{ +{ uint8_t i = 0; uint8_t* ptrBuffer; char LevelHeader[LEVEL_MAGIC_NUMBER_SIZE + 1]; - + /* TODO - Very important */ // Map contents (that means, without header) should be copied to GameLevelBuffer // Header treatment (magic number, map size, map title...) should be done // using System's file buffer. - + if (SystemLoadFile(GameLevelList[0]) == false) { return; } - + ptrBuffer = SystemGetBufferAddress(); - + //SystemLoadFileToBuffer(GameLevelList[0],GameLevelBuffer,GAME_MAX_MAP_SIZE); - + memset(LevelHeader,0, LEVEL_MAGIC_NUMBER_SIZE + 1); - + memcpy(LevelHeader,ptrBuffer,LEVEL_MAGIC_NUMBER_SIZE); - + LevelHeader[LEVEL_MAGIC_NUMBER_SIZE] = '\0'; - + Serial_printf("Level header: %s\n",LevelHeader); - + if (strncmp(LevelHeader,LEVEL_MAGIC_NUMBER_STRING,LEVEL_MAGIC_NUMBER_SIZE) != 0) { Serial_printf("Invalid level header! Read \"%s\" instead of \"ATC\"\n",LevelHeader); return; } - + i += LEVEL_MAGIC_NUMBER_SIZE; - + GameLevelColumns = ptrBuffer[i++]; - + Serial_printf("Level size: %d\n",GameLevelColumns); - + if ( (GameLevelColumns < MIN_MAP_COLUMNS) || (GameLevelColumns > MAX_MAP_COLUMNS) ) { - Serial_printf("Invalid map size! Value: %d\n",GameLevelColumns); + Serial_printf("Invalid map size! Value: %d\n",GameLevelColumns); return; } - + GameLevelSize = GameLevelColumns * GameLevelColumns; - + memset(GameLevelTitle,0,LEVEL_TITLE_SIZE); - + memcpy(GameLevelTitle,&ptrBuffer[i],LEVEL_TITLE_SIZE); - + Serial_printf("Game level title: %s\n",GameLevelTitle); - + i += LEVEL_TITLE_SIZE; - + memset(GameLevelBuffer,0,GAME_MAX_MAP_SIZE); - + i = LEVEL_HEADER_SIZE; - + memcpy(GameLevelBuffer, &ptrBuffer[i], GameLevelSize * sizeof(uint16_t)); // 2 bytes per tile } /* ****************************************************************************************** - * + * * @name: void GameAircraftState(uint8_t i) - * + * * @author: Xavier Del Campo * * @param: * uint8_t i: * Index for FlightData table. - * + * * @brief: * It determines what state should be applied to aircraft when spawn timer expires. - * + * * @remarks: * This is where TYPE_FLIGHT_DATA is transferred to TYPE_AIRCRAFT on departure. - * + * * ******************************************************************************************/ - + void GameAircraftState(uint8_t i) { uint16_t target[2] = {0}; @@ -1387,7 +1387,7 @@ void GameAircraftState(uint8_t i) // target which is the parking tile itself, and the second element // is just the NULL character. // Not an ideal solution, but the best one currently available. - + if (FlightData.Finished[i] == false) { if ( (FlightData.Hours[i] == 0) @@ -1434,11 +1434,11 @@ void GameAircraftState(uint8_t i) // Create notification request for incoming aircraft GameGuiBubbleShow(); - + target[0] = FlightData.Parking[i]; - + Serial_printf("Target assigned = %d\n", target[0]); - + if (AircraftAddNew(&FlightData, i, target) == false) { Serial_printf("Exceeded maximum aircraft number!\n"); @@ -1470,23 +1470,23 @@ void GameAircraftState(uint8_t i) } /* ****************************************************************************************** - * + * * @name: void GameRenderLevel(TYPE_PLAYER* ptrPlayer) - * + * * @author: Xavier Del Campo * * @param: * TYPE_PLAYER* ptrPlayer: * Pointer to a player structure * - * + * * @brief: * Draws all tiles depending on GameLevelBuffer configuration. - * + * * @remarks: * Tiles are usually rendered with normal RGB values unless parking/runway is busy * or ptrPlayer->InvalidPath == true. - * + * * ******************************************************************************************/ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) @@ -1504,21 +1504,21 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) //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 == true) { - + /*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: @@ -1533,16 +1533,16 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) // | | | | V Tile, bit 5 // | | V Tile, bit 6 // | Tile mirror flag - + uint8_t CurrentTile = (uint8_t)(GameLevelBuffer[i] & 0x00FF); // Isometric -> Cartesian conversion tileIsoPos.x = columns << (TILE_SIZE_BIT_SHIFT); tileIsoPos.y = rows << (TILE_SIZE_BIT_SHIFT); tileIsoPos.z = 0; - + tileCartPos = GfxIsometricToCartesian(&tileIsoPos); - + // Flipped tiles have bit 7 set. if (CurrentTile & TILE_MIRROR_FLAG) { @@ -1554,7 +1554,7 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) { flip_id = false; } - + if (CurrentTile <= LAST_TILE_TILESET1) { // Draw using GameTilesetSpr @@ -1572,19 +1572,19 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) ptrTileset = NULL; continue; - + // if (flip_id == false) // { // continue; // } } - + ptrTileset->w = TILE_SIZE; ptrTileset->h = TILE_SIZE_H; ptrTileset->x = tileCartPos.x; ptrTileset->y = tileCartPos.y; - + // Set coordinate origin to left upper corner ptrTileset->x -= TILE_SIZE >> 1; //ptrTileset->y -= TILE_SIZE_H >> 2; @@ -1609,14 +1609,14 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) ptrTileset->r = NORMAL_LUMINANCE; ptrTileset->g = NORMAL_LUMINANCE; ptrTileset->b = NORMAL_LUMINANCE; - + if ( (ptrPlayer->SelectRunway == true) && (i != 0) && (SystemContains_u16(i, ptrPlayer->RwyArray, GAME_MAX_RWY_LENGTH) == true) ) { - + if (used_rwy == true) { ptrTileset->r = rwy_sine; @@ -1674,13 +1674,13 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) //init_timer_value = GetRCnt(2); //end_timer_value = GetRCnt(2); - + ptrTileset->r = NORMAL_LUMINANCE >> 2; ptrTileset->g = rwy_sine; ptrTileset->b = NORMAL_LUMINANCE >> 2; } } - + if (ptrTileset != NULL) { if (flip_id == true) @@ -1688,13 +1688,13 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) ptrTileset->attribute |= H_FLIP; } } - + ptrTileset->u = (short)(CurrentTile % 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->my = ptrTileset->v + (TILE_SIZE_H >> 1); - + if (flip_id == true) { flip_id = false; @@ -1704,7 +1704,7 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) // Serial_printf("Tile %d, attribute 0x%X\n",i,ptrTileset->attribute); GfxSortSprite(ptrTileset); - + if (ptrTileset->attribute & H_FLIP) { ptrTileset->attribute &= ~(H_FLIP); @@ -1719,18 +1719,18 @@ void GameRenderLevel(TYPE_PLAYER* ptrPlayer) } /* ******************************************************************* - * + * * @name: void GameSetTime(uint8_t hour, uint8_t minutes) - * + * * @author: Xavier Del Campo - * + * * @brief: * Reportedly, it sets game time to specified hour and minutes. - * - * + * + * * @remarks: * To be used on GameInit() after PLT file parsing. - * + * * *******************************************************************/ void GameSetTime(uint8_t hour, uint8_t minutes) @@ -1740,23 +1740,23 @@ void GameSetTime(uint8_t hour, uint8_t minutes) } /* ******************************************************************* - * + * * @name: void GameActiveAircraft(uint8_t i) - * + * * @author: Xavier Del Campo * * @param: * uint8_t i: * Index from FlightData array. - * + * * @brief: * On each game cycle, FlightData.ActiveAircraft is set to 0 and * number of active aircraft is recalculated. - * + * * @remarks: * Called ciclically from GameCalculations(). This function is * executed GAME_MAX_AIRCRAFT times on each cycle. - * + * * *******************************************************************/ void GameActiveAircraft(uint8_t i) @@ -1767,7 +1767,7 @@ void GameActiveAircraft(uint8_t i) { FlightData.ActiveAircraft = 0; } - + if (FlightData.State[i] != STATE_IDLE) { FlightData.ActiveAircraft++; @@ -1775,9 +1775,9 @@ void GameActiveAircraft(uint8_t i) } /* ****************************************************************************************** - * + * * @name: void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -1787,14 +1787,14 @@ void GameActiveAircraft(uint8_t i) * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Handles ptrPlayer->ShowAircraftData state. - * - * + * + * * @remarks: * Called ciclically from GamePlayerHandler(). - * + * * ******************************************************************************************/ void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) @@ -1806,7 +1806,7 @@ void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightDa ptrPlayer->ShowAircraftData = false; } } - + if (ptrPlayer->PadKeySinglePress_Callback(PAD_CIRCLE) == true) { if (GameGuiShowAircraftDataSpecialConditions(ptrPlayer) == false) @@ -1818,9 +1818,9 @@ void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightDa } /* ****************************************************************************************** - * + * * @name: void GameStateLockTarget(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -1830,20 +1830,20 @@ void GameStateShowAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightDa * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Handles ptrPlayer->LockTarget state. - * - * + * + * * @remarks: * Called ciclically from GamePlayerHandler(). - * + * ******************************************************************************************/ void GameStateLockTarget(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) { uint8_t AircraftIdx = ptrPlayer->FlightDataSelectedAircraft; - + if (ptrPlayer->LockTarget == true) { if (ptrPlayer->LockedAircraft != FLIGHT_DATA_INVALID_IDX) @@ -1851,7 +1851,7 @@ void GameStateLockTarget(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData CameraMoveToIsoPos(ptrPlayer, AircraftGetIsoPos(ptrPlayer->LockedAircraft) ); } } - + if (ptrPlayer->PadKeySinglePress_Callback(PAD_SQUARE) == true) { if (ptrPlayer->LockTarget == false) @@ -1886,9 +1886,9 @@ void GameStateLockTarget(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData } /* ****************************************************************************************** - * + * * @name: void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -1898,14 +1898,14 @@ void GameStateLockTarget(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Handler for ptrPlayer->SelectTaxiwayRunway. - * - * + * + * * @remarks: * Called ciclically from GamePlayerHandler(). - * + * * ******************************************************************************************/ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) @@ -1913,22 +1913,22 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrF TYPE_ISOMETRIC_POS IsoPos = CameraGetIsoPos(ptrPlayer); uint8_t i; uint16_t target_tile; - + /*Serial_printf("Camera is pointing to {%d,%d}\n",IsoPos.x, IsoPos.y);*/ - + if (ptrPlayer->SelectTaxiwayRunway == true) { // Under this mode, always reset locking target. ptrPlayer->LockTarget = false; ptrPlayer->LockedAircraft = FLIGHT_DATA_INVALID_IDX; - + ptrPlayer->SelectedTile = GameGetTileFromIsoPosition(&IsoPos); - + if (GamePathToTile(ptrPlayer, ptrFlightData) == false) { ptrPlayer->InvalidPath = true; } - + if (ptrPlayer->PadKeySinglePress_Callback(PAD_TRIANGLE) == true) { // State exit. @@ -1948,14 +1948,14 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrF { break; } - + ptrPlayer->LastWaypointIdx = i; } - + target_tile = GameLevelBuffer[ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx]]; SfxPlaySound(&BeepSnd); - + switch(target_tile) { case TILE_RWY_HOLDING_POINT: @@ -1967,14 +1967,14 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrF case TILE_RWY_HOLDING_POINT_2 | TILE_MIRROR_FLAG: AircraftFromFlightDataIndexAddTargets(ptrPlayer->FlightDataSelectedAircraft, ptrPlayer->Waypoints); Serial_printf("Added these targets to aircraft %d:\n", ptrPlayer->FlightDataSelectedAircraft); - + for (i = 0; i < PLAYER_MAX_WAYPOINTS; i++) { Serial_printf("%d ",ptrPlayer->Waypoints[i]); } - + Serial_printf("\n"); - + // Clear waypoints array. memset(ptrPlayer->Waypoints, 0, sizeof(uint16_t) * PLAYER_MAX_WAYPOINTS); @@ -1984,11 +1984,11 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrF ptrPlayer->LockedAircraft = FLIGHT_DATA_INVALID_IDX; ptrPlayer->LockTarget = false; ptrPlayer->SelectTaxiwayRunway = false; - + ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] = STATE_TAXIING; GameScore += SCORE_REWARD_TAXIING; break; - + default: break; } @@ -1998,9 +1998,9 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrF } /* ************************************************************************************************** - * + * * @name: void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -2010,12 +2010,12 @@ void GameStateSelectTaxiwayRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrF * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Handler for ptrPlayer->SelectTaxiwayParking. - * + * * @remarks: - * + * * **************************************************************************************************/ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) @@ -2023,20 +2023,20 @@ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptr TYPE_ISOMETRIC_POS IsoPos = CameraGetIsoPos(ptrPlayer); uint8_t i; uint16_t target_tile; - + if (ptrPlayer->SelectTaxiwayParking == true) { // Under this mode, always reset locking target. ptrPlayer->LockTarget = false; ptrPlayer->LockedAircraft = FLIGHT_DATA_INVALID_IDX; - + ptrPlayer->SelectedTile = GameGetTileFromIsoPosition(&IsoPos); - + if (GamePathToTile(ptrPlayer, ptrFlightData) == false) { ptrPlayer->InvalidPath = true; } - + if (ptrPlayer->PadKeySinglePress_Callback(PAD_TRIANGLE) == true) { // State exit. @@ -2056,21 +2056,21 @@ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptr { break; } - + ptrPlayer->LastWaypointIdx = i; } - + target_tile = GameLevelBuffer[ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx]]; - + Serial_printf("ptrPlayer->LastWaypointIdx = %d\n", ptrPlayer->LastWaypointIdx); - + Serial_printf("target_tile = %d, TILE_PARKING = %d\n", target_tile, TILE_PARKING); SfxPlaySound(&BeepSnd); - + if ( (target_tile == TILE_PARKING) || (target_tile == (TILE_PARKING | TILE_MIRROR_FLAG)) @@ -2081,22 +2081,22 @@ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptr { // TODO: Assign path to aircraft AircraftFromFlightDataIndexAddTargets(ptrPlayer->FlightDataSelectedAircraft, ptrPlayer->Waypoints); - + Serial_printf("Added these targets to aircraft %d:\n", ptrPlayer->FlightDataSelectedAircraft); - + for (i = 0; i < PLAYER_MAX_WAYPOINTS; i++) { Serial_printf("%d ",ptrPlayer->Waypoints[i]); } - + Serial_printf("\n"); - + ptrPlayer->SelectTaxiwayParking = false; // Clear waypoints array. memset(ptrPlayer->Waypoints, 0, sizeof(uint16_t) * PLAYER_MAX_WAYPOINTS); ptrPlayer->WaypointIdx = 0; ptrPlayer->LastWaypointIdx = 0; - + ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] = STATE_TAXIING; GameScore += SCORE_REWARD_TAXIING; } @@ -2106,9 +2106,9 @@ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptr } /* ************************************************************************************************** - * + * * @name: void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -2118,32 +2118,32 @@ void GameStateSelectTaxiwayParking(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptr * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Handler for ptrPlayer->SelectRunway. - * + * * @remarks: - * + * * **************************************************************************************************/ void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) -{ +{ uint8_t i; bool success; TYPE_ISOMETRIC_POS IsoPos = { GameGetXFromTile_short(GameRwy[ptrPlayer->SelectedRunway]), GameGetYFromTile_short(GameRwy[ptrPlayer->SelectedRunway]), 0 }; - + if (ptrPlayer->SelectRunway == true) - { + { // Under this mode, always reset locking target. ptrPlayer->LockTarget = false; ptrPlayer->LockedAircraft = FLIGHT_DATA_INVALID_IDX; GameGetSelectedRunwayArray(GameRwy[ptrPlayer->SelectedRunway], ptrPlayer->RwyArray, sizeof(ptrPlayer->RwyArray)); - + CameraMoveToIsoPos(ptrPlayer, IsoPos); - + if (ptrPlayer->PadKeySinglePress_Callback(PAD_TRIANGLE) == true) { ptrPlayer->SelectRunway = false; @@ -2156,9 +2156,9 @@ void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightDa { ptrPlayer->SelectRunway = false; Serial_printf("Player selected runway %d!\n",GameRwy[ptrPlayer->SelectedRunway]); - + success = false; - + for (i = 0; i < GAME_MAX_RUNWAYS; i++) { if (GameUsedRwy[i] == 0) @@ -2169,7 +2169,7 @@ void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightDa break; } } - + if (success == false) { Serial_printf("No available runways!\n"); @@ -2203,25 +2203,25 @@ void GameStateSelectRunway(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightDa } /* ************************************************************************************************** - * + * * @name: void GameGetRunwayArray(void) - * + * * @author: Xavier Del Campo * - * + * * @brief: * On startup, an array of runway headers is created from GameLevelBuffer once *.LVL is parsed. - * + * * @remarks: * Do not confuse GameRwy with GameRwyArray, which are used for completely different purposes. - * + * * **************************************************************************************************/ void GameGetRunwayArray(void) { uint8_t i; uint8_t j = 0; - + for (i = 0; i < GameLevelSize; i++) { if (GameLevelBuffer[i] == TILE_RWY_START_1) @@ -2232,26 +2232,26 @@ void GameGetRunwayArray(void) } } } - + Serial_printf("GameRwy = "); - + for (i = 0; i < GAME_MAX_RUNWAYS; i++) { if (GameRwy[i] == 0) { break; } - + Serial_printf("%d ", GameRwy[i]); } - + Serial_printf("\n"); } /* ************************************************************************************************** - * + * * @name: void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -2261,19 +2261,19 @@ void GameGetRunwayArray(void) * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Determines actions for aircraft on PAD_CROSS pressed. - * + * * @remarks: - * + * * **************************************************************************************************/ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) { uint8_t AircraftIdx = ptrPlayer->FlightDataSelectedAircraft; FL_STATE aircraftState = ptrFlightData->State[AircraftIdx]; - + if (ptrPlayer->ShowAircraftData == true) { if (ptrPlayer->PadKeySinglePress_Callback(PAD_CROSS) == true) @@ -2281,7 +2281,7 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli if (ptrPlayer->ActiveAircraft != 0) { ptrPlayer->ShowAircraftData = false; - + switch(aircraftState) { case STATE_APPROACH: @@ -2333,7 +2333,7 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli ptrPlayer->SelectedRunway = i; } break; - + default: Serial_printf("Incompatible state %d!\n",aircraftState); // States remain unchanged @@ -2344,7 +2344,7 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli break; } } - + Serial_printf("aircraftState = %d\n", aircraftState); Serial_printf("AircraftIdx = %d\n", AircraftIdx); } @@ -2365,9 +2365,9 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli } /* ************************************************************************************************** - * + * * @name: void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t sz) - * + * * @author: Xavier Del Campo * * @param: @@ -2382,13 +2382,13 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli * * size_t sz: * Maximum size of the array. - * + * * @brief: * Fills rwyArray with all the tile numbers (included in GameLevelBuffer) belonging to a * runway with header pointed to by rwyHeader. - * + * * @remarks: - * + * * **************************************************************************************************/ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t sz) @@ -2400,7 +2400,7 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s RWY_DIR_NORTH, RWY_DIR_SOUTH, }RWY_DIR; - + static uint16_t last_tile = 0; static uint8_t i = 0; static RWY_DIR dir; @@ -2413,7 +2413,7 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s (GAME_MAX_RWY_LENGTH * sizeof(uint16_t) ) ); return; } - + if (rwyHeader != 0) { // This function is called recursively. @@ -2422,18 +2422,18 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s // when to start creating the array. // Part one: determine runway direction and call the function again with rwyHeader == 0. - + memset(rwyArray, 0, sz); last_tile = rwyHeader; i = 0; - + switch(GameLevelBuffer[rwyHeader]) { case TILE_RWY_START_1: - dir = RWY_DIR_EAST; + dir = RWY_DIR_EAST; break; case TILE_RWY_START_2: - dir = RWY_DIR_WEST; + dir = RWY_DIR_WEST; break; case TILE_RWY_START_1 | TILE_MIRROR_FLAG: dir = RWY_DIR_SOUTH; @@ -2464,7 +2464,7 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s } //DEBUG_PRINT_VAR(i); - + rwyArray[i++] = last_tile; //DEBUG_PRINT_VAR(rwyArray[i -1]); @@ -2481,14 +2481,14 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s case RWY_DIR_SOUTH: last_tile += GameLevelColumns; } - + GameGetSelectedRunwayArray(0, rwyArray, sz); } /* ************************************************************************************************** - * + * * @name: void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -2498,13 +2498,13 @@ void GameGetSelectedRunwayArray(uint16_t rwyHeader, uint16_t* rwyArray, size_t s * TYPE_FLIGHT_DATA* ptrFlightData: * In the end, pointer to FlightData data table, which contains * information about all available flights. - * + * * @brief: * Assigns a runway to an incoming aircraft (FlightDirection == ARRIVAL) depending on * player selection. - * + * * @remarks: - * + * * **************************************************************************************************/ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) @@ -2515,47 +2515,47 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli uint32_t i; uint16_t targets[AIRCRAFT_MAX_TARGETS] = {0}; uint8_t rwyTiles[GAME_MAX_RWY_LENGTH] = {0}; - + // Remember that ptrPlayer->SelectedAircraft contains an index to // be used with ptrFlightData. - + Serial_printf("aircraftIndex = %d\n",aircraftIndex); - + if (ptrFlightData->State[aircraftIndex] == STATE_APPROACH) { uint16_t rwyArray[GAME_MAX_RWY_LENGTH]; ptrFlightData->State[aircraftIndex] = STATE_FINAL; GameScore += SCORE_REWARD_FINAL; - + GameGetSelectedRunwayArray(assignedRwy, rwyArray, sizeof(rwyArray)); - + for (i = 0; i < GAME_MAX_RWY_LENGTH; i++) { rwyTiles[i] = GameLevelBuffer[rwyArray[i]]; } - + i = SystemIndexOf_U8((uint8_t)TILE_RWY_EXIT, rwyTiles, 0, GAME_MAX_RWY_LENGTH); - + if (i == -1) { Serial_printf("ERROR: Could not find TILE_RWY_EXIT for runway header %d.\n", assignedRwy); return; } - + i = SystemIndexOf_U8((uint8_t)TILE_RWY_EXIT, rwyTiles, i + 1, GAME_MAX_RWY_LENGTH); - + if (i == -1) { Serial_printf("ERROR: Could not find second TILE_RWY_EXIT for runway header %d.\n", assignedRwy); return; - } - + } + rwyExit = rwyArray[i]; - + targets[0] = assignedRwy; targets[1] = rwyExit; - + if ( AircraftAddNew(ptrFlightData, aircraftIndex, targets ) == false) @@ -2572,7 +2572,7 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli uint8_t i; GameGetRunwayEntryTile(aircraftIndex, &rwyEntryData); - + targets[0] = rwyEntryData.rwyEntryTile; targets[1] = targets[0] + rwyEntryData.rwyStep; @@ -2588,9 +2588,9 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli AircraftAddTargets(AircraftFromFlightDataIndex(aircraftIndex), targets); ptrFlightData->State[aircraftIndex] = STATE_ENTERING_RWY; - + /*uint16_t i; - + i = rwyEntryData.rwyEntryTile; @@ -2610,9 +2610,9 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli } /* ******************************************************************* - * + * * @name: short GameGetXFromTile_short(uint16_t tile) - * + * * @author: Xavier Del Campo * * @param: @@ -2622,29 +2622,29 @@ void GameAssignRunwaytoAircraft(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli * @return: * Returns relative X position (no fixed-point arithmetic) given * a tile number from GameLevelBuffer. - * + * * @remarks: - * + * * *******************************************************************/ short GameGetXFromTile_short(uint16_t tile) { short retVal; - + tile %= GameLevelColumns; - + retVal = (tile << TILE_SIZE_BIT_SHIFT); - + // Always point to tile center retVal += TILE_SIZE >> 1; - + return retVal; } /* ******************************************************************* - * + * * @name: short GameGetYFromTile_short(uint16_t tile) - * + * * @author: Xavier Del Campo * * @param: @@ -2654,31 +2654,31 @@ short GameGetXFromTile_short(uint16_t tile) * @return: * Returns relative Y position (no fixed-point arithmetic) given * a tile number from GameLevelBuffer. - * + * * @remarks: - * + * * *******************************************************************/ short GameGetYFromTile_short(uint16_t tile) { short retVal; - + tile /= GameLevelColumns; - + //retVal = (fix16_t)(tile << TILE_SIZE_BIT_SHIFT); retVal = (tile << TILE_SIZE_BIT_SHIFT); - + // Always point to tile center //retVal += TILE_SIZE >> 1; retVal += TILE_SIZE >> 1; - + return retVal; } /* ******************************************************************* - * + * * @name: fix16_t GameGetXFromTile(uint16_t tile) - * + * * @author: Xavier Del Campo * * @param: @@ -2688,9 +2688,9 @@ short GameGetYFromTile_short(uint16_t tile) * @return: * Returns relative X position in 16.16 (fix16_t) fixed-point format * given a tile number from GameLevelBuffer. - * + * * @remarks: - * + * * *******************************************************************/ fix16_t GameGetXFromTile(uint16_t tile) @@ -2699,9 +2699,9 @@ fix16_t GameGetXFromTile(uint16_t tile) } /* ******************************************************************* - * + * * @name: fix16_t GameGetYFromTile(uint16_t tile) - * + * * @author: Xavier Del Campo * * @param: @@ -2711,9 +2711,9 @@ fix16_t GameGetXFromTile(uint16_t tile) * @return: * Returns relative Y position in 16.16 (fix16_t) fixed-point format * given a tile number from GameLevelBuffer. - * + * * @remarks: - * + * * *******************************************************************/ fix16_t GameGetYFromTile(uint16_t tile) @@ -2722,9 +2722,9 @@ fix16_t GameGetYFromTile(uint16_t tile) } /* **************************************************************************** - * + * * @name: FL_STATE GameTargetsReached(uint16_t firstTarget, uint8_t index) - * + * * @author: Xavier Del Campo * * @param: @@ -2739,16 +2739,16 @@ fix16_t GameGetYFromTile(uint16_t tile) * * @return: * New state for aircraft once waypoints have been reached. - * + * * @remarks: - * + * * ****************************************************************************/ FL_STATE GameTargetsReached(uint16_t firstTarget, uint8_t index) { FL_STATE retState = STATE_IDLE; uint8_t i; - + switch(FlightData.State[index]) { case STATE_FINAL: @@ -2762,7 +2762,7 @@ FL_STATE GameTargetsReached(uint16_t firstTarget, uint8_t index) } } break; - + case STATE_TAXIING: if (FlightData.FlightDirection[index] == DEPARTURE) { @@ -2781,18 +2781,18 @@ FL_STATE GameTargetsReached(uint16_t firstTarget, uint8_t index) case STATE_ENTERING_RWY: FlightData.State[index] = STATE_READY_FOR_TAKEOFF; break; - + default: break; } - + return retState; } /* **************************************************************************** - * + * * @name: uint16_t GameGetTileFromIsoPosition(TYPE_ISOMETRIC_POS* IsoPos) - * + * * @author: Xavier Del Campo * * @param: @@ -2804,48 +2804,48 @@ FL_STATE GameTargetsReached(uint16_t firstTarget, uint8_t index) * * @return: * Tile number to be used against GameLevelBuffer. - * + * * @remarks: * GameLevelColumns is used to determine tile number. - * + * * ****************************************************************************/ uint16_t GameGetTileFromIsoPosition(TYPE_ISOMETRIC_POS* IsoPos) { uint16_t tile; - + if (IsoPos == NULL) { return 0; } - + if ( (IsoPos->x < 0) || (IsoPos->y < 0) ) { return GAME_INVALID_TILE_SELECTION; // Invalid XYZ position } - + tile = IsoPos->x >> TILE_SIZE_BIT_SHIFT; tile += (IsoPos->y >> TILE_SIZE_BIT_SHIFT) * GameLevelColumns; - + /*Serial_printf("Returning tile %d from position {%d, %d, %d}\n", tile, IsoPos->x, IsoPos->y, IsoPos->z );*/ - + return tile; } /* **************************************************************************** - * + * * @name: uint8_t GameGetLevelColumns(void) - * + * * @author: Xavier Del Campo * * @return: * GameLevelColumns. Used for other modules without declaring GameLevelColumns * as a global variable. - * + * * ****************************************************************************/ uint8_t GameGetLevelColumns(void) @@ -2854,9 +2854,9 @@ uint8_t GameGetLevelColumns(void) } /* **************************************************************************** - * + * * @name: void GamePlayerAddWaypoint(TYPE_PLAYER* ptrPlayer) - * + * * @author: Xavier Del Campo * * @param: @@ -2865,7 +2865,7 @@ uint8_t GameGetLevelColumns(void) * * @brief: * Wrapper for GamePlayerAddWaypoint_Ex(). - * + * * ****************************************************************************/ void GamePlayerAddWaypoint(TYPE_PLAYER* ptrPlayer) @@ -2874,15 +2874,15 @@ void GamePlayerAddWaypoint(TYPE_PLAYER* ptrPlayer) } /* **************************************************************************** - * + * * @name: void GamePlayerAddWaypoint(TYPE_PLAYER* ptrPlayer) - * + * * @author: Xavier Del Campo * * @param: * TYPE_PLAYER* ptrPlayer: * Pointer to a player structure. - * + * * uint16_t tile: * Tile number from GameLevelBuffer. * @@ -2891,37 +2891,37 @@ void GamePlayerAddWaypoint(TYPE_PLAYER* ptrPlayer) * * @remark: * To be used together with GamePathToTile(). - * + * * ****************************************************************************/ void GamePlayerAddWaypoint_Ex(TYPE_PLAYER* ptrPlayer, uint16_t tile) { // "_Ex" function allow selecting a certain tile, whereas the other one // is a particulare case of "_Ex" for tile = ptrPlayer->SelectedTIle. - + if (ptrPlayer->WaypointIdx >= PLAYER_MAX_WAYPOINTS) { Serial_printf("No available waypoints for this player!\n"); return; } - + /*Serial_printf("Added tile %d to ptrPlayer->Waypoints[%d]\n", tile, ptrPlayer->WaypointIdx);*/ - + ptrPlayer->Waypoints[ptrPlayer->WaypointIdx++] = tile; } /* ************************************************************************************** - * + * * @name: bool GameWaypointCheckExisting(TYPE_PLAYER* ptrPlayer, uint16_t temp_tile) - * + * * @author: Xavier Del Campo * * @param: * TYPE_PLAYER* ptrPlayer: * Pointer to a player structure. - * + * * uint16_t tile: * Tile number from GameLevelBuffer. * @@ -2930,7 +2930,7 @@ void GamePlayerAddWaypoint_Ex(TYPE_PLAYER* ptrPlayer, uint16_t tile) * * @return: * True if waypoint is already included on waypoint list, false otherwise. - * + * * **************************************************************************************/ bool GameWaypointCheckExisting(TYPE_PLAYER* ptrPlayer, uint16_t temp_tile) @@ -2949,7 +2949,7 @@ bool GameWaypointCheckExisting(TYPE_PLAYER* ptrPlayer, uint16_t temp_tile) } } }*/ - + GamePlayerAddWaypoint_Ex(ptrPlayer, temp_tile); return false; @@ -2960,9 +2960,9 @@ bool GameWaypointCheckExisting(TYPE_PLAYER* ptrPlayer, uint16_t temp_tile) } /* **************************************************************************************** - * + * * @name: bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -2978,46 +2978,46 @@ bool GameWaypointCheckExisting(TYPE_PLAYER* ptrPlayer, uint16_t temp_tile) * it updates current Waypoints array with all tiles between two points. * If one of these tiles do not belong to desired tiles (i.e.: grass, * water, buildings...), then false is returned. - * + * * @return: * Returns false on invalid path or invalid tile number selected. True otherwise. - * + * * ****************************************************************************************/ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) -{ +{ uint8_t AcceptedTiles[] = { TILE_ASPHALT_WITH_BORDERS, 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_RWY_HOLDING_POINT, TILE_RWY_HOLDING_POINT_2 }; - + uint8_t i; uint8_t j; - + uint16_t x_diff; uint16_t y_diff; uint16_t temp_tile; - + if (ptrPlayer->SelectedTile == GAME_INVALID_TILE_SELECTION) { return false; } - + for (i = (ptrPlayer->LastWaypointIdx + 1); i < PLAYER_MAX_WAYPOINTS; i++) { ptrPlayer->Waypoints[i] = 0; } - + ptrPlayer->WaypointIdx = ptrPlayer->LastWaypointIdx + 1; - + x_diff = (uint16_t)abs( (ptrPlayer->SelectedTile % GameLevelColumns) - (ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx] % GameLevelColumns) ); - + 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, @@ -3026,24 +3026,24 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) 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. - + temp_tile = ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx]; - + if (x_diff >= y_diff) { while ( (x_diff--) > 0) { - if ( (ptrPlayer->SelectedTile % GameLevelColumns) > + if ( (ptrPlayer->SelectedTile % GameLevelColumns) > (ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx] % GameLevelColumns) ) { temp_tile++; @@ -3052,16 +3052,16 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) { temp_tile--; } - + if (GameWaypointCheckExisting(ptrPlayer, temp_tile) == true) { return false; // Tile is already included in the list of temporary tiles? } } - + while ( (y_diff--) > 0) { - if ( (ptrPlayer->SelectedTile / GameLevelColumns) > + if ( (ptrPlayer->SelectedTile / GameLevelColumns) > (ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx] / GameLevelColumns) ) { temp_tile += GameLevelColumns; @@ -3070,7 +3070,7 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) { temp_tile -= GameLevelColumns; } - + if (GameWaypointCheckExisting(ptrPlayer, temp_tile) == true) { return false; // Tile is already included in the list of temporary tiles? @@ -3078,10 +3078,10 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) } } else - { + { while ( (y_diff--) > 0) { - if ( (ptrPlayer->SelectedTile / GameLevelColumns) > + if ( (ptrPlayer->SelectedTile / GameLevelColumns) > (ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx] / GameLevelColumns) ) { temp_tile += GameLevelColumns; @@ -3096,10 +3096,10 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) return false; // Tile is already included in the list of temporary tiles? } } - + while ( (x_diff--) > 0) { - if ( (ptrPlayer->SelectedTile % GameLevelColumns) > + if ( (ptrPlayer->SelectedTile % GameLevelColumns) > (ptrPlayer->Waypoints[ptrPlayer->LastWaypointIdx] % GameLevelColumns) ) { temp_tile++; @@ -3108,16 +3108,16 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) { temp_tile--; } - + if (GameWaypointCheckExisting(ptrPlayer, temp_tile) == true) { return false; // Tile is already included in the list of temporary tiles? } } } - + // Now at this point, we have prepared our array. - + for (i = 0; i < PLAYER_MAX_WAYPOINTS; i++) { if (ptrPlayer->Waypoints[i] == 0) @@ -3125,18 +3125,18 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) // We have found empty waypoints. Exit loop break; } - + if (SystemContains_u8( GameLevelBuffer[ptrPlayer->Waypoints[i]], AcceptedTiles, sizeof(AcceptedTiles) ) == false) { // Now try again with mirrored tiles, just in case! - + for (j = 0; j < (sizeof(AcceptedTiles) * sizeof(uint8_t) ); j++) { AcceptedTiles[j] |= TILE_MIRROR_FLAG; } - + if (SystemContains_u8( GameLevelBuffer[ptrPlayer->Waypoints[i]], AcceptedTiles, sizeof(AcceptedTiles) ) == false) @@ -3144,23 +3144,23 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) // Both cases have failed. Return from function. return false; } - + // Reverse mirror flag. - + for (j = 0; j < (sizeof(AcceptedTiles) * sizeof(uint8_t) ); j++) { AcceptedTiles[j] &= ~(TILE_MIRROR_FLAG); } } } - + return true; } /* **************************************************************************************** - * + * * @name: TYPE_ISOMETRIC_POS GameSelectAircraft(TYPE_PLAYER* ptrPlayer) - * + * * @author: Xavier Del Campo * * @param: @@ -3169,26 +3169,26 @@ bool GamePathToTile(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) * * @brief: * Moves player camera position to selected aircraft. - * + * * @return: * Isometric position of selected aircraft. - * + * * ****************************************************************************************/ TYPE_ISOMETRIC_POS GameSelectAircraft(TYPE_PLAYER* ptrPlayer) { uint8_t AircraftIdx = ptrPlayer->FlightDataSelectedAircraft; TYPE_ISOMETRIC_POS IsoPos = AircraftGetIsoPos(AircraftIdx); - + CameraMoveToIsoPos(ptrPlayer, IsoPos); - + return IsoPos; } /* ******************************************************************************** - * + * * @name: void GameSelectAircraftWaypoint(TYPE_PLAYER* ptrPlayer) - * + * * @author: Xavier Del Campo * * @param: @@ -3197,28 +3197,28 @@ TYPE_ISOMETRIC_POS GameSelectAircraft(TYPE_PLAYER* ptrPlayer) * * @brief: * Moves player camera to selected aircraft and adds first waypoint. - * + * * ********************************************************************************/ void GameSelectAircraftWaypoint(TYPE_PLAYER* ptrPlayer) { TYPE_ISOMETRIC_POS IsoPos = GameSelectAircraft(ptrPlayer); - + ptrPlayer->SelectedTile = GameGetTileFromIsoPosition(&IsoPos); - + GamePlayerAddWaypoint(ptrPlayer); } /* ******************************************************************************** - * + * * @name: bool GameTwoPlayersActive(void) - * + * * @author: Xavier Del Campo * * @return: * Returns if a second player is active. To be used with other modules without * declaring TwoPlayersActive as a global variable. - * + * * ********************************************************************************/ bool GameTwoPlayersActive(void) @@ -3227,18 +3227,18 @@ bool GameTwoPlayersActive(void) } /* ***************************************************************** - * + * * @name: void GameDrawMouse(TYPE_PLAYER* ptrPlayer) - * + * * @author: Xavier Del Campo * * @param: * TYPE_PLAYER* ptrPlayer: * Pointer to a player structure - * + * * @brief: * Draws GameMouseSpr under determined player states. - * + * * *****************************************************************/ void GameDrawMouse(TYPE_PLAYER* ptrPlayer) @@ -3252,9 +3252,9 @@ void GameDrawMouse(TYPE_PLAYER* ptrPlayer) } /* ******************************************************************************** - * + * * @name: FL_STATE GameGetFlightDataStateFromIdx(uint8_t FlightDataIdx) - * + * * @author: Xavier Del Campo * * @param: @@ -3263,7 +3263,7 @@ void GameDrawMouse(TYPE_PLAYER* ptrPlayer) * * @return: * Returns .State variable given offset from FlightData. - * + * * ********************************************************************************/ FL_STATE GameGetFlightDataStateFromIdx(uint8_t FlightDataIdx) @@ -3277,14 +3277,14 @@ FL_STATE GameGetFlightDataStateFromIdx(uint8_t FlightDataIdx) } /* ******************************************************************************** - * + * * @name: uint32_t GameGetScore(void) - * + * * @author: Xavier Del Campo * * @return: * Returns game score to other modules. - * + * * ********************************************************************************/ uint32_t GameGetScore(void) @@ -3293,9 +3293,9 @@ uint32_t GameGetScore(void) } /* ******************************************************************************************* - * + * * @name: void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -3308,7 +3308,7 @@ uint32_t GameGetScore(void) * * @brief: * Handler for StateUnboarding. - * + * * *******************************************************************************************/ void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) @@ -3346,7 +3346,7 @@ void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData ptrPlayer->Unboarding = false; GameRemoveFlight(ptrPlayer->FlightDataSelectedAircraft, true); } - + ptrPlayer->UnboardingSequenceIdx = 0; } @@ -3362,9 +3362,9 @@ void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData } /* ******************************************************************************************* - * + * * @name: void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: @@ -3377,7 +3377,7 @@ void GameStateUnboarding(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData * * @todo: * Maximum number of sequence keys should be adjusted according to difficulty. - * + * * *******************************************************************************************/ void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer) @@ -3390,12 +3390,12 @@ void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer) ptrPlayer->UnboardingSequenceIdx = 0; Serial_printf("Key sequence generated: "); - + // Only medium level implemented. TODO: Implement other levels for (i = 0; i < UNBOARDING_KEY_SEQUENCE_MEDIUM; i++) { uint8_t randIdx = SystemRand(0, (sizeof(keyTable) / sizeof(keyTable[0])) - 1); - + ptrPlayer->UnboardingSequence[i] = keyTable[randIdx]; Serial_printf("idx = %d, 0x%04X ", randIdx, ptrPlayer->UnboardingSequence[i]); @@ -3405,9 +3405,9 @@ void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer) } /* ********************************************************************************************************************* - * + * * @name: void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData, uint8_t aircraftIdx) - * + * * @author: Xavier Del Campo * * @param: @@ -3424,7 +3424,7 @@ void GameGenerateUnboardingSequence(TYPE_PLAYER* ptrPlayer) * @brief: * Given input aircraft from FlightData, it automatically looks for selected runway and creates an array * of waypoints to be then executed by corresponding TYPE_AIRCRAFT_DATA instance. - * + * * *********************************************************************************************************************/ void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData, uint8_t aircraftIdx) @@ -3470,7 +3470,7 @@ void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli (GameLevelBuffer[currentTile] != TILE_RWY_START_2); currentTile -= rwyStep ) { - + } for (i = 0; i < GAME_MAX_RUNWAYS; i++) @@ -3486,7 +3486,7 @@ void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli GameLevelBuffer[currentTile] != TILE_RWY_EXIT; currentTile += rwyStep ) { - + } targets[0] = currentTile; @@ -3495,22 +3495,22 @@ void GameCreateTakeoffWaypoints(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli } /* ******************************************************************************************* - * + * * @name: void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntry) - * + * * @author: Xavier Del Campo * * @param: - * + * * uint8_t aircraftIdx: * Index from FlightData. Used to determine target tile. - * + * * TYPE_RWY_ENTRY_DATA* ptrRwyEntry: * Instance to be filled with runway data. * * @brief: * Fills a TYPE_RWY_ENTRY_DATA instance with information about runway. - * + * * *******************************************************************************************/ void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntry) @@ -3583,19 +3583,19 @@ void GameGetRunwayEntryTile(uint8_t aircraftIdx, TYPE_RWY_ENTRY_DATA* ptrRwyEntr } /* ******************************************************************************************* - * + * * @name: bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos) - * + * * @author: Xavier Del Campo * * @param: - * + * * TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos: * (x, y, z) coordinate data in an isometric system. * * @return: * Returns true if a (x, y, z) coordinate is inside level coordinates. False otherwise. - * + * * *******************************************************************************************/ bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos) @@ -3627,13 +3627,13 @@ bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos) } /* ******************************************************************************************* - * + * * @name: void GameRemoveFlight(uint8_t idx, bool successful) - * + * * @author: Xavier Del Campo * * @param: - * + * * uint8_t idx: * Index from FlightData. * @@ -3645,7 +3645,7 @@ bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos) * * @remarks: * GameScore is updated here depending on player actions. - * + * * *******************************************************************************************/ void GameRemoveFlight(uint8_t idx, bool successful) @@ -3760,13 +3760,13 @@ void GameRemoveFlight(uint8_t idx, bool successful) } /* ******************************************************************************************* - * + * * @name: void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData) - * + * * @author: Xavier Del Campo * * @param: - * + * * TYPE_PLAYER* ptrPlayer: * Pointer to a player structure * @@ -3786,15 +3786,15 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightD uint8_t currentFlightDataIdx; uint8_t lastFlightDataIdx; - + // Clear all pointers for aircraft data first. // Then, rebuild aircraft list for player. - + lastFlightDataIdx = ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft]; memset(ptrPlayer->ActiveAircraftList, 0, GAME_MAX_AIRCRAFT); ptrPlayer->ActiveAircraft = 0; - + for (i = 0; i < FlightData.nAircraft; i++) { if ( (ptrFlightData->State[i] != STATE_IDLE) @@ -3818,7 +3818,7 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightD currentFlightDataIdx, lastFlightDataIdx ); if (currentFlightDataIdx != lastFlightDataIdx) - { + { for (ptrPlayer->SelectedAircraft = 0; ptrPlayer->SelectedAircraft < FlightData.nAircraft; ptrPlayer->SelectedAircraft++) { if (ptrPlayer->ActiveAircraftList[ptrPlayer->SelectedAircraft] == lastFlightDataIdx) @@ -3837,13 +3837,13 @@ void GameActiveAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightD } /* ******************************************************************************************* - * + * * @name: void GameRemainingAircraft(uint8_t i) - * + * * @author: Xavier Del Campo * * @param: - * + * * uint8_t i: * Index from FlightData. * @@ -3864,7 +3864,7 @@ void GameRemainingAircraft(uint8_t i) { FlightData.nRemainingAircraft = FlightData.nAircraft; } - + if (FlightData.Finished[i] == true) { FlightData.nRemainingAircraft--; @@ -3872,13 +3872,13 @@ void GameRemainingAircraft(uint8_t i) } /* ******************************************************************************************* - * + * * @name: void GameFinished(uint8_t i) - * + * * @author: Xavier Del Campo * * @param: - * + * * uint8_t i: * Index from FlightData. * @@ -3905,13 +3905,13 @@ void GameFinished(uint8_t i) } /* ******************************************************************************************* - * + * * @name: void GameMinimumSpawnTimeout(void) - * + * * @author: Xavier Del Campo * * @param: - * + * * uint8_t i: * Index from FlightData. * @@ -3927,13 +3927,13 @@ void GameMinimumSpawnTimeout(void) } /* ******************************************************************************************* - * + * * @name: void GameAircraftCollision(uint8_t AircraftIdx) - * + * * @author: Xavier Del Campo * * @param: - * + * * uint8_t AircraftIdx: * Index from FlightData. * diff --git a/Source/GameGui.c b/Source/GameGui.c index a4355a2..6ec89f2 100644 --- a/Source/GameGui.c +++ b/Source/GameGui.c @@ -12,7 +12,7 @@ /* *************************************
* Defines
* *************************************/
-
+
#define GAME_GUI_AIRCRAFT_DATA_MAX_PAGE 4
#define SLOW_SCORE_LOW_SPEED_MARGIN 100
@@ -29,7 +29,7 @@ enum BUBBLE_SPRITE_Y = 32,
BUBBLE_SPRITE_RAND_MIN = -3,
BUBBLE_SPRITE_RAND_MAX = 3,
-
+
NOTIFICATION_BUTTON_X = BUBBLE_SPRITE_X + 24,
NOTIFICATION_BUTTON_Y = BUBBLE_SPRITE_Y + 16
};
@@ -40,32 +40,32 @@ enum AIRCRAFT_DATA_GSGPOLY4_R1 = AIRCRAFT_DATA_GSGPOLY4_R0,
AIRCRAFT_DATA_GSGPOLY4_R2 = 0,
AIRCRAFT_DATA_GSGPOLY4_R3 = AIRCRAFT_DATA_GSGPOLY4_R2,
-
+
AIRCRAFT_DATA_GSGPOLY4_G0 = NORMAL_LUMINANCE,
AIRCRAFT_DATA_GSGPOLY4_G1 = AIRCRAFT_DATA_GSGPOLY4_G0,
AIRCRAFT_DATA_GSGPOLY4_G2 = 0,
AIRCRAFT_DATA_GSGPOLY4_G3 = AIRCRAFT_DATA_GSGPOLY4_G2,
-
+
AIRCRAFT_DATA_GSGPOLY4_B0 = 40,
AIRCRAFT_DATA_GSGPOLY4_B1 = AIRCRAFT_DATA_GSGPOLY4_B0,
AIRCRAFT_DATA_GSGPOLY4_B2 = 0,
AIRCRAFT_DATA_GSGPOLY4_B3 = AIRCRAFT_DATA_GSGPOLY4_B2,
-
+
AIRCRAFT_DATA_GSGPOLY4_X0 = (X_SCREEN_RESOLUTION >> 1) - 88,
AIRCRAFT_DATA_GSGPOLY4_X1 = (X_SCREEN_RESOLUTION >> 1) + 88,
AIRCRAFT_DATA_GSGPOLY4_X2 = AIRCRAFT_DATA_GSGPOLY4_X0,
AIRCRAFT_DATA_GSGPOLY4_X3 = AIRCRAFT_DATA_GSGPOLY4_X1,
-
+
AIRCRAFT_DATA_GSGPOLY4_Y0 = (Y_SCREEN_RESOLUTION >> 1) - 96,
AIRCRAFT_DATA_GSGPOLY4_Y1 = AIRCRAFT_DATA_GSGPOLY4_Y0,
AIRCRAFT_DATA_GSGPOLY4_Y2 = (Y_SCREEN_RESOLUTION >> 1) + 96,
AIRCRAFT_DATA_GSGPOLY4_Y3 = AIRCRAFT_DATA_GSGPOLY4_Y2,
-
+
AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER = 24,
AIRCRAFT_DATA_GSGPOLY4_X1_2PLAYER = 168,
AIRCRAFT_DATA_GSGPOLY4_X2_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER,
AIRCRAFT_DATA_GSGPOLY4_X3_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_X1_2PLAYER,
-
+
AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER = 24,
AIRCRAFT_DATA_GSGPOLY4_Y1_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER,
AIRCRAFT_DATA_GSGPOLY4_Y2_2PLAYER = 208,
@@ -86,34 +86,34 @@ enum AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R1 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R2 = 0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R2,
-
+
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G0 = NORMAL_LUMINANCE,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G1 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G2 = 0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G2,
-
+
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B0 = NORMAL_LUMINANCE,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B1 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B2 = 0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B2,
-
+
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP = 8,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0 = AIRCRAFT_DATA_GSGPOLY4_X0 + 24,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1 = AIRCRAFT_DATA_GSGPOLY4_X1 - 24,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X2 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1,
-
+
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H = 42,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0 = AIRCRAFT_DATA_GSGPOLY4_Y0 + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y1 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y2 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0 + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y3 = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y2,
-
+
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_X1_2PLAYER - AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X2_2PLAYER = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0_2PLAYER,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X3_2PLAYER = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1_2PLAYER,
-
+
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0_2PLAYER = AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y1_2PLAYER = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0_2PLAYER,
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y2_2PLAYER = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H,
@@ -124,19 +124,19 @@ enum {
AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0 + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0 + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
-
+
AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X_2PLAYER = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y_2PLAYER = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
-
+
AIRCRAFT_DATA_DIRECTION_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X,
AIRCRAFT_DATA_DIRECTION_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
-
+
AIRCRAFT_DATA_DIRECTION_X_2PLAYER = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X_2PLAYER,
AIRCRAFT_DATA_DIRECTION_Y_2PLAYER = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y_2PLAYER + AIRCRAFT_DATA_FLIGHT_GSGPOLY4_GAP,
-
+
AIRCRAFT_DATA_PASSENGERS_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X + 64,
AIRCRAFT_DATA_PASSENGERS_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y,
-
+
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,
@@ -161,7 +161,7 @@ enum AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_X_2PLAYER = 48,
AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y_2PLAYER = 112,
-
+
AIRCRAFT_DATA_FLIGHT_PAGE_UP_X = 260,
AIRCRAFT_DATA_FLIGHT_PAGE_UP_Y = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y,
@@ -210,7 +210,7 @@ static char* GameFileList[] = { "cdrom:\\DATA\\SPRITES\\BUBBLE.TIM;1" , "cdrom:\\DATA\\FONTS\\FONT_1.FNT;1" ,
"cdrom:\\DATA\\SPRITES\\DEPARR.TIM;1" ,
"cdrom:\\DATA\\SPRITES\\PAGEUPDN.TIM;1" };
-
+
static void* GameFileDest[] = {(GsSprite*)&BubbleSpr ,
(TYPE_FONT*)&RadioFont ,
(GsSprite*)&DepArrSpr ,
@@ -226,17 +226,17 @@ void GameGuiInit(void) PAUSE_DIALOG_Y = 28,
PAUSE_DIALOG_W = 200,
PAUSE_DIALOG_H = 184,
-
+
PAUSE_DIALOG_R0 = 0,
PAUSE_DIALOG_R1 = PAUSE_DIALOG_R0,
PAUSE_DIALOG_R2 = 0,
PAUSE_DIALOG_R3 = PAUSE_DIALOG_R2,
-
+
PAUSE_DIALOG_G0 = NORMAL_LUMINANCE,
PAUSE_DIALOG_G1 = PAUSE_DIALOG_G0,
PAUSE_DIALOG_G2 = 0,
PAUSE_DIALOG_G3 = PAUSE_DIALOG_G2,
-
+
PAUSE_DIALOG_B0 = 40,
PAUSE_DIALOG_B1 = PAUSE_DIALOG_B0,
PAUSE_DIALOG_B2 = 0,
@@ -259,32 +259,32 @@ void GameGuiInit(void) sizeof(GameFileList) / sizeof(char*),
sizeof(GameFileDest) /sizeof(void*) );
}
-
+
PauseRect.x[0] = PAUSE_DIALOG_X;
PauseRect.x[1] = PAUSE_DIALOG_X + PAUSE_DIALOG_W;
PauseRect.x[2] = PAUSE_DIALOG_X;
PauseRect.x[3] = PAUSE_DIALOG_X + PAUSE_DIALOG_W;
-
+
PauseRect.y[0] = PAUSE_DIALOG_Y;
PauseRect.y[1] = PAUSE_DIALOG_Y;
PauseRect.y[2] = PAUSE_DIALOG_Y + PAUSE_DIALOG_H;
PauseRect.y[3] = PAUSE_DIALOG_Y + PAUSE_DIALOG_H;
-
+
PauseRect.r[0] = PAUSE_DIALOG_R0;
PauseRect.r[1] = PAUSE_DIALOG_R1;
PauseRect.r[2] = PAUSE_DIALOG_R2;
PauseRect.r[3] = PAUSE_DIALOG_R3;
-
+
PauseRect.b[0] = PAUSE_DIALOG_B0;
PauseRect.b[1] = PAUSE_DIALOG_B1;
PauseRect.b[2] = PAUSE_DIALOG_B2;
PauseRect.b[3] = PAUSE_DIALOG_B3;
-
+
PauseRect.g[0] = PAUSE_DIALOG_G0;
PauseRect.g[1] = PAUSE_DIALOG_G1;
PauseRect.g[2] = PAUSE_DIALOG_G2;
PauseRect.g[3] = PAUSE_DIALOG_G3;
-
+
PauseRect.attribute |= ENABLE_TRANS | TRANS_MODE(0);
PageUpDownSpr.w = AIRCRAFT_DATA_FLIGHT_PAGEUPDN_SIZE;
@@ -299,30 +299,30 @@ void GameGuiInit(void) }
bool GameGuiPauseDialog(TYPE_PLAYER* ptrPlayer)
-{
+{
GfxSaveDisplayData(&SecondDisplay);
-
+
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
-
+
//DrawFBRect(0, 0, X_SCREEN_RESOLUTION, VRAM_H, 0, 0, 0);
-
+
while (GfxIsGPUBusy() == true);
-
+
do
{
if (ptrPlayer->PadKeySinglePress_Callback(PAD_CROSS) == true)
{
return true;
}
-
+
GfxSortSprite(&SecondDisplay);
-
+
GsSortGPoly4(&PauseRect);
-
+
GfxDrawScene_Slow();
-
+
}while (ptrPlayer->PadKeySinglePress_Callback(PAD_START) == false);
-
+
return false;
}
@@ -348,7 +348,7 @@ void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlig {
ptrPlayer->FlightDataPage++;
}
-
+
if (ptrPlayer->ShowAircraftData == true)
{
if (ptrPlayer->PadKeySinglePress_Callback(PAD_DOWN) == true)
@@ -360,7 +360,7 @@ void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlig ptrPlayer->SelectedAircraft++;
}
}
-
+
if (ptrPlayer->PadKeySinglePress_Callback(PAD_UP) == true)
{
if (ptrPlayer->SelectedAircraft > ( (ptrPlayer->FlightDataPage) * GAME_GUI_AIRCRAFT_DATA_MAX_PAGE) )
@@ -368,7 +368,7 @@ void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlig ptrPlayer->SelectedAircraft--;
}
}
-
+
if (ptrPlayer->PadKeySinglePress_Callback(PAD_RIGHT) == true)
{
if (ptrPlayer->ActiveAircraft > (GAME_GUI_AIRCRAFT_DATA_MAX_PAGE * (ptrPlayer->FlightDataPage + 1) ) )
@@ -378,7 +378,7 @@ void GameGuiActiveAircraftPage(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlig Serial_printf("Selected Aircraft = %d\n",ptrPlayer->SelectedAircraft);
}
}
-
+
if (ptrPlayer->PadKeySinglePress_Callback(PAD_LEFT) == true)
{
if (ptrPlayer->FlightDataPage != 0)
@@ -412,7 +412,7 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData AIRCRAFT_STOP_Y = AIRCRAFT_LOCK_TARGET_Y,
AIRCRAFT_STOP_TEXT_Y = AIRCRAFT_STOP_Y + 4
};
-
+
if (ptrPlayer->ShowAircraftData == true)
{
// Prepare RGB data and (X,Y) coordinates for aircraft
@@ -421,26 +421,26 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData AircraftDataGPoly4.r[1] = AIRCRAFT_DATA_GSGPOLY4_R1;
AircraftDataGPoly4.r[2] = AIRCRAFT_DATA_GSGPOLY4_R2;
AircraftDataGPoly4.r[3] = AIRCRAFT_DATA_GSGPOLY4_R3;
-
+
AircraftDataGPoly4.g[0] = AIRCRAFT_DATA_GSGPOLY4_G0;
AircraftDataGPoly4.g[1] = AIRCRAFT_DATA_GSGPOLY4_G1;
AircraftDataGPoly4.g[2] = AIRCRAFT_DATA_GSGPOLY4_G2;
AircraftDataGPoly4.g[3] = AIRCRAFT_DATA_GSGPOLY4_G3;
-
+
AircraftDataGPoly4.b[0] = AIRCRAFT_DATA_GSGPOLY4_B0;
AircraftDataGPoly4.b[1] = AIRCRAFT_DATA_GSGPOLY4_B1;
AircraftDataGPoly4.b[2] = AIRCRAFT_DATA_GSGPOLY4_B2;
AircraftDataGPoly4.b[3] = AIRCRAFT_DATA_GSGPOLY4_B3;
-
+
AircraftDataGPoly4.attribute |= ENABLE_TRANS | TRANS_MODE(0);
-
+
if (GameTwoPlayersActive() == true)
{
AircraftDataGPoly4.x[0] = AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER;
AircraftDataGPoly4.x[1] = AIRCRAFT_DATA_GSGPOLY4_X1_2PLAYER;
AircraftDataGPoly4.x[2] = AIRCRAFT_DATA_GSGPOLY4_X2_2PLAYER;
AircraftDataGPoly4.x[3] = AIRCRAFT_DATA_GSGPOLY4_X3_2PLAYER;
-
+
AircraftDataGPoly4.y[0] = AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER;
AircraftDataGPoly4.y[1] = AIRCRAFT_DATA_GSGPOLY4_Y1_2PLAYER;
AircraftDataGPoly4.y[2] = AIRCRAFT_DATA_GSGPOLY4_Y2_2PLAYER;
@@ -452,13 +452,13 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData AircraftDataGPoly4.x[1] = AIRCRAFT_DATA_GSGPOLY4_X1;
AircraftDataGPoly4.x[2] = AIRCRAFT_DATA_GSGPOLY4_X2;
AircraftDataGPoly4.x[3] = AIRCRAFT_DATA_GSGPOLY4_X3;
-
+
AircraftDataGPoly4.y[0] = AIRCRAFT_DATA_GSGPOLY4_Y0;
AircraftDataGPoly4.y[1] = AIRCRAFT_DATA_GSGPOLY4_Y1;
AircraftDataGPoly4.y[2] = AIRCRAFT_DATA_GSGPOLY4_Y2;
AircraftDataGPoly4.y[3] = AIRCRAFT_DATA_GSGPOLY4_Y3;
}
-
+
GsSortGPoly4(&AircraftDataGPoly4);
if (GameTwoPlayersActive() == true)
@@ -477,26 +477,26 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData "Remaining aircraft: %d",
ptrFlightData->nRemainingAircraft );
}
-
+
if (ptrPlayer->ActiveAircraft != 0)
{
SelectedAircraftGPoly4.r[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R0;
SelectedAircraftGPoly4.r[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R1;
SelectedAircraftGPoly4.r[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R2;
SelectedAircraftGPoly4.r[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_R3;
-
+
SelectedAircraftGPoly4.g[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G0;
SelectedAircraftGPoly4.g[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G1;
SelectedAircraftGPoly4.g[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G2;
SelectedAircraftGPoly4.g[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_G3;
-
+
SelectedAircraftGPoly4.b[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B0;
SelectedAircraftGPoly4.b[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B1;
SelectedAircraftGPoly4.b[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B2;
SelectedAircraftGPoly4.b[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_B3;
-
+
SelectedAircraftGPoly4.attribute |= ENABLE_TRANS | TRANS_MODE(0);
-
+
if (GameTwoPlayersActive() == true)
{
SelectedAircraftGPoly4.x[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0_2PLAYER;
@@ -505,22 +505,22 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData SelectedAircraftGPoly4.x[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X3_2PLAYER;
}
else
- {
+ {
SelectedAircraftGPoly4.x[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0;
SelectedAircraftGPoly4.x[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1;
SelectedAircraftGPoly4.x[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X2;
SelectedAircraftGPoly4.x[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X3;
}
-
+
page_aircraft = (ptrPlayer->SelectedAircraft) - (ptrPlayer->FlightDataPage * GAME_GUI_AIRCRAFT_DATA_MAX_PAGE);
-
+
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() == true)
{
SelectedAircraftGPoly4.y[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0_2PLAYER;
@@ -535,22 +535,22 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData SelectedAircraftGPoly4.y[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y2;
SelectedAircraftGPoly4.y[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y3;
}
-
+
SelectedAircraftGPoly4.y[0] += y_offset;
- SelectedAircraftGPoly4.y[1] += y_offset;
+ SelectedAircraftGPoly4.y[1] += y_offset;
SelectedAircraftGPoly4.y[2] += y_offset;
SelectedAircraftGPoly4.y[3] += y_offset;
-
+
GsSortGPoly4(&SelectedAircraftGPoly4);
PageUpDownSpr.attribute |= GFX_2HZ_FLASH;
-
+
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)
{
PageUpDownSpr.x = AIRCRAFT_DATA_FLIGHT_PAGE_UP_X_2PLAYER;
@@ -566,13 +566,13 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData PageUpDownSpr.u = orig_pageupdn_u;
}
-
+
if (ptrPlayer->FlightDataPage != 0)
{
orig_pageupdn_u = PageUpDownSpr.u;
-
+
PageUpDownSpr.u = orig_pageupdn_u + AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_U;
-
+
if (GameTwoPlayersActive() == true)
{
PageUpDownSpr.x = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_X_2PLAYER;
@@ -583,16 +583,16 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData PageUpDownSpr.x = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_X;
PageUpDownSpr.y = AIRCRAFT_DATA_FLIGHT_PAGE_DOWN_Y;
}
-
+
GfxSortSprite(&PageUpDownSpr);
PageUpDownSpr.u = orig_pageupdn_u;
}
-
+
GameGuiShowAircraftData(ptrPlayer, ptrFlightData);
-
+
GfxDrawButton(AIRCRAFT_LOCK_TARGET_X, AIRCRAFT_LOCK_TARGET_Y, PAD_SQUARE);
-
+
if (ptrPlayer->LockTarget == true)
{
FontPrintText(&SmallFont, AIRCRAFT_LOCK_TARGET_TEXT_X, AIRCRAFT_LOCK_TARGET_TEXT_Y, "Unlock target");
@@ -618,7 +618,7 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData if (GameTwoPlayersActive() == true)
{
FontPrintText( &SmallFont,
- AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER +
+ AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER +
( (AIRCRAFT_DATA_GSGPOLY4_X1_2PLAYER - AIRCRAFT_DATA_GSGPOLY4_X0_2PLAYER) >> 2),
AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER +
( (AIRCRAFT_DATA_GSGPOLY4_Y2_2PLAYER - AIRCRAFT_DATA_GSGPOLY4_Y0_2PLAYER) >> 1),
@@ -627,7 +627,7 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData else
{
FontPrintText( &SmallFont,
- AIRCRAFT_DATA_GSGPOLY4_X0 +
+ AIRCRAFT_DATA_GSGPOLY4_X0 +
( (AIRCRAFT_DATA_GSGPOLY4_X1 - AIRCRAFT_DATA_GSGPOLY4_X0) >> 2),
AIRCRAFT_DATA_GSGPOLY4_Y0 +
( (AIRCRAFT_DATA_GSGPOLY4_Y2 - AIRCRAFT_DATA_GSGPOLY4_Y0) >> 1),
@@ -676,10 +676,10 @@ void GameGuiBubble(TYPE_FLIGHT_DATA* ptrFlightData) TimerRestart(GameGuiBubbleVibrationTimer);
}
}
-
+
BubbleSpr.x = BUBBLE_SPRITE_X;
BubbleSpr.y = BUBBLE_SPRITE_Y;
-
+
if (GameGuiBubbleVibrationFlag == true)
{
BubbleSpr.x += SystemRand(BUBBLE_SPRITE_RAND_MIN,BUBBLE_SPRITE_RAND_MAX);
@@ -689,7 +689,7 @@ void GameGuiBubble(TYPE_FLIGHT_DATA* ptrFlightData) GfxSortSprite(&BubbleSpr);
FontSetFlags(&SmallFont, FONT_CENTERED);
FontPrintText(&SmallFont,BubbleSpr.x + 8 , BubbleSpr.y + 2, "%d", ptrFlightData->ActiveAircraft);
-
+
GfxDrawButton(NOTIFICATION_BUTTON_X, NOTIFICATION_BUTTON_Y, PAD_CIRCLE);
}
@@ -705,13 +705,13 @@ void GameGuiClock(uint8_t hour, uint8_t min) };
static char strClock[6]; // HH:MM + \0 (6 characters needed)
-
+
if (GameStartupFlag || System1SecondTick() == true)
{
memset(strClock, 0, 6);
snprintf(strClock,6,"%02d:%02d",hour, min);
}
-
+
RadioFont.max_ch_wrap = 0;
FontSetFlags(&RadioFont, FONT_NOFLAGS);
FontPrintText(&RadioFont,CLOCK_X,CLOCK_Y,strClock);
@@ -754,7 +754,7 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight short AircraftDataRemainingTime_X;
short AircraftDataRemainingTime_Y;
short orig_DepArr_u = DepArrSpr.u;
-
+
if (GameTwoPlayersActive() == true)
{
AircraftDataDirection_X = AIRCRAFT_DATA_DIRECTION_X_2PLAYER;
@@ -779,18 +779,18 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight AircraftDataRemainingTime_X = AIRCRAFT_DATA_REMAINING_TIME_X;
AircraftDataRemainingTime_Y = AIRCRAFT_DATA_REMAINING_TIME_Y;
}
-
+
FontSetFlags(&SmallFont,FONT_NOFLAGS);
-
+
for (i = init_flight ; i < ptrPlayer->ActiveAircraft ; i++)
{
j = i - init_flight;
-
+
if (j >= GAME_GUI_AIRCRAFT_DATA_MAX_PAGE)
{
break;
}
-
+
FontPrintText( &SmallFont,
AircraftDataFlightNumber_X,
AircraftDataFlightNumber_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
@@ -799,7 +799,7 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight 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]])
{
case ARRIVAL:
@@ -816,9 +816,9 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight GfxSortSprite(&DepArrSpr);
DepArrSpr.u = orig_DepArr_u;
-
+
FontSetFlags(&SmallFont, FONT_2HZ_FLASH);
-
+
switch(ptrFlightData->State[ptrPlayer->ActiveAircraftList[i]])
{
case STATE_APPROACH:
@@ -827,28 +827,28 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Approach" );
break;
-
+
case STATE_READY_FOR_TAKEOFF:
FontPrintText( &SmallFont,
AircraftDataDirection_X + AircraftDataState_X_Offset,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Takeoff" );
break;
-
+
case STATE_LANDED:
FontPrintText( &SmallFont,
AircraftDataDirection_X + AircraftDataState_X_Offset,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Landed" );
break;
-
+
case STATE_PARKED:
FontPrintText( &SmallFont,
AircraftDataDirection_X + AircraftDataState_X_Offset,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Parked" );
break;
-
+
case STATE_UNBOARDING:
FontPrintText( &SmallFont,
AircraftDataDirection_X + AircraftDataState_X_Offset,
@@ -869,13 +869,13 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
"Stopped" );
break;
-
+
default:
break;
}
-
+
FontSetFlags(&SmallFont, FONT_NOFLAGS);
-
+
/*FontPrintText( &SmallFont,
AircraftDataPassengers_X,
AircraftDataPassengers_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
@@ -893,7 +893,7 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight bool GameGuiShowAircraftDataSpecialConditions(TYPE_PLAYER* ptrPlayer)
{
// Aircraft list data cannot be shown under these conditions.
-
+
if ( (ptrPlayer->SelectRunway == true)
||
(ptrPlayer->SelectTaxiwayParking == true)
@@ -902,7 +902,7 @@ bool GameGuiShowAircraftDataSpecialConditions(TYPE_PLAYER* ptrPlayer) {
return true;
}
-
+
return false;
}
@@ -977,44 +977,44 @@ void GameGuiClearPassengersLeft(void) bool GameGuiFinishedDialog(TYPE_PLAYER* ptrPlayer)
{
GfxSaveDisplayData(&SecondDisplay);
-
+
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
-
+
do
{
if (ptrPlayer->PadKeySinglePress_Callback(PAD_CROSS) == true)
{
return true;
}
-
+
GfxSortSprite(&SecondDisplay);
-
+
GsSortGPoly4(&PauseRect);
FontPrintText( &SmallFont,
- AIRCRAFT_DATA_GSGPOLY4_X0 +
+ AIRCRAFT_DATA_GSGPOLY4_X0 +
( (AIRCRAFT_DATA_GSGPOLY4_X1 - AIRCRAFT_DATA_GSGPOLY4_X0) >> 2),
AIRCRAFT_DATA_GSGPOLY4_Y0 +
( (AIRCRAFT_DATA_GSGPOLY4_Y2 - AIRCRAFT_DATA_GSGPOLY4_Y0) >> 1),
"Level finished!" );
-
+
GfxDrawScene_Slow();
-
+
}while (ptrPlayer->PadKeySinglePress_Callback(PAD_START) == false);
-
+
return false;
}
void GameGuiAircraftCollision(TYPE_PLAYER* ptrPlayer)
{
GfxSaveDisplayData(&SecondDisplay);
-
+
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
-
+
do
- {
+ {
GfxSortSprite(&SecondDisplay);
-
+
GsSortGPoly4(&PauseRect);
FontPrintText( &SmallFont,
@@ -1022,9 +1022,9 @@ void GameGuiAircraftCollision(TYPE_PLAYER* ptrPlayer) AIRCRAFT_DATA_GSGPOLY4_Y0 +
( (AIRCRAFT_DATA_GSGPOLY4_Y2 - AIRCRAFT_DATA_GSGPOLY4_Y0) >> 1),
"Collision between aircraft!" );
-
+
GfxDrawScene_Slow();
-
+
}while (ptrPlayer->PadKeySinglePress_Callback(PAD_CROSS) == false);
}
diff --git a/Source/GameStructures.h b/Source/GameStructures.h index c7082d8..0b5358f 100644 --- a/Source/GameStructures.h +++ b/Source/GameStructures.h @@ -157,7 +157,7 @@ typedef struct bool LockTarget;
// Player is unboarding passengers
bool Unboarding;
-
+
// Stores indexes for player-specific active aircraft
// Used to relate SelectedAircraft agains FlightData index
uint8_t ActiveAircraftList[GAME_MAX_AIRCRAFT];
@@ -171,7 +171,7 @@ typedef struct uint8_t SelectedAircraft;
// Aircraft being followed by camera
uint8_t LockedAircraft;
- // Index for GameRwy buffer on "Select runway" mode
+ // Index for GameRwy buffer on "Select runway" mode
uint16_t SelectedRunway;
// Tile pointed to by cursor
uint16_t SelectedTile;
@@ -191,7 +191,7 @@ typedef struct uint8_t UnboardingSequenceIdx;
// Show passengers left
uint8_t PassengersLeftSelectedAircraft;
-
+
bool (*PadKeyPressed_Callback)(unsigned short);
bool (*PadKeyReleased_Callback)(unsigned short);
bool (*PadKeySinglePress_Callback)(unsigned short);
diff --git a/Source/Gfx.c b/Source/Gfx.c index a7f8aa6..5110442 100644 --- a/Source/Gfx.c +++ b/Source/Gfx.c @@ -27,22 +27,22 @@ enum { BUTTON_SIZE = 16, - + BUTTON_CROSS_U = 48, BUTTON_CROSS_V = 0, - + BUTTON_SQUARE_U = 0, BUTTON_SQUARE_V = 0, - + BUTTON_TRIANGLE_U = 32, BUTTON_TRIANGLE_V = 0, - + BUTTON_CIRCLE_U = 16, BUTTON_CIRCLE_V = 0, BUTTON_DIRECTION_U = 64, BUTTON_DIRECTION_V = 0, - + BUTTON_LR_U = 80, BUTTON_LR_V = 0, BUTTON_LR_SIZE = 24, @@ -63,7 +63,7 @@ enum LETTER_OFFSET_INSIDE_BUTTON_LR_X = 8, LETTER_OFFSET_INSIDE_BUTTON_LR_Y = 6 - + }; enum @@ -113,7 +113,7 @@ void GfxSwapBuffers(void) Serial_printf("Linked list iterator overflow!\n"); while (1); } - + if ( (DrawEnv.h != Y_SCREEN_RESOLUTION) || ( (DrawEnv.w != X_SCREEN_RESOLUTION) @@ -146,7 +146,7 @@ void GfxSwapBuffers(void) DispEnv.y = 0; DrawEnv.y = DOUBLE_BUFFERING_SWAP_Y; } - + GsSetDispEnv(&DispEnv); GsSetDrawEnv(&DrawEnv); } @@ -160,7 +160,7 @@ void GfxInitDrawEnv(void) DrawEnv.draw_on_display = false; DrawEnv.w = X_SCREEN_RESOLUTION; DrawEnv.h = Y_SCREEN_RESOLUTION; - + GsSetDrawEnv(&DrawEnv); } @@ -168,7 +168,7 @@ void GfxInitDispEnv(void) { DispEnv.x = 0; DispEnv.y = 0; - + GsSetDispEnv(&DispEnv); } @@ -200,7 +200,7 @@ void GfxDrawScene_Fast(void) { five_hundred_ms_show = five_hundred_ms_show? false:true; } - + GfxSwapBuffers(); FontCyclic(); GsDrawList(); @@ -213,12 +213,12 @@ bool GfxReadyForDMATransfer(void) void GfxDrawScene(void) { - while ( (SystemRefreshNeeded() == false) + while ( (SystemRefreshNeeded() == false) || (GfxIsGPUBusy() == true) ); - + GfxDrawScene_Fast(); - + SystemCyclicHandler(); } @@ -238,13 +238,13 @@ void GfxSortSprite(GsSprite * spr) short aux_x = spr->x; 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) ) { // Invalid width or heigth return; } - + if (GfxIsSpriteInsideScreenArea(spr) == false) { return; @@ -257,7 +257,7 @@ void GfxSortSprite(GsSprite * spr) { return; } - + if (global_lum != NORMAL_LUMINANCE) { if (spr->r < NORMAL_LUMINANCE - global_lum) @@ -268,7 +268,7 @@ void GfxSortSprite(GsSprite * spr) { spr->r -= NORMAL_LUMINANCE - global_lum; } - + if (spr->g < NORMAL_LUMINANCE - global_lum) { spr->g = 0; @@ -277,7 +277,7 @@ void GfxSortSprite(GsSprite * spr) { spr->g -= NORMAL_LUMINANCE - global_lum; } - + if (spr->b < NORMAL_LUMINANCE - global_lum) { spr->b = 0; @@ -287,17 +287,17 @@ void GfxSortSprite(GsSprite * spr) spr->b -= NORMAL_LUMINANCE - global_lum; } } - + if (has_1hz_flash == true) { spr->attribute &= ~(GFX_1HZ_FLASH); } - + if (spr->w > MAX_SIZE_FOR_GSSPRITE) { // GsSprites can't be bigger than 256x256, so since display // resolution is 384x240, it must be split into two primitives. - + spr->w = MAX_SIZE_FOR_GSSPRITE; GsSortSprite(spr); @@ -305,22 +305,22 @@ void GfxSortSprite(GsSprite * spr) spr->w = X_SCREEN_RESOLUTION - MAX_SIZE_FOR_GSSPRITE; spr->tpage += MAX_SIZE_FOR_GSSPRITE / GFX_TPAGE_WIDTH; GsSortSprite(spr); - + // Restore original values after sorting spr->w = aux_w; spr->tpage = aux_tpage; spr->x = aux_x; } else - { + { GsSortSprite(spr); } - + if (has_1hz_flash == true) { spr->attribute |= GFX_1HZ_FLASH; } - + spr->r = aux_r; spr->g = aux_g; spr->b = aux_b; @@ -337,7 +337,7 @@ void GfxSetGlobalLuminance(uint8_t value) } void GfxIncreaseGlobalLuminance(int8_t step) -{ +{ if ( ( (global_lum + step) < MAX_LUMINANCE ) && ( (global_lum + step) > 0 ) ) @@ -363,18 +363,18 @@ bool GfxIsGPUBusy(void) bool GfxSpriteFromFile(char* fname, GsSprite * spr) { GsImage gsi; - + if (SystemLoadFile(fname) == false) { return false; } - + while (GfxIsGPUBusy() == true); - + gfx_busy = true; - + GsImageFromTim(&gsi, SystemGetBufferAddress() ); - + GsSpriteFromImage(spr, &gsi, UPLOAD_IMAGE_FLAG); gfx_busy = false; @@ -384,7 +384,7 @@ bool GfxSpriteFromFile(char* fname, GsSprite * spr) DEBUG_PRINT_VAR(spr->v); DEBUG_PRINT_VAR(spr->w); DEBUG_PRINT_VAR(spr->h); - + return true; } @@ -396,23 +396,23 @@ bool GfxCLUTFromFile(char* fname) { return false; } - + while (GfxIsGPUBusy() == true); - + gfx_busy = true; - + GsImageFromTim(&gsi,SystemGetBufferAddress() ); - + GsUploadCLUT(&gsi); - + gfx_busy = false; - + return true; } bool GfxIsInsideScreenArea(short x, short y, short w, short h) { - if ( ( (x + w) >= 0) + if ( ( (x + w) >= 0) && (x < DrawEnv.w) && @@ -422,7 +422,7 @@ bool GfxIsInsideScreenArea(short x, short y, short w, short h) { return true; } - + return false; } @@ -452,43 +452,43 @@ void GfxDrawButton(short x, short y, unsigned short btn) static bool first_entered = true; static short orig_u; static short orig_v; - + if (first_entered == true) { first_entered = false; orig_u = PSXButtons.u; orig_v = PSXButtons.v; } - + PSXButtons.w = BUTTON_SIZE; PSXButtons.h = BUTTON_SIZE; - + PSXButtons.r = NORMAL_LUMINANCE; PSXButtons.g = NORMAL_LUMINANCE; PSXButtons.b = NORMAL_LUMINANCE; - + PSXButtons.x = x; PSXButtons.y = y; PSXButtons.mx = PSXButtons.w >> 1; PSXButtons.my = PSXButtons.h >> 1; - + switch(btn) { case PAD_CROSS: PSXButtons.u = BUTTON_CROSS_U; PSXButtons.v = BUTTON_CROSS_V; break; - + case PAD_SQUARE: PSXButtons.u = BUTTON_SQUARE_U; PSXButtons.v = BUTTON_SQUARE_V; break; - + case PAD_TRIANGLE: PSXButtons.u = BUTTON_TRIANGLE_U; PSXButtons.v = BUTTON_TRIANGLE_V; break; - + case PAD_CIRCLE: PSXButtons.u = BUTTON_CIRCLE_U; PSXButtons.v = BUTTON_CIRCLE_V; @@ -498,13 +498,13 @@ void GfxDrawButton(short x, short y, unsigned short btn) 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; @@ -516,7 +516,7 @@ void GfxDrawButton(short x, short y, unsigned short btn) PSXButtons.v = BUTTON_DIRECTION_V; PSXButtons.attribute |= H_FLIP; break; - + case PAD_L1: // Fall through case PAD_L2: @@ -539,10 +539,10 @@ void GfxDrawButton(short x, short y, unsigned short btn) PSXButtons.h = 0; break; } - + PSXButtons.u += orig_u; PSXButtons.v += orig_v; - + GfxSortSprite(&PSXButtons); switch(btn) @@ -583,14 +583,14 @@ void GfxDrawButton(short x, short y, unsigned short btn) void GfxSaveDisplayData(GsSprite *spr) { while (GfxIsGPUBusy() == true); - + MoveImage( DispEnv.x, DispEnv.y, GFX_SECOND_DISPLAY_X, GFX_SECOND_DISPLAY_Y, X_SCREEN_RESOLUTION, Y_SCREEN_RESOLUTION); - + spr->x = 0; spr->y = 0; spr->tpage = GFX_SECOND_DISPLAY_TPAGE; @@ -622,36 +622,36 @@ bool GfxTPageOffsetFromVRAMPosition(GsSprite * spr, short x, short y) { return false; } - + spr->tpage = x / GFX_TPAGE_WIDTH; spr->tpage += (short)(VRAM_W / GFX_TPAGE_WIDTH) * (short)(y / GFX_TPAGE_HEIGHT); - + spr->u = (x % GFX_TPAGE_WIDTH); - + if (spr->attribute & COLORMODE(COLORMODE_8BPP)) { // On 8bpp images, it looks like U offset needs to be multiplied by 2. spr->u <<= 1; } - + spr->v = (y % GFX_TPAGE_HEIGHT); - + //Serial_printf("Sprite:\n\tTPAGE: %d\n\tU=%d\n\tV=%d\n",spr->tpage,spr->u, spr->v); - + return false; } TYPE_CARTESIAN_POS GfxIsometricToCartesian(TYPE_ISOMETRIC_POS* ptrIsoPos) { TYPE_CARTESIAN_POS retCartPos; - + retCartPos.x = ptrIsoPos->x - (ptrIsoPos->x >> 1); retCartPos.x -= ptrIsoPos->y >> 1; - + retCartPos.y = ptrIsoPos->y >> 2; retCartPos.y += ptrIsoPos->x >> 2; retCartPos.y -= ptrIsoPos->z; - + return retCartPos; } @@ -663,26 +663,26 @@ void GfxDrawScene_NoSwap(void) TYPE_CARTESIAN_POS GfxIsometricFix16ToCartesian(TYPE_ISOMETRIC_FIX16_POS * ptrIso16Pos) { TYPE_ISOMETRIC_POS IsoPos; - + IsoPos.x = (short)fix16_to_int(ptrIso16Pos->x); IsoPos.y = (short)fix16_to_int(ptrIso16Pos->y); IsoPos.z = (short)fix16_to_int(ptrIso16Pos->z); - + return GfxIsometricToCartesian(&IsoPos); } TYPE_ISOMETRIC_POS GfxCartesianToIsometric(TYPE_CARTESIAN_POS * ptrCartPos) { TYPE_ISOMETRIC_POS IsoPos; - + /*isoX = cartX - cartY; isoY = (cartX + cartY) / 2;*/ IsoPos.x = ptrCartPos->x + (ptrCartPos->y << 1); IsoPos.y = (ptrCartPos->y << 1) - ptrCartPos->x; - + // Explicitly suppose z = 0 IsoPos.z = 0; - + return IsoPos; } @@ -694,16 +694,16 @@ void GfxSetSplitScreen(uint8_t playerIndex) DrawEnv.x = 0; DrawEnv.w = X_SCREEN_RESOLUTION >> 1; break; - + case PLAYER_TWO: DrawEnv.x = X_SCREEN_RESOLUTION >> 1; DrawEnv.w = X_SCREEN_RESOLUTION >> 1; break; - + default: break; } - + GsSetDrawEnv_DMA(&DrawEnv); } @@ -711,6 +711,6 @@ void GfxDisableSplitScreen(void) { DrawEnv.x = 0; DrawEnv.w = X_SCREEN_RESOLUTION; - + GsSetDrawEnv_DMA(&DrawEnv); } diff --git a/Source/LoadMenu.c b/Source/LoadMenu.c index ef139dc..4aa6221 100644 --- a/Source/LoadMenu.c +++ b/Source/LoadMenu.c @@ -1,5 +1,5 @@ /* ************************************** - * Includes * + * Includes * * *************************************/ #include "LoadMenu.h" @@ -10,7 +10,7 @@ #include "Sfx.h" /* ************************************** - * Defines * + * Defines * * *************************************/ /* ************************************** @@ -35,10 +35,10 @@ enum LOADING_BAR_X = 64, LOADING_BAR_Y = 200, LOADING_BAR_N_LINES = 4, - + LOADING_BAR_WIDTH = 256, LOADING_BAR_HEIGHT = 16, - + LOADING_BAR_LUMINANCE_TARGET = NORMAL_LUMINANCE, LOADING_BAR_LUMINANCE_STEP = 10 }; @@ -49,23 +49,23 @@ enum LOADING_TITLE_CLUT_Y = 496, LOADING_TITLE_X = 128, LOADING_TITLE_Y = 32, - + LOADING_TITLE_U = 0, LOADING_TITLE_V = 0, - + LOADING_TITLE_LUMINANCE_STEP = 10, LOADING_TITLE_LUMINANCE_TARGET = NORMAL_LUMINANCE }; enum -{ +{ PLANE_START_X = 56, PLANE_START_Y = 200, - + PLANE_U = 0, PLANE_V = 32, PLANE_SIZE = 16, - + PLANE_LUMINANCE_STEP = 0x10, PLANE_LUMINANCE_TARGET_VALUE = NORMAL_LUMINANCE }; @@ -78,7 +78,7 @@ static void LoadMenuInit(void); static void ISR_LoadMenuVBlank(void); static bool LoadMenuISRHasEnded(void); static bool LoadMenuISRHasStarted(void); -static void LoadMenuLoadFileList( char* fileList[], void* dest[], +static void LoadMenuLoadFileList( char* fileList[], void* dest[], uint8_t szFileList, uint8_t szDestList); /* ************************************* @@ -95,7 +95,7 @@ static char* LoadMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\PLANE.TIM;1", "cdrom:\\DATA\\SPRITES\\LOADING.TIM;1", "cdrom:\\DATA\\FONTS\\FONT_2.FNT;1" }; -static void* LoadMenuDest[] = {(GsSprite*)&LoadMenuPlaneSpr, +static void* LoadMenuDest[] = { (GsSprite*)&LoadMenuPlaneSpr, (GsSprite*)&LoadMenuTitleSpr, (TYPE_FONT*)&SmallFont }; @@ -120,7 +120,7 @@ void LoadMenuInit(void) { int i; static bool first_load = false; - + if (first_load == false) { first_load = true; @@ -129,48 +129,48 @@ void LoadMenuInit(void) sizeof(LoadMenuFiles) / sizeof(char*), sizeof(LoadMenuDest) / sizeof(void*)); } - + FontSetSize(&SmallFont, SMALL_FONT_SIZE); FontSetSpacing(&SmallFont, SMALL_FONT_SPACING); LoadMenuPlaneSpr.r = 0; LoadMenuPlaneSpr.g = 0; LoadMenuPlaneSpr.b = 0; - + LoadMenuPlaneSpr.x = PLANE_START_X; LoadMenuPlaneSpr.y = PLANE_START_Y; - + // "Loading..." title init - + LoadMenuTitleSpr.r = 0; LoadMenuTitleSpr.g = 0; LoadMenuTitleSpr.b = 0; - + LoadMenuTitleSpr.x = LOADING_TITLE_X; LoadMenuTitleSpr.y = LOADING_TITLE_Y; - + LoadMenuTitleSpr.cx = LOADING_TITLE_CLUT_X; LoadMenuTitleSpr.cy = LOADING_TITLE_CLUT_Y; LoadMenuTitleSpr.u = LOADING_TITLE_U; LoadMenuTitleSpr.v = LOADING_TITLE_V; - + startup_flag = true; isr_started = false; end_flag = false; isr_ended = false; - + // Background init - + loadMenuBg.x[0] = 0; loadMenuBg.x[1] = X_SCREEN_RESOLUTION; loadMenuBg.x[2] = 0; loadMenuBg.x[3] = X_SCREEN_RESOLUTION; - + loadMenuBg.y[0] = 0; loadMenuBg.y[1] = 0; loadMenuBg.y[2] = Y_SCREEN_RESOLUTION; loadMenuBg.y[3] = Y_SCREEN_RESOLUTION; - + // Colour components adjustment (default to zero) for (i = 0; i < 4 ; i++) { @@ -178,69 +178,69 @@ void LoadMenuInit(void) loadMenuBg.g[i] = 0; loadMenuBg.b[i] = 0; } - + // "Loading" bar line 0 (up left - up right) - + LoadMenuBarLines[0].x[0] = LOADING_BAR_X; LoadMenuBarLines[0].x[1] = LOADING_BAR_X + LOADING_BAR_WIDTH; - + LoadMenuBarLines[0].y[0] = LOADING_BAR_Y; LoadMenuBarLines[0].y[1] = LOADING_BAR_Y; - + // "Loading" bar line 1 (up left - down left) - + LoadMenuBarLines[1].x[0] = LOADING_BAR_X; LoadMenuBarLines[1].x[1] = LOADING_BAR_X; - + LoadMenuBarLines[1].y[0] = LOADING_BAR_Y; LoadMenuBarLines[1].y[1] = LOADING_BAR_Y + LOADING_BAR_HEIGHT; - + // "Loading" bar line 2 (down left - down right) - + LoadMenuBarLines[2].x[0] = LOADING_BAR_X; LoadMenuBarLines[2].x[1] = LOADING_BAR_X + LOADING_BAR_WIDTH; - + LoadMenuBarLines[2].y[0] = LOADING_BAR_Y + LOADING_BAR_HEIGHT; LoadMenuBarLines[2].y[1] = LOADING_BAR_Y + LOADING_BAR_HEIGHT; - + // "Loading" bar line 3 (up right - down right) - + LoadMenuBarLines[3].x[0] = LOADING_BAR_X + LOADING_BAR_WIDTH; LoadMenuBarLines[3].x[1] = LOADING_BAR_X + LOADING_BAR_WIDTH; - + LoadMenuBarLines[3].y[0] = LOADING_BAR_Y; LoadMenuBarLines[3].y[1] = LOADING_BAR_Y + LOADING_BAR_HEIGHT; - + for (i = 0; i < LOADING_BAR_N_LINES ; i++) { LoadMenuBarLines[i].r = 0; LoadMenuBarLines[i].g = 0; LoadMenuBarLines[i].b = 0; } - + LoadMenuBarRect.r = 0; LoadMenuBarRect.g = 0; LoadMenuBarRect.b = 0; - + // LoadMenuBarRect.attribute |= ENABLE_TRANS | TRANS_MODE(0); - + LoadMenuBarRect.x = LOADING_BAR_X; LoadMenuBarRect.y = LOADING_BAR_Y; LoadMenuBarRect.w = 0; LoadMenuBarRect.h = LOADING_BAR_HEIGHT; - + LoadMenuBarRect.attribute |= ENABLE_TRANS | TRANS_MODE(0); - + load_menu_running = true; - + SmallFont.spr.r = 0; SmallFont.spr.g = 0; SmallFont.spr.b = 0; - + GfxSetGlobalLuminance(0); Serial_printf("I_MASK = 0x%08X\n", (*(unsigned int*)0x1F801074)); - + SetVBlankHandler(&ISR_LoadMenuVBlank); } @@ -248,11 +248,11 @@ void LoadMenuEnd(void) { end_flag = true; load_menu_running = false; - + while (LoadMenuISRHasEnded() == false); Serial_printf("Set default VBlank handler.\n"); SetVBlankHandler(&ISR_SystemDefaultVBlank); - + GfxSetGlobalLuminance(NORMAL_LUMINANCE); } @@ -279,12 +279,12 @@ void ISR_LoadMenuVBlank(void) dprintf("Serialisbusy\n"); return; } - + /*if ( (SystemIsBusy() == true) || (GfxIsGPUBusy() == true) || (SerialIsBusy() == true) ) { return; }*/ - + if (startup_flag == true) { // "Loading..." text @@ -294,15 +294,15 @@ void ISR_LoadMenuVBlank(void) LoadMenuTitleSpr.g += LOADING_TITLE_LUMINANCE_STEP; LoadMenuTitleSpr.b += LOADING_TITLE_LUMINANCE_STEP; } - + if (loadMenuBg.g[0] < BG_WHITE_TARGET_VALUE) { loadMenuBg.r[0] += BG_INCREASE_STEP; loadMenuBg.r[1] += BG_INCREASE_STEP; - + loadMenuBg.g[0] += BG_INCREASE_STEP; loadMenuBg.g[1] += BG_INCREASE_STEP; - + loadMenuBg.b[0] += BG_INCREASE_STEP; loadMenuBg.b[1] += BG_INCREASE_STEP; } @@ -312,7 +312,7 @@ void ISR_LoadMenuVBlank(void) loadMenuBg.b[2] += BG_INCREASE_STEP; loadMenuBg.b[3] += BG_INCREASE_STEP; } - + if (LoadMenuBarRect.r < LOADING_BAR_LUMINANCE_TARGET) { LoadMenuBarRect.r += LOADING_BAR_LUMINANCE_STEP; @@ -324,7 +324,7 @@ void ISR_LoadMenuVBlank(void) startup_flag = false; isr_started = true; } - + for (i = 0;i < LOADING_BAR_N_LINES ; i++) { if (LoadMenuBarLines[i].r < LOADING_BAR_LUMINANCE_TARGET) @@ -334,64 +334,64 @@ void ISR_LoadMenuVBlank(void) LoadMenuBarLines[i].b += LOADING_BAR_LUMINANCE_STEP; } } - + if (LoadMenuPlaneSpr.r < PLANE_LUMINANCE_TARGET_VALUE) { LoadMenuPlaneSpr.r += PLANE_LUMINANCE_STEP; LoadMenuPlaneSpr.g += PLANE_LUMINANCE_STEP; LoadMenuPlaneSpr.b += PLANE_LUMINANCE_STEP; } - + } else if (end_flag == true) { LoadMenuTitleSpr.r -= LOADING_TITLE_LUMINANCE_STEP; LoadMenuTitleSpr.g -= LOADING_TITLE_LUMINANCE_STEP; LoadMenuTitleSpr.b -= LOADING_TITLE_LUMINANCE_STEP; - + if (loadMenuBg.g[0] > 0) { loadMenuBg.r[0] -= BG_INCREASE_STEP; loadMenuBg.r[1] -= BG_INCREASE_STEP; - + loadMenuBg.g[0] -= BG_INCREASE_STEP; loadMenuBg.g[1] -= BG_INCREASE_STEP; - + loadMenuBg.b[0] -= BG_INCREASE_STEP; loadMenuBg.b[1] -= BG_INCREASE_STEP; } - + if (loadMenuBg.b[2] > 0) { loadMenuBg.b[2] -= BG_INCREASE_STEP; loadMenuBg.b[3] -= BG_INCREASE_STEP; } - + if (loadMenuBg.b[2] == 0) { end_flag = false; isr_ended = true; } - + if (LoadMenuPlaneSpr.r > 0) { LoadMenuPlaneSpr.r -= PLANE_LUMINANCE_STEP; LoadMenuPlaneSpr.g -= PLANE_LUMINANCE_STEP; LoadMenuPlaneSpr.b -= PLANE_LUMINANCE_STEP; } - + LoadMenuPlaneSpr.x = (PLANE_START_X + LOADING_BAR_WIDTH); LoadMenuPlaneSpr.y = PLANE_START_Y; - + LoadMenuBarRect.w = LOADING_BAR_WIDTH; - + if (LoadMenuBarRect.r > 0) { LoadMenuBarRect.r -= LOADING_BAR_LUMINANCE_STEP; LoadMenuBarRect.g -= LOADING_BAR_LUMINANCE_STEP; LoadMenuBarRect.b -= LOADING_BAR_LUMINANCE_STEP; } - + for (i = 0;i < LOADING_BAR_N_LINES ; i++) { if (LoadMenuBarLines[i].r > 0) @@ -402,32 +402,32 @@ void ISR_LoadMenuVBlank(void) } } } - + GsSortGPoly4(&loadMenuBg); - + GsSortRectangle(&LoadMenuBarRect); - + for (i = 0 ; i < LOADING_BAR_N_LINES ; i++) { GsSortLine(&LoadMenuBarLines[i]); } - + GsSortSprite(&LoadMenuTitleSpr); - + LoadMenuPlaneSpr.w = PLANE_SIZE; LoadMenuPlaneSpr.h = PLANE_SIZE; - + GsSortSprite(&LoadMenuPlaneSpr); - + FontSetFlags(&SmallFont, FONT_BLEND_EFFECT); - + FontPrintText( &SmallFont, LOADING_BAR_X, LOADING_BAR_Y + LOADING_BAR_HEIGHT + 8, strCurrentFile ); - + //FontSetFlags(&SmallFont, FONT_NOFLAGS); - + GfxDrawScene_Fast(); } @@ -441,67 +441,67 @@ bool LoadMenuISRHasStarted(void) return isr_started; } -void LoadMenu( char* fileList[], +void LoadMenu( char* fileList[], void* dest[], uint8_t szFileList , uint8_t szDestList) { - + if (load_menu_running == false) { LoadMenuInit(); - + while (LoadMenuISRHasStarted() == false); } - + LoadMenuLoadFileList(fileList,dest,szFileList,szDestList); - + } -void LoadMenuLoadFileList( char* fileList[], void* dest[], +void LoadMenuLoadFileList( char* fileList[], void* dest[], uint8_t szFileList, uint8_t szDestList) { char aux_file_name[100]; char* extension; short x_increment; uint8_t fileLoadedCount; - + if (szFileList != szDestList) { Serial_printf("File list size different from dest list size! %d vs %d\n", szFileList, szDestList); return; } - + for (fileLoadedCount = 0; fileLoadedCount < szFileList ; fileLoadedCount++) { strCurrentFile = fileList[fileLoadedCount]; - + if (strCurrentFile == NULL) { continue; } - + x_increment = (short)(LOADING_BAR_WIDTH / szFileList); - + // Calculate new X position for loading menu plane sprite. // This is not calculated on ISR as to avoid longer ISR time. LoadMenuPlaneSpr.x = (PLANE_START_X + (fileLoadedCount* x_increment) ); - + LoadMenuBarRect.w = fileLoadedCount* x_increment; - + //Serial_printf("Files %d / %d loaded. New plane X = %d.\n",fileLoadedCount,szFileList,LoadMenuPlaneSpr.x); - + // Backup original file path strncpy(aux_file_name, strCurrentFile, 100); - + //We want to get file extension, so split into tokens strtok(strCurrentFile, ".;"); extension = strtok(NULL, ".;"); - + Serial_printf("File extension: .%s\n", extension); //Restore original file path in order to load file strncpy(strCurrentFile, aux_file_name, 100); - + if (strncmp(extension,"TIM",3) == 0) { if (GfxSpriteFromFile(strCurrentFile, dest[fileLoadedCount]) == false) @@ -515,7 +515,7 @@ void LoadMenuLoadFileList( char* fileList[], void* dest[], { Serial_printf("WARNING: File %s linked to non-NULL destination pointer!\n", dest[fileLoadedCount]); } - + if (GfxCLUTFromFile(strCurrentFile) == false) { Serial_printf("Could not load CLUT file \"%s\"!\n", strCurrentFile); diff --git a/Source/LoadMenu.h b/Source/LoadMenu.h index 307c7ae..3407dd1 100644 --- a/Source/LoadMenu.h +++ b/Source/LoadMenu.h @@ -15,10 +15,10 @@ * Global prototypes * *************************************/ -void LoadMenu( char* fileList[], +void LoadMenu( char* fileList[], void* dest[], uint8_t szFileList , uint8_t szDestList); - + void LoadMenuEnd(void); #endif //__LOAD_MENU_HEADER__ diff --git a/Source/Makefile b/Source/Makefile index ac29758..c6c98a0 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -47,11 +47,11 @@ EMULATOR_FLAGS = -nogui -psxout # Compiled objects list OBJ_DIR = Obj SRC_DIR = . -OBJECTS = $(addprefix $(OBJ_DIR)/,main.o System.o Menu.o Gfx.o Pad.o MainMenuBtnAni.o \ - LoadMenu.o GameGui.o Sfx.o Camera.o EndAnimation.o \ - PSXSDKIntro.o PltParser.o Game.o Font.o MemCard.o \ - Aircraft.o Serial.o Timer.o) - +OBJECTS = $(addprefix $(OBJ_DIR)/, main.o System.o Menu.o Gfx.o Pad.o MainMenuBtnAni.o \ + LoadMenu.o GameGui.o Sfx.o Camera.o EndAnimation.o \ + PSXSDKIntro.o PltParser.o Game.o Font.o MemCard.o \ + Aircraft.o Serial.o Timer.o) + # Source dependencies: DEPS = $(OBJECTS:.o=.d) @@ -63,8 +63,8 @@ FFMPEG_FLAGS = -f s16le -acodec pcm_s16le # VAG objects: SOURCE_SOUNDS_FOLDER = ../Sounds -SOUNDS_FOLDER = ../cdimg/DATA/SOUNDS -SOUND_OBJECTS = $(addprefix $(SOUNDS_FOLDER)/, BELL.VAG \ +OBJ_SOUNDS_DIR = ../cdimg/DATA/SOUNDS +SOUND_OBJECTS = $(addprefix $(OBJ_SOUNDS_DIR)/, BELL.VAG \ ACCEPT.VAG \ TRAYCL.VAG \ SPINDISK.VAG \ @@ -78,7 +78,35 @@ SRC_LEVELS_DIR = $(PROJECT_DIR)/Levels OBJ_LEVELS_DIR = $(CDROM_ROOT)/DATA/LEVELS LEVEL_OBJECTS = $(addprefix $(OBJ_LEVELS_DIR)/, LEVEL1.LVL LEVEL1.PLT) -# ------------------------------------ +# Sprite objects: +BMP2TIM = bmp2tim +SRC_SPRITES_PATH = $(PROJECT_DIR)/Sprites +OBJ_SPRITES_PATH = $(CDROM_ROOT)/DATA/SPRITES +# NOTE: Fonts, despite still being .TIM files, are separated into another folder, +# so SPRITE_OBJECTS are splitted in two parts. +OBJ_FONTS_PATH = $(CDROM_ROOT)/DATA/FONTS +SPRITE_OBJECTS = $(addprefix $(OBJ_SPRITES_PATH)/, PSXDISK.TIM \ + TILESET1.TIM \ + TILESET2.TIM \ + MAINMENU.TIM \ + LOADING.TIM \ + PLANE.TIM \ + BUTTONS.TIM \ + GAMEPLN.TIM \ + PLNBLUE.CLT \ + BUBBLE.TIM \ + GPL.TIM \ + OPENSRC.TIM \ + MOUSE.TIM \ + DEPARR.TIM \ + PAGEUPDN.TIM \ + BLDNGS1.TIM \ + ARROW.TIM \ + MENUSTAR.TIM ) + +SPRITE_OBJECTS += $(addprefix $(OBJ_FONTS_PATH)/, INTROFNT.TIM \ + FONT_1.TIM \ + FONT_2.TIM ) # Instructions # ------------------------------------ @@ -89,62 +117,49 @@ rebuild: make build -include $(DEPS) - + music_objects: $(addprefix ../Music/, TRACK01.bin TRACK02.bin TRACK03.bin) - + clean: - rm -f Obj/*.o - rm -f $(CDROM_ROOT)/DATA/SOUNDS/*.VAG - rm -f $(CDROM_ROOT)/DATA/LEVELS/*.LVL - rm -f $(CDROM_ROOT)/DATA/LEVELS/*.PLT - + rm -f $(OBJ_DIR)/*.o + rm -f $(OBJ_SOUNDS_DIR)/*.VAG + rm -f $(OBJ_LEVELS_DIR)/*.LVL + rm -f $(OBJ_LEVELS_DIR)/*.PLT + rm -f $(OBJ_SPRITES_PATH)/*.TIM + rm -f $(OBJ_FONTS_PATH)/*.TIM + $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(OBJ_DIR)/%.d $(CC) $< -o $@ $(DEFINE) $(CC_FLAGS) -MMD - + $(EXE_PATH)/$(PROJECT).elf: $(OBJECTS) $(LINKER) $^ -o $@ $(LIBS) -Wl,--gc-sections + $(GNU_SIZE) $@ -$(EXE_PATH)/$(PROJECT).iso: $(EXE_PATH)/$(PROJECT).exe $(SOUND_OBJECTS) $(LEVEL_OBJECTS) +$(EXE_PATH)/$(PROJECT).iso: $(EXE_PATH)/$(PROJECT).exe $(SOUND_OBJECTS) $(LEVEL_OBJECTS) $(SPRITE_OBJECTS) mkisofs -o $@ -V $(PROJECT) -sysid PLAYSTATION $(CDROM_ROOT) $(BIN_TARGET_PATH)/$(PROJECT).bin: $(EXE_PATH)/$(PROJECT).iso mkpsxiso $< $@ $(LICENSE_FILE) $(MUSIC_TRACKS) # $(PROJECT).cue is automatically generated by mkpsxiso - + $(EXE_PATH)/$(PROJECT).exe: $(EXE_PATH)/$(PROJECT).elf $(ELF2EXE) $< $@ $(ELF2EXE_FLAGS) cp $@ $(CDROM_ROOT) - + #~ emulator: #~ export PATH=$$PATH:$(EMULATOR_DIR) #~ $(EMULATOR) -cdfile $(PROJECT_DIR)/Bin/$(PROJECT).bin $(EMULATOR_FLAGS) -tiles: - rm -f ../cdimg/DATA/SPRITES/*.TIM - rm -f ../cdimg/DATA/FONTS/*.FNT - bmp2tim ../Sprites/PSXDisk.bmp ../cdimg/DATA/SPRITES/PSXDISK.TIM 16 -org=384,0 -mpink - bmp2tim ../Sprites/IntroFnt.bmp ../cdimg/DATA/SPRITES/INTROFNT.TIM 16 -org=384,76 -mpink - bmp2tim ../Sprites/Tileset1.bmp ../cdimg/DATA/SPRITES/TILESET1.TIM 16 -org=384,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/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=536,240 -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,256 -clut=384,497 - 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=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_2_4bit.bmp ../cdimg/DATA/FONTS/FONT_2.FNT 4 -org=768,288 -mpink -clut=384,499 - 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/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 - bmp2tim ../Sprites/Bldngs1.bmp ../cdimg/DATA/SPRITES/BLDNGS1.TIM 16 -org=640,128 -mpink - bmp2tim ../Sprites/Arrow.bmp ../cdimg/DATA/SPRITES/ARROW.TIM 16 -org=604,240 -mpink - bmp2tim ../Sprites/MenuStar_4_bit.bmp ../cdimg/DATA/SPRITES/MENUSTAR.TIM 4 -org= - -$(SOUNDS_FOLDER)/%.VAG: $(SOURCE_SOUNDS_FOLDER)/%.wav +$(OBJ_SPRITES_PATH)/%.TIM: $(SRC_SPRITES_PATH)/%.bmp $(SRC_SPRITES_PATH)/%.flags + $(BMP2TIM) $< $@ `cat $(word 2,$^)` + +$(OBJ_FONTS_PATH)/%.TIM: $(SRC_SPRITES_PATH)/%.bmp $(SRC_SPRITES_PATH)/%.flags + $(BMP2TIM) $< $@ `cat $(word 2,$^)` + +$(OBJ_SPRITES_PATH)/%.CLT: $(SRC_SPRITES_PATH)/%.bmp $(SRC_SPRITES_PATH)/%.flags + $(BMP2TIM) $< $@ `cat $(word 2,$^)` + +$(OBJ_SOUNDS_DIR)/%.VAG: $(SOURCE_SOUNDS_FOLDER)/%.wav wav2vag $^ $@ $(OBJ_LEVELS_DIR)/%.LVL: $(SRC_LEVELS_DIR)/%.LVL diff --git a/Source/MemCard.c b/Source/MemCard.c index 09a7de3..cd8add0 100644 --- a/Source/MemCard.c +++ b/Source/MemCard.c @@ -10,7 +10,7 @@ /* *************************************
* Defines
* *************************************/
-
+
#define MEMCARD_SECTOR_SIZE 128
#define MEMCARD_SECTORS_PER_BLOCK 64
#define MEMCARD_SECTORS_PER_BLOCK_BITSHIFT 6
@@ -26,14 +26,14 @@ /* *************************************
* Structs and enums
* *************************************/
-
+
typedef enum t_Sectors
{
TITLE_FRAME = 0,
ICON_FRAME_1,
ICON_FRAME_2,
ICON_FRAME_3,
- DATA_FRAME,
+ DATA_FRAME,
}MEMCARD_FILE_SECTORS;
enum
@@ -57,11 +57,11 @@ enum MEMCARD_DIALOG_Y = 28,
MEMCARD_DIALOG_W = 256,
MEMCARD_DIALOG_H = 184,
-
+
MEMCARD_DIALOG_R = 0,
MEMCARD_DIALOG_G = 128,
MEMCARD_DIALOG_B = 64,
-
+
MEMCARD_DIALOG_GAP_X = 24,
MEMCARD_DIALOG_GAP_SLOT = 128
};
@@ -72,17 +72,17 @@ enum MEMCARD_BG_Y = 28,
MEMCARD_BG_W = 256,
MEMCARD_BG_H = 184,
-
+
MEMCARD_BG_R0 = 0,
MEMCARD_BG_R1 = MEMCARD_BG_R0,
MEMCARD_BG_R2 = MEMCARD_BG_R0,
MEMCARD_BG_R3 = MEMCARD_BG_R0,
-
+
MEMCARD_BG_G0 = 0,
MEMCARD_BG_G1 = MEMCARD_BG_G0,
MEMCARD_BG_G2 = NORMAL_LUMINANCE,
MEMCARD_BG_G3 = MEMCARD_BG_G2,
-
+
MEMCARD_BG_B0 = 0,
MEMCARD_BG_B1 = MEMCARD_BG_B0,
MEMCARD_BG_B2 = NORMAL_LUMINANCE >> 1,
@@ -95,9 +95,9 @@ enum MEMCARD_PROGRESS_BAR_Y = 148,
MEMCARD_PROGRESS_BAR_W = 226,
MEMCARD_PROGRESS_BAR_H = 16,
-
+
MEMCARD_PROGRESS_BAR_N_LINES = 4,
-
+
MEMCARD_PROGRESS_BAR_R = NORMAL_LUMINANCE,
MEMCARD_PROGRESS_BAR_G = NORMAL_LUMINANCE,
MEMCARD_PROGRESS_BAR_B = NORMAL_LUMINANCE
@@ -118,11 +118,11 @@ typedef struct t_MemCardErrors MEMCARD_BLOCKS Block;
MEMCARD_PROCESS Process;
}TYPE_MEMCARD_ERRORS;
-
+
/* *************************************
* Local Prototypes
* *************************************/
-
+
static bool MemCardGetInitialFrameInfo(TYPE_BLOCK_DATA * ptrBlockData);
static bool MemCardGetIconFrameInfo(TYPE_BLOCK_DATA * ptrBlockData);
static bool MemCardGetBlockStateFileName(TYPE_BLOCK_DATA * ptrBlockData);
@@ -133,7 +133,7 @@ static void MemCardIconIndexHandler(void); /* *************************************
* Local Variables
* *************************************/
-
+
static uint8_t DataBuffer[MEMCARD_SECTOR_SIZE];
static TYPE_MEMCARD_ERRORS MemCardErrors;
static GsSprite SecondDisplay;
@@ -160,141 +160,141 @@ void MemCardInit(void) TYPE_BLOCK_DATA * ptrBlockData;
uint8_t i;
uint8_t j;
-
+
for (j = SLOT_ONE; j <= SLOT_TWO; j++)
- {
+ {
for (i = BLOCK_1; i <= BLOCK_15; i++)
{
ptrBlockData = &MemCardData[i - BLOCK_1][j];
-
+
ptrBlockData->IconTPoly.r = NORMAL_LUMINANCE;
ptrBlockData->IconTPoly.g = NORMAL_LUMINANCE;
ptrBlockData->IconTPoly.b = NORMAL_LUMINANCE;
}
}
-
+
bzero((TYPE_MEMCARD_ERRORS*)&MemCardErrors, sizeof(TYPE_MEMCARD_ERRORS) );
}
void ISR_MemCardDataHandling(void)
{
-
+
uint8_t i;
-
+
if ( (GfxIsGPUBusy() == true) || (SystemIsBusy() == true) )
{
return;
}
-
+
// Dim background
SecondDisplay.r = NORMAL_LUMINANCE >> 1;
SecondDisplay.g = NORMAL_LUMINANCE >> 1;
SecondDisplay.b = NORMAL_LUMINANCE >> 1;
-
+
MemCardRect.x[0] = MEMCARD_BG_X;
MemCardRect.x[1] = MEMCARD_BG_X + MEMCARD_BG_W;
MemCardRect.x[2] = MEMCARD_BG_X;
MemCardRect.x[3] = MEMCARD_BG_X + MEMCARD_BG_W;
-
+
MemCardRect.y[0] = MEMCARD_BG_Y;
MemCardRect.y[1] = MEMCARD_BG_Y;
MemCardRect.y[2] = MEMCARD_BG_Y + MEMCARD_BG_H;
MemCardRect.y[3] = MEMCARD_BG_Y + MEMCARD_BG_H;
-
+
MemCardRect.r[0] = MEMCARD_BG_R0;
MemCardRect.r[1] = MEMCARD_BG_R1;
MemCardRect.r[2] = MEMCARD_BG_R2;
MemCardRect.r[3] = MEMCARD_BG_R3;
-
+
MemCardRect.g[0] = MEMCARD_BG_G0;
MemCardRect.g[1] = MEMCARD_BG_G1;
MemCardRect.g[2] = MEMCARD_BG_G2;
MemCardRect.g[3] = MEMCARD_BG_G3;
-
+
MemCardRect.b[0] = MEMCARD_BG_B0;
MemCardRect.b[1] = MEMCARD_BG_B1;
MemCardRect.b[2] = MEMCARD_BG_B2;
MemCardRect.b[3] = MEMCARD_BG_B3;
-
+
MemCardRect.attribute |= ENABLE_TRANS | TRANS_MODE(0);
-
+
// "Loading" bar line 0 (up left - up right)
-
+
MemCardProgressBarLines[0].x[0] = MEMCARD_PROGRESS_BAR_X;
MemCardProgressBarLines[0].x[1] = MEMCARD_PROGRESS_BAR_X + MEMCARD_PROGRESS_BAR_W;
-
+
MemCardProgressBarLines[0].y[0] = MEMCARD_PROGRESS_BAR_Y;
MemCardProgressBarLines[0].y[1] = MEMCARD_PROGRESS_BAR_Y;
-
+
// "Loading" bar line 1 (up left - down left)
-
+
MemCardProgressBarLines[1].x[0] = MEMCARD_PROGRESS_BAR_X;
MemCardProgressBarLines[1].x[1] = MEMCARD_PROGRESS_BAR_X;
-
+
MemCardProgressBarLines[1].y[0] = MEMCARD_PROGRESS_BAR_Y;
MemCardProgressBarLines[1].y[1] = MEMCARD_PROGRESS_BAR_Y + MEMCARD_PROGRESS_BAR_H;
-
+
// "Loading" bar line 2 (down left - down right)
-
+
MemCardProgressBarLines[2].x[0] = MEMCARD_PROGRESS_BAR_X;
MemCardProgressBarLines[2].x[1] = MEMCARD_PROGRESS_BAR_X + MEMCARD_PROGRESS_BAR_W;
-
+
MemCardProgressBarLines[2].y[0] = MEMCARD_PROGRESS_BAR_Y + MEMCARD_PROGRESS_BAR_H;
MemCardProgressBarLines[2].y[1] = MEMCARD_PROGRESS_BAR_Y + MEMCARD_PROGRESS_BAR_H;
-
+
// "Loading" bar line 3 (up right - down right)
-
+
MemCardProgressBarLines[3].x[0] = MEMCARD_PROGRESS_BAR_X + MEMCARD_PROGRESS_BAR_W;
MemCardProgressBarLines[3].x[1] = MEMCARD_PROGRESS_BAR_X + MEMCARD_PROGRESS_BAR_W;
-
+
MemCardProgressBarLines[3].y[0] = MEMCARD_PROGRESS_BAR_Y;
MemCardProgressBarLines[3].y[1] = MEMCARD_PROGRESS_BAR_Y + MEMCARD_PROGRESS_BAR_H;
-
+
for (i = 0; i < MEMCARD_PROGRESS_BAR_N_LINES; i++)
{
MemCardProgressBarLines[i].r = NORMAL_LUMINANCE;
MemCardProgressBarLines[i].g = NORMAL_LUMINANCE;
MemCardProgressBarLines[i].b = NORMAL_LUMINANCE;
}
-
+
// Set progress bar attributes
-
+
MemCardProgressBar.x = MEMCARD_PROGRESS_BAR_X;
MemCardProgressBar.y = MEMCARD_PROGRESS_BAR_Y;
-
+
MemCardProgressBar.w = ProgressBarXOffset;
MemCardProgressBar.h = MEMCARD_PROGRESS_BAR_H;
-
+
MemCardProgressBar.r = MEMCARD_PROGRESS_BAR_R;
MemCardProgressBar.g = MEMCARD_PROGRESS_BAR_G;
MemCardProgressBar.b = MEMCARD_PROGRESS_BAR_B;
-
+
GfxSortSprite(&SecondDisplay);
GsSortGPoly4(&MemCardRect);
GsSortRectangle(&MemCardProgressBar);
-
+
for (i = 0; i < MEMCARD_PROGRESS_BAR_N_LINES; i++)
{
GsSortLine(&MemCardProgressBarLines[i]);
}
-
+
FontSetFlags(&SmallFont, FONT_BLEND_EFFECT);
-
+
FontPrintText(&SmallFont, MEMCARD_LOAD_DATA_TEXT_X, MEMCARD_LOAD_DATA_TEXT_Y, "Loading memory card data...");
-
+
FontSetFlags(&SmallFont, FONT_NOFLAGS);
-
+
GfxDrawScene_Fast();
-
+
}
-
+
void MemCardResetBlockData(TYPE_BLOCK_DATA * ptrBlockData)
-{
+{
bzero((TYPE_BLOCK_DATA*)ptrBlockData, sizeof(TYPE_BLOCK_DATA));
-
+
ptrBlockData->BlockCount = FIRST_OR_ONLY_BLOCK;
-
- IconIndex = 0;
+
+ IconIndex = 0;
}
bool MemCardGetBlockInfo( TYPE_BLOCK_DATA * ptrBlockData,
@@ -302,92 +302,92 @@ bool MemCardGetBlockInfo( TYPE_BLOCK_DATA * ptrBlockData, MEMCARD_BLOCKS blockNumber )
{
MemCardResetBlockData(ptrBlockData);
-
+
ptrBlockData->Slot = slot;
ptrBlockData->Block = blockNumber;
-
+
Serial_printf("MemCardGetBlockStateFileName...\n");
-
+
if (MemCardGetBlockStateFileName(ptrBlockData) == false)
{
return false;
}
-
+
if (ptrBlockData->BlockCount == EMPTY_BLOCK)
{
// Stop looking for any other data.
return true;
}
-
+
Serial_printf("MemCardGetInitialFrameInfo...\n");
-
+
if (MemCardGetInitialFrameInfo(ptrBlockData) == false)
{
return false;
}
-
+
Serial_printf("MemCardGetIconFrameInfo...\n");
-
+
if (MemCardGetIconFrameInfo(ptrBlockData) == false)
{
return false;
}
-
+
// We will not get any block data information, we are only interested
// in basic info.
-
+
Serial_printf("MemCardUploadToGPU...\n");
-
+
if (MemCardUploadToGPU(ptrBlockData) == false)
{
return false;
}
-
+
return true;
}
bool MemCardGetBlockStateFileName(TYPE_BLOCK_DATA * ptrBlockData)
{
int sector = ptrBlockData->Block;
-
+
MemCardErrors.Block = ptrBlockData->Block;
MemCardErrors.Slot = ptrBlockData->Slot;
MemCardErrors.Process = MEMCARD_PROCESS_GET_FILENAME;
-
+
memset(DataBuffer, 0, MEMCARD_SECTOR_SIZE);
-
+
if (MemCardReadSector(ptrBlockData, sector) == false)
{
return false;
}
-
+
// 00h-03h Block Allocation State
Serial_printf("Block %d, slot %d, allocation state: 0x%02X.\n",
ptrBlockData->Block,
ptrBlockData->Slot,
DataBuffer[0] );
-
+
/* 00000051h - In use ;first-or-only block of a file
* 00000052h - In use ;middle block of a file (if 3 or more blocks)
- * 00000053h - In use ;last block of a file (if 2 or more blocks)
+ * 00000053h - In use ;last block of a file (if 2 or more blocks)
* 000000A0h - Free ;freshly formatted
* 000000A1h - Free ;deleted (first-or-only block of file)
* 000000A2h - Free ;deleted (middle block of file)
* 000000A3h - Free ;deleted (last block of file) */
-
+
// Always take into account memory card data is little-endian,
// so if using a hex editor, you will read 51000000h.
-
+
switch(DataBuffer[0])
{
case 0x51:
ptrBlockData->BlockCount = FIRST_OR_ONLY_BLOCK;
break;
-
+
case 0x52:
ptrBlockData->BlockCount = INTERMEDIATE_BLOCK;
break;
-
+
case 0x53:
ptrBlockData->BlockCount = LAST_BLOCK;
break;
@@ -401,19 +401,19 @@ bool MemCardGetBlockStateFileName(TYPE_BLOCK_DATA * ptrBlockData) printf("Invalid block allocation state!\n");
return false;
}
-
+
// 0Ah-1Eh Filename in ASCII, terminated by 00h (max 20 chars, plus ending 00h)
// File name is only defined on first block of group (allocation state == 0x51)
-
+
if (ptrBlockData->BlockCount == FIRST_OR_ONLY_BLOCK)
{
memset(ptrBlockData->FileName, 0 , MEMCARD_FILENAME_SIZE);
-
+
memcpy(ptrBlockData->FileName, &DataBuffer[0x0A], MEMCARD_FILENAME_SIZE);
-
+
Serial_printf("File name: %s\n", ptrBlockData->FileName);
}
-
+
return true;
}
@@ -421,35 +421,35 @@ bool MemCardGetInitialFrameInfo(TYPE_BLOCK_DATA * ptrBlockData) {
unsigned int i;
int sector = ptrBlockData->Block << MEMCARD_SECTORS_PER_BLOCK_BITSHIFT;
-
+
MemCardErrors.Block = ptrBlockData->Block;
MemCardErrors.Slot = ptrBlockData->Slot;
MemCardErrors.Process = MEMCARD_PROCESS_GET_FILENAME;
-
+
if (ptrBlockData->BlockCount != FIRST_OR_ONLY_BLOCK)
{
// Icon data is only stored on first block (if game takes more
// than one block. Skip this step otherwise.
-
+
// When dealing with intermediate or last blocks of a file,
// we use a static pointer which points to first block of a file,
// and then image data is copied into other blocks.
return true;
}
-
+
// Pretty silly operation (TITLE_FRAME = 0), but used for
// conceptual purposes and better understanding.
sector += TITLE_FRAME;
-
+
memset(DataBuffer, 0, MEMCARD_SECTOR_SIZE);
-
+
if (MemCardReadSector(ptrBlockData, sector) == false)
{
return false;
}
-
+
Serial_printf("Magic number: '%c' '%c'\n",DataBuffer[0], DataBuffer[1]);
-
+
if (DataBuffer[0] != 'S' || DataBuffer[1] != 'C')
{
// Invalid magic number.
@@ -459,42 +459,42 @@ bool MemCardGetInitialFrameInfo(TYPE_BLOCK_DATA * ptrBlockData) return false;
}
-
+
/* 02h Icon Display Flag
11h...Icon has 1 frame (static) (same image shown forever)
12h...Icon has 2 frames (animated) (changes every 16 PAL frames)
13h...Icon has 3 frames (animated) (changes every 11 PAL frames)
* */
-
+
switch(DataBuffer[2])
{
case 0x11:
ptrBlockData->IconNumber = 1;
break;
-
+
case 0x12:
ptrBlockData->IconNumber = 2;
break;
-
+
case 0x13:
ptrBlockData->IconNumber = 3;
break;
-
+
default:
// Invalid icon display flag! We can't know how many icons
// are used.
return false;
}
-
+
Serial_printf("Number of icons: %d\n", ptrBlockData->IconNumber);
-
+
// 60h-7Fh Icon 16 Color Palette Data (each entry is 16bit CLUT)
-
+
for (i = 0; i < ptrBlockData->IconNumber; i++)
{
memcpy(ptrBlockData->CLUT[i],&DataBuffer[0x60], MEMCARD_CLUT_SIZE);
}
-
+
return true;
}
@@ -506,39 +506,39 @@ bool MemCardGetIconFrameInfo(TYPE_BLOCK_DATA * ptrBlockData) unsigned int j;
uint8_t buffer_contents;
static TYPE_BLOCK_DATA * ptrReferenceBlock = NULL;
-
+
switch(ptrBlockData->BlockCount)
{
case EMPTY_BLOCK:
// Empty blocks are not of interest. Skip.
return true;
-
+
case INTERMEDIATE_BLOCK:
case LAST_BLOCK:
-
+
if (ptrReferenceBlock == NULL)
{
Serial_printf("No reference memory card block found yet!\n");
return false;
}
-
+
ptrBlockData->IconNumber = ptrReferenceBlock->IconNumber;
-
+
for (i = 0; i < MEMCARD_NUMBER_OF_ICONS; i++)
{
memcpy(ptrBlockData->CLUT[i], ptrReferenceBlock->CLUT[i], MEMCARD_CLUT_SIZE);
memcpy(ptrBlockData->Icons[i], ptrReferenceBlock->Icons[i], MEMCARD_ICON_SIZE);
}
-
+
if (ptrBlockData->BlockCount == LAST_BLOCK)
{
// Dereference pointer
ptrReferenceBlock = NULL;
}
-
+
return true;
case FIRST_OR_ONLY_BLOCK:
-
+
// Icon Frame(s) (Block 1..15, Frame 1..3) (in first block of file only)
for (i = ICON_FRAME_1; i <= ptrBlockData->IconNumber; i++)
{
@@ -546,20 +546,20 @@ bool MemCardGetIconFrameInfo(TYPE_BLOCK_DATA * ptrBlockData) buffer_contents = 0;
sector = initial_sector + i;
memset(DataBuffer, 0, MEMCARD_SECTOR_SIZE * sizeof(uint8_t) );
-
+
if (MemCardReadSector(ptrBlockData, sector) == false)
{
Serial_printf("Could not read memory sector!\n");
return false;
}
-
+
memcpy(ptrBlockData->Icons[i - 1 /* ICON_FRAME_# - 1 */], DataBuffer, MEMCARD_SECTOR_SIZE);
-
+
for (j = 0; j < MEMCARD_SECTOR_SIZE; j++)
{
buffer_contents |= ptrBlockData->Icons[i - 1][j];
}
-
+
if (buffer_contents == 0)
{
// Icon buffer is empty!
@@ -570,15 +570,15 @@ bool MemCardGetIconFrameInfo(TYPE_BLOCK_DATA * ptrBlockData) return false;
}
}
-
+
// Use current block as reference if file contains more than one block.
ptrReferenceBlock = ptrBlockData;
-
+
return true;
}
-
+
Serial_printf("Unknown error from MemCardGetIconFrameInfo()!\n");
-
+
return false;
}
@@ -589,7 +589,7 @@ bool MemCardUploadToGPU(TYPE_BLOCK_DATA * ptrBlockData) short y_clut_offset;
short x_block_offset;
GsImage gs;
-
+
if ( (ptrBlockData->IconNumber < 1)
||
(ptrBlockData->IconNumber > MEMCARD_NUMBER_OF_ICONS) )
@@ -597,128 +597,128 @@ bool MemCardUploadToGPU(TYPE_BLOCK_DATA * ptrBlockData) Serial_printf("Invalid number of icons.\n");
return false;
}
-
+
for (i = 0; i < ptrBlockData->IconNumber; i++)
{
gs.pmode = COLORMODE_4BPP;
gs.has_clut = 1;
-
+
x_clut_offset = i << 4;
y_clut_offset = ptrBlockData->Block - 1;
-
+
gs.clut_x = MEMCARD_BLOCK_CLUT_X + x_clut_offset;
gs.clut_y = MEMCARD_BLOCK_CLUT_Y + y_clut_offset + (ptrBlockData->Slot << 4);
gs.clut_w = MEMCARD_BLOCK_CLUT_W;
gs.clut_h = MEMCARD_BLOCK_CLUT_H;
-
+
Serial_printf("Gs Clut = {%d,%d,%d,%d}\n",
gs.clut_x,
gs.clut_y,
gs.clut_w,
gs.clut_h );
-
+
x_block_offset = MEMCARD_BLOCK_IMAGE_W * (ptrBlockData->Block - 1);
x_block_offset *= MEMCARD_BLOCK_MAX_ICONS;
x_block_offset >>= MEMCARD_BLOCK_IMAGE_W_BITSHIFT;
x_block_offset += i<<MEMCARD_BLOCK_IMAGE_W_BITSHIFT;
-
- gs.x = MEMCARD_BLOCK_IMAGE_X + x_block_offset;
+
+ gs.x = MEMCARD_BLOCK_IMAGE_X + x_block_offset;
gs.y = MEMCARD_BLOCK_IMAGE_Y + (MEMCARD_BLOCK_IMAGE_H * ptrBlockData->Slot);
-
+
// Dimensions are 16x16 px, but since 4bpp is used, it actually
// takes 4x16 px on the framebuffer.
gs.w = MEMCARD_BLOCK_IMAGE_W >> MEMCARD_BLOCK_IMAGE_W_BITSHIFT;
gs.h = MEMCARD_BLOCK_IMAGE_H;
-
+
gs.clut_data = (uint8_t*)ptrBlockData->CLUT[i];
gs.data = (uint8_t*)ptrBlockData->Icons[i];
-
+
GsUploadImage(&gs);
-
+
if (i == 0)
{
ptrBlockData->IconTPoly.attribute = COLORMODE(COLORMODE_4BPP);
ptrBlockData->IconTPoly.tpage = (gs.x / 64) + ((gs.y/256)*16);
-
+
Serial_printf("\tTPAGE = %d\n", ptrBlockData->IconTPoly.tpage);
-
+
x_block_offset = MEMCARD_BLOCK_IMAGE_W * (ptrBlockData->Block - 1);
x_block_offset *= MEMCARD_BLOCK_MAX_ICONS;
-
+
ptrBlockData->IconTPoly.u[0] = MEMCARD_BLOCK_IMAGE_X + x_block_offset;
ptrBlockData->IconTPoly.u[1] = ptrBlockData->IconTPoly.u[0] + (gs.w << 2);
ptrBlockData->IconTPoly.u[2] = ptrBlockData->IconTPoly.u[0];
ptrBlockData->IconTPoly.u[3] = ptrBlockData->IconTPoly.u[1];
-
+
Serial_printf("\tu = {%d, %d, %d, %d}\n",
ptrBlockData->IconTPoly.u[0],
ptrBlockData->IconTPoly.u[1],
ptrBlockData->IconTPoly.u[2],
ptrBlockData->IconTPoly.u[3]);
-
+
ptrBlockData->IconTPoly.v[0] = gs.y % 256;
ptrBlockData->IconTPoly.v[1] = ptrBlockData->IconTPoly.v[0];
ptrBlockData->IconTPoly.v[2] = (gs.y % 256) + (gs.h);
ptrBlockData->IconTPoly.v[3] = ptrBlockData->IconTPoly.v[2];
-
+
Serial_printf("\tu = {%d, %d, %d, %d}\n",
ptrBlockData->IconTPoly.v[0],
ptrBlockData->IconTPoly.v[1],
ptrBlockData->IconTPoly.v[2],
ptrBlockData->IconTPoly.v[3]);
-
+
ptrBlockData->IconTPoly.r = NORMAL_LUMINANCE;
ptrBlockData->IconTPoly.g = NORMAL_LUMINANCE;
ptrBlockData->IconTPoly.b = NORMAL_LUMINANCE;
-
+
ptrBlockData->IconTPoly.cx = gs.clut_x;
ptrBlockData->IconTPoly.cy = gs.clut_y;
-
+
Serial_printf("\tclut = {%d, %d}\n",
ptrBlockData->IconTPoly.cx,
ptrBlockData->IconTPoly.cy);
}
}
-
+
return true;
}
bool MemCardReadSector(TYPE_BLOCK_DATA * ptrBlockData, int sector)
{
uint8_t result;
-
+
MemCardErrors.Block = ptrBlockData->Block;
MemCardErrors.Slot = ptrBlockData->Slot;
-
+
if ( (ptrBlockData->Slot != 0)
&&
(ptrBlockData->Slot != 1) )
{
MemCardErrors.ErrorByte = 'S';
-
+
Serial_printf("Incorrect slot %d! Block %d?\n",
ptrBlockData->Slot,
ptrBlockData->Block);
-
+
return false;
}
-
+
if ((sector < 0) || (sector > MEMCARD_MAXIMUM_SECTOR))
{
MemCardErrors.ErrorByte = 'T';
-
+
Serial_printf("Invalid memory card sector %d. Only values between"
" 0 and %d are allowed!\n", sector, MEMCARD_MAXIMUM_SECTOR);
return false;
}
while (GfxIsGPUBusy() == true);
-
+
result = McReadSector(ptrBlockData->Slot, sector, DataBuffer);
-
+
// Fill char "MemCardErrors" for further error description.
MemCardErrors.ErrorByte = result;
-
+
switch(result)
{
case '1':
@@ -734,19 +734,19 @@ bool MemCardReadSector(TYPE_BLOCK_DATA * ptrBlockData, int sector) ptrBlockData->Block,
ptrBlockData->Slot );
return false;
-
+
case MEMCARD_BAD_SECTOR:
Serial_printf("Invalid memory card sector %d. Only values between"
" 0 and 511 are allowed!\n", sector);
return false;
-
+
case MEMCARD_CORRECT_RW:
return true;
-
+
default:
return false;
}
-
+
return true;
}
@@ -754,57 +754,57 @@ bool MemCardGetAllData(void) {
uint8_t i;
uint8_t j;
-
+
PadClearData();
-
+
CurrentReadBlock = 0;
-
+
TotalBlocks = MEMCARD_BLOCKS_PER_CARD * MEMCARD_NUMBER_OF_SLOTS;
-
+
SmallFont.spr.r = 0;
SmallFont.spr.g = 0;
SmallFont.spr.b = 0;
-
+
GfxSaveDisplayData(&SecondDisplay);
-
+
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
-
+
// ISR_MemCardDataHandling draws a rectangle on top to show
// memory card loading progress.
-
+
SetVBlankHandler(&ISR_MemCardDataHandling);
-
+
for (j = SLOT_ONE; j <= SLOT_TWO; j++)
{
MemCardStatus[j] = McGetStatus(j);
-
+
if (MemCardStatus[j] == MEMCARD_STATUS_UNKNOWN)
{
// Memcard not connected and/or formatted.
continue;
}
-
+
for (i = BLOCK_1; i <= BLOCK_15; i++)
{
- ProgressBarXOffset = (short)(CurrentReadBlock *
+ ProgressBarXOffset = (short)(CurrentReadBlock *
(MEMCARD_PROGRESS_BAR_W /
(MEMCARD_BLOCKS_PER_CARD * MEMCARD_NUMBER_OF_SLOTS) ) );
-
+
if (MemCardGetBlockInfo(&MemCardData[i - BLOCK_1][j], j, i) == false)
{
// Return to normal behaviour if anything fails
SetVBlankHandler(&ISR_SystemDefaultVBlank);
return false;
}
-
+
CurrentReadBlock++;
}
}
-
+
SetVBlankHandler(&ISR_SystemDefaultVBlank);
-
+
CurrentReadBlock = 0;
-
+
return true;
}
@@ -816,13 +816,13 @@ void MemCardHandler(void) void MemCardIconIndexHandler(void)
{
static uint8_t iconTimer = 0;
-
+
if (System100msTick() == true)
{
if (++iconTimer >= MEMCARD_ICON_INDEX_TIME)
{
iconTimer = 0;
-
+
if (++IconIndex >= MEMCARD_NUMBER_OF_ICONS)
{
IconIndex = 0;
@@ -838,12 +838,12 @@ void MemCardDrawIcon(TYPE_BLOCK_DATA * ptrBlockData, short x, short y) short orig_u[4];
short orig_clut_x;
static bool first_access = true;
-
+
if (ptrBlockData->BlockCount == EMPTY_BLOCK)
{
return;
}
-
+
ptrBlockData->IconTPoly.x[0] = x;
ptrBlockData->IconTPoly.x[1] = x + MEMCARD_BLOCK_IMAGE_W;
ptrBlockData->IconTPoly.x[2] = x;
@@ -858,71 +858,71 @@ void MemCardDrawIcon(TYPE_BLOCK_DATA * ptrBlockData, short x, short y) {
orig_u[i] = ptrBlockData->IconTPoly.u[i];
}
-
+
orig_clut_x = ptrBlockData->IconTPoly.cx;
-
+
if (ptrBlockData->IconNumber > IconIndex)
{
ptrBlockData->IconTPoly.u[0] += MEMCARD_BLOCK_IMAGE_W * IconIndex;
ptrBlockData->IconTPoly.u[1] = ptrBlockData->IconTPoly.u[0] + MEMCARD_BLOCK_IMAGE_W;
ptrBlockData->IconTPoly.u[2] = ptrBlockData->IconTPoly.u[0];
ptrBlockData->IconTPoly.u[3] = ptrBlockData->IconTPoly.u[1];
-
+
ptrBlockData->IconTPoly.cx += IconIndex * MEMCARD_BLOCK_CLUT_W;
}
-
+
if (first_access == true)
{
if (IconIndex == 0)
{
first_access = false;
-
+
Serial_printf("Icon index: %d\n",IconIndex);
-
+
Serial_printf("\tU = {%d,%d,%d,%d}\n",
ptrBlockData->IconTPoly.u[0],
ptrBlockData->IconTPoly.u[1],
ptrBlockData->IconTPoly.u[2],
ptrBlockData->IconTPoly.u[3]);
-
-
+
+
Serial_printf("\tV = {%d,%d,%d,%d}\n",
ptrBlockData->IconTPoly.v[0],
ptrBlockData->IconTPoly.v[1],
ptrBlockData->IconTPoly.v[2],
ptrBlockData->IconTPoly.v[3]);
-
+
Serial_printf("\tBlock number: %d\n",ptrBlockData->Block);
-
+
Serial_printf("\tBlock count: %d\n",ptrBlockData->BlockCount);
-
+
Serial_printf("\tX = {%d,%d,%d,%d}\n",
ptrBlockData->IconTPoly.x[0],
ptrBlockData->IconTPoly.x[1],
ptrBlockData->IconTPoly.x[2],
ptrBlockData->IconTPoly.x[3]);
-
+
Serial_printf("\tY = {%d,%d,%d,%d}\n",
ptrBlockData->IconTPoly.y[0],
ptrBlockData->IconTPoly.y[1],
ptrBlockData->IconTPoly.y[2],
ptrBlockData->IconTPoly.y[3]);
-
+
Serial_printf("\tTPAGE = %d\n", ptrBlockData->IconTPoly.tpage);
Serial_printf("\tCLUT = {%d, %d}\n",
ptrBlockData->IconTPoly.cx,
ptrBlockData->IconTPoly.cy);
}
}
-
+
GsSortTPoly4(&ptrBlockData->IconTPoly);
-
+
for (i = 0; i < 4; i++)
{
ptrBlockData->IconTPoly.u[i] = orig_u[i]; // Restore data
}
-
+
ptrBlockData->IconTPoly.cx = orig_clut_x;
}
@@ -940,32 +940,32 @@ TYPE_BLOCK_DATA * MemCardShowMap(void) unsigned char orig_g;
unsigned char orig_b;
GsRectangle MemCardMapDialog;
-
+
if (MemCardGetAllData() == false)
{
return false;
}
-
+
bzero((GsRectangle*)&MemCardMapDialog, sizeof(GsRectangle));
bzero((GsRectangle*)&emptyBlockRect, sizeof(GsRectangle));
-
+
emptyBlockRect.attribute |= ENABLE_TRANS | TRANS_MODE(1);
-
+
MemCardMapDialog.x = MEMCARD_DIALOG_X;
MemCardMapDialog.y = MEMCARD_DIALOG_Y;
MemCardMapDialog.w = MEMCARD_DIALOG_W;
MemCardMapDialog.h = MEMCARD_DIALOG_H;
-
+
MemCardMapDialog.r = MEMCARD_DIALOG_R;
MemCardMapDialog.g = MEMCARD_DIALOG_G;
MemCardMapDialog.b = MEMCARD_DIALOG_B;
-
+
MemCardMapDialog.attribute |= ENABLE_TRANS | TRANS_MODE(0);
-
+
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
-
+
while (1)
- {
+ {
if (PadOneKeyReleased(PAD_TRIANGLE) == true)
{
break;
@@ -1002,70 +1002,70 @@ TYPE_BLOCK_DATA * MemCardShowMap(void) selectedBlock++;
}
}
-
+
// Dim background
SecondDisplay.r = NORMAL_LUMINANCE >> 1;
SecondDisplay.g = NORMAL_LUMINANCE >> 1;
SecondDisplay.b = NORMAL_LUMINANCE >> 1;
-
+
GfxSortSprite(&SecondDisplay);
-
+
GsSortRectangle(&MemCardMapDialog);
-
+
for (j = SLOT_ONE; j <= SLOT_TWO; j++)
{
if (MemCardStatus[j] == MEMCARD_STATUS_UNKNOWN)
{
FontSetFlags(&SmallFont, FONT_NOFLAGS);
-
+
x = MEMCARD_DIALOG_X;
x += MEMCARD_DIALOG_GAP_SLOT * j;
-
+
y = MEMCARD_DIALOG_Y;
y += (short)(MEMCARD_DIALOG_GAP_X << 1);
y += MEMCARD_DIALOG_GAP_X;
-
+
x += MEMCARD_DIALOG_GAP_X;
-
+
FontPrintText( &SmallFont,
x,
y,
"Disconnected" );
continue;
}
-
+
for (i = BLOCK_1; i <= BLOCK_15; i++)
- {
+ {
ptrBlockData = &MemCardData[i - BLOCK_1][j];
-
+
x = MEMCARD_DIALOG_X;
x += MEMCARD_DIALOG_GAP_SLOT * j;
x += ( (i - BLOCK_1) % 3) * MEMCARD_DIALOG_GAP_X;
x += MEMCARD_DIALOG_GAP_X;
-
+
y = MEMCARD_DIALOG_Y;
y += (short)(MEMCARD_DIALOG_GAP_X * ((i - BLOCK_1) / 3));
y += MEMCARD_DIALOG_GAP_X;
-
+
if (ptrBlockData->BlockCount == EMPTY_BLOCK)
{
emptyBlockRect.x = x;
emptyBlockRect.y = y;
emptyBlockRect.w = MEMCARD_BLOCK_IMAGE_W;
emptyBlockRect.h = MEMCARD_BLOCK_IMAGE_H;
-
+
if ( (i == selectedBlock) && (j == selectedSlot) )
{
emptyBlockRect.r = FULL_LUMINANCE;
emptyBlockRect.g = FULL_LUMINANCE;
emptyBlockRect.b = FULL_LUMINANCE;
-
+
FontSetFlags(&SmallFont, FONT_NOFLAGS);
-
+
FontPrintText( &SmallFont,
MEMCARD_LOAD_DATA_TEXT_X,
MEMCARD_LOAD_DATA_TEXT_Y,
- "Empty block" );
+ "Empty block" );
}
else
{
@@ -1073,42 +1073,42 @@ TYPE_BLOCK_DATA * MemCardShowMap(void) emptyBlockRect.g = NORMAL_LUMINANCE >> 1;
emptyBlockRect.b = NORMAL_LUMINANCE >> 1;
}
-
+
GsSortRectangle(&emptyBlockRect);
-
+
continue;
}
-
+
orig_r = ptrBlockData->IconTPoly.r;
orig_g = ptrBlockData->IconTPoly.g;
orig_b = ptrBlockData->IconTPoly.b;
-
+
if ( (i == selectedBlock) && (j == selectedSlot) )
{
ptrBlockData->IconTPoly.r = FULL_LUMINANCE;
ptrBlockData->IconTPoly.g = FULL_LUMINANCE;
ptrBlockData->IconTPoly.b = FULL_LUMINANCE;
-
+
if (ptrBlockData->BlockCount == FIRST_OR_ONLY_BLOCK)
{
FontPrintText( &SmallFont,
MEMCARD_LOAD_DATA_TEXT_X,
MEMCARD_LOAD_DATA_TEXT_Y,
- (char*)ptrBlockData->FileName );
+ (char*)ptrBlockData->FileName );
}
else if (ptrBlockData->BlockCount == INTERMEDIATE_BLOCK)
{
FontPrintText( &SmallFont,
MEMCARD_LOAD_DATA_TEXT_X,
MEMCARD_LOAD_DATA_TEXT_Y,
- "Intermediate block" );
+ "Intermediate block" );
}
else if (ptrBlockData->BlockCount == LAST_BLOCK)
{
FontPrintText( &SmallFont,
MEMCARD_LOAD_DATA_TEXT_X,
MEMCARD_LOAD_DATA_TEXT_Y,
- "Last block" );
+ "Last block" );
}
}
else
@@ -1117,18 +1117,18 @@ TYPE_BLOCK_DATA * MemCardShowMap(void) ptrBlockData->IconTPoly.g = NORMAL_LUMINANCE >> 1;
ptrBlockData->IconTPoly.b = NORMAL_LUMINANCE >> 1;
}
-
+
MemCardDrawIcon(ptrBlockData, x, y);
-
+
ptrBlockData->IconTPoly.r = orig_r;
ptrBlockData->IconTPoly.g = orig_g;
ptrBlockData->IconTPoly.b = orig_b;
}
}
-
+
GfxDrawScene_Slow();
}
-
+
return NULL;
}
@@ -1137,9 +1137,9 @@ bool MemCardSaveData(TYPE_BLOCK_DATA * ptrBlockData) uint32_t i;
uint32_t sz;
int sector = (ptrBlockData->Block << MEMCARD_SECTORS_PER_BLOCK_BITSHIFT) + DATA_FRAME;
-
+
// Always check whether current block is empty or not
-
+
if (ptrBlockData->BlockCount != EMPTY_BLOCK)
{
if (strncmp((char*)ptrBlockData->FileName, MEMCARD_GAME_FILENAME, MEMCARD_FILENAME_SIZE) != 0)
@@ -1164,15 +1164,15 @@ bool MemCardSaveData(TYPE_BLOCK_DATA * ptrBlockData) Serial_printf("Invalid block selected!\n");
return false;
}
-
+
// After all these checks, now we can save data!
-
+
sz = MEMCARD_FIRST_OR_LAST_DATA_SIZE;
-
+
for (i = 0; i < sz; i++)
{
McWriteSector(ptrBlockData->Slot, sector + i, &ptrBlockData->Data[i << 7 /* 128 */]);
}
-
+
return true;
}
diff --git a/Source/MemCard.h b/Source/MemCard.h index 723e74d..77c3f33 100644 --- a/Source/MemCard.h +++ b/Source/MemCard.h @@ -10,10 +10,10 @@ /* *************************************
* Defines
* *************************************/
-
-/* The memory is split into 16 blocks (of 8 Kbytes each), and each block
+
+/* The memory is split into 16 blocks (of 8 Kbytes each), and each block
* is split into 64 sectors (of 128 bytes each). The first block is used
- * as Directory, the remaining 15 blocks are containing Files, each
+ * as Directory, the remaining 15 blocks are containing Files, each
* file can occupy one or more blocks. */
#define MEMCARD_BLOCKS_PER_CARD 15
@@ -30,7 +30,7 @@ /* *************************************
* Structs and enums
* *************************************/
-
+
typedef enum t_CardBlock
{
SLOT_ONE = 0,
@@ -72,25 +72,25 @@ typedef struct t_MemCard uint8_t IconNumber; // Possible values : 1 ... 3
uint8_t FileName[MEMCARD_FILENAME_SIZE];
MEMCARD_BLOCK_COUNT BlockCount; // Look at MEMCARD_BLOCK_COUNT enum
-
+
/*
* The first some letters of the filename should indicate the game
* to which the file belongs, in case of commercial games this is
* conventionally done like so: Two character region code:
- * "BI"=Japan, "BE"=Europe, "BA"=America
+ * "BI"=Japan, "BE"=Europe, "BA"=America
* followed by 10 character game code,
* in "AAAA-NNNNN" form
- *
+ *
* Where the "AAAA" part does imply the region too;
* (SLPS/SCPS=Japan, SLUS/SCUS=America, SLES/SCES=Europe)
* (SCxS=Made by Sony, SLxS=Licensed by Sony),
* followed by up to 8 characters, "abcdefgh"
- *
+ *
* (which may identify the file if the game uses multiple files;
* this part often contains a random string which seems to be
* allowed to contain any chars in range of 20h..7Fh, of course it
* shouldn't contain "?" and "*" wildcards).*/
-
+
uint8_t Icons[MEMCARD_NUMBER_OF_ICONS][MEMCARD_ICON_SIZE];
uint8_t CLUT[MEMCARD_NUMBER_OF_ICONS][MEMCARD_CLUT_SIZE];
uint8_t* Data; // Buffer pointed to by "Data" must be 128 KB or higher!
@@ -101,9 +101,9 @@ typedef struct t_MemCard * Global prototypes
* *************************************/
-// Inits default values for memory card blocks
+// Inits default values for memory card blocks
void MemCardInit(void);
-
+
// Sets null values to structure pointed to by ptrBlockData.
void MemCardResetBlockData(TYPE_BLOCK_DATA * ptrBlockData);
@@ -141,7 +141,7 @@ bool MemCardSaveData(TYPE_BLOCK_DATA * ptrBlockData); /* *************************************
* Global variables
* *************************************/
-
+
extern TYPE_BLOCK_DATA MemCardData[MEMCARD_BLOCKS_PER_CARD][MEMCARD_NUMBER_OF_SLOTS];
#endif //__MEMCARD_HEADER__
diff --git a/Source/Menu.c b/Source/Menu.c index c3a2f13..f17991e 100644 --- a/Source/Menu.c +++ b/Source/Menu.c @@ -1,5 +1,5 @@ /* ************************************** - * Includes * + * Includes * * *************************************/ #include "Menu.h" @@ -17,7 +17,7 @@ #include "Pad.h" /* ************************************** - * Defines * + * Defines * * *************************************/ #define BUTTON_SIZE 64 @@ -48,7 +48,7 @@ typedef enum OPTIONS_BUTTON_INDEX, ONE_PLAYER_BUTTON_INDEX, TWO_PLAYER_BUTTON_INDEX, - + MAIN_MENU_BUTTONS_MAX }MMBtn_Index; @@ -56,52 +56,52 @@ enum { MAIN_MENU_PLAY_BUTTON_X = 92, MAIN_MENU_PLAY_BUTTON_Y = 92, - + MAIN_MENU_OPTIONS_BUTTON_X = 225, MAIN_MENU_OPTIONS_BUTTON_Y = 92, - + MAIN_MENU_ONE_PLAYER_BUTTON_X = 92, MAIN_MENU_ONE_PLAYER_BUTTON_Y = 92, - + MAIN_MENU_TWO_PLAYER_BUTTON_X = 225, - MAIN_MENU_TWO_PLAYER_BUTTON_Y = 92 + MAIN_MENU_TWO_PLAYER_BUTTON_Y = 92 }; typedef enum { PLAY_BUTTON_U_OFFSET = 0, PLAY_BUTTON_Y_OFFSET = 64, - + ONE_PLAYER_BUTTON_U_OFFSET = 128, ONE_PLAYER_BUTTON_Y_OFFSET = 64, - + OPTIONS_BUTTON_U_OFFSET = 64, OPTIONS_BUTTON_Y_OFFSET = 64, - + TWO_PLAYER_BUTTON_U_OFFSET = 192, TWO_PLAYER_BUTTON_Y_OFFSET = 64, - + DEFAULT_BUTTON_U_OFFSET = 0, DEFAULT_BUTTON_V_OFFSET = 128 - + }MMBtn_Offset; typedef struct { MMBtn_Offset offset_u; MMBtn_Offset offset_v; - + // Timer for absolute, sine-like animation short timer; // Pointer to function executed by pressing the button void (*f)(); - + MMBtn_Index i; - + bool selected; bool was_selected; - + }TYPE_MMBtn; /* ************************************** @@ -135,14 +135,14 @@ static char* MainMenuFiles[] = { "cdrom:\\DATA\\SPRITES\\MAINMENU.TIM;1" , "cdrom:\\DATA\\SPRITES\\BUTTONS.TIM;1" , #ifndef NO_INTRO "cdrom:\\DATA\\SPRITES\\PSXDISK.TIM;1" , - "cdrom:\\DATA\\SPRITES\\INTROFNT.TIM;1" , + "cdrom:\\DATA\\FONTS\\INTROFNT.TIM;1" , "cdrom:\\DATA\\SPRITES\\GPL.TIM;1" , "cdrom:\\DATA\\SPRITES\\OPENSRC.TIM;1" , "cdrom:\\DATA\\SOUNDS\\TRAYCL.VAG;1" , - "cdrom:\\DATA\\SOUNDS\\SPINDISK.VAG;1" + "cdrom:\\DATA\\SOUNDS\\SPINDISK.VAG;1" #endif // NO_INTRO }; - + static void* MainMenuDest[] = { (GsSprite*)&MenuSpr , (SsVag*)&BellSnd , (SsVag*)&AcceptSnd , @@ -153,7 +153,7 @@ static void* MainMenuDest[] = { (GsSprite*)&MenuSpr , (GsSprite*)&GPL_Logo , (GsSprite*)&OpenSource_Logo , (SsVag*)&TrayClSnd , - (SsVag*)&SpinDiskSnd + (SsVag*)&SpinDiskSnd #endif // NO_INTRO }; @@ -165,19 +165,19 @@ void PlayMenu(void) { menuLevel = ONE_TWO_PLAYERS_LEVEL; MainMenuMinimumBtn = ONE_PLAYER_BUTTON_INDEX; - + MainMenuBtn[PLAY_BUTTON_INDEX].selected = false; MainMenuBtn[PLAY_BUTTON_INDEX].was_selected = false; MainMenuBtn[PLAY_BUTTON_INDEX].timer = 0; - + MainMenuBtn[OPTIONS_BUTTON_INDEX].selected = false; MainMenuBtn[OPTIONS_BUTTON_INDEX].was_selected = false; MainMenuBtn[OPTIONS_BUTTON_INDEX].timer = 0; - + MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].selected = true; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].was_selected = false; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].timer = 0; - + MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].selected = false; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].was_selected = false; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].timer = 0; @@ -206,39 +206,39 @@ void MainMenuInit(void) LoadMenu( MainMenuFiles,MainMenuDest, sizeof(MainMenuFiles) / sizeof(char*) , sizeof(MainMenuDest) / sizeof(void*) ); - + MainMenuBtn[PLAY_BUTTON_INDEX].offset_u = PLAY_BUTTON_U_OFFSET; MainMenuBtn[PLAY_BUTTON_INDEX].offset_v = PLAY_BUTTON_Y_OFFSET; MainMenuBtn[PLAY_BUTTON_INDEX].timer = 0; MainMenuBtn[PLAY_BUTTON_INDEX].f = &PlayMenu; MainMenuBtn[PLAY_BUTTON_INDEX].i = PLAY_BUTTON_INDEX; - + MainMenuBtn[OPTIONS_BUTTON_INDEX].offset_u = OPTIONS_BUTTON_U_OFFSET; MainMenuBtn[OPTIONS_BUTTON_INDEX].offset_v = OPTIONS_BUTTON_Y_OFFSET; MainMenuBtn[OPTIONS_BUTTON_INDEX].timer = 0; MainMenuBtn[OPTIONS_BUTTON_INDEX].f = &OptionsMenu; MainMenuBtn[OPTIONS_BUTTON_INDEX].i = OPTIONS_BUTTON_INDEX; - + MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].offset_u = ONE_PLAYER_BUTTON_U_OFFSET; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].offset_v = ONE_PLAYER_BUTTON_Y_OFFSET; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].timer = 0; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].f = &OnePlayerMenu; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].i = ONE_PLAYER_BUTTON_INDEX; - + MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].offset_u = TWO_PLAYER_BUTTON_U_OFFSET; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].offset_v = TWO_PLAYER_BUTTON_Y_OFFSET; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].timer = 0; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].f = &TwoPlayerMenu; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].i = TWO_PLAYER_BUTTON_INDEX; - + menuLevel = PLAY_OPTIONS_LEVEL; - + MainMenuMinimumBtn = PLAY_BUTTON_INDEX; - + TestCheat.Callback = &MenuTestCheat; memset(TestCheat.Combination,0,CHEAT_ARRAY_SIZE); //memcpy(myarray, (int [5]){a,b,c,d,e}, 5*sizeof(int)); - + memcpy( TestCheat.Combination, (unsigned short[CHEAT_ARRAY_SIZE]) { PAD_CIRCLE, PAD_CIRCLE, PAD_CROSS, PAD_TRIANGLE, @@ -246,12 +246,12 @@ void MainMenuInit(void) 0, 0, 0, 0, 0, 0, 0, 0 } , sizeof(unsigned short) * CHEAT_ARRAY_SIZE); - + PadAddCheat(&TestCheat); - + StackCheckCheat.Callback = &SystemPrintStackPointerAddress; memset(StackCheckCheat.Combination, 0, CHEAT_ARRAY_SIZE); - + memcpy( StackCheckCheat.Combination, (unsigned short[CHEAT_ARRAY_SIZE]) { PAD_TRIANGLE, PAD_TRIANGLE, PAD_CROSS, PAD_TRIANGLE, @@ -259,7 +259,7 @@ void MainMenuInit(void) 0, 0, 0, 0, 0, 0, 0, 0 } , sizeof(unsigned short) * CHEAT_ARRAY_SIZE); - + PadAddCheat(&StackCheckCheat); DevMenuCheat.Callback = &SystemDevMenuToggle; @@ -293,55 +293,39 @@ void MainMenuInit(void) void MainMenu(void) { - unsigned short* cheat_array; - uint8_t i; MainMenuInit(); - - #ifndef NO_INTRO + +#ifndef NO_INTRO PSXSDKIntro(); - #endif //PSXSDK_DEBUG +#endif //PSXSDK_DEBUG GfxSetGlobalLuminance(NORMAL_LUMINANCE); - + while (1) - { + { MainMenuButtonHandler(); - while (GfxIsGPUBusy() == true); - + GsSortCls(0,0,40); + switch(menuLevel) { case PLAY_OPTIONS_LEVEL: - - GsSortCls(0,0,40); MainMenuDrawButton(&MainMenuBtn[PLAY_BUTTON_INDEX]); MainMenuDrawButton(&MainMenuBtn[OPTIONS_BUTTON_INDEX]); - - for (cheat_array = PadGetPlayerOneCheatArray(), i = 0; *cheat_array != 0; cheat_array++, i += 16) - { - GfxDrawButton(i, 220, *cheat_array); - } - - GfxDrawScene(); break; - + case ONE_TWO_PLAYERS_LEVEL: - + GsSortCls(0,0,40); MainMenuDrawButton(&MainMenuBtn[ONE_PLAYER_BUTTON_INDEX]); MainMenuDrawButton(&MainMenuBtn[TWO_PLAYER_BUTTON_INDEX]); - - for (cheat_array = PadGetPlayerOneCheatArray(), i = 0; *cheat_array != 0; cheat_array++, i += 16) - { - GfxDrawButton(i, 220, *cheat_array); - } - - GfxDrawScene(); break; - + default: break; } + + GfxDrawScene_Slow(); } } @@ -350,23 +334,23 @@ void MainMenuRestoreInitValues(void) { menuLevel = PLAY_OPTIONS_LEVEL; MainMenuMinimumBtn = PLAY_BUTTON_INDEX; - + MainMenuBtn[PLAY_BUTTON_INDEX].selected = true; MainMenuBtn[PLAY_BUTTON_INDEX].was_selected = false; MainMenuBtn[PLAY_BUTTON_INDEX].timer = 0; - + MainMenuBtn[OPTIONS_BUTTON_INDEX].selected = false; MainMenuBtn[OPTIONS_BUTTON_INDEX].was_selected = false; MainMenuBtn[OPTIONS_BUTTON_INDEX].timer = 0; - + MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].selected = false; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].was_selected = false; MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].timer = 0; - + MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].selected = false; MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].was_selected = false; - MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].timer = 0; - + MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].timer = 0; + GfxSetGlobalLuminance(NORMAL_LUMINANCE); SfxPlayTrack(INTRO_TRACK); @@ -377,7 +361,7 @@ void MainMenuButtonHandler(void) static uint8_t btn_selected = PLAY_BUTTON_INDEX; static uint8_t previous_btn_selected = 0; uint8_t max_buttons; - + if (PadOneAnyKeyPressed() == true) { if (SystemIsRandSeedSet() == false) @@ -385,20 +369,20 @@ void MainMenuButtonHandler(void) SystemSetRandSeed(); } } - + if ( (PadOneKeySinglePress(PAD_CROSS) == true) || (PadOneKeySinglePress(PAD_TRIANGLE) == true) ) { SfxPlaySound(&AcceptSnd); } - + switch(menuLevel) { case PLAY_OPTIONS_LEVEL: max_buttons = MAIN_MENU_PLAY_OPTIONS_LEVEL_BUTTONS; break; - + case ONE_TWO_PLAYERS_LEVEL: if ( (btn_selected == TWO_PLAYER_BUTTON_INDEX) @@ -420,17 +404,17 @@ void MainMenuButtonHandler(void) } break; - + default: max_buttons = 0; break; } //DEBUG_PRINT_VAR(btn_selected); - + MainMenuBtn[previous_btn_selected].was_selected = MainMenuBtn[previous_btn_selected].selected; MainMenuBtn[btn_selected].was_selected = MainMenuBtn[btn_selected].selected; - + if (PadOneKeySinglePress(PAD_LEFT) && (btn_selected > 0) ) { MainMenuBtn[btn_selected].selected = false; @@ -438,27 +422,27 @@ void MainMenuButtonHandler(void) btn_selected--; SfxPlaySound(&BellSnd); } - else if (PadOneKeySinglePress(PAD_RIGHT) + else if (PadOneKeySinglePress(PAD_RIGHT) && (btn_selected < (max_buttons - 1 + MainMenuMinimumBtn) ) ) { MainMenuBtn[btn_selected].selected = false; previous_btn_selected = btn_selected; - btn_selected++; + btn_selected++; SfxPlaySound(&BellSnd); } - + if (btn_selected < MainMenuMinimumBtn) { btn_selected = MainMenuMinimumBtn; } - + if (btn_selected > (max_buttons - 1 + MainMenuMinimumBtn) ) { // Avoid overflow when going back in menu navigation btn_selected = (max_buttons - 1 + MainMenuMinimumBtn); } - + if (PadOneKeySinglePress(PAD_CROSS) ) { if (menuLevel == ONE_TWO_PLAYERS_LEVEL) @@ -473,38 +457,38 @@ void MainMenuButtonHandler(void) { MainMenuBtn[btn_selected].f(); } - - - + + + if (menuLevel == ONE_TWO_PLAYERS_LEVEL) { btn_selected = PLAY_BUTTON_INDEX; } - + } - + MainMenuBtn[btn_selected].selected = true; - + } void MainMenuDrawButton(TYPE_MMBtn * btn) -{ +{ MenuSpr.w = BUTTON_SIZE; MenuSpr.h = BUTTON_SIZE; - - if (btn->timer < MainMenuBtnAni_sz) + + if ( (btn->timer) < (MainMenuBtnAni_sz - 1) ) { btn->timer++; } - + if (btn->selected == true) { if (btn->was_selected == false) { btn->timer = 0; } - + MenuSpr.r = SELECTED_BUTTON_LUMINANCE; MenuSpr.g = SELECTED_BUTTON_LUMINANCE; MenuSpr.b = SELECTED_BUTTON_LUMINANCE; @@ -515,42 +499,36 @@ void MainMenuDrawButton(TYPE_MMBtn * btn) MenuSpr.g = NORMAL_LUMINANCE; MenuSpr.b = NORMAL_LUMINANCE; } - + MenuSpr.u = DEFAULT_BUTTON_U_OFFSET; MenuSpr.v = DEFAULT_BUTTON_V_OFFSET; - + switch(btn->i) { case PLAY_BUTTON_INDEX: MenuSpr.x = MAIN_MENU_PLAY_BUTTON_X; - MenuSpr.y = MAIN_MENU_PLAY_BUTTON_Y - MainMenuBtnAni[btn->timer]; + MenuSpr.y = MAIN_MENU_PLAY_BUTTON_Y; MenuSpr.u += btn->offset_u; MenuSpr.v += btn->offset_v; - - GsSortSprite(&MenuSpr); break; - + case OPTIONS_BUTTON_INDEX: MenuSpr.x = MAIN_MENU_OPTIONS_BUTTON_X; - MenuSpr.y = MAIN_MENU_OPTIONS_BUTTON_Y - MainMenuBtnAni[btn->timer]; + MenuSpr.y = MAIN_MENU_OPTIONS_BUTTON_Y; MenuSpr.u += btn->offset_u; MenuSpr.v += btn->offset_v; - - GsSortSprite(&MenuSpr); break; - + case ONE_PLAYER_BUTTON_INDEX: MenuSpr.x = MAIN_MENU_ONE_PLAYER_BUTTON_X; - MenuSpr.y = MAIN_MENU_ONE_PLAYER_BUTTON_Y - MainMenuBtnAni[btn->timer]; + MenuSpr.y = MAIN_MENU_ONE_PLAYER_BUTTON_Y; MenuSpr.u += btn->offset_u; MenuSpr.v += btn->offset_v; - - GsSortSprite(&MenuSpr); break; - + case TWO_PLAYER_BUTTON_INDEX: MenuSpr.x = MAIN_MENU_TWO_PLAYER_BUTTON_X; - MenuSpr.y = MAIN_MENU_TWO_PLAYER_BUTTON_Y - MainMenuBtnAni[btn->timer]; + MenuSpr.y = MAIN_MENU_TWO_PLAYER_BUTTON_Y; MenuSpr.u += btn->offset_u; MenuSpr.v += btn->offset_v; @@ -562,14 +540,14 @@ void MainMenuDrawButton(TYPE_MMBtn * btn) MenuSpr.g = NORMAL_LUMINANCE >> 1; MenuSpr.b = NORMAL_LUMINANCE >> 1; } - - GsSortSprite(&MenuSpr); break; - + default: break; } + MenuSpr.y -= MainMenuBtnAni[btn->timer]; + GsSortSprite(&MenuSpr); } void MenuTestCheat(void) diff --git a/Source/PSXSDKIntro.c b/Source/PSXSDKIntro.c index d73367e..941cea4 100644 --- a/Source/PSXSDKIntro.c +++ b/Source/PSXSDKIntro.c @@ -23,7 +23,7 @@ enum PSX_V = 0, PSX_X = (X_SCREEN_RESOLUTION >> 1) - (PSX_W >> 1), PSX_Y = (Y_SCREEN_RESOLUTION >> 1) - (PSX_H >> 1), - + DISK_X = PSX_X + 11, DISK_Y = PSX_Y + 2, DISK_W = 27, @@ -31,29 +31,29 @@ enum DISK_U = 2, DISK_V = 2, MAX_DISK_SPIN = 5, - + READER_X = PSX_X + 9, READER_Y = PSX_Y + 1, - + CLOSED_READER_W = 30, CLOSED_READER_H = 30, CLOSED_READER_U = 0, CLOSED_READER_V = 30, - + OPEN_READER_W = CLOSED_READER_W, OPEN_READER_H = 15, OPEN_READER_U = 0, OPEN_READER_V = (CLOSED_READER_H << 1) + 1, - + TRANSPARENT_CLOSED_READER_W = CLOSED_READER_W, TRANSPARENT_CLOSED_READER_H = CLOSED_READER_H, TRANSPARENT_CLOSED_READER_U = CLOSED_READER_W, TRANSPARENT_CLOSED_READER_V = PSX_H, - + TRANSPARENT_OPEN_READER_W = OPEN_READER_W, TRANSPARENT_OPEN_READER_H = OPEN_READER_H, TRANSPARENT_OPEN_READER_U = OPEN_READER_W, - TRANSPARENT_OPEN_READER_V = TRANSPARENT_CLOSED_READER_V + + TRANSPARENT_OPEN_READER_V = TRANSPARENT_CLOSED_READER_V + TRANSPARENT_CLOSED_READER_H }; @@ -146,20 +146,20 @@ void PSXSDKIntroDrawChar(short x, short y, char ch) PSXSDKIntroFont.w = FONT_SIZE; PSXSDKIntroFont.h = FONT_SIZE; PSXSDKIntroFont.tpage = FONT_TPAGE; - + if ( (ch >= 'A') && (ch <= 'Z') ) { ch -= 'A'; // Reset offset - + PSXSDKIntroFont.x = x; PSXSDKIntroFont.y = y; - + PSXSDKIntroFont.u = FONT_U + ( (ch % FONT_COLUMNS) << FONT_SIZE_BITSHIFT); PSXSDKIntroFont.v = FONT_V + ((short)(ch / FONT_COLUMNS) << FONT_SIZE_BITSHIFT); - + GfxSortSprite(&PSXSDKIntroFont); } - + if (ch == ' ') { return; @@ -169,7 +169,7 @@ void PSXSDKIntroDrawChar(short x, short y, char ch) void PSXSDKIntro(void) { int i; - + PSXSDKIntroCloseShellEvent = false; PSXSDKIntroCloseShellEventReminder = false; PSXSDKIntroSpinDiskEvent = false; @@ -178,29 +178,29 @@ void PSXSDKIntro(void) PSXSDKIntroRandTextEventReminder = false; PSXSDKIntroStringEvent = false; PSXSDKIntroClose = false; - + GfxSetGlobalLuminance(NORMAL_LUMINANCE); - + while (1) { while (GfxIsGPUBusy() == true); - + if ( ( (GfxGetGlobalLuminance() - BG_LUMINANCE_STEP) > 0) && (PSXSDKIntroClose == true) ) { GfxIncreaseGlobalLuminance(-BG_LUMINANCE_STEP); } - + if ( (GfxGetGlobalLuminance() <= BG_LUMINANCE_STEP) && (PSXSDKIntroClose == true) ) { break; } - + GsSortCls(0,0,0); - + for (i = 0; i < strlen(strPSXSDKIntro) ; i++) { if ( (PSXSDKIntroRandTextEvent == true) @@ -212,13 +212,13 @@ void PSXSDKIntro(void) PSXSDKIntroRandTextEventReminder = true; SfxPlaySound(&SpinDiskSnd); } - + PSXSDKIntroDrawChar(FONT_X + (i << FONT_SIZE_BITSHIFT),FONT_Y,SystemRand('A','Z')); - + GPL_Logo.r = 0; GPL_Logo.g = 0; GPL_Logo.b = 0; - + OpenSource_Logo.r = 0; OpenSource_Logo.g = 0; OpenSource_Logo.b = 0; @@ -226,9 +226,9 @@ void PSXSDKIntro(void) else if ( (PSXSDKIntroRandTextEvent == true) && (PSXSDKIntroStringEvent == true) ) - { + { PSXSDKIntroDrawChar(FONT_X + (i << FONT_SIZE_BITSHIFT),FONT_Y,strPSXSDKIntro[i]); - + if (System100msTick() == true) { if (GPL_Logo.r < GPL_LOGO_LUMINANCE_TARGET) @@ -237,32 +237,32 @@ void PSXSDKIntro(void) GPL_Logo.g += GPL_LOGO_LUMINANCE_STEP; GPL_Logo.b += GPL_LOGO_LUMINANCE_STEP; } - + GPL_Logo.x = GPL_LOGO_X; GPL_Logo.y = GPL_LOGO_Y; - + if (OpenSource_Logo.r < OPEN_SOURCE_LOGO_LUMINANCE_TARGET) { OpenSource_Logo.r += OPEN_SOURCE_LOGO_LUMINANCE_STEP; OpenSource_Logo.g += OPEN_SOURCE_LOGO_LUMINANCE_STEP; OpenSource_Logo.b += OPEN_SOURCE_LOGO_LUMINANCE_STEP; } - + OpenSource_Logo.x = OPEN_SOURCE_LOGO_X; OpenSource_Logo.y = OPEN_SOURCE_LOGO_Y; } - + GfxSortSprite(&GPL_Logo); GfxSortSprite(&OpenSource_Logo); } } - + for (i = 0; i < strlen(strPSXSDKIntroAuthor) ; i++) { if ( (PSXSDKIntroRandTextEvent == true) && (PSXSDKIntroStringEvent == false) ) - { + { PSXSDKIntroDrawChar(FONT_X2 + (i << FONT_SIZE_BITSHIFT),FONT_Y2,SystemRand('A','Z')); } else if ( (PSXSDKIntroRandTextEvent == true) @@ -272,49 +272,49 @@ void PSXSDKIntro(void) PSXSDKIntroDrawChar(FONT_X2 + (i << FONT_SIZE_BITSHIFT),FONT_Y2,strPSXSDKIntroAuthor[i]); } } - + PSXSDKIntroDrawConsole(); - + PSXSDKIntroDrawDisk(); - + if (PSXSDKIntroCloseShellEvent == true) { if (PSXSDKIntroCloseShellEventReminder == false) { PSXSDKIntroCloseShellEventReminder = true; - + SfxPlaySound(&TrayClSnd); } - + PsxDisk.x = READER_X; PsxDisk.y = READER_Y; - + PsxDisk.w = CLOSED_READER_W; PsxDisk.h = CLOSED_READER_H; - + PsxDisk.u = CLOSED_READER_U; PsxDisk.v = CLOSED_READER_V; - + GfxSortSprite(&PsxDisk); } else { PsxDisk.x = READER_X; PsxDisk.y = READER_Y; - + PsxDisk.w = OPEN_READER_W; PsxDisk.h = OPEN_READER_H; - + PsxDisk.u = OPEN_READER_U; PsxDisk.v = OPEN_READER_V; - + GfxSortSprite(&PsxDisk); } - + PSXSDKIntroDrawTransCase(); - + GfxDrawScene(); - + PSXSDKIntroRunTimers(); } } @@ -322,9 +322,9 @@ void PSXSDKIntro(void) void PSXSDKIntroRunTimers(void) { static uint16_t intro_timer = 0; - + intro_timer++; - + if ( (intro_timer >= CLOSE_SHELL_EV_TIM) && (PSXSDKIntroCloseShellEvent == false) ) @@ -332,7 +332,7 @@ void PSXSDKIntroRunTimers(void) PSXSDKIntroCloseShellEvent = true; intro_timer = 0; } - + if ( (intro_timer >= DISK_SPIN_EV_TIM) && (PSXSDKIntroCloseShellEvent == true) @@ -342,7 +342,7 @@ void PSXSDKIntroRunTimers(void) PSXSDKIntroSpinDiskEvent = true; intro_timer = 0; } - + if ( (intro_timer >= TEXT_APPEAR_RANDOM_TIM) && (PSXSDKIntroCloseShellEvent == true) @@ -354,7 +354,7 @@ void PSXSDKIntroRunTimers(void) PSXSDKIntroRandTextEvent = true; intro_timer = 0; } - + if ( (intro_timer >= TEXT_APPEAR_STRING_TIM) && (PSXSDKIntroCloseShellEvent == true) @@ -369,7 +369,7 @@ void PSXSDKIntroRunTimers(void) SfxPlayTrack(INTRO_TRACK); intro_timer = 0; } - + if ( (intro_timer >= INTRO_CLOSE_TIM) && (PSXSDKIntroCloseShellEvent == true) @@ -383,39 +383,39 @@ void PSXSDKIntroRunTimers(void) PSXSDKIntroClose = true; intro_timer = 0; } - - - + + + } void PSXSDKIntroDrawDisk(void) { static int spin_rotate = 0; static int spin_speed = 0; - + PsxDisk.x = DISK_X; PsxDisk.y = DISK_Y; - + PsxDisk.w = DISK_W; PsxDisk.h = DISK_H; - + PsxDisk.u = DISK_U; PsxDisk.v = DISK_V; - + if (PSXSDKIntroSpinDiskEvent == true) { if (PSXSDKIntroSpinDiskEventReminder == false) { PSXSDKIntroSpinDiskEventReminder = true; - + //SfxPlaySound(&SpinDiskSnd); } - + if (spin_speed < MAX_DISK_SPIN) { spin_speed++; } - + if (spin_rotate < GfxRotateFromDegrees(360) ) { spin_rotate += GfxRotateFromDegrees(spin_speed++); @@ -424,14 +424,14 @@ void PSXSDKIntroDrawDisk(void) { spin_rotate = SystemRand(0,GfxRotateFromDegrees(360)); } - + PsxDisk.rotate = spin_rotate; PsxDisk.mx = DISK_W >> 1; PsxDisk.my = DISK_H >> 1; } - + GfxSortSprite(&PsxDisk); - + PsxDisk.rotate = 0; } @@ -441,49 +441,49 @@ void PSXSDKIntroDrawTransCase(void) { PsxDisk.x = READER_X; PsxDisk.y = READER_Y; - + PsxDisk.w = TRANSPARENT_OPEN_READER_W; PsxDisk.h = TRANSPARENT_OPEN_READER_H; - + PsxDisk.u = TRANSPARENT_OPEN_READER_U; PsxDisk.v = TRANSPARENT_OPEN_READER_V; - + PsxDisk.attribute |= ENABLE_TRANS | TRANS_MODE(0); - + GfxSortSprite(&PsxDisk); - + PsxDisk.attribute &= ~(ENABLE_TRANS | TRANS_MODE(0) ); } else { PsxDisk.x = READER_X; PsxDisk.y = READER_Y; - + PsxDisk.w = TRANSPARENT_CLOSED_READER_W; PsxDisk.h = TRANSPARENT_CLOSED_READER_H; - + PsxDisk.u = TRANSPARENT_CLOSED_READER_U; PsxDisk.v = TRANSPARENT_CLOSED_READER_V; - + PsxDisk.attribute |= ENABLE_TRANS | TRANS_MODE(0); - + GfxSortSprite(&PsxDisk); - + PsxDisk.attribute &= ~(ENABLE_TRANS | TRANS_MODE(0) ); }*/ - + } void PSXSDKIntroDrawConsole(void) { PsxDisk.x = PSX_X; PsxDisk.y = PSX_Y; - + PsxDisk.w = PSX_W; PsxDisk.h = PSX_H; - + PsxDisk.u = PSX_U; PsxDisk.v = PSX_V; - + GfxSortSprite(&PsxDisk); } diff --git a/Source/Pad.c b/Source/Pad.c index 71b1fdc..0f7fe82 100644 --- a/Source/Pad.c +++ b/Source/Pad.c @@ -22,27 +22,27 @@ enum { - + PAD_CROSS_INDEX = 0, PAD_SQUARE_INDEX, PAD_TRIANGLE_INDEX, PAD_CIRCLE_INDEX, - + PAD_DOWN_INDEX, PAD_LEFT_INDEX, PAD_UP_INDEX, PAD_RIGHT_INDEX, - + PAD_L1_INDEX, PAD_L2_INDEX, - + PAD_R1_INDEX, PAD_R2_INDEX, - + NUMBER_OF_KEYS - + }; - + /* ************************************* * Local Prototypes @@ -102,9 +102,9 @@ static TYPE_CHEAT * cheatsArray[PAD_MAX_CHEATS]; psx_pad_state PadOneGetState(void) { psx_pad_state PadOne; - + PSX_PollPad_Fast(PAD_ONE, &PadOne); - + return PadOne; } @@ -116,9 +116,9 @@ unsigned char PadOneGetType(void) psx_pad_state PadTwoGetState(void) { psx_pad_state PadTwo; - + PSX_PollPad_Fast(PAD_TWO, &PadTwo); - + return PadTwo; } @@ -137,21 +137,21 @@ bool PadOneConnected(void) { return false; } - + return true; } bool PadTwoConnected(void) { psx_pad_state PadTwo = PadTwoGetState(); - + if ( (PadTwo.status != PAD_STATUS_OK) && (PadTwoGetID() == PAD_FLOATING_ID) ) { return false; } - + return true; } @@ -230,26 +230,26 @@ bool PadTwoKeyPressed(unsigned short key) } bool PadOneKeySinglePress(unsigned short key) -{ +{ return (bool)( !(previous_pad1 & key) && (pad1 & key) ); } bool PadTwoKeySinglePress(unsigned short key) -{ +{ return (bool)( !(previous_pad2 & key) && (pad2 & key) ); } bool PadOneKeyRepeat(unsigned short key, uint8_t time) { uint8_t key_index = PadGetKeyIndex(key); - + if (key_index == NUMBER_OF_KEYS) { return false; } - + pad1_keys_repeat[key_index]++; - + if (pad1_keys_repeat[key_index] >= time) { pad1_keys_repeat[key_index] = 0; @@ -262,20 +262,20 @@ bool PadOneKeyRepeat(unsigned short key, uint8_t time) bool PadTwoKeyRepeat(unsigned short key, uint8_t time) { uint8_t key_index = PadGetKeyIndex(key); - + if (key_index == NUMBER_OF_KEYS) { return false; } - + pad2_keys_repeat[key_index]++; - + if (pad2_keys_repeat[key_index] >= time) { pad2_keys_repeat[key_index] = 0; return true; } - + return false; } @@ -296,7 +296,7 @@ void PadTwoVibrationHandler(void) pad_enable_vibration(PAD_TWO); pad_set_vibration(PAD_TWO,pad2_small_vibration_force,pad2_big_vibration_force); pad2_vibration_timer--; - } + } } bool PadOneIsVibrationEnabled(void) @@ -314,15 +314,15 @@ bool UpdatePads(void) unsigned short adc_mouse; static unsigned short old_adc_mouse; bool both_pads_connected = true; - + PadOneVibrationHandler(); - + PadTwoVibrationHandler(); - + PadCheatHandler(PAD_ONE); - + PadCheatHandler(PAD_TWO); - + // Get now-old pad data previous_pad1 = pad1; previous_pad2 = pad2; @@ -342,7 +342,7 @@ bool UpdatePads(void) { PSX_ReadPad(&pad1,&pad2); } - + if (PadOneConnected() == false) { both_pads_connected = false; @@ -370,7 +370,7 @@ bool UpdatePads(void) { pad2_last_key_single_pressed = 0; } - + return both_pads_connected; } @@ -391,51 +391,51 @@ uint8_t PadGetKeyIndex(unsigned short key) case PAD_CROSS: return PAD_CROSS_INDEX; break; - + case PAD_SQUARE: return PAD_SQUARE_INDEX; break; - + case PAD_TRIANGLE: return PAD_TRIANGLE_INDEX; break; - + case PAD_CIRCLE: return PAD_CIRCLE_INDEX; break; - + case PAD_DOWN: return PAD_DOWN_INDEX; break; - + case PAD_LEFT: return PAD_LEFT_INDEX; break; - + case PAD_UP: return PAD_UP_INDEX; break; - + case PAD_RIGHT: return PAD_RIGHT_INDEX; break; - + case PAD_L1: return PAD_L1_INDEX; break; - + case PAD_R1: return PAD_R1_INDEX; break; - + case PAD_L2: return PAD_L2_INDEX; break; - + case PAD_R2: return PAD_R2_INDEX; break; - + default: return NUMBER_OF_KEYS; break; @@ -451,7 +451,7 @@ void PadClearData(void) { pad1 = 0; pad2 = 0; - + previous_pad1 = 0; previous_pad2 = 0; } @@ -460,16 +460,16 @@ void PadInit(void) { pad1_cheat_timer = TimerCreate(PAD_CHEAT_TIMEOUT,true /* Repeat flag */,&PadOneCleanCheatArray); pad2_cheat_timer = TimerCreate(PAD_CHEAT_TIMEOUT,true /* Repeat flag */,&PadTwoCleanCheatArray); - + memset(cheatsArray,0, sizeof(cheatsArray)); } void PadCheatHandler(uint8_t n_pad) { - unsigned short available_keys[12] = { PAD_LEFT, PAD_RIGHT, PAD_UP, PAD_DOWN, + unsigned short available_keys[12] = { PAD_LEFT, PAD_RIGHT, PAD_UP, PAD_DOWN, PAD_L2, PAD_R2, PAD_L1, PAD_R1, PAD_TRIANGLE, PAD_CIRCLE, PAD_CROSS, PAD_SQUARE }; - + uint8_t i; uint8_t keys_released = 0; unsigned short key; @@ -479,7 +479,7 @@ void PadCheatHandler(uint8_t n_pad) bool success = false; unsigned short* cheat_array; TYPE_TIMER* timer; - + switch(n_pad) { case PAD_ONE: @@ -488,19 +488,19 @@ void PadCheatHandler(uint8_t n_pad) clean_callback = &PadOneCleanCheatArray; timer = pad1_cheat_timer; break; - + case PAD_TWO: pressed_callback = &PadTwoKeySinglePress; cheat_array = pad2_cheat_array; clean_callback = &PadTwoCleanCheatArray; timer = pad2_cheat_timer; break; - + default: Serial_printf("Invalid pad called for PadCheatHandler()!\n"); return; } - + for (i = 0; i < PAD_MAX_CHEATS; i++) { if (cheatsArray[i] != NULL) @@ -513,15 +513,15 @@ void PadCheatHandler(uint8_t n_pad) { clean_callback(); } - + cheatsArray[i]->Callback(); - + return; } } } } - + for (i = 0; i < sizeof(available_keys) / sizeof(unsigned short); i++) { if (pressed_callback(available_keys[i]) == true) @@ -531,12 +531,12 @@ void PadCheatHandler(uint8_t n_pad) keys_released++; } } - + if (keys_released != 1) { return; } - + // Check for full array (return success = true if an empty array // element was found. for (j = 0; j < CHEAT_ARRAY_SIZE; j++) @@ -547,7 +547,7 @@ void PadCheatHandler(uint8_t n_pad) break; } } - + if (success == false) { if (clean_callback != NULL) @@ -556,22 +556,22 @@ void PadCheatHandler(uint8_t n_pad) clean_callback(); } } - + cheat_array[j] = key; } bool PadAddCheat(TYPE_CHEAT * cheat) { static uint8_t idx = 0; - + if (idx >= PAD_MAX_CHEATS) { Serial_printf("Maximum number of cheats exceeded!\n"); return false; } - + cheatsArray[idx++] = cheat; - + return true; } @@ -581,7 +581,7 @@ void PadOneCleanCheatArray(void) } void PadTwoCleanCheatArray(void) -{ +{ memset(pad2_cheat_array,0,sizeof(unsigned short) * CHEAT_ARRAY_SIZE); } diff --git a/Source/Pad.h b/Source/Pad.h index 458260c..c09ec9d 100644 --- a/Source/Pad.h +++ b/Source/Pad.h @@ -17,7 +17,7 @@ /* ************************************* * Global prototypes * *************************************/ - + void PadInit(void); void PadClearData(void); diff --git a/Source/PltParser.c b/Source/PltParser.c index 5a07c7b..ad7cf76 100644 --- a/Source/PltParser.c +++ b/Source/PltParser.c @@ -9,7 +9,7 @@ /* ************************************* * Defines * *************************************/ - + #define LINE_MAX_CHARACTERS 100 /* ************************************** @@ -63,15 +63,15 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) } strPltBuffer = SystemGetBufferAddress(); - + PltParserResetBuffers(ptrFlightData); - + // Now, buffer shall be read from line to line - + buffer = strtok_r((char*)strPltBuffer,"\n",&pltBufferSavePtr); - + aircraftIndex = 0; - + while (buffer != NULL) { if (buffer[0] == '#') @@ -80,28 +80,28 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) buffer = strtok_r(NULL,"\n",&pltBufferSavePtr); continue; } - + if (first_line_read == false) { // First (non-comment) line should indicate level time // i.e.: 10:30, or 22:45 first_line_read = true; - + if (strlen(buffer) != PLT_FIRST_LINE_CHARACTERS) { // Format should always be HH:MM (5 characters) // Treat any other combination as possible error return false; } - + if (buffer[PLT_COLON_POSITION] != ':') { // Check whether time format is HH:MM return false; } - + j = 0; - + for (i = 0; i < PLT_FIRST_LINE_CHARACTERS ; i++) { if (i == PLT_COLON_POSITION) @@ -127,19 +127,19 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) { // File header (initial game time) has already been read strncpy(lineBuffer, buffer, LINE_MAX_CHARACTERS); - + lineBufferPtr = strtok(lineBuffer,";"); - + i = 0; - + Serial_printf("New line read: %s\n",buffer); - + while (lineBufferPtr != NULL) { switch(i) { case DEPARTURE_ARRIVAL_INDEX: - + if (strncmp(lineBufferPtr,"DEPARTURE",strlen("DEPARTURE") ) == 0) { ptrFlightData->FlightDirection[aircraftIndex] = DEPARTURE; @@ -155,18 +155,18 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) Serial_printf("Flight direction is not correct!\n"); } break; - + case FLIGHT_NUMBER_INDEX: strncpy(ptrFlightData->strFlightNumber[aircraftIndex],lineBufferPtr,GAME_MAX_CHARACTERS); ptrFlightData->strFlightNumber[aircraftIndex][GAME_MAX_CHARACTERS - 1] = '\0'; Serial_printf("Aircraft %d flight number set to %s.\n",aircraftIndex,ptrFlightData->strFlightNumber[aircraftIndex]); break; - + case PASSENGERS_INDEX: ptrFlightData->Passengers[aircraftIndex] = atoi(lineBufferPtr); Serial_printf("Aircraft %d passengers set to %d.\n",aircraftIndex,ptrFlightData->Passengers[aircraftIndex]); break; - + case PARKING_INDEX: if (ptrFlightData->FlightDirection[aircraftIndex] == DEPARTURE) { @@ -178,24 +178,24 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) } Serial_printf("Aircraft %d parking set to %d.\n",aircraftIndex,ptrFlightData->Parking[aircraftIndex]); break; - + case HOURS_MINUTES_INDEX: if ( strlen(lineBufferPtr) != strlen("HH:MM") ) { Serial_printf("Hour minute format is not correct!\n"); break; } - + // Copy hour strHour[0] = lineBufferPtr[0]; strHour[1] = lineBufferPtr[1]; // Copy minutes strMinutes[0] = lineBufferPtr[3]; strMinutes[1] = lineBufferPtr[4]; - + ptrFlightData->Hours[aircraftIndex] = (uint8_t)atoi(strHour); ptrFlightData->Minutes[aircraftIndex] = (uint8_t)atoi(strMinutes); - + Serial_printf("Aircraft %d time set to %.2d:%.2d.\n", aircraftIndex, ptrFlightData->Hours[aircraftIndex], ptrFlightData->Minutes[aircraftIndex] ); @@ -205,40 +205,40 @@ bool PltParserLoadFile(char* strPath, TYPE_FLIGHT_DATA* ptrFlightData) ptrFlightData->RemainingTime[aircraftIndex] = (uint16_t)atoi(lineBufferPtr); Serial_printf("ptrFlightData->RemainingTime[%d] = %d\n", aircraftIndex, ptrFlightData->RemainingTime[aircraftIndex]); break; - - + + default: break; } - + lineBufferPtr = strtok(NULL,";"); i++; } - + ptrFlightData->State[aircraftIndex] = STATE_IDLE; aircraftIndex++; } - + buffer = strtok_r(NULL,"\n",&pltBufferSavePtr); } - + ptrFlightData->nAircraft = aircraftIndex; //Set total number of aircraft used ptrFlightData->ActiveAircraft = 0; - + Serial_printf("Number of aircraft parsed: %d\n",ptrFlightData->nAircraft); - + return true; } void PltParserResetBuffers(TYPE_FLIGHT_DATA* ptrFlightData) { uint8_t i; - + for (i = 0; i < GAME_MAX_AIRCRAFT ; i++) { memset(ptrFlightData->strFlightNumber[i],'\0',GAME_MAX_CHARACTERS); } - + memset(ptrFlightData->FlightDirection,DEPARTURE,GAME_MAX_AIRCRAFT); memset(ptrFlightData->Passengers,0,GAME_MAX_AIRCRAFT); memset(ptrFlightData->Hours,0,GAME_MAX_AIRCRAFT); @@ -342,7 +342,7 @@ uint8_t* PltParserGenerateFile(TYPE_PLT_CONFIG* ptrPltConfig) for (j = 0; j < nAircraft; j++) { uint8_t dep_arr_rand = SystemRand(0,100); - + if (dep_arr_rand < 50) { // Set departure flight diff --git a/Source/Serial.c b/Source/Serial.c index 8711245..528e97b 100644 --- a/Source/Serial.c +++ b/Source/Serial.c @@ -52,7 +52,7 @@ bool SerialRead(uint8_t* ptrArray, size_t nBytes) do { //uint16_t timeout = SERIAL_TX_RX_TIMEOUT; - + while ( (SIOCheckInBuffer() == SERIAL_RX_FIFO_EMPTY)); // Wait for RX FIFO not empty *(ptrArray++) = SIOReadByte(); diff --git a/Source/Sfx.c b/Source/Sfx.c index 905cefb..a79a308 100644 --- a/Source/Sfx.c +++ b/Source/Sfx.c @@ -44,15 +44,15 @@ bool SfxUploadSound(char* file_path, SsVag * vag) { return false; } - + if (voiceIndex < NUMBER_OF_VOICES) { SsReadVag(vag,SystemGetBufferAddress()); - + SsUploadVag(vag); - + vag->cur_voice = voiceIndex; - + voiceIndex++; Serial_printf("SPU voices used = %d\n", voiceIndex); @@ -76,7 +76,7 @@ bool SfxUploadSound(char* file_path, SsVag * vag) Serial_printf("Maximum number of SPU voices exceeded!\n"); return false; //Maximum voices exceeded } - + return true; } @@ -96,17 +96,17 @@ void SfxStopMusic(void) uint64_t timer = SystemGetGlobalTimer(); uint16_t CDVol = 0x7FFF; uint8_t time_step = 5; - + while (CDVol > 0x3F) { CDVol>>=1; SsCdVol(CDVol,CDVol); - + while (SystemGetGlobalTimer() < (timer + time_step) ); - + timer = SystemGetGlobalTimer(); } - + CdSendCommand(CdlMute,0); #endif } diff --git a/Source/Sfx.h b/Source/Sfx.h index f687353..1d4e8c0 100644 --- a/Source/Sfx.h +++ b/Source/Sfx.h @@ -11,7 +11,7 @@ /* ************************************* * Defines * *************************************/ - + /* ************************************* * Structs and enums * *************************************/ diff --git a/Source/System.c b/Source/System.c index 001a01d..675b0aa 100644 --- a/Source/System.c +++ b/Source/System.c @@ -14,7 +14,7 @@ * Defines * *************************************/ -#define FILE_BUFFER_SIZE 0x20014 +#define FILE_BUFFER_SIZE (128 << 10) // 128 KB #define END_STACK_PATTERN (uint32_t) 0x18022015 #define BEGIN_STACK_ADDRESS (uint32_t*) 0x801FFF00 @@ -24,7 +24,7 @@ /* ************************************* * Local Prototypes * *************************************/ - + static void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step); static void SystemSetStackPattern(void); static void ISR_RootCounter2(void); @@ -59,15 +59,15 @@ static bool devmenu_flag; static unsigned char sine_counter; /* ******************************************************************* - * + * * @name: void SystemInit(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Calls main intialization routines. - * + * * @remarks: To be called before main loop. - * + * * *******************************************************************/ void SystemInit(void) @@ -76,7 +76,7 @@ void SystemInit(void) global_timer = 0; //Reset 1 second timer one_second_timer = 0; - + //PSXSDK init #ifdef SERIAL_INTERFACE // PSX_INIT_SAVESTATE | PSX_INIT_CD flags are not needed @@ -118,11 +118,11 @@ void SystemInit(void) devmenu_flag = false; //Emergency mode flag emergency_mode = false; - + GfxSetGlobalLuminance(NORMAL_LUMINANCE); - + SystemSetStackPattern(); - + //SetRCntHandler(&ISR_RootCounter2, 2, 0xA560); Serial_printf("Begin SetRCntHandler\n"); @@ -141,19 +141,19 @@ void ISR_RootCounter2(void) } /* ******************************************************************* - * + * * @name: void SystemSetRandSeed(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Calls srand() while avoiding multiple calls by setting internal * variable rand_seed to true. Internal variable "global_timer" is * used to generate the new seed. - * + * * @remarks: * It is recommended to call it once user has pressed any key. - * + * * *******************************************************************/ void SystemSetRandSeed(void) @@ -163,25 +163,25 @@ void SystemSetRandSeed(void) rand_seed = true; //Set random seed using global timer as reference srand((unsigned int)global_timer); - + Serial_printf("Seed used: %d\n",(unsigned int)global_timer); } } /* ******************************************************************* - * + * * @name: bool SystemIsRandSeedSet(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Reportedly, returns whether rand seed has already been set. - * + * * @remarks: * * @return: * Reportedly, returns whether rand seed has already been set. - * + * * *******************************************************************/ bool SystemIsRandSeedSet(void) @@ -190,18 +190,18 @@ bool SystemIsRandSeedSet(void) } /* ******************************************************************* - * + * * @name: bool SystemRefreshNeeded(void) - * + * * @author: Xavier Del Campo - * + * * @brief: - * + * * @remarks: * * @return: * Returns whether VSync flag has been enabled. - * + * * *******************************************************************/ bool SystemRefreshNeeded(void) @@ -210,17 +210,17 @@ bool SystemRefreshNeeded(void) } /* ******************************************************************* - * + * * @name: void ISR_SystemDefaultVBlank(void) - * + * * @author: Xavier Del Campo - * + * * @brief: - * + * * @remarks: * Called from VSync interrupt. Called 50 times a second in PAL mode, * 60 times a second in NTSC mode. - * + * * *******************************************************************/ void ISR_SystemDefaultVBlank(void) @@ -230,21 +230,21 @@ void ISR_SystemDefaultVBlank(void) fps = temp_fps; temp_fps = 0; } - + refresh_needed = true; } /* ******************************************************************* - * + * * @name: void SystemAcknowledgeFrame(void) - * + * * @author: Xavier Del Campo - * + * * @brief: - * + * * @remarks: * Called by Game module in order to calculate frames per second. - * + * * *******************************************************************/ void SystemAcknowledgeFrame(void) @@ -253,18 +253,18 @@ void SystemAcknowledgeFrame(void) } /* ******************************************************************* - * + * * @name: void SystemAcknowledgeFrame(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Creates a sine-line (more exactly, a parabola-like) effect and * stores its value into a variable. - * + * * @remarks: * To be called only once, preferibly on SystemCyclic(). - * + * * *******************************************************************/ void SystemCalculateSine(void) @@ -275,7 +275,7 @@ void SystemCalculateSine(void) SINE_EFFECT_MAX = 240 }; - static bool sine_decrease = false; + static bool sine_decrease = false; if (sine_decrease == false) { @@ -302,15 +302,15 @@ void SystemCalculateSine(void) } /* ******************************************************************* - * + * * @name: unsigned char SystemGetSineValue(void) - * + * * @author: Xavier Del Campo * * @return: * Returns a value which oscillates like a sine (more exactly, like * a parabola) function to be used wherever you want. - * + * * *******************************************************************/ unsigned char SystemGetSineValue(void) @@ -319,17 +319,17 @@ unsigned char SystemGetSineValue(void) } /* ******************************************************************* - * + * * @name: void SystemIncreaseGlobalTimer(void) - * + * * @author: Xavier Del Campo - * + * * @brief: * Increases internal variable responsible for time handling. - * + * * @remarks: * Usually called from ISR_SystemDefaultVBlank(). - * + * * *******************************************************************/ void SystemIncreaseGlobalTimer(void) @@ -338,13 +338,13 @@ void SystemIncreaseGlobalTimer(void) } /* ******************************************************************* - * + * * @name: uint64_t SystemGetGlobalTimer(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Returns internal global timer value. - * + * * *******************************************************************/ uint64_t SystemGetGlobalTimer(void) @@ -353,13 +353,13 @@ uint64_t SystemGetGlobalTimer(void) } /* ******************************************************************* - * + * * @name: void SystemDisableScreenRefresh(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Resets VBlank IRQ flag. - * + * * *******************************************************************/ void SystemDisableScreenRefresh(void) @@ -368,14 +368,14 @@ void SystemDisableScreenRefresh(void) } /* ******************************************************************* - * + * * @name: bool System1SecondTick(void) - * + * * @author: Xavier Del Campo - * + * * @return: bool variable with a 1-cycle-length pulse that gets * set each second. - * + * * *******************************************************************/ bool System1SecondTick(void) @@ -384,14 +384,14 @@ bool System1SecondTick(void) } /* ******************************************************************* - * + * * @name: bool System100msTick(void) - * + * * @author: Xavier Del Campo - * + * * @return: bool variable with a 1-cycle-length pulse that gets * set every 100 milliseconds. - * + * * *******************************************************************/ bool System100msTick(void) @@ -400,14 +400,14 @@ bool System100msTick(void) } /* ******************************************************************* - * + * * @name bool System500msTick(void) - * + * * @author: Xavier Del Campo - * + * * @return: bool variable with a 1-cycle-length pulse that gets * set every 500 milliseconds. - * + * * *******************************************************************/ bool System500msTick(void) @@ -416,15 +416,15 @@ bool System500msTick(void) } /* ******************************************************************* - * - * @name void SystemRunTimers(void) - * + * + * @name void SystemRunTimers(void) + * * @author: Xavier Del Campo - * + * * @brief: general timer handler * * @remarks: 1 second, 500 ms and 100 ms ticks get updated here. - * + * * *******************************************************************/ void SystemRunTimers(void) @@ -434,26 +434,26 @@ void SystemRunTimers(void) static uint64_t last_500_ms_tick; SystemCheckTimer(&one_second_timer, &last_one_second_tick, REFRESH_FREQUENCY); - + #ifdef _PAL_MODE_ SystemCheckTimer(&hundred_ms_timer, &last_100_ms_tick, 2 /* 2 * 50 ms = 100 ms */); SystemCheckTimer(&five_hundred_ms_timer, &last_500_ms_tick, 10 /* 10 * 50 ms = 500 ms */); #else // _PAL_MODE_ SystemCheckTimer(&hundred_ms_timer, &last_100_ms_tick, 3); #endif // _PAL_MODE_ - + } /* ******************************************************************************** - * + * * @name void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step) - * + * * @author: Xavier Del Campo - * + * * @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 == true) @@ -469,16 +469,16 @@ void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step) } /* **************************************************************************************** - * + * * @name bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) - * + * * @author: Xavier Del Campo - * + * * @brief: Given an input path, it fills a buffer pointed to by "buffer" with * maximum size "szBuffer" with data from CD-ROM. * * @return: true if file has been loaded successfully, false otherwise. - * + * * ****************************************************************************************/ bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) @@ -490,16 +490,16 @@ bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) FILE *f; #endif // SERIAL_INTERFACE int32_t size = 0; - + // Wait for possible previous operation from the GPU before entering this section. while ( (SystemIsBusy() == true) || (GfxIsGPUBusy() == true) ); - + if (fname == NULL) { Serial_printf("SystemLoadFile: NULL fname!\n"); return false; } - + memset(buffer,0,szBuffer); #ifdef SERIAL_INTERFACE @@ -540,7 +540,7 @@ bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) SystemDisableVBlankInterrupt(); f = fopen(fname, "r"); - + if (f == NULL) { Serial_printf("SystemLoadFile: file could not be found!\n"); @@ -551,18 +551,18 @@ bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) fseek(f, 0, SEEK_END); size = ftell(f); - + if (size > szBuffer) { Serial_printf("SystemLoadFile: Exceeds file buffer size (%d bytes)\n",size); //Bigger than 128 kB (buffer's max size) return false; } - + fseek(f, 0, SEEK_SET); //f->pos = 0; - + fread(buffer, sizeof(char), size, f); - + fclose(f); SystemEnableVBlankInterrupt(); @@ -570,22 +570,22 @@ bool SystemLoadFileToBuffer(char* fname, uint8_t* buffer, uint32_t szBuffer) system_busy = false; #endif // SERIAL_INTERFACE - + Serial_printf("File \"%s\" loaded successfully!\n",fname); - + return true; } /* **************************************************************************************** - * + * * @name bool SystemLoadFile(char*fname) - * + * * @author: Xavier Del Campo - * + * * @brief: Given an input file name, it loads its conents into internal buffer. * * @return: true if file has been loaded successfully, false otherwise. - * + * * ****************************************************************************************/ bool SystemLoadFile(char*fname) @@ -594,13 +594,13 @@ bool SystemLoadFile(char*fname) } /* ****************************************************************** - * + * * @name uint8_t* SystemGetBufferAddress(void) - * + * * @author: Xavier Del Campo * * @return: Reportedly, returns internal buffer initial address. - * + * * *****************************************************************/ uint8_t* SystemGetBufferAddress(void) @@ -609,13 +609,13 @@ uint8_t* SystemGetBufferAddress(void) } /* ****************************************************************** - * + * * @name void SystemClearBuffer(void) - * + * * @author: Xavier Del Campo * * @return: Fills internal buffer with zeros - * + * * *****************************************************************/ void SystemClearBuffer(void) @@ -624,33 +624,33 @@ void SystemClearBuffer(void) } /* ****************************************************************** - * + * * @name void SystemWaitCycles(uint32_t cycles) - * + * * @author: Xavier Del Campo * * @return: halts program execution for n-"cycles" - * + * * *****************************************************************/ void SystemWaitCycles(uint32_t cycles) { uint64_t currentTime = global_timer; - + while (global_timer < (currentTime + cycles) ); } /* ****************************************************************** - * + * * @name uint32_t SystemRand(uint32_t min, uint32_t max) - * + * * @author: Xavier Del Campo * * @return: random number between "min" and "max". * * @remarks: rand seed must be set before using this function, or * you will predictable values otherwise! - * + * * *****************************************************************/ uint32_t SystemRand(uint32_t min, uint32_t max) @@ -659,20 +659,20 @@ uint32_t SystemRand(uint32_t min, uint32_t max) { Serial_printf("Warning: calling rand() before srand()\n"); } - + return rand() % (max - min + 1) + min; } /* *********************************************************************** - * + * * @name void SystemSetEmergencyMode(bool value) - * + * * @author: Xavier Del Campo * * @brief: Sets emergency mode flag. * * @remarks: emergency mode is set once that a controller is unplugged. - * + * * ***********************************************************************/ void SystemSetEmergencyMode(bool value) @@ -681,13 +681,13 @@ void SystemSetEmergencyMode(bool value) } /* *********************************************************************** - * + * * @name bool SystemGetEmergencyMode(void) - * + * * @author: Xavier Del Campo * * @return: returns emergency mode flag. - * + * * ***********************************************************************/ bool SystemGetEmergencyMode(void) @@ -696,13 +696,13 @@ bool SystemGetEmergencyMode(void) } /* *********************************************************************** - * + * * @name volatile bool SystemIsBusy(void) - * + * * @author: Xavier Del Campo * * @return: returns system busy flag. - * + * * ***********************************************************************/ volatile bool SystemIsBusy(void) @@ -711,21 +711,21 @@ volatile bool SystemIsBusy(void) } /* **************************************************************************** - * + * * @name bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz) - * + * * @author: Xavier Del Campo * * @brief: checks if a certain value is contained in a buffer with size "sz". - * + * * @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; - + for (i = 0; i < sz; i++) { if (buffer[i] == value) @@ -733,27 +733,27 @@ bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz) return true; } } - + return false; } /* **************************************************************************** - * + * * @name bool SystemContains_u16(uint16_t value, uint16_t* buffer, size_t sz) - * + * * @author: Xavier Del Campo * * @brief: checks if a certain value is contained in a buffer with size "sz". * Variant for u16 variables. - * + * * @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; - + for (i = 0; i < sz; i++) { if (buffer[i] == value) @@ -761,26 +761,26 @@ bool SystemContains_u16(uint16_t value, uint16_t* buffer, size_t sz) return true; } } - + return false; } /* **************************************************************************************** - * + * * @name bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz) - * + * * @author: Xavier Del Campo - * + * * @brief: Reportedly, it compares two arrays "arr1" and "arr2", with size "sz". * * @return: true if they are equal, false otherwise. - * + * * ****************************************************************************************/ bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz) { size_t i; - + for (i = 0; i < sz; i++) { if (arr1[i] != arr2[i]) @@ -788,18 +788,18 @@ bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz) return false; } } - + return true; } /* **************************************************************************************** - * + * * @name void SystemPrintStackPointerAddress(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Prints stack usage in percentage via dprintf calls. - * + * * ****************************************************************************************/ void SystemPrintStackPointerAddress(void) @@ -808,11 +808,11 @@ void SystemPrintStackPointerAddress(void) void* ptr = NULL; fix16_t used_bytes = fix16_from_int((int)((void*)BEGIN_STACK_ADDRESS - (void*)&ptr)); fix16_t stackPercent = fix16_sdiv(used_bytes,fix16_from_int((int)STACK_SIZE)); - + stackPercent = fix16_smul(stackPercent, fix16_from_int((int)100)); - + Serial_printf("stackPercent: %d\n", stackPercent); - + Serial_printf("Stack begin pointer: 0x%08X\n" "Stack pointer address: 0x%08X\n" "Used %d%% of stack size.\n" @@ -826,99 +826,99 @@ void SystemPrintStackPointerAddress(void) } /* **************************************************************************************** - * + * * @name void SystemCheckStack(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Compares stack top with expected byte pattern. If does not match, a stack * overflow has been caused, and application returns to a safe state. - * + * * ****************************************************************************************/ void SystemCheckStack(void) { uint32_t * ptrStack = BEGIN_STACK_ADDRESS; uint32_t data; - + ptrStack -= STACK_SIZE; data = (*ptrStack); - + if (data != END_STACK_PATTERN) { Serial_printf("Stack overflow?\n"); - + while (1); } } /* **************************************************************************************** - * + * * @name void SystemSetStackPattern(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Sets a determined byte pattern on stack top to detect possible stack * overflow during execution. - * + * * ****************************************************************************************/ void SystemSetStackPattern(void) { uint32_t * ptrStack = BEGIN_STACK_ADDRESS; - + ptrStack -= STACK_SIZE; - + *ptrStack = END_STACK_PATTERN; } /* **************************************************************************************** - * + * * @name int32_t SystemIndexOfStringArray(char* str, char** array) - * + * * @author: Xavier Del Campo - * + * * @brief: Finds string "str" inside an array of strings "array". * * @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; - + for (i = 0; array[i] != NULL; i++) { Serial_printf("String to find: %s\nEntry: %s\n", str, array[i]); - + if (strcmp(str, array[i]) == 0) { Serial_printf("Match! Returning index %d...\n", i); return i; } } - + return -1; } /* **************************************************************************************** - * + * * @name int32_t SystemIndexOf_U16(uint16_t value, uint16_t* array, uint32_t sz) - * + * * @author: Xavier Del Campo - * + * * @brief: For a uint16_t array, it returns index of a variable "value" inside an 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; - + for (i = 0; i < sz; i++) { if (value == array[i]) @@ -926,28 +926,28 @@ int32_t SystemIndexOf_U16(uint16_t value, uint16_t* array, uint32_t sz) return i; } } - + return -1; } /* **************************************************************************************** - * + * * @name int32_t SystemIndexOf_U8(uint8_t value, uint8_t* array, uint32_t from, uint32_t sz) - * + * * @author: Xavier Del Campo - * + * * @brief: For a uint8_t array, it returns index of a variable "value" inside an array. * "from" and "size_t" can be used to determine initial/ending positions. * * @return Index for a variable "value" inside "array". -1 if it could not be found. - * + * * ****************************************************************************************/ int32_t SystemIndexOf_U8(uint8_t value, uint8_t* array, uint32_t from, uint32_t sz) { int32_t i; - + for (i = from; i < sz; i++) { if (value == array[i]) @@ -955,18 +955,18 @@ int32_t SystemIndexOf_U8(uint8_t value, uint8_t* array, uint32_t from, uint32_t return i; } } - + return -1; } /* **************************************************************************************** - * + * * @name volatile uint8_t SystemGetFPS(void) - * + * * @author: Xavier Del Campo - * + * * @return: Frames per second - * + * * ****************************************************************************************/ volatile uint8_t SystemGetFPS(void) @@ -975,14 +975,14 @@ volatile uint8_t SystemGetFPS(void) } /* **************************************************************************************** - * + * * @name void SystemCyclicHandler(void) - * + * * @author: Xavier Del Campo - * + * * @brief: It calls system handlers once an execution cycle has finished. - * - * + * + * * ****************************************************************************************/ void SystemCyclicHandler(void) @@ -990,31 +990,31 @@ void SystemCyclicHandler(void) UpdatePads(); SystemIncreaseGlobalTimer(); - + SystemRunTimers(); - + TimerHandler(); - + SystemDisableScreenRefresh(); - + MemCardHandler(); SystemCalculateSine(); - + SystemCheckStack(); } /* **************************************************************************************** - * + * * @name void SystemDisableVBlankInterrupt(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Reportedly, this routine enables VBLANK interrupt flag. * * @remark: Used when critical timing is needed or GPU activity is not desired - * e.g.: when reading files from CD-ROM. - * + * e.g.: when reading files from CD-ROM. + * * ****************************************************************************************/ void SystemDisableVBlankInterrupt(void) @@ -1023,14 +1023,14 @@ void SystemDisableVBlankInterrupt(void) } /* **************************************************************************************** - * + * * @name void SystemEnableVBlankInterrupt(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Reportedly, this routine enables VBLANK interrupt flag. - * - * + * + * * ****************************************************************************************/ void SystemEnableVBlankInterrupt(void) @@ -1039,14 +1039,14 @@ void SystemEnableVBlankInterrupt(void) } /* **************************************************************************************** - * + * * @name void SystemReturnToLoader(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Deinitializes PSXSDK library and returns to OpenSend loader, * located at memory address 0x801A0000 - * + * * ****************************************************************************************/ void SystemReturnToLoader(void) @@ -1054,36 +1054,36 @@ void SystemReturnToLoader(void) Serial_printf("Returning to loader...\n"); EndAnimation(); - + PSX_DeInit(); __asm__("j 0x801A0000"); } /* **************************************************************************************** - * + * * @name void SystemDevMenuToggle(void) - * + * * @author: Xavier Del Campo - * + * * @brief: It toggles a flag called "devmenu_flag" which, if true, shows information on * top of all drawn primitives for debugging/development purposes. - * + * * ****************************************************************************************/ - + void SystemDevMenuToggle(void) { devmenu_flag = devmenu_flag? false: true; } /* **************************************************************************************** - * + * * @name void SystemEnableRCnt2Interrupt(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Enables bit 6 from I_MASK (0x1F801074)/IRQ6 RCNT2 (System clock / 8) - * + * * ****************************************************************************************/ void SystemEnableRCnt2Interrupt(void) @@ -1093,13 +1093,13 @@ void SystemEnableRCnt2Interrupt(void) /* **************************************************************************************** - * + * * @name void SystemDisableRCnt2Interrupt(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Disables bit 6 from I_MASK (0x1F801074)/IRQ6 RCNT2 (System clock / 8) - * + * * ****************************************************************************************/ void SystemDisableRCnt2Interrupt(void) @@ -1108,13 +1108,13 @@ void SystemDisableRCnt2Interrupt(void) } /* **************************************************************************************** - * + * * @name void SystemDevMenu(void) - * + * * @author: Xavier Del Campo - * + * * @brief: Shows information on top of all drawn primitives for debugging/development purposes. - * + * * ****************************************************************************************/ void SystemDevMenu(void) @@ -1125,7 +1125,7 @@ void SystemDevMenu(void) DEVMENU_BG_X = (X_SCREEN_RESOLUTION >> 1) - (DEVMENU_BG_W >> 1), DEVMENU_BG_Y = 32, DEVMENU_BG_H = 128, - + DEVMENU_BG_R = 0, DEVMENU_BG_G = 128, DEVMENU_BG_B = 32, diff --git a/Source/System.h b/Source/System.h index 3bce5e4..306bd5f 100644 --- a/Source/System.h +++ b/Source/System.h @@ -2,7 +2,7 @@ #define __SYSTEM_HEADER__ /* ************************************** - * Includes * + * Includes * * **************************************/ #include "Global_Inc.h" @@ -134,7 +134,7 @@ void SystemCalculateSine(void); unsigned char SystemGetSineValue(void); /* ************************************** - * Global Variables * + * Global Variables * * **************************************/ #endif //__SYSTEM_HEADER__ diff --git a/Source/Timer.c b/Source/Timer.c index d49e698..85ae267 100644 --- a/Source/Timer.c +++ b/Source/Timer.c @@ -23,9 +23,9 @@ static TYPE_TIMER timer_array[MAX_TIMERS]; * *************************************/ /* ******************************************************************************************** - * + * * @name TYPE_TIMER* TimerCreate(uint32_t t, bool rf, void (*timer_callback)(void) ) - * + * * @author: Xavier Del Campo * * @brief: fills a TYPE_TIMER structure with input parameters @@ -35,23 +35,23 @@ static TYPE_TIMER timer_array[MAX_TIMERS]; * bool rf: * Repeat flag * void (*timer_callback)(void) - * Function to be called on timeout - * + * Function to be called on timeout + * * @return: pointer to TYPE_TIMER structure if filled correctly, NULL pointer otherwise. - * + * * ********************************************************************************************/ TYPE_TIMER* TimerCreate(uint32_t t, bool rf, void (*timer_callback)(void) ) { bool success = false; uint8_t i; - + if (t == 0) { Serial_printf("Cannot create timer with time == 0!\n"); return NULL; } - + for (i = 0; i < MAX_TIMERS; i++) { if (timer_array[i].busy == false) @@ -65,30 +65,30 @@ TYPE_TIMER* TimerCreate(uint32_t t, bool rf, void (*timer_callback)(void) ) break; } } - + if (success == false) { Serial_printf("Could not find any free timer!\n"); return NULL; } - + return &timer_array[i]; } /* ******************************************* - * + * * @name void TimerReset(void) - * + * * @author: Xavier Del Campo * * @brief: reportedly, removes all timers. - * + * * *******************************************/ void TimerReset(void) { uint8_t i; - + for (i = 0; i < MAX_TIMERS; i++) { TimerRemove(&timer_array[i]); @@ -96,21 +96,21 @@ void TimerReset(void) } /* ***************************************************** - * + * * @name void TimerHandler(void) - * + * * @author: Xavier Del Campo * * @brief: reportedly, handles all available timers. * * @remarks: calls callback on timeout. - * + * * *****************************************************/ void TimerHandler(void) { uint8_t i; - + for (i = 0; i < MAX_TIMERS; i++) { if (timer_array[i].busy == true) @@ -118,11 +118,11 @@ void TimerHandler(void) if (System100msTick() == true) { timer_array[i].time--; - + if (timer_array[i].time == 0) { timer_array[i].Timeout_Callback(); - + if (timer_array[i].repeat_flag == true) { timer_array[i].time = timer_array[i].orig_time; @@ -134,15 +134,15 @@ void TimerHandler(void) } /* ********************************************************************* - * + * * @name void TimerRestart(TYPE_TIMER* timer) - * + * * @author: Xavier Del Campo * * @brief: sets time left for TYPE_TIMER instance to initial value. * * @remarks: specially used when TYPE_TIMER.rf is enabled. - * + * * *********************************************************************/ void TimerRestart(TYPE_TIMER* timer) @@ -151,16 +151,16 @@ void TimerRestart(TYPE_TIMER* timer) } /* ********************************************************************* - * + * * @name void TimerRemove(TYPE_TIMER* timer) - * + * * @author: Xavier Del Campo * * @brief: Resets timer parameters to default values so timer instance - * can be recycled. + * can be recycled. * * @remarks: - * + * * *********************************************************************/ void TimerRemove(TYPE_TIMER* timer) diff --git a/Source/Timer.h b/Source/Timer.h index 6f4a3a4..6b11d9a 100644 --- a/Source/Timer.h +++ b/Source/Timer.h @@ -2,7 +2,7 @@ #define __TIMER_HEADER__ /* ************************************** - * Includes * + * Includes * * **************************************/ #include "Global_Inc.h" diff --git a/Source/main.c b/Source/main.c index 80e74be..e025f22 100644 --- a/Source/main.c +++ b/Source/main.c @@ -18,8 +18,8 @@ int main(void) { //System initialization SystemInit(); - + MainMenu(); - + return 0; } |
