* 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:
XaviDCR92 2017-05-22 07:06:17 +02:00
parent 3a8f914661
commit aefe5f8c1c
9 changed files with 176 additions and 97 deletions

View File

@ -7,8 +7,7 @@
/* *************************************
* Defines
* *************************************/
#define AIRCRAFT_SPEED_TABLE_SIZE 8
#define AIRCRAFT_SIZE 16
/* *************************************

View File

@ -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)

View File

@ -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] );
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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__

View File

@ -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;

View File

@ -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);