rw skeleton

This commit is contained in:
Fire-Head
2019-05-31 20:02:26 +03:00
parent 84204471a5
commit 28fce310d5
19 changed files with 2422 additions and 332 deletions

845
src/skel/events.cpp Normal file
View File

@ -0,0 +1,845 @@
#include "rwcore.h"
#include "skeleton.h"
#include "events.h"
//#include "main.h"
#include "common.h"
#include "Pad.h"
#include "ControllerConfig.h"
#include "Frontend.h"
#include "Camera.h"
#include "patcher.h"
/*
*****************************************************************************
*/
static RsEventStatus
HandleKeyDown(RsKeyStatus *keyStatus)
{
CPad *pad0 = CPad::GetPad(0);
CPad *pad1 = CPad::GetPad(1);
RwInt32 c = keyStatus->keyCharCode;
if ( c != rsNULL )
{
switch (c)
{
case rsESC:
{
CPad::TempKeyState.ESC = 255;
break;
}
case rsINS:
{
CPad::TempKeyState.INS = 255;
break;
}
case rsDEL:
{
CPad::TempKeyState.DEL = 255;
break;
}
case rsHOME:
{
CPad::TempKeyState.HOME = 255;
break;
}
case rsEND:
{
CPad::TempKeyState.END = 255;
break;
}
case rsPGUP:
{
CPad::TempKeyState.PGUP = 255;
break;
}
case rsPGDN:
{
CPad::TempKeyState.PGDN = 255;
break;
}
case rsUP:
{
CPad::TempKeyState.UP = 255;
break;
}
case rsDOWN:
{
CPad::TempKeyState.DOWN = 255;
break;
}
case rsLEFT:
{
CPad::TempKeyState.LEFT = 255;
break;
}
case rsRIGHT:
{
CPad::TempKeyState.RIGHT = 255;
break;
}
case rsNUMLOCK:
{
CPad::TempKeyState.NUMLOCK = 255;
break;
}
case rsPADDEL:
{
CPad::TempKeyState.DECIMAL = 255;
break;
}
case rsPADEND:
{
CPad::TempKeyState.NUM1 = 255;
break;
}
case rsPADDOWN:
{
CPad::TempKeyState.NUM2 = 255;
break;
}
case rsPADPGDN:
{
CPad::TempKeyState.NUM3 = 255;
break;
}
case rsPADLEFT:
{
CPad::TempKeyState.NUM4 = 255;
break;
}
case rsPAD5:
{
CPad::TempKeyState.NUM5 = 255;
break;
}
case rsPADRIGHT:
{
CPad::TempKeyState.NUM6 = 255;
break;
}
case rsPADHOME:
{
CPad::TempKeyState.NUM7 = 255;
break;
}
case rsPADUP:
{
CPad::TempKeyState.NUM8 = 255;
break;
}
case rsPADPGUP:
{
CPad::TempKeyState.NUM9 = 255;
break;
}
case rsPADINS:
{
CPad::TempKeyState.NUM0 = 255;
break;
}
case rsDIVIDE:
{
CPad::TempKeyState.DIV = 255;
break;
}
case rsTIMES:
{
CPad::TempKeyState.MUL = 255;
break;
}
case rsMINUS:
{
CPad::TempKeyState.SUB = 255;
break;
}
case rsPADENTER:
{
CPad::TempKeyState.ENTER = 255;
break;
}
case rsPLUS:
{
CPad::TempKeyState.ADD = 255;
break;
}
case rsENTER:
{
CPad::TempKeyState.EXTENTER = 255;
break;
}
case rsSCROLL:
{
CPad::TempKeyState.SCROLLLOCK = 255;
break;
}
case rsPAUSE:
{
CPad::TempKeyState.PAUSE = 255;
break;
}
case rsBACKSP:
{
CPad::TempKeyState.BACKSP = 255;
break;
}
case rsTAB:
{
CPad::TempKeyState.TAB = 255;
break;
}
case rsCAPSLK:
{
CPad::TempKeyState.CAPSLOCK = 255;
break;
}
case rsLSHIFT:
{
CPad::TempKeyState.LSHIFT = 255;
break;
}
case rsSHIFT:
{
CPad::TempKeyState.SHIFT = 255;
break;
}
case rsRSHIFT:
{
CPad::TempKeyState.RSHIFT = 255;
break;
}
case rsLCTRL:
{
CPad::TempKeyState.LCTRL = 255;
break;
}
case rsRCTRL:
{
CPad::TempKeyState.RCTRL = 255;
break;
}
case rsLALT:
{
CPad::TempKeyState.LALT = 255;
break;
}
case rsRALT:
{
CPad::TempKeyState.RALT = 255;
break;
}
case rsLWIN:
{
CPad::TempKeyState.LWIN = 255;
break;
}
case rsRWIN:
{
CPad::TempKeyState.RWIN = 255;
break;
}
case rsAPPS:
{
CPad::TempKeyState.APPS = 255;
break;
}
case rsF1:
case rsF2:
case rsF3:
case rsF4:
case rsF5:
case rsF6:
case rsF7:
case rsF8:
case rsF9:
case rsF10:
case rsF11:
case rsF12:
{
CPad::TempKeyState.F[c - rsF1] = 255;
break;
}
default:
{
if ( c < 255 )
{
CPad::TempKeyState.VK_KEYS[c] = 255;
pad0->AddToPCCheatString(c);
}
break;
}
}
if ( CPad::m_bMapPadOneToPadTwo )
{
if ( c == 'D' ) pad1->PCTempKeyState.LeftStickX = 128;
if ( c == 'A' ) pad1->PCTempKeyState.LeftStickX = -128;
if ( c == 'W' ) pad1->PCTempKeyState.LeftStickY = 128;
if ( c == 'S' ) pad1->PCTempKeyState.LeftStickY = -128;
if ( c == 'J' ) pad1->PCTempKeyState.RightStickX = 128;
if ( c == 'G' ) pad1->PCTempKeyState.RightStickX = -128;
if ( c == 'Y' ) pad1->PCTempKeyState.RightStickY = 128;
if ( c == 'H' ) pad1->PCTempKeyState.RightStickY = -128;
if ( c == 'Z' ) pad1->PCTempKeyState.LeftShoulder1 = 255;
if ( c == 'X' ) pad1->PCTempKeyState.LeftShoulder2 = 255;
if ( c == 'C' ) pad1->PCTempKeyState.RightShoulder1 = 255;
if ( c == 'V' ) pad1->PCTempKeyState.RightShoulder2 = 255;
if ( c == 'O' ) pad1->PCTempKeyState.DPadUp = 255;
if ( c == 'L' ) pad1->PCTempKeyState.DPadDown = 255;
if ( c == 'K' ) pad1->PCTempKeyState.DPadLeft = 255;
if ( c == ';' ) pad1->PCTempKeyState.DPadRight = 255;
if ( c == 'B' ) pad1->PCTempKeyState.Start = 255;
if ( c == 'N' ) pad1->PCTempKeyState.Select = 255;
if ( c == 'M' ) pad1->PCTempKeyState.Square = 255;
if ( c == ',' ) pad1->PCTempKeyState.Triangle = 255;
if ( c == '.' ) pad1->PCTempKeyState.Cross = 255;
if ( c == '/' ) pad1->PCTempKeyState.Circle = 255;
if ( c == rsRSHIFT ) pad1->PCTempKeyState.LeftShock = 255;
if ( c == rsRCTRL ) pad1->PCTempKeyState.RightShock = 255;
}
}
return rsEVENTPROCESSED;
}
static RsEventStatus
HandleKeyUp(RsKeyStatus *keyStatus)
{
CPad *pad0 = CPad::GetPad(0);
CPad *pad1 = CPad::GetPad(1);
RwInt32 c = keyStatus->keyCharCode;
if ( c != rsNULL )
{
switch (c)
{
case rsESC:
{
CPad::TempKeyState.ESC = 0;
break;
}
case rsINS:
{
CPad::TempKeyState.INS = 0;
break;
}
case rsDEL:
{
CPad::TempKeyState.DEL = 0;
break;
}
case rsHOME:
{
CPad::TempKeyState.HOME = 0;
break;
}
case rsEND:
{
CPad::TempKeyState.END = 0;
break;
}
case rsPGUP:
{
CPad::TempKeyState.PGUP = 0;
break;
}
case rsPGDN:
{
CPad::TempKeyState.PGDN = 0;
break;
}
case rsUP:
{
CPad::TempKeyState.UP = 0;
break;
}
case rsDOWN:
{
CPad::TempKeyState.DOWN = 0;
break;
}
case rsLEFT:
{
CPad::TempKeyState.LEFT = 0;
break;
}
case rsRIGHT:
{
CPad::TempKeyState.RIGHT = 0;
break;
}
case rsNUMLOCK:
{
CPad::TempKeyState.NUMLOCK = 0;
break;
}
case rsPADDEL:
{
CPad::TempKeyState.DECIMAL = 0;
break;
}
case rsPADEND:
{
CPad::TempKeyState.NUM1 = 0;
break;
}
case rsPADDOWN:
{
CPad::TempKeyState.NUM2 = 0;
break;
}
case rsPADPGDN:
{
CPad::TempKeyState.NUM3 = 0;
break;
}
case rsPADLEFT:
{
CPad::TempKeyState.NUM4 = 0;
break;
}
case rsPAD5:
{
CPad::TempKeyState.NUM5 = 0;
break;
}
case rsPADRIGHT:
{
CPad::TempKeyState.NUM6 = 0;
break;
}
case rsPADHOME:
{
CPad::TempKeyState.NUM7 = 0;
break;
}
case rsPADUP:
{
CPad::TempKeyState.NUM8 = 0;
break;
}
case rsPADPGUP:
{
CPad::TempKeyState.NUM9 = 0;
break;
}
case rsPADINS:
{
CPad::TempKeyState.NUM0 = 0;
break;
}
case rsDIVIDE:
{
CPad::TempKeyState.DIV = 0;
break;
}
case rsTIMES:
{
CPad::TempKeyState.MUL = 0;
break;
}
case rsMINUS:
{
CPad::TempKeyState.SUB = 0;
break;
}
case rsPADENTER:
{
CPad::TempKeyState.ENTER = 0;
break;
}
case rsPLUS:
{
CPad::TempKeyState.ADD = 0;
break;
}
case rsENTER:
{
CPad::TempKeyState.EXTENTER = 0;
break;
}
case rsSCROLL:
{
CPad::TempKeyState.SCROLLLOCK = 0;
break;
}
case rsPAUSE:
{
CPad::TempKeyState.PAUSE = 0;
break;
}
case rsBACKSP:
{
CPad::TempKeyState.BACKSP = 0;
break;
}
case rsTAB:
{
CPad::TempKeyState.TAB = 0;
break;
}
case rsCAPSLK:
{
CPad::TempKeyState.CAPSLOCK = 0;
break;
}
case rsLSHIFT:
{
CPad::TempKeyState.LSHIFT = 0;
break;
}
case rsSHIFT:
{
CPad::TempKeyState.SHIFT = 0;
break;
}
case rsRSHIFT:
{
CPad::TempKeyState.RSHIFT = 0;
break;
}
case rsLCTRL:
{
CPad::TempKeyState.LCTRL = 0;
break;
}
case rsRCTRL:
{
CPad::TempKeyState.RCTRL = 0;
break;
}
case rsLALT:
{
CPad::TempKeyState.LALT = 0;
break;
}
case rsRALT:
{
CPad::TempKeyState.RALT = 0;
break;
}
case rsLWIN:
{
CPad::TempKeyState.LWIN = 0;
break;
}
case rsRWIN:
{
CPad::TempKeyState.RWIN = 0;
break;
}
case rsAPPS:
{
CPad::TempKeyState.APPS = 0;
break;
}
case rsF1:
case rsF2:
case rsF3:
case rsF4:
case rsF5:
case rsF6:
case rsF7:
case rsF8:
case rsF9:
case rsF10:
case rsF11:
case rsF12:
{
CPad::TempKeyState.F[c - rsF1] = 0;
break;
}
default:
{
if ( c < 255 )
{
CPad::TempKeyState.VK_KEYS[c] = 0;
pad0->AddToPCCheatString(c);
}
break;
}
}
if ( CPad::m_bMapPadOneToPadTwo )
{
if ( c == 'D' ) pad1->PCTempKeyState.LeftStickX = 0;
if ( c == 'A' ) pad1->PCTempKeyState.LeftStickX = 0;
if ( c == 'W' ) pad1->PCTempKeyState.LeftStickY = 0;
if ( c == 'S' ) pad1->PCTempKeyState.LeftStickY = 0;
if ( c == 'J' ) pad1->PCTempKeyState.RightStickX = 0;
if ( c == 'G' ) pad1->PCTempKeyState.RightStickX = 0;
if ( c == 'Y' ) pad1->PCTempKeyState.RightStickY = 0;
if ( c == 'H' ) pad1->PCTempKeyState.RightStickY = 0;
if ( c == 'Z' ) pad1->PCTempKeyState.LeftShoulder1 = 0;
if ( c == 'X' ) pad1->PCTempKeyState.LeftShoulder2 = 0;
if ( c == 'C' ) pad1->PCTempKeyState.RightShoulder1 = 0;
if ( c == 'V' ) pad1->PCTempKeyState.RightShoulder2 = 0;
if ( c == 'O' ) pad1->PCTempKeyState.DPadUp = 0;
if ( c == 'L' ) pad1->PCTempKeyState.DPadDown = 0;
if ( c == 'K' ) pad1->PCTempKeyState.DPadLeft = 0;
if ( c == ';' ) pad1->PCTempKeyState.DPadRight = 0;
if ( c == 'B' ) pad1->PCTempKeyState.Start = 0;
if ( c == 'N' ) pad1->PCTempKeyState.Select = 0;
if ( c == 'M' ) pad1->PCTempKeyState.Square = 0;
if ( c == ',' ) pad1->PCTempKeyState.Triangle = 0;
if ( c == '.' ) pad1->PCTempKeyState.Cross = 0;
if ( c == '/' ) pad1->PCTempKeyState.Circle = 0;
if ( c == rsRSHIFT ) pad1->PCTempKeyState.LeftShock = 0;
if ( c == rsRCTRL ) pad1->PCTempKeyState.RightShock = 0;
}
}
return rsEVENTPROCESSED;
}
/*
*****************************************************************************
*/
static RsEventStatus
KeyboardHandler(RsEvent event, void *param)
{
/*
* ...then the application events, if necessary...
*/
switch( event )
{
case rsKEYDOWN:
{
return HandleKeyDown((RsKeyStatus *)param);
}
case rsKEYUP:
{
return HandleKeyUp((RsKeyStatus *)param);
}
default:
{
return rsEVENTNOTPROCESSED;
}
}
}
/*
*****************************************************************************
*/
static RsEventStatus
HandlePadButtonDown(RsPadButtonStatus *padButtonStatus)
{
Bool bPadTwo = false;
Int32 padNumber = padButtonStatus->padID;
CPad *pad = CPad::GetPad(padNumber);
if ( CPad::m_bMapPadOneToPadTwo )
padNumber = 1;
if ( padNumber == 1 )
bPadTwo = true;
ControlsManager.UpdateJoyButtonState(padNumber);
for ( Int32 i = 0; i < _TODOCONST(16); i++ )
{
RsPadButtons btn = rsPADNULL;
if ( ControlsManager.m_aButtonStates[i] == TRUE )
btn = (RsPadButtons)(i + 1);
if ( FrontEndMenuManager.m_bMenuActive || bPadTwo )
ControlsManager.UpdateJoyInConfigMenus_ButtonDown(btn, padNumber);
else
ControlsManager.AffectControllerStateOn_ButtonDown(btn, JOYSTICK);
}
return rsEVENTPROCESSED;
}
/*
*****************************************************************************
*/
static RsEventStatus
HandlePadButtonUp(RsPadButtonStatus *padButtonStatus)
{
Bool bPadTwo = false;
Int32 padNumber = padButtonStatus->padID;
CPad *pad = CPad::GetPad(padNumber);
if ( CPad::m_bMapPadOneToPadTwo )
padNumber = 1;
if ( padNumber == 1 )
bPadTwo = true;
Bool bCam = false;
Int16 mode = TheCamera.Cams[TheCamera.ActiveCam].Mode;
if ( mode == CCam::MODE_FLYBY || mode == CCam::MODE_FIXED )
Bool bCam = true;
ControlsManager.UpdateJoyButtonState(padNumber);
for ( Int32 i = 1; i < _TODOCONST(16); i++ )
{
RsPadButtons btn = rsPADNULL;
if ( ControlsManager.m_aButtonStates[i] == FALSE )
btn = (RsPadButtons)(i + 1); // bug ?, cycle begins from 1(not zero), 1+1==2==rsPADBUTTON2, so we skip rsPADBUTTON1, right ?
if ( FrontEndMenuManager.m_bMenuActive || bPadTwo || bCam )
ControlsManager.UpdateJoyInConfigMenus_ButtonUp(btn, padNumber);
else
ControlsManager.AffectControllerStateOn_ButtonUp(btn, JOYSTICK);
}
return rsEVENTPROCESSED;
}
/*
*****************************************************************************
*/
static RsEventStatus
PadHandler(RsEvent event, void *param)
{
switch( event )
{
case rsPADBUTTONDOWN:
{
return HandlePadButtonDown((RsPadButtonStatus *)param);
}
case rsPADBUTTONUP:
{
return HandlePadButtonUp((RsPadButtonStatus *)param);
}
default:
{
return rsEVENTNOTPROCESSED;
}
}
}
/*
*****************************************************************************
*/
RwBool
AttachInputDevices(void)
{
RsInputDeviceAttach(rsKEYBOARD, KeyboardHandler);
RsInputDeviceAttach(rsPAD, PadHandler);
return TRUE;
}
STARTPATCHES
InjectHook(0x583F10, HandleKeyDown, PATCH_JUMP);
InjectHook(0x5842F0, HandleKeyUp, PATCH_JUMP);
InjectHook(0x5846C0, KeyboardHandler, PATCH_JUMP);
InjectHook(0x5846F0, HandlePadButtonDown, PATCH_JUMP);
InjectHook(0x584770, HandlePadButtonUp, PATCH_JUMP);
InjectHook(0x584830, PadHandler, PATCH_JUMP);
InjectHook(0x584860, AttachInputDevices, PATCH_JUMP);
ENDPATCHES

7
src/skel/events.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef EVENTS_H
#define EVENTS_H
#include <rwcore.h>
#include "skeleton.h"
#endif /* EVENTS_H */

36
src/skel/platform.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef PLATFORM_H
#define PLATFORM_H
#include "rwcore.h"
#include "skeleton.h"
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RwUInt32 psTimer(void);
extern RwBool psInitialise(void);
extern void psTerminate(void);
extern void psCameraShowRaster(RwCamera *camera);
extern RwBool psCameraBeginUpdate(RwCamera *camera);
extern void psMouseSetPos(RwV2d *pos);
extern RwBool psSelectDevice(RwBool useDefault);
/* install the platform specific file system */
extern RwBool psInstallFileSystem(void);
/* Handle native texture support */
extern RwBool psNativeTextureSupport(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* PLATFORM_H */

454
src/skel/skeleton.cpp Normal file
View File

@ -0,0 +1,454 @@
#include "common.h"
#include "patcher.h"
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include "rwcore.h"
#include "skeleton.h"
#include "platform.h"
static RwBool DefaultVideoMode = TRUE;
//RsGlobalType RsGlobal;
RsGlobalType &RsGlobal = *(RsGlobalType*)0x8F4360;
////////////////////////////////////////////////////////////////////////
WRAPPER RwUInt32 psTimer(void) { EAXJMP(0x580CE0); }
WRAPPER RwBool psInitialise(void) { EAXJMP(0x581180); }
WRAPPER void psTerminate(void) { EAXJMP(0x581460); }
WRAPPER void psCameraShowRaster(RwCamera *camera) { EAXJMP(0x580CA0); }
WRAPPER RwBool psCameraBeginUpdate(RwCamera *camera) { EAXJMP(0x580C70); }
WRAPPER void psMouseSetPos(RwV2d *pos) { EAXJMP(0x580D20); }
WRAPPER RwBool psSelectDevice(RwBool useDefault) { EAXJMP(0x581D80); }
WRAPPER RwBool psInstallFileSystem(void) { EAXJMP(0x580E20); }
WRAPPER RwBool psNativeTextureSupport(void) { EAXJMP(0x580E30); }
////////////////////////////////////////////////////////////////////////
_TODO("psGetMemoryFunctions");
RwMemoryFunctions*
psGetMemoryFunctions(void)
{
return 0;
}
/*
*****************************************************************************
*/
RwUInt32
RsTimer(void)
{
return psTimer();
}
/*
*****************************************************************************
*/
void
RsCameraShowRaster(RwCamera * camera)
{
psCameraShowRaster(camera);
return;
}
/*
*****************************************************************************
*/
RwBool
RsCameraBeginUpdate(RwCamera * camera)
{
return psCameraBeginUpdate(camera);
}
/*
*****************************************************************************
*/
RwBool
RsRegisterImageLoader(void)
{
return TRUE;
}
/*
*****************************************************************************
*/
static RwBool
RsSetDebug(void)
{
return TRUE;
}
/*
*****************************************************************************
*/
void
RsMouseSetPos(RwV2d * pos)
{
psMouseSetPos(pos);
return;
}
/*
*****************************************************************************
*/
RwBool
RsSelectDevice(void)
{
return psSelectDevice(DefaultVideoMode);
}
/*
*****************************************************************************
*/
RwBool
RsInputDeviceAttach(RsInputDeviceType inputDevice,
RsInputEventHandler inputEventHandler)
{
switch (inputDevice)
{
case rsKEYBOARD:
{
RsGlobal.keyboard.inputEventHandler = inputEventHandler;
RsGlobal.keyboard.used = TRUE;
break;
}
case rsMOUSE:
{
RsGlobal.mouse.inputEventHandler = inputEventHandler;
RsGlobal.mouse.used = TRUE;
break;
}
case rsPAD:
{
RsGlobal.pad.inputEventHandler = inputEventHandler;
RsGlobal.pad.used = TRUE;
break;
}
default:
{
return FALSE;
}
}
return TRUE;
}
/*
*****************************************************************************
*/
static RwBool
rsCommandLine(RwChar *arg)
{
RsEventHandler(rsFILELOAD, arg);
return TRUE;
}
/*
*****************************************************************************
*/
static RwBool
rsPreInitCommandLine(RwChar *arg)
{
if( !strcmp(arg, RWSTRING("-vms")) )
{
DefaultVideoMode = FALSE;
return TRUE;
}
return FALSE;
}
/*
*****************************************************************************
*/
RsEventStatus
RsKeyboardEventHandler(RsEvent event, void *param)
{
if (RsGlobal.keyboard.used)
{
return RsGlobal.keyboard.inputEventHandler(event, param);
}
return rsEVENTNOTPROCESSED;
}
/*
*****************************************************************************
*/
RsEventStatus
RsPadEventHandler(RsEvent event, void *param)
{
if (RsGlobal.pad.used)
{
return RsGlobal.pad.inputEventHandler(event, param);
}
return rsEVENTNOTPROCESSED;
}
/*
*****************************************************************************
*/
RsEventStatus
RsEventHandler(RsEvent event, void *param)
{
RsEventStatus result;
RsEventStatus es;
/*
* Give the application an opportunity to override any events...
*/
es = AppEventHandler(event, param);
/*
* We never allow the app to replace the quit behaviour,
* only to intercept...
*/
if (event == rsQUITAPP)
{
/*
* Set the flag which causes the event loop to exit...
*/
RsGlobal.quit = TRUE;
}
if (es == rsEVENTNOTPROCESSED)
{
switch (event)
{
case rsSELECTDEVICE:
result =
(RsSelectDevice()? rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsCOMMANDLINE:
result = (rsCommandLine((RwChar *) param) ?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsPREINITCOMMANDLINE:
result = (rsPreInitCommandLine((RwChar *) param) ?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsINITDEBUG:
result =
(RsSetDebug()? rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsREGISTERIMAGELOADER:
result = (RsRegisterImageLoader()?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsRWTERMINATE:
RsRwTerminate();
result = (rsEVENTPROCESSED);
break;
case rsRWINITIALISE:
result = (RsRwInitialise(param) ?
rsEVENTPROCESSED : rsEVENTERROR);
break;
case rsTERMINATE:
RsTerminate();
result = (rsEVENTPROCESSED);
break;
case rsINITIALISE:
result =
(RsInitialise()? rsEVENTPROCESSED : rsEVENTERROR);
break;
default:
result = (es);
break;
}
}
else
{
result = (es);
}
return result;
}
/*
*****************************************************************************
*/
void
RsRwTerminate(void)
{
/* Close RenderWare */
RwEngineStop();
RwEngineClose();
RwEngineTerm();
return;
}
/*
*****************************************************************************
*/
RwBool
RsRwInitialise(void *displayID)
{
RwEngineOpenParams openParams;
/*
* Start RenderWare...
*/
if (!RwEngineInit(psGetMemoryFunctions(), 0, rsRESOURCESDEFAULTARENASIZE))
{
return (FALSE);
}
/*
* Install any platform specific file systems...
*/
psInstallFileSystem();
/*
* Initialize debug message handling...
*/
RsEventHandler(rsINITDEBUG, NULL);
/*
* Attach all plugins...
*/
if (RsEventHandler(rsPLUGINATTACH, NULL) == rsEVENTERROR)
{
return (FALSE);
}
/*
* Attach input devices...
*/
if (RsEventHandler(rsINPUTDEVICEATTACH, NULL) == rsEVENTERROR)
{
return (FALSE);
}
openParams.displayID = displayID;
if (!RwEngineOpen(&openParams))
{
RwEngineTerm();
return (FALSE);
}
if (RsEventHandler(rsSELECTDEVICE, displayID) == rsEVENTERROR)
{
RwEngineClose();
RwEngineTerm();
return (FALSE);
}
if (!RwEngineStart())
{
RwEngineClose();
RwEngineTerm();
return (FALSE);
}
/*
* Register loaders for an image with a particular file extension...
*/
RsEventHandler(rsREGISTERIMAGELOADER, NULL);
psNativeTextureSupport();
RwTextureSetMipmapping(FALSE);
RwTextureSetAutoMipmapping(FALSE);
return TRUE;
}
/*
*****************************************************************************
*/
void
RsTerminate(void)
{
psTerminate();
return;
}
/*
*****************************************************************************
*/
RwBool
RsInitialise(void)
{
/*
* Initialize Platform independent data...
*/
RwBool result;
RsGlobal.appName = RWSTRING("GTA3");
RsGlobal.maximumWidth = DEFAULT_SCREEN_WIDTH;
RsGlobal.maximumHeight = DEFAULT_SCREEN_HEIGHT;
RsGlobal.width = DEFAULT_SCREEN_WIDTH;
RsGlobal.height = DEFAULT_SCREEN_HEIGHT;
RsGlobal.maxFPS = 30;
RsGlobal.quit = FALSE;
/* setup the keyboard */
RsGlobal.keyboard.inputDeviceType = rsKEYBOARD;
RsGlobal.keyboard.inputEventHandler = 0;
RsGlobal.keyboard.used = FALSE;
/* setup the mouse */
RsGlobal.mouse.inputDeviceType = rsMOUSE;
RsGlobal.mouse.inputEventHandler = 0;
RsGlobal.mouse.used = FALSE;
/* setup the pad */
RsGlobal.pad.inputDeviceType = rsPAD;
RsGlobal.pad.inputEventHandler = 0;
RsGlobal.pad.used = FALSE;
result = psInitialise();
return result;
}
STARTPATCHES
InjectHook(0x584890, RsTimer, PATCH_JUMP);
InjectHook(0x5848A0, RsCameraShowRaster, PATCH_JUMP);
InjectHook(0x5848B0, RsCameraBeginUpdate, PATCH_JUMP);
InjectHook(0x5848C0, RsRegisterImageLoader, PATCH_JUMP);
InjectHook(0x5848D0, RsSetDebug, PATCH_JUMP);
InjectHook(0x5848E0, RsMouseSetPos, PATCH_JUMP);
InjectHook(0x5848F0, RsSelectDevice, PATCH_JUMP);
InjectHook(0x584900, RsInputDeviceAttach, PATCH_JUMP);
InjectHook(0x584960, rsCommandLine, PATCH_JUMP);
InjectHook(0x584980, rsPreInitCommandLine, PATCH_JUMP);
InjectHook(0x5849C0, RsKeyboardEventHandler, PATCH_JUMP);
InjectHook(0x5849F0, RsPadEventHandler, PATCH_JUMP);
InjectHook(0x584A20, RsEventHandler, PATCH_JUMP);
InjectHook(0x584B30, RsRwTerminate, PATCH_JUMP);
InjectHook(0x584B40, RsRwInitialise, PATCH_JUMP);
InjectHook(0x584C30, RsTerminate, PATCH_JUMP);
InjectHook(0x584C40, RsInitialise, PATCH_JUMP);
ENDPATCHES

276
src/skel/skeleton.h Normal file
View File

@ -0,0 +1,276 @@
#ifndef SKELETON_H
#define SKELETON_H
#include "rwcore.h"
/* Default arena size depending on platform. */
#define rsRESOURCESDEFAULTARENASIZE (1 << 20)
#if (!defined(RsSprintf))
#define RsSprintf rwsprintf
#endif /* (!defined(RsSprintf)) */
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
#if (!defined(RSASSERT))
#define RSASSERT(_condition) /* No-op */
#endif /* (!defined(RSASSERT)) */
#define RSASSERTISTYPE(_f, _t) \
RSASSERT( (!(_f)) || ((((const RwObject *)(_f))->type)==(_t)) )
enum RsInputDeviceType
{
rsKEYBOARD,
rsMOUSE,
rsPAD
};
typedef enum RsInputDeviceType RsInputDeviceType;
enum RsEventStatus
{
rsEVENTERROR,
rsEVENTPROCESSED,
rsEVENTNOTPROCESSED
};
typedef enum RsEventStatus RsEventStatus;
enum RsEvent
{
rsCAMERASIZE,
rsCOMMANDLINE,
rsFILELOAD,
rsINITDEBUG,
rsINPUTDEVICEATTACH,
rsLEFTBUTTONDOWN,
rsLEFTBUTTONUP,
rsMOUSEMOVE,
rsMOUSEWHEELMOVE,
rsPLUGINATTACH,
rsREGISTERIMAGELOADER,
rsRIGHTBUTTONDOWN,
rsRIGHTBUTTONUP,
_rs_13,
_rs_14,
_rs_15,
_rs_16,
_rs_17,
_rs_18,
_rs_19,
_rs_20,
rsRWINITIALISE,
rsRWTERMINATE,
rsSELECTDEVICE,
rsINITIALISE,
rsTERMINATE,
rsIDLE,
rsFRONTENDIDLE,
rsKEYDOWN,
rsKEYUP,
rsQUITAPP,
rsPADBUTTONDOWN,
rsPADBUTTONUP,
rsPADANALOGUELEFT,
rsPADANALOGUELEFTRESET,
rsPADANALOGUERIGHT,
rsPADANALOGUERIGHTRESET,
rsPREINITCOMMANDLINE,
rsACTIVATE,
};
typedef enum RsEvent RsEvent;
typedef RsEventStatus (*RsInputEventHandler)(RsEvent event, void *param);
typedef struct RsInputDevice RsInputDevice;
struct RsInputDevice
{
RsInputDeviceType inputDeviceType;
RwBool used;
RsInputEventHandler inputEventHandler;
};
typedef struct RsGlobalType RsGlobalType;
struct RsGlobalType
{
const RwChar *appName;
RwInt32 width;
RwInt32 height;
RwInt32 maximumWidth;
RwInt32 maximumHeight;
RwInt32 maxFPS;
RwBool quit;
void *ps; /* platform specific data */
RsInputDevice keyboard;
RsInputDevice mouse;
RsInputDevice pad;
};
enum RsKeyCodes
{
rsESC = 1000,
rsF1 = 1001,
rsF2 = 1002,
rsF3 = 1003,
rsF4 = 1004,
rsF5 = 1005,
rsF6 = 1006,
rsF7 = 1007,
rsF8 = 1008,
rsF9 = 1009,
rsF10 = 1010,
rsF11 = 1011,
rsF12 = 1012,
rsINS = 1013,
rsDEL = 1014,
rsHOME = 1015,
rsEND = 1016,
rsPGUP = 1017,
rsPGDN = 1018,
rsUP = 1019,
rsDOWN = 1020,
rsLEFT = 1021,
rsRIGHT = 1022,
rsDIVIDE = 1023,
rsTIMES = 1024,
rsPLUS = 1025,
rsMINUS = 1026,
rsPADDEL = 1027,
rsPADEND = 1028,
rsPADDOWN = 1029,
rsPADPGDN = 1030,
rsPADLEFT = 1031,
rsPAD5 = 1032,
rsNUMLOCK = 1033,
rsPADRIGHT = 1034,
rsPADHOME = 1035,
rsPADUP = 1036,
rsPADPGUP = 1037,
rsPADINS = 1038,
rsPADENTER = 1039,
rsSCROLL = 1040,
rsPAUSE = 1041,
rsBACKSP = 1042,
rsTAB = 1043,
rsCAPSLK = 1044,
rsENTER = 1045,
rsLSHIFT = 1046,
rsRSHIFT = 1047,
rsSHIFT = 1048,
rsLCTRL = 1049,
rsRCTRL = 1050,
rsLALT = 1051,
rsRALT = 1052,
rsLWIN = 1053,
rsRWIN = 1054,
rsAPPS = 1055,
rsNULL = 1056,
};
typedef enum RsKeyCodes RsKeyCodes;
typedef struct RsKeyStatus RsKeyStatus;
struct RsKeyStatus
{
RwInt32 keyCharCode;
};
typedef struct RsPadButtonStatus RsPadButtonStatus;
struct RsPadButtonStatus
{
RwInt32 padID;
RwUInt32 padButtons;
};
enum RsPadButtons
{
rsPADNULL = 0,
rsPADBUTTON1 = 1,
rsPADBUTTON2 = 2,
rsPADBUTTON3 = 3,
rsPADBUTTON4 = 4,
rsPADBUTTON5 = 5,
rsPADBUTTON6 = 6,
rsPADBUTTON7 = 7,
rsPADBUTTON8 = 8,
rsPADSELECT = 9,
rsPADBUTTONA1 = 10,
rsPADBUTTONA2 = 11,
rsPADSTART = 12,
rsPADDPADUP = 13,
rsPADDPADRIGHT = 14,
rsPADDPADDOWN = 15,
rsPADDPADLEFT = 16,
};
typedef enum RsPadButtons RsPadButtons;
extern RsGlobalType &RsGlobal;
extern RsEventStatus AppEventHandler(RsEvent event, void *param);
extern RwBool AttachInputDevices(void);
extern RsEventStatus RsEventHandler(RsEvent event, void *param);
extern RsEventStatus RsKeyboardEventHandler(RsEvent event, void *param);
extern RsEventStatus RsPadEventHandler(RsEvent event, void *param);
extern RwBool
RsInitialise(void);
extern RwBool
RsRegisterImageLoader(void);
extern RwBool
RsRwInitialise(void *param);
extern RwBool
RsSelectDevice(void);
extern RwBool
RsInputDeviceAttach(RsInputDeviceType inputDevice,
RsInputEventHandler inputEventHandler);
extern RwUInt32
RsTimer(void);
extern void
RsCameraShowRaster(RwCamera *camera);
extern RwBool
RsCameraBeginUpdate(RwCamera *camera);
//TODO
//extern void
//RsMouseSetVisibility(RwBool visible);
extern void
RsMouseSetPos(RwV2d *pos);
extern void
RsRwTerminate(void);
extern void
RsTerminate(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SKELETON_H */