* Split screen from now on is only calling GsDrawList() once. The reason for this is that now DMA is used instead of GPIO for drawenv/dispenv management.
* (PSXSDK internals): incorrect bit shifting was being made on 0xE3 and 0xE4 GPU instructions (drawenv management). * (Bugfix): Timers were not being reset properly because pad1_cheat_timer and pad2_cheat_timer were being accidentally reset to NULL on calling memset() for cheatsArray. * Timers are now updated every 100 ms instead of every second. * Mouse sprite should be now drawn on X_SCREEN_RESOLUTION >> 2 in 2-player mode. TODO: check why this isn't working!
This commit is contained in:
parent
3a8f914661
commit
aefe5f8c1c
|
@ -7,8 +7,7 @@
|
|||
/* *************************************
|
||||
* Defines
|
||||
* *************************************/
|
||||
|
||||
#define AIRCRAFT_SPEED_TABLE_SIZE 8
|
||||
|
||||
#define AIRCRAFT_SIZE 16
|
||||
|
||||
/* *************************************
|
||||
|
|
|
@ -76,8 +76,10 @@ enum
|
|||
{
|
||||
MOUSE_W = 8,
|
||||
MOUSE_H = 8,
|
||||
MOUSE_X = X_SCREEN_RESOLUTION - (X_SCREEN_RESOLUTION >> 1),
|
||||
MOUSE_Y = Y_SCREEN_RESOLUTION - (Y_SCREEN_RESOLUTION >> 1),
|
||||
MOUSE_X = (X_SCREEN_RESOLUTION >> 1),
|
||||
MOUSE_Y = (Y_SCREEN_RESOLUTION >> 1),
|
||||
MOUSE_X_2PLAYER = (X_SCREEN_RESOLUTION >> 2),
|
||||
MOUSE_Y_2PLAYER = (Y_SCREEN_RESOLUTION >> 1)
|
||||
};
|
||||
|
||||
/* *************************************
|
||||
|
@ -305,8 +307,17 @@ void GameInit(void)
|
|||
firstActiveAircraft = 0;
|
||||
lastActiveAircraft = 0;
|
||||
|
||||
GameMouseSpr.x = MOUSE_X;
|
||||
GameMouseSpr.y = MOUSE_Y;
|
||||
if(GameTwoPlayersActive() == true)
|
||||
{
|
||||
GameMouseSpr.x = MOUSE_X;
|
||||
GameMouseSpr.y = MOUSE_Y;
|
||||
}
|
||||
else
|
||||
{
|
||||
GameMouseSpr.x = MOUSE_X_2PLAYER;
|
||||
GameMouseSpr.y = MOUSE_Y_2PLAYER;
|
||||
}
|
||||
|
||||
GameMouseSpr.w = MOUSE_W;
|
||||
GameMouseSpr.h = MOUSE_H;
|
||||
GameMouseSpr.attribute = COLORMODE(COLORMODE_16BPP);
|
||||
|
@ -556,9 +567,7 @@ void GameGraphics(void)
|
|||
int i;
|
||||
bool split_screen = false;
|
||||
|
||||
while( (GfxIsGPUBusy() == true)
|
||||
||
|
||||
(SystemRefreshNeeded() == false) );
|
||||
while(GfxIsGPUBusy() == true);
|
||||
|
||||
if(TwoPlayersActive == true)
|
||||
{
|
||||
|
@ -583,15 +592,8 @@ void GameGraphics(void)
|
|||
|
||||
GameRenderLevel(&PlayerData[i]);
|
||||
AircraftRender(&PlayerData[i]);
|
||||
|
||||
/*for(i = 0; i < MAX_PLAYERS ; i++)
|
||||
{*/
|
||||
GameGuiAircraftList(&PlayerData[i], &FlightData);
|
||||
//}
|
||||
|
||||
GfxDrawScene_NoSwap();
|
||||
|
||||
while(GfxIsGPUBusy() == true);
|
||||
|
||||
GameGuiAircraftList(&PlayerData[i], &FlightData);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -603,13 +605,7 @@ void GameGraphics(void)
|
|||
|
||||
GameGuiClock(GameHour,GameMinutes);
|
||||
|
||||
GfxDrawScene_NoSwap();
|
||||
|
||||
while(GfxIsGPUBusy() == true);
|
||||
|
||||
GfxSwapBuffers();
|
||||
|
||||
SystemCyclicHandler();
|
||||
GfxDrawScene();
|
||||
}
|
||||
|
||||
void GameLoadLevel(void)
|
||||
|
|
129
Source/GameGui.c
129
Source/GameGui.c
|
@ -150,7 +150,17 @@ enum
|
|||
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_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,
|
||||
AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y3_2PLAYER = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y2_2PLAYER
|
||||
};
|
||||
|
||||
enum
|
||||
|
@ -158,11 +168,20 @@ 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_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
|
||||
};
|
||||
|
||||
enum
|
||||
|
@ -339,8 +358,10 @@ void GameGuiAircraftNotificationRequest(TYPE_FLIGHT_DATA * ptrFlightData)
|
|||
bool GameGuiPauseDialog(TYPE_PLAYER* ptrPlayer)
|
||||
{
|
||||
GfxSaveDisplayData(&SecondDisplay);
|
||||
|
||||
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
|
||||
|
||||
DrawFBRect(0, 0, X_SCREEN_RESOLUTION, VRAM_H, 0, 0, 0);
|
||||
//DrawFBRect(0, 0, X_SCREEN_RESOLUTION, VRAM_H, 0, 0, 0);
|
||||
|
||||
while(GfxIsGPUBusy() == true);
|
||||
|
||||
|
@ -518,10 +539,20 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightDat
|
|||
|
||||
SelectedAircraftGPoly4.attribute |= ENABLE_TRANS | TRANS_MODE(0);
|
||||
|
||||
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;
|
||||
if(GameTwoPlayersActive() == true)
|
||||
{
|
||||
SelectedAircraftGPoly4.x[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X0_2PLAYER;
|
||||
SelectedAircraftGPoly4.x[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X1_2PLAYER;
|
||||
SelectedAircraftGPoly4.x[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_X2_2PLAYER;
|
||||
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);
|
||||
|
||||
|
@ -532,11 +563,26 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFlightDat
|
|||
dprintf("ptrPlayer->FlightDataPage = %d\n",ptrPlayer->FlightDataPage);
|
||||
dprintf("y_offset = %d\n",y_offset);*/
|
||||
|
||||
SelectedAircraftGPoly4.y[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0 + y_offset;
|
||||
SelectedAircraftGPoly4.y[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y1 + y_offset;
|
||||
SelectedAircraftGPoly4.y[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y2 + y_offset;
|
||||
SelectedAircraftGPoly4.y[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y3 + y_offset;
|
||||
|
||||
if(GameTwoPlayersActive() == true)
|
||||
{
|
||||
SelectedAircraftGPoly4.y[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0_2PLAYER;
|
||||
SelectedAircraftGPoly4.y[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y1_2PLAYER;
|
||||
SelectedAircraftGPoly4.y[2] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y2_2PLAYER;
|
||||
SelectedAircraftGPoly4.y[3] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y3_2PLAYER;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedAircraftGPoly4.y[0] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y0;
|
||||
SelectedAircraftGPoly4.y[1] = AIRCRAFT_DATA_FLIGHT_GSGPOLY4_Y1;
|
||||
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[2] += y_offset;
|
||||
SelectedAircraftGPoly4.y[3] += y_offset;
|
||||
|
||||
GsSortGPoly4(&SelectedAircraftGPoly4);
|
||||
|
||||
if(ptrPlayer->ActiveAircraft > (GAME_GUI_AIRCRAFT_DATA_MAX_PAGE * (ptrPlayer->FlightDataPage + 1) ) )
|
||||
|
@ -688,6 +734,31 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFligh
|
|||
uint8_t init_flight = ptrPlayer->FlightDataPage * GAME_GUI_AIRCRAFT_DATA_MAX_PAGE;
|
||||
uint8_t i;
|
||||
uint8_t j;
|
||||
short AircraftDataDirection_X;
|
||||
short AircraftDataDirection_Y;
|
||||
short AircraftDataFlightNumber_X;
|
||||
short AircraftDataFlightNumber_Y;
|
||||
short AircraftDataPassengers_X;
|
||||
short AircraftDataPassengers_Y;
|
||||
|
||||
if(GameTwoPlayersActive() == true)
|
||||
{
|
||||
AircraftDataDirection_X = AIRCRAFT_DATA_DIRECTION_X_2PLAYER;
|
||||
AircraftDataDirection_Y = AIRCRAFT_DATA_DIRECTION_Y_2PLAYER;
|
||||
AircraftDataFlightNumber_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X_2PLAYER;
|
||||
AircraftDataFlightNumber_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y_2PLAYER;
|
||||
AircraftDataPassengers_X = AIRCRAFT_DATA_PASSENGERS_X_2PLAYER;
|
||||
AircraftDataPassengers_Y = AIRCRAFT_DATA_PASSENGERS_Y_2PLAYER;
|
||||
}
|
||||
else
|
||||
{
|
||||
AircraftDataDirection_X = AIRCRAFT_DATA_DIRECTION_X;
|
||||
AircraftDataDirection_Y = AIRCRAFT_DATA_DIRECTION_Y;
|
||||
AircraftDataFlightNumber_X = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X;
|
||||
AircraftDataFlightNumber_Y = AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y;
|
||||
AircraftDataPassengers_X = AIRCRAFT_DATA_PASSENGERS_X;
|
||||
AircraftDataPassengers_Y = AIRCRAFT_DATA_PASSENGERS_Y;
|
||||
}
|
||||
|
||||
FontSetFlags(&SmallFont,FONT_NOFLAGS);
|
||||
|
||||
|
@ -701,22 +772,22 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFligh
|
|||
}
|
||||
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_X,
|
||||
AIRCRAFT_DATA_FLIGHT_NUMBER_TEXT_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
AircraftDataFlightNumber_X,
|
||||
AircraftDataFlightNumber_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
ptrFlightData->strFlightNumber[i] );
|
||||
|
||||
switch(ptrFlightData->FlightDirection[i])
|
||||
{
|
||||
case ARRIVAL:
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_DIRECTION_X,
|
||||
AIRCRAFT_DATA_DIRECTION_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
AircraftDataDirection_X,
|
||||
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"Arrival" );
|
||||
break;
|
||||
case DEPARTURE:
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_DIRECTION_X,
|
||||
AIRCRAFT_DATA_DIRECTION_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
AircraftDataDirection_X,
|
||||
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"Departure" );
|
||||
break;
|
||||
default:
|
||||
|
@ -729,30 +800,30 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFligh
|
|||
{
|
||||
case STATE_FINAL:
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_DIRECTION_X + 88,
|
||||
AIRCRAFT_DATA_DIRECTION_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
AircraftDataDirection_X + 88,
|
||||
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"Landing" );
|
||||
break;
|
||||
|
||||
case STATE_LANDED:
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_DIRECTION_X + 88,
|
||||
AIRCRAFT_DATA_DIRECTION_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
AircraftDataDirection_X + 88,
|
||||
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"Arrived" );
|
||||
break;
|
||||
|
||||
case STATE_PARKED:
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_DIRECTION_X + 88,
|
||||
AIRCRAFT_DATA_DIRECTION_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
AircraftDataDirection_X + 88,
|
||||
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"Parked" );
|
||||
break;
|
||||
|
||||
case STATE_UNBOARDING:
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_DIRECTION_X + 88,
|
||||
AIRCRAFT_DATA_DIRECTION_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"Waiting for unboard" );
|
||||
AircraftDataDirection_X + 88,
|
||||
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"Unboard" );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -762,8 +833,8 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA * ptrFligh
|
|||
FontSetFlags(&SmallFont, FONT_NOFLAGS);
|
||||
|
||||
FontPrintText( &SmallFont,
|
||||
AIRCRAFT_DATA_PASSENGERS_X,
|
||||
AIRCRAFT_DATA_PASSENGERS_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
AircraftDataPassengers_X,
|
||||
AircraftDataPassengers_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
|
||||
"%d pax.",
|
||||
ptrFlightData->Passengers[i] );
|
||||
}
|
||||
|
|
22
Source/Gfx.c
22
Source/Gfx.c
|
@ -14,6 +14,7 @@
|
|||
#define MAX_LUMINANCE 0xFF
|
||||
#define ROTATE_BIT_SHIFT 12
|
||||
#define GPUSTAT (*(unsigned int*)0x1F801814)
|
||||
#define D2_CHCR (*(unsigned int*)0x1F8010A8)
|
||||
|
||||
/* *************************************
|
||||
* Structs and enums
|
||||
|
@ -85,8 +86,8 @@ void GfxSwapBuffers(void)
|
|||
DrawEnv.y = DOUBLE_BUFFERING_SWAP_Y;
|
||||
}
|
||||
|
||||
GsSetDispEnv(&DispEnv);
|
||||
GsSetDrawEnv(&DrawEnv);
|
||||
GsSetDispEnv_DMA(&DispEnv);
|
||||
GsSetDrawEnv_DMA(&DrawEnv);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -122,14 +123,9 @@ void GfxDrawScene_Fast(void)
|
|||
GsDrawList();
|
||||
}
|
||||
|
||||
void GfxDrawScene_NoSwap(void)
|
||||
{
|
||||
GsDrawList();
|
||||
}
|
||||
|
||||
bool GfxReadyForDMATransfer(void)
|
||||
{
|
||||
return (GPUSTAT & 1<<28);
|
||||
return ( (GPUSTAT & 1<<28) && !(D2_CHCR & 1<<24) );
|
||||
}
|
||||
|
||||
void GfxDrawScene(void)
|
||||
|
@ -522,14 +518,12 @@ void GfxSetSplitScreen(uint8_t playerIndex)
|
|||
{
|
||||
switch(playerIndex)
|
||||
{
|
||||
case 0:
|
||||
// PLAYER_ONE
|
||||
case PLAYER_ONE:
|
||||
DrawEnv.x = 0;
|
||||
DrawEnv.w = X_SCREEN_RESOLUTION >> 1;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
// PLAYER_TWO
|
||||
case PLAYER_TWO:
|
||||
DrawEnv.x = X_SCREEN_RESOLUTION >> 1;
|
||||
DrawEnv.w = X_SCREEN_RESOLUTION >> 1;
|
||||
break;
|
||||
|
@ -538,7 +532,7 @@ void GfxSetSplitScreen(uint8_t playerIndex)
|
|||
break;
|
||||
}
|
||||
|
||||
GsSetDrawEnv(&DrawEnv);
|
||||
GsSetDrawEnv_DMA(&DrawEnv);
|
||||
}
|
||||
|
||||
void GfxDisableSplitScreen(void)
|
||||
|
@ -546,5 +540,5 @@ void GfxDisableSplitScreen(void)
|
|||
DrawEnv.x = 0;
|
||||
DrawEnv.w = X_SCREEN_RESOLUTION;
|
||||
|
||||
GsSetDrawEnv(&DrawEnv);
|
||||
GsSetDrawEnv_DMA(&DrawEnv);
|
||||
}
|
||||
|
|
|
@ -72,7 +72,6 @@ typedef enum
|
|||
|
||||
}MMBtn_Offset;
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct
|
||||
{
|
||||
MMBtn_Offset offset_u;
|
||||
|
@ -90,7 +89,6 @@ typedef struct
|
|||
bool was_selected;
|
||||
|
||||
}TYPE_MMBtn;
|
||||
#pragma pack()
|
||||
|
||||
/* **************************************
|
||||
* Local prototypes *
|
||||
|
@ -251,7 +249,8 @@ void MainMenuInit(void)
|
|||
|
||||
void MainMenu(void)
|
||||
{
|
||||
|
||||
unsigned short* cheat_array;
|
||||
uint8_t i;
|
||||
MainMenuInit();
|
||||
|
||||
#ifndef NO_INTRO
|
||||
|
@ -271,6 +270,11 @@ void MainMenu(void)
|
|||
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;
|
||||
|
@ -280,6 +284,12 @@ void MainMenu(void)
|
|||
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;
|
||||
|
||||
|
|
32
Source/Pad.c
32
Source/Pad.c
|
@ -10,7 +10,7 @@
|
|||
|
||||
#define PAD_ONE 0
|
||||
#define PAD_TWO 1
|
||||
#define PAD_CHEAT_TIMEOUT 2
|
||||
#define PAD_CHEAT_TIMEOUT 20 // 2 units * 100 ms/unit = 2000 ms
|
||||
#define PAD_MAX_CHEATS 16
|
||||
|
||||
/* **************************************
|
||||
|
@ -82,13 +82,13 @@ static uint8_t pad1_keys_repeat[NUMBER_OF_KEYS];
|
|||
static uint8_t pad2_keys_repeat[NUMBER_OF_KEYS];
|
||||
// These arrays include last 16 buttons pressed by user and keeps them
|
||||
// for cheating purposes. They are cleaned if no keys are pressed during
|
||||
// PAD_CHEAT_TIMEOUT seconds.
|
||||
// PAD_CHEAT_TIMEOUT milliseconds.
|
||||
static unsigned short pad1_cheat_array[CHEAT_ARRAY_SIZE];
|
||||
static unsigned short pad2_cheat_array[CHEAT_ARRAY_SIZE];
|
||||
|
||||
// Pointers to timers which clean padX_cheat_array.
|
||||
static TYPE_TIMER * pad1_cheat_timer;
|
||||
static TYPE_TIMER * pad2_cheat_timer;
|
||||
static TYPE_TIMER* pad1_cheat_timer;
|
||||
static TYPE_TIMER* pad2_cheat_timer;
|
||||
|
||||
static TYPE_CHEAT * cheatsArray[PAD_MAX_CHEATS];
|
||||
|
||||
|
@ -349,7 +349,7 @@ uint8_t PadGetKeyIndex(unsigned short key)
|
|||
}
|
||||
}
|
||||
|
||||
unsigned short * PadOneGetAddress(void)
|
||||
unsigned short* PadOneGetAddress(void)
|
||||
{
|
||||
return &pad1;
|
||||
}
|
||||
|
@ -367,7 +367,8 @@ void PadInit(void)
|
|||
{
|
||||
pad1_cheat_timer = SystemCreateTimer(PAD_CHEAT_TIMEOUT,true /* Repeat flag */,&PadOneCleanCheatArray);
|
||||
pad2_cheat_timer = SystemCreateTimer(PAD_CHEAT_TIMEOUT,true /* Repeat flag */,&PadTwoCleanCheatArray);
|
||||
memset(cheatsArray,0, sizeof(TYPE_CHEAT) * PAD_MAX_CHEATS);
|
||||
|
||||
memset(cheatsArray,0, sizeof(cheatsArray));
|
||||
}
|
||||
|
||||
void PadCheatHandler(uint8_t n_pad)
|
||||
|
@ -380,23 +381,23 @@ void PadCheatHandler(uint8_t n_pad)
|
|||
uint8_t keys_released = 0;
|
||||
unsigned short key;
|
||||
uint8_t j;
|
||||
bool (*released_callback)(unsigned short);
|
||||
bool (*pressed_callback)(unsigned short);
|
||||
void (*clean_callback)(void);
|
||||
bool success = false;
|
||||
unsigned short * cheat_array;
|
||||
TYPE_TIMER * timer;
|
||||
unsigned short* cheat_array;
|
||||
TYPE_TIMER* timer;
|
||||
|
||||
switch(n_pad)
|
||||
{
|
||||
case PAD_ONE:
|
||||
released_callback = &PadOneKeyReleased;
|
||||
pressed_callback = &PadOneKeySinglePress;
|
||||
cheat_array = pad1_cheat_array;
|
||||
clean_callback = &PadOneCleanCheatArray;
|
||||
timer = pad1_cheat_timer;
|
||||
break;
|
||||
|
||||
case PAD_TWO:
|
||||
released_callback = &PadTwoKeyReleased;
|
||||
pressed_callback = &PadTwoKeySinglePress;
|
||||
cheat_array = pad2_cheat_array;
|
||||
clean_callback = &PadTwoCleanCheatArray;
|
||||
timer = pad2_cheat_timer;
|
||||
|
@ -404,7 +405,7 @@ void PadCheatHandler(uint8_t n_pad)
|
|||
|
||||
default:
|
||||
dprintf("Invalid pad called for PadCheatHandler()!\n");
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
for(i = 0; i < PAD_MAX_CHEATS; i++)
|
||||
|
@ -430,7 +431,7 @@ void PadCheatHandler(uint8_t n_pad)
|
|||
|
||||
for(i = 0; i < sizeof(available_keys) / sizeof(unsigned short); i++)
|
||||
{
|
||||
if(released_callback(available_keys[i]) == true)
|
||||
if(pressed_callback(available_keys[i]) == true)
|
||||
{
|
||||
SystemTimerRestart(timer);
|
||||
key = available_keys[i];
|
||||
|
@ -490,3 +491,8 @@ void PadTwoCleanCheatArray(void)
|
|||
{
|
||||
memset(pad2_cheat_array,0,sizeof(unsigned short) * CHEAT_ARRAY_SIZE);
|
||||
}
|
||||
|
||||
unsigned short* PadGetPlayerOneCheatArray(void)
|
||||
{
|
||||
return pad1_cheat_array;
|
||||
}
|
||||
|
|
|
@ -51,7 +51,9 @@ bool PadTwoIsVibrationEnabled(void);
|
|||
|
||||
bool PadAddCheat(TYPE_CHEAT * cheat);
|
||||
|
||||
unsigned short* PadGetPlayerOneCheatArray(void);
|
||||
|
||||
// Experimental (to be removed)
|
||||
unsigned short * PadOneGetAddress(void);
|
||||
unsigned short* PadOneGetAddress(void);
|
||||
|
||||
#endif //__PAD_HEADER__
|
||||
|
|
|
@ -391,12 +391,12 @@ bool SystemContains_u16(uint16_t value, uint16_t * buffer, size_t sz)
|
|||
return false;
|
||||
}
|
||||
|
||||
TYPE_TIMER * SystemCreateTimer(uint32_t seconds, bool rf, void (*timer_callback)(void) )
|
||||
TYPE_TIMER* SystemCreateTimer(uint32_t t, bool rf, void (*timer_callback)(void) )
|
||||
{
|
||||
bool success = false;
|
||||
uint8_t i;
|
||||
|
||||
if(seconds == 0)
|
||||
if(t == 0)
|
||||
{
|
||||
dprintf("Cannot create timer with time == 0!\n");
|
||||
return NULL;
|
||||
|
@ -407,8 +407,8 @@ TYPE_TIMER * SystemCreateTimer(uint32_t seconds, bool rf, void (*timer_callback)
|
|||
if(timer_array[i].busy == false)
|
||||
{
|
||||
timer_array[i].Timeout_Callback = timer_callback;
|
||||
timer_array[i].time = seconds;
|
||||
timer_array[i].orig_time = seconds;
|
||||
timer_array[i].time = t;
|
||||
timer_array[i].orig_time = t;
|
||||
timer_array[i].repeat_flag = rf;
|
||||
timer_array[i].busy = true;
|
||||
success = true;
|
||||
|
@ -447,7 +447,7 @@ void SystemUserTimersHandler(void)
|
|||
{
|
||||
if(timer_array[i].busy == true)
|
||||
{
|
||||
if(System1SecondTick() == true)
|
||||
if(System100msTick() == true)
|
||||
{
|
||||
timer_array[i].time--;
|
||||
|
||||
|
@ -472,12 +472,12 @@ void SystemUserTimersHandler(void)
|
|||
}
|
||||
}
|
||||
|
||||
void SystemTimerRestart(TYPE_TIMER * timer)
|
||||
void SystemTimerRestart(TYPE_TIMER* timer)
|
||||
{
|
||||
timer->time = timer->orig_time;
|
||||
}
|
||||
|
||||
void SystemTimerRemove(TYPE_TIMER * timer)
|
||||
void SystemTimerRemove(TYPE_TIMER* timer)
|
||||
{
|
||||
timer->time = 0;
|
||||
timer->orig_time = 0;
|
||||
|
@ -486,7 +486,7 @@ void SystemTimerRemove(TYPE_TIMER * timer)
|
|||
timer->repeat_flag = false;
|
||||
}
|
||||
|
||||
bool SystemArrayCompare(unsigned short * arr1, unsigned short * arr2, size_t sz)
|
||||
bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
|
|
|
@ -89,7 +89,8 @@ bool SystemContains_u16(uint16_t value, uint16_t * buffer, size_t sz);
|
|||
|
||||
// Creates a timer instance wiht a determined value and associates it to a callback
|
||||
// Once time expires, callback is automatically called right after GfxDrawScene().
|
||||
TYPE_TIMER * SystemCreateTimer(uint32_t seconds, bool rf, void (*timer_callback)(void) );
|
||||
// Time is expressed so that t = 100 ms e.g.: 2 seconds = 20.
|
||||
TYPE_TIMER* SystemCreateTimer(uint32_t t, bool rf, void (*timer_callback)(void) );
|
||||
|
||||
// Reportedly, sets all timer data to zero.
|
||||
void SystemResetTimers(void);
|
||||
|
@ -98,13 +99,13 @@ void SystemResetTimers(void);
|
|||
void SystemUserTimersHandler(void);
|
||||
|
||||
// Sets timer remaining time to initial value.
|
||||
void SystemTimerRestart(TYPE_TIMER * timer);
|
||||
void SystemTimerRestart(TYPE_TIMER* timer);
|
||||
|
||||
// Flushes a timer pointed to by timer.
|
||||
void SystemTimerRemove(TYPE_TIMER * timer);
|
||||
void SystemTimerRemove(TYPE_TIMER* timer);
|
||||
|
||||
// Compares two arrays of unsigned short type.
|
||||
bool SystemArrayCompare(unsigned short * arr1, unsigned short * arr2, size_t sz);
|
||||
bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz);
|
||||
|
||||
// Prints stack pointer address using dprintf()
|
||||
void SystemPrintStackPointerAddress(void);
|
||||
|
|
Loading…
Reference in New Issue