summaryrefslogtreecommitdiffstats
path: root/src/skel
diff options
context:
space:
mode:
authorFire-Head <Fire-Head@users.noreply.github.com>2019-05-31 19:02:26 +0200
committerFire-Head <Fire-Head@users.noreply.github.com>2019-05-31 19:02:26 +0200
commit28fce310d5cb9a3a81e0f038192a39abd688d1bd (patch)
tree392a32b7c35ad574879564487f52ed14d6d4ea5c /src/skel
parentmore high level functions (diff)
downloadre3-28fce310d5cb9a3a81e0f038192a39abd688d1bd.tar
re3-28fce310d5cb9a3a81e0f038192a39abd688d1bd.tar.gz
re3-28fce310d5cb9a3a81e0f038192a39abd688d1bd.tar.bz2
re3-28fce310d5cb9a3a81e0f038192a39abd688d1bd.tar.lz
re3-28fce310d5cb9a3a81e0f038192a39abd688d1bd.tar.xz
re3-28fce310d5cb9a3a81e0f038192a39abd688d1bd.tar.zst
re3-28fce310d5cb9a3a81e0f038192a39abd688d1bd.zip
Diffstat (limited to '')
-rw-r--r--src/skel/events.cpp845
-rw-r--r--src/skel/events.h7
-rw-r--r--src/skel/platform.h36
-rw-r--r--src/skel/skeleton.cpp454
-rw-r--r--src/skel/skeleton.h276
5 files changed, 1618 insertions, 0 deletions
diff --git a/src/skel/events.cpp b/src/skel/events.cpp
new file mode 100644
index 00000000..4a7a8bd2
--- /dev/null
+++ b/src/skel/events.cpp
@@ -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 \ No newline at end of file
diff --git a/src/skel/events.h b/src/skel/events.h
new file mode 100644
index 00000000..ef812ebc
--- /dev/null
+++ b/src/skel/events.h
@@ -0,0 +1,7 @@
+#ifndef EVENTS_H
+#define EVENTS_H
+
+#include <rwcore.h>
+#include "skeleton.h"
+
+#endif /* EVENTS_H */
diff --git a/src/skel/platform.h b/src/skel/platform.h
new file mode 100644
index 00000000..5338b270
--- /dev/null
+++ b/src/skel/platform.h
@@ -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 */
diff --git a/src/skel/skeleton.cpp b/src/skel/skeleton.cpp
new file mode 100644
index 00000000..f9fc95ea
--- /dev/null
+++ b/src/skel/skeleton.cpp
@@ -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 \ No newline at end of file
diff --git a/src/skel/skeleton.h b/src/skel/skeleton.h
new file mode 100644
index 00000000..891ca14f
--- /dev/null
+++ b/src/skel/skeleton.h
@@ -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 */