mirror of
https://gitlab.com/shinovon/re3-symbian.git
synced 2026-05-23 01:57:21 +03:00
Initial commit
This commit is contained in:
commit
77cdaaf97e
827 changed files with 418745 additions and 0 deletions
425
src/skel/crossplatform.cpp
Normal file
425
src/skel/crossplatform.cpp
Normal file
|
|
@ -0,0 +1,425 @@
|
|||
#include "common.h"
|
||||
#include "crossplatform.h"
|
||||
|
||||
// Codes compatible with Windows and Linux
|
||||
#ifndef _WIN32
|
||||
|
||||
// For internal use
|
||||
// wMilliseconds is not needed
|
||||
void tmToSystemTime(const tm *tm, SYSTEMTIME *out) {
|
||||
out->wYear = tm->tm_year + 1900;
|
||||
out->wMonth = tm->tm_mon + 1;
|
||||
out->wDayOfWeek = tm->tm_wday;
|
||||
out->wDay = tm->tm_mday;
|
||||
out->wHour = tm->tm_hour;
|
||||
out->wMinute = tm->tm_min;
|
||||
out->wSecond = tm->tm_sec;
|
||||
}
|
||||
|
||||
void GetLocalTime_CP(SYSTEMTIME *out) {
|
||||
time_t timestamp = time(nil);
|
||||
tm *localTm = localtime(×tamp);
|
||||
tmToSystemTime(localTm, out);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Compatible with Linux/POSIX and MinGW on Windows
|
||||
#ifndef _WIN32
|
||||
HANDLE FindFirstFile(const char* pathname, WIN32_FIND_DATA* firstfile) {
|
||||
char pathCopy[MAX_PATH];
|
||||
strcpy(pathCopy, pathname);
|
||||
|
||||
char *folder = strtok(pathCopy, "*");
|
||||
char *extension = strtok(NULL, "*");
|
||||
|
||||
// because I remember like strtok might not return NULL for last delimiter
|
||||
if (extension && extension - folder == strlen(pathname))
|
||||
extension = nil;
|
||||
|
||||
// Case-sensitivity and backslashes...
|
||||
// Will be freed at the bottom
|
||||
char *realFolder = casepath(folder);
|
||||
if (realFolder) {
|
||||
folder = realFolder;
|
||||
}
|
||||
|
||||
strncpy(firstfile->folder, folder, sizeof(firstfile->folder));
|
||||
|
||||
if (extension)
|
||||
strncpy(firstfile->extension, extension, sizeof(firstfile->extension));
|
||||
else
|
||||
firstfile->extension[0] = '\0';
|
||||
|
||||
if (realFolder)
|
||||
free(realFolder);
|
||||
|
||||
HANDLE d;
|
||||
if ((d = (HANDLE)opendir(firstfile->folder)) == NULL || !FindNextFile(d, firstfile))
|
||||
return NULL;
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
bool FindNextFile(HANDLE d, WIN32_FIND_DATA* finddata) {
|
||||
dirent *file;
|
||||
static struct stat fileStats;
|
||||
static char path[PATH_MAX], relativepath[NAME_MAX + sizeof(finddata->folder) + 1];
|
||||
int extensionLen = strlen(finddata->extension);
|
||||
while ((file = readdir((DIR*)d)) != NULL) {
|
||||
|
||||
// We only want "DT_REG"ular Files, but reportedly some FS and OSes gives DT_UNKNOWN as type.
|
||||
if ((file->d_type == DT_UNKNOWN || file->d_type == DT_REG || file->d_type == DT_LNK) &&
|
||||
(extensionLen == 0 || strncasecmp(&file->d_name[strlen(file->d_name) - extensionLen], finddata->extension, extensionLen) == 0)) {
|
||||
|
||||
sprintf(relativepath, "%s/%s", finddata->folder, file->d_name);
|
||||
realpath(relativepath, path);
|
||||
stat(path, &fileStats);
|
||||
strncpy(finddata->cFileName, file->d_name, sizeof(finddata->cFileName));
|
||||
finddata->ftLastWriteTime = fileStats.st_mtime;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void GetDateFormat(int unused1, int unused2, SYSTEMTIME* in, int unused3, char* out, int size) {
|
||||
tm linuxTime;
|
||||
linuxTime.tm_year = in->wYear - 1900;
|
||||
linuxTime.tm_mon = in->wMonth - 1;
|
||||
linuxTime.tm_wday = in->wDayOfWeek;
|
||||
linuxTime.tm_mday = in->wDay;
|
||||
linuxTime.tm_hour = in->wHour;
|
||||
linuxTime.tm_min = in->wMinute;
|
||||
linuxTime.tm_sec = in->wSecond;
|
||||
strftime(out, size, nl_langinfo(D_FMT), &linuxTime);
|
||||
}
|
||||
|
||||
void FileTimeToSystemTime(time_t* writeTime, SYSTEMTIME* out) {
|
||||
tm *ptm = gmtime(writeTime);
|
||||
tmToSystemTime(ptm, out);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Because wchar length differs between platforms.
|
||||
wchar*
|
||||
AllocUnicode(const char* src)
|
||||
{
|
||||
wchar *dst = (wchar*)malloc(strlen(src)*2 + 2);
|
||||
wchar *i = dst;
|
||||
while((*i++ = (unsigned char)*src++) != '\0');
|
||||
return dst;
|
||||
}
|
||||
|
||||
// Funcs/features from Windows that we need on other platforms
|
||||
#ifndef _WIN32
|
||||
char *strupr(char *s) {
|
||||
char* tmp = s;
|
||||
|
||||
for (;*tmp;++tmp) {
|
||||
*tmp = toupper((unsigned char) *tmp);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
char *strlwr(char *s) {
|
||||
char* tmp = s;
|
||||
|
||||
for (;*tmp;++tmp) {
|
||||
*tmp = tolower((unsigned char) *tmp);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
char *trim(char *s) {
|
||||
char *ptr;
|
||||
if (!s)
|
||||
return NULL; // handle NULL string
|
||||
if (!*s)
|
||||
return s; // handle empty string
|
||||
for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
|
||||
ptr[1] = '\0';
|
||||
return s;
|
||||
}
|
||||
|
||||
FILE* _fcaseopen(char const* filename, char const* mode)
|
||||
{
|
||||
FILE* result;
|
||||
char* real = casepath(filename);
|
||||
if (!real)
|
||||
result = fopen(filename, mode);
|
||||
else {
|
||||
result = fopen(real, mode);
|
||||
free(real);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int _caserename(const char *old_filename, const char *new_filename)
|
||||
{
|
||||
int result;
|
||||
char *real_old = casepath(old_filename);
|
||||
char *real_new = casepath(new_filename);
|
||||
|
||||
// hack so we don't even try to rename it to new_filename if it already exists
|
||||
if (!real_new) {
|
||||
free(real_old);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!real_old)
|
||||
result = rename(old_filename, real_new);
|
||||
else
|
||||
result = rename(real_old, real_new);
|
||||
|
||||
free(real_old);
|
||||
free(real_new);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Case-insensitivity on linux (from https://github.com/OneSadCookie/fcaseopen)
|
||||
// Returned string should freed manually (if exists)
|
||||
char* casepath(char const* path, bool checkPathFirst)
|
||||
{
|
||||
if (checkPathFirst && access(path, F_OK) != -1) {
|
||||
// File path is correct
|
||||
return nil;
|
||||
}
|
||||
|
||||
size_t l = strlen(path);
|
||||
char* p = (char*)alloca(l + 1);
|
||||
char* out = (char*)malloc(l + 3); // for extra ./
|
||||
strcpy(p, path);
|
||||
|
||||
// my addon: linux doesn't handle filenames with spaces at the end nicely
|
||||
p = trim(p);
|
||||
|
||||
size_t rl = 0;
|
||||
|
||||
DIR* d;
|
||||
char* c;
|
||||
|
||||
#if defined(__SWITCH__) || defined(PSP2)
|
||||
if( (c = strstr(p, ":/")) != NULL) // scheme used by some environments, eg. switch, vita
|
||||
{
|
||||
size_t deviceNameOffset = c - p + 3;
|
||||
char* deviceNamePath = (char*)alloca(deviceNameOffset + 1);
|
||||
strlcpy(deviceNamePath, p, deviceNameOffset);
|
||||
deviceNamePath[deviceNameOffset] = 0;
|
||||
d = opendir(deviceNamePath);
|
||||
p = c + 1;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (p[0] == '/' || p[0] == '\\')
|
||||
{
|
||||
d = opendir("/");
|
||||
}
|
||||
else
|
||||
{
|
||||
d = opendir(".");
|
||||
out[0] = '.';
|
||||
out[1] = 0;
|
||||
rl = 1;
|
||||
}
|
||||
|
||||
bool cantProceed = false; // just convert slashes in what's left in string, don't correct case of letters(because we can't)
|
||||
bool mayBeTrailingSlash = false;
|
||||
|
||||
while (c = strsep(&p, "/\\"))
|
||||
{
|
||||
// May be trailing slash(allow), slash at the start(avoid), or multiple slashes(avoid)
|
||||
if (*c == '\0')
|
||||
{
|
||||
mayBeTrailingSlash = true;
|
||||
continue;
|
||||
} else {
|
||||
mayBeTrailingSlash = false;
|
||||
}
|
||||
|
||||
out[rl] = '/';
|
||||
rl += 1;
|
||||
out[rl] = 0;
|
||||
|
||||
if (cantProceed)
|
||||
{
|
||||
strcpy(out + rl, c);
|
||||
rl += strlen(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
struct dirent* e;
|
||||
while (e = readdir(d))
|
||||
{
|
||||
if (strcasecmp(c, e->d_name) == 0)
|
||||
{
|
||||
strcpy(out + rl, e->d_name);
|
||||
int reportedLen = (int)strlen(e->d_name);
|
||||
rl += reportedLen;
|
||||
assert(reportedLen == strlen(c) && "casepath: This is not good at all");
|
||||
|
||||
closedir(d);
|
||||
d = opendir(out);
|
||||
|
||||
// Either it wasn't a folder, or permission error, I/O error etc.
|
||||
if (!d) {
|
||||
cantProceed = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!e)
|
||||
{
|
||||
printf("casepath couldn't find dir/file \"%s\", full path was %s\n", c, path);
|
||||
// No match, add original name and continue converting further slashes.
|
||||
strcpy(out + rl, c);
|
||||
rl += strlen(c);
|
||||
cantProceed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (d) closedir(d);
|
||||
if (mayBeTrailingSlash) {
|
||||
out[rl] = '/'; rl += 1;
|
||||
out[rl] = '\0';
|
||||
}
|
||||
|
||||
if (rl > l + 2) {
|
||||
printf("\n\ncasepath: Corrected path length is longer then original+2:\n\tOriginal: %s (%zu chars)\n\tCorrected: %s (%zu chars)\n\n", path, l, out, rl);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __SWITCH__
|
||||
/* Taken from glibc */
|
||||
char *realpath(const char *name, char *resolved)
|
||||
{
|
||||
char *rpath, *dest = NULL;
|
||||
const char *start, *end, *rpath_limit;
|
||||
long int path_max;
|
||||
|
||||
/* As per Single Unix Specification V2 we must return an error if
|
||||
either parameter is a null pointer. We extend this to allow
|
||||
the RESOLVED parameter to be NULL in case the we are expected to
|
||||
allocate the room for the return value. */
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
||||
/* As per Single Unix Specification V2 we must return an error if
|
||||
the name argument points to an empty string. */
|
||||
if (name[0] == '\0')
|
||||
return NULL;
|
||||
|
||||
#ifdef PATH_MAX
|
||||
path_max = PATH_MAX;
|
||||
#else
|
||||
path_max = pathconf(name, _PC_PATH_MAX);
|
||||
if (path_max <= 0)
|
||||
path_max = 1024;
|
||||
#endif
|
||||
|
||||
if (!resolved)
|
||||
{
|
||||
rpath = (char*)malloc(path_max);
|
||||
if (!rpath)
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
rpath = resolved;
|
||||
rpath_limit = rpath + path_max;
|
||||
|
||||
if (name[0] != '/')
|
||||
{
|
||||
if (!getcwd(rpath, path_max))
|
||||
{
|
||||
rpath[0] = '\0';
|
||||
goto error;
|
||||
}
|
||||
dest = (char*)memchr(rpath, '\0', path_max);
|
||||
}
|
||||
else
|
||||
{
|
||||
rpath[0] = '/';
|
||||
dest = rpath + 1;
|
||||
}
|
||||
|
||||
for (start = end = name; *start; start = end)
|
||||
{
|
||||
/* Skip sequence of multiple path-separators. */
|
||||
while (*start == '/')
|
||||
++start;
|
||||
|
||||
/* Find end of path component. */
|
||||
for (end = start; *end && *end != '/'; ++end)
|
||||
/* Nothing. */;
|
||||
|
||||
if (end - start == 0)
|
||||
break;
|
||||
else if (end - start == 1 && start[0] == '.')
|
||||
/* nothing */;
|
||||
else if (end - start == 2 && start[0] == '.' && start[1] == '.')
|
||||
{
|
||||
/* Back up to previous component, ignore if at root already. */
|
||||
if (dest > rpath + 1)
|
||||
while ((--dest)[-1] != '/')
|
||||
;
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t new_size;
|
||||
|
||||
if (dest[-1] != '/')
|
||||
*dest++ = '/';
|
||||
|
||||
if (dest + (end - start) >= rpath_limit)
|
||||
{
|
||||
ptrdiff_t dest_offset = dest - rpath;
|
||||
char *new_rpath;
|
||||
|
||||
if (resolved)
|
||||
{
|
||||
if (dest > rpath + 1)
|
||||
dest--;
|
||||
*dest = '\0';
|
||||
goto error;
|
||||
}
|
||||
new_size = rpath_limit - rpath;
|
||||
if (end - start + 1 > path_max)
|
||||
new_size += end - start + 1;
|
||||
else
|
||||
new_size += path_max;
|
||||
new_rpath = (char *)realloc(rpath, new_size);
|
||||
if (!new_rpath)
|
||||
goto error;
|
||||
rpath = new_rpath;
|
||||
rpath_limit = rpath + new_size;
|
||||
|
||||
dest = rpath + dest_offset;
|
||||
}
|
||||
|
||||
dest = (char*)memcpy(dest, start, end - start);
|
||||
*dest = '\0';
|
||||
}
|
||||
}
|
||||
if (dest > rpath + 1 && dest[-1] == '/')
|
||||
--dest;
|
||||
*dest = '\0';
|
||||
|
||||
return rpath;
|
||||
|
||||
error:
|
||||
if (!resolved)
|
||||
free(rpath);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ssize_t readlink (const char * __path, char * __buf, size_t __buflen)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
184
src/skel/crossplatform.h
Normal file
184
src/skel/crossplatform.h
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
#include <time.h>
|
||||
#include <limits.h>
|
||||
|
||||
// This is the common include for platform/renderer specific skeletons(glfw.cpp, win.cpp etc.) and using cross platform things (like Windows directories wrapper, platform specific global arrays etc.)
|
||||
// Functions that's different on glfw and win but have same signature, should be located on platform.h.
|
||||
|
||||
enum eWinVersion
|
||||
{
|
||||
OS_WIN95 = 0,
|
||||
OS_WIN98,
|
||||
OS_WINNT,
|
||||
OS_WIN2000,
|
||||
OS_WINXP,
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
// As long as WITHWINDOWS isn't defined / <Windows.h> isn't included, we only need type definitions so let's include <IntSafe.h>.
|
||||
// NOTE: It's perfectly fine to include <Windows.h> here, but it can increase build size and time in *some* conditions, and maybe substantially in future if we'll use crossplatform.h more.
|
||||
#ifndef _INC_WINDOWS
|
||||
#ifndef __MWERKS__
|
||||
#include <IntSafe.h>
|
||||
#else
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
#endif
|
||||
#if defined RW_D3D9 || defined RWLIBS
|
||||
#include "win.h"
|
||||
#endif
|
||||
extern DWORD _dwOperatingSystemVersion;
|
||||
#define fcaseopen fopen
|
||||
#define caserename rename
|
||||
#else
|
||||
char *strupr(char *str);
|
||||
char *strlwr(char *str);
|
||||
|
||||
enum {
|
||||
LANG_OTHER,
|
||||
LANG_GERMAN,
|
||||
LANG_FRENCH,
|
||||
LANG_ENGLISH,
|
||||
LANG_ITALIAN,
|
||||
LANG_SPANISH,
|
||||
};
|
||||
|
||||
enum {
|
||||
SUBLANG_OTHER,
|
||||
SUBLANG_ENGLISH_AUS
|
||||
};
|
||||
|
||||
extern long _dwOperatingSystemVersion;
|
||||
char *casepath(char const *path, bool checkPathFirst = true);
|
||||
FILE *_fcaseopen(char const *filename, char const *mode);
|
||||
#define fcaseopen _fcaseopen
|
||||
int _caserename(const char *old_filename, const char *new_filename);
|
||||
#define caserename _caserename
|
||||
#endif
|
||||
|
||||
#ifdef RW_GL3
|
||||
typedef struct
|
||||
{
|
||||
GLFWwindow* window;
|
||||
RwBool fullScreen;
|
||||
RwV2d lastMousePos;
|
||||
double mouseWheel; // glfw doesn't cache it
|
||||
bool cursorIsInWindow;
|
||||
RwInt8 joy1id;
|
||||
RwInt8 joy2id;
|
||||
}
|
||||
psGlobalType;
|
||||
|
||||
#define PSGLOBAL(var) (((psGlobalType *)(RsGlobal.ps))->var)
|
||||
|
||||
void CapturePad(RwInt32 padID);
|
||||
void joysChangeCB(int jid, int event);
|
||||
#endif
|
||||
|
||||
#ifdef DETECT_JOYSTICK_MENU
|
||||
extern char gSelectedJoystickName[128];
|
||||
#endif
|
||||
|
||||
enum eGameState
|
||||
{
|
||||
GS_START_UP = 0,
|
||||
GS_INIT_LOGO_MPEG,
|
||||
GS_LOGO_MPEG,
|
||||
GS_INIT_INTRO_MPEG,
|
||||
GS_INTRO_MPEG,
|
||||
GS_INIT_ONCE,
|
||||
GS_INIT_FRONTEND,
|
||||
GS_FRONTEND,
|
||||
GS_INIT_PLAYING_GAME,
|
||||
GS_PLAYING_GAME,
|
||||
};
|
||||
extern RwUInt32 gGameState;
|
||||
|
||||
RwBool IsForegroundApp();
|
||||
|
||||
#ifndef MAX_PATH
|
||||
#if !defined _WIN32 || defined __MINGW32__
|
||||
#define MAX_PATH PATH_MAX
|
||||
#else
|
||||
#define MAX_PATH 260
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Codes compatible with Windows and Linux
|
||||
#ifndef _WIN32
|
||||
#define DeleteFile unlink
|
||||
|
||||
// Needed for save games
|
||||
struct SYSTEMTIME {
|
||||
RwUInt16 wYear;
|
||||
RwUInt16 wMonth;
|
||||
RwUInt16 wDayOfWeek;
|
||||
RwUInt16 wDay;
|
||||
RwUInt16 wHour;
|
||||
RwUInt16 wMinute;
|
||||
RwUInt16 wSecond;
|
||||
RwUInt16 wMilliseconds;
|
||||
};
|
||||
|
||||
void GetLocalTime_CP(SYSTEMTIME* out);
|
||||
#define GetLocalTime GetLocalTime_CP
|
||||
#define OutputDebugString(s) re3_debug("[DBG-2]: %s\n",s)
|
||||
#endif
|
||||
|
||||
// Compatible with Linux/POSIX and MinGW on Windows
|
||||
#ifndef _WIN32
|
||||
#include <iostream>
|
||||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <langinfo.h>
|
||||
#include <unistd.h>
|
||||
|
||||
typedef void* HANDLE;
|
||||
#define INVALID_HANDLE_VALUE NULL
|
||||
#define FindClose(h) \
|
||||
do { \
|
||||
if (h != nil) \
|
||||
closedir((DIR*)h); \
|
||||
} while(0)
|
||||
|
||||
#define LOCALE_USER_DEFAULT 0
|
||||
#define DATE_SHORTDATE 0
|
||||
|
||||
struct WIN32_FIND_DATA {
|
||||
char extension[32]; // for searching
|
||||
char folder[MAX_PATH]; // for searching
|
||||
char cFileName[256]; // because tSkinInfo has it 256
|
||||
time_t ftLastWriteTime;
|
||||
};
|
||||
|
||||
HANDLE FindFirstFile(const char*, WIN32_FIND_DATA*);
|
||||
bool FindNextFile(HANDLE, WIN32_FIND_DATA*);
|
||||
void FileTimeToSystemTime(time_t*, SYSTEMTIME*);
|
||||
void GetDateFormat(int, int, SYSTEMTIME*, int, char*, int);
|
||||
#endif
|
||||
|
||||
#ifdef __SWITCH__
|
||||
|
||||
// tweak glfw values for switch to match expected pc bindings
|
||||
#ifdef GLFW_GAMEPAD_BUTTON_A
|
||||
#undef GLFW_GAMEPAD_BUTTON_A
|
||||
#endif
|
||||
#define GLFW_GAMEPAD_BUTTON_A 1
|
||||
|
||||
#ifdef GLFW_GAMEPAD_BUTTON_B
|
||||
#undef GLFW_GAMEPAD_BUTTON_B
|
||||
#endif
|
||||
#define GLFW_GAMEPAD_BUTTON_B 0
|
||||
|
||||
#ifdef GLFW_GAMEPAD_BUTTON_X
|
||||
#undef GLFW_GAMEPAD_BUTTON_X
|
||||
#endif
|
||||
#define GLFW_GAMEPAD_BUTTON_X 3
|
||||
|
||||
#ifdef GLFW_GAMEPAD_BUTTON_Y
|
||||
#undef GLFW_GAMEPAD_BUTTON_Y
|
||||
#endif
|
||||
#define GLFW_GAMEPAD_BUTTON_Y 2
|
||||
|
||||
#endif
|
||||
831
src/skel/events.cpp
Normal file
831
src/skel/events.cpp
Normal file
|
|
@ -0,0 +1,831 @@
|
|||
#include "common.h"
|
||||
#include "Pad.h"
|
||||
#include "ControllerConfig.h"
|
||||
#include "Frontend.h"
|
||||
#include "Camera.h"
|
||||
|
||||
#include "rwcore.h"
|
||||
#include "skeleton.h"
|
||||
#include "events.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;
|
||||
}
|
||||
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 )
|
||||
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)
|
||||
{
|
||||
#ifndef IGNORE_MOUSE_KEYBOARD
|
||||
RsInputDeviceAttach(rsKEYBOARD, KeyboardHandler);
|
||||
#endif
|
||||
|
||||
RsInputDeviceAttach(rsPAD, PadHandler);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
7
src/skel/events.h
Normal file
7
src/skel/events.h
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#ifndef EVENTS_H
|
||||
#define EVENTS_H
|
||||
|
||||
#include <rwcore.h>
|
||||
#include "skeleton.h"
|
||||
|
||||
#endif /* EVENTS_H */
|
||||
2572
src/skel/glfw/glfw.cpp
Normal file
2572
src/skel/glfw/glfw.cpp
Normal file
File diff suppressed because it is too large
Load diff
59
src/skel/platform.h
Normal file
59
src/skel/platform.h
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
#ifndef PLATFORM_H
|
||||
#define PLATFORM_H
|
||||
|
||||
// Functions that's different on glfw/win etc. but have same signature (but if a function only used in win.cpp you can keep in win.h)
|
||||
|
||||
#include "rwcore.h"
|
||||
#include "skeleton.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#ifdef _WIN32
|
||||
extern RwUInt32 psTimer(void);
|
||||
#else
|
||||
extern double psTimer(void);
|
||||
#endif
|
||||
|
||||
extern RwBool psInitialize(void);
|
||||
extern void psTerminate(void);
|
||||
|
||||
extern void psCameraShowRaster(RwCamera *camera);
|
||||
extern RwBool psCameraBeginUpdate(RwCamera *camera);
|
||||
extern RwImage *psGrabScreen(RwCamera *camera);
|
||||
|
||||
extern void psMouseSetPos(RwV2d *pos);
|
||||
|
||||
extern RwBool psSelectDevice();
|
||||
|
||||
extern RwMemoryFunctions *psGetMemoryFunctions(void);
|
||||
|
||||
/* install the platform specific file system */
|
||||
extern RwBool psInstallFileSystem(void);
|
||||
|
||||
|
||||
/* Handle native texture support */
|
||||
extern RwBool psNativeTextureSupport(void);
|
||||
|
||||
extern void _InputTranslateShiftKeyUpDown(RsKeyCodes* rs);
|
||||
extern long _InputInitialiseMouse(); // returns HRESULT on Windows actually
|
||||
extern void _InputInitialiseJoys();
|
||||
|
||||
extern void HandleExit();
|
||||
|
||||
extern void _psSelectScreenVM(RwInt32 videoMode);
|
||||
|
||||
extern void InitialiseLanguage();
|
||||
|
||||
extern RwBool _psSetVideoMode(RwInt32 subSystem, RwInt32 videoMode);
|
||||
|
||||
extern RwChar** _psGetVideoModeList();
|
||||
|
||||
extern RwInt32 _psGetNumVideModes();
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* PLATFORM_H */
|
||||
432
src/skel/skeleton.cpp
Normal file
432
src/skel/skeleton.cpp
Normal file
|
|
@ -0,0 +1,432 @@
|
|||
#include "common.h"
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "rwcore.h"
|
||||
|
||||
#include "skeleton.h"
|
||||
#include "platform.h"
|
||||
#include "main.h"
|
||||
#include "MemoryHeap.h"
|
||||
|
||||
static RwBool DefaultVideoMode = TRUE;
|
||||
|
||||
RsGlobalType RsGlobal;
|
||||
|
||||
#ifdef _WIN32
|
||||
RwUInt32
|
||||
#else
|
||||
double
|
||||
#endif
|
||||
RsTimer(void)
|
||||
{
|
||||
return psTimer();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void
|
||||
RsCameraShowRaster(RwCamera * camera)
|
||||
{
|
||||
psCameraShowRaster(camera);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwBool
|
||||
RsCameraBeginUpdate(RwCamera * camera)
|
||||
{
|
||||
return psCameraBeginUpdate(camera);
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwImage*
|
||||
RsGrabScreen(RwCamera *camera)
|
||||
{
|
||||
return psGrabScreen(camera);
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwBool
|
||||
RsRegisterImageLoader(void)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
static RwBool
|
||||
RsSetDebug(void)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void
|
||||
RsMouseSetPos(RwV2d * pos)
|
||||
{
|
||||
psMouseSetPos(pos);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwBool
|
||||
RsSelectDevice(void)
|
||||
{
|
||||
return psSelectDevice();
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
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;
|
||||
}
|
||||
#ifndef MASTER
|
||||
if (!strcmp(arg, RWSTRING("-animviewer")))
|
||||
{
|
||||
gbModelViewer = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
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 rsRWINITIALIZE:
|
||||
result = (RsRwInitialize(param) ?
|
||||
rsEVENTPROCESSED : rsEVENTERROR);
|
||||
break;
|
||||
|
||||
case rsTERMINATE:
|
||||
RsTerminate();
|
||||
result = (rsEVENTPROCESSED);
|
||||
break;
|
||||
|
||||
case rsINITIALIZE:
|
||||
result =
|
||||
(RsInitialize()? rsEVENTPROCESSED : rsEVENTERROR);
|
||||
break;
|
||||
|
||||
default:
|
||||
result = (es);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = (es);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void
|
||||
RsRwTerminate(void)
|
||||
{
|
||||
/* Close RenderWare */
|
||||
|
||||
RwEngineStop();
|
||||
RwEngineClose();
|
||||
RwEngineTerm();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwBool
|
||||
RsRwInitialize(void *displayID)
|
||||
{
|
||||
RwEngineOpenParams openParams;
|
||||
|
||||
PUSH_MEMID(MEMID_RENDER); // NB: not popped on failed return
|
||||
|
||||
/*
|
||||
* Start RenderWare...
|
||||
*/
|
||||
|
||||
if (!RwEngineInit(psGetMemoryFunctions(), 0, rsRESOURCESDEFAULTARENASIZE))
|
||||
{
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Install any platform specific file systems...
|
||||
*/
|
||||
psInstallFileSystem();
|
||||
|
||||
/*
|
||||
* Initialize debug message handling...
|
||||
*/
|
||||
RsEventHandler(rsINITDEBUG, nil);
|
||||
|
||||
/*
|
||||
* Attach all plugins...
|
||||
*/
|
||||
if (RsEventHandler(rsPLUGINATTACH, nil) == rsEVENTERROR)
|
||||
{
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Attach input devices...
|
||||
*/
|
||||
if (RsEventHandler(rsINPUTDEVICEATTACH, nil) == 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, nil);
|
||||
|
||||
psNativeTextureSupport();
|
||||
|
||||
RwTextureSetMipmapping(FALSE);
|
||||
RwTextureSetAutoMipmapping(FALSE);
|
||||
|
||||
POP_MEMID();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void
|
||||
RsTerminate(void)
|
||||
{
|
||||
psTerminate();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwBool
|
||||
RsInitialize(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 = nil;
|
||||
RsGlobal.keyboard.used = FALSE;
|
||||
|
||||
/* setup the mouse */
|
||||
RsGlobal.mouse.inputDeviceType = rsMOUSE;
|
||||
RsGlobal.mouse.inputEventHandler = nil;
|
||||
RsGlobal.mouse.used = FALSE;
|
||||
|
||||
/* setup the pad */
|
||||
RsGlobal.pad.inputDeviceType = rsPAD;
|
||||
RsGlobal.pad.inputEventHandler = nil;
|
||||
RsGlobal.pad.used = FALSE;
|
||||
|
||||
result = psInitialize();
|
||||
|
||||
return result;
|
||||
}
|
||||
290
src/skel/skeleton.h
Normal file
290
src/skel/skeleton.h
Normal file
|
|
@ -0,0 +1,290 @@
|
|||
#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,
|
||||
rsRWINITIALIZE,
|
||||
rsRWTERMINATE,
|
||||
rsSELECTDEVICE,
|
||||
rsINITIALIZE,
|
||||
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,
|
||||
|
||||
rsMOUSELEFTBUTTON = 1,
|
||||
rsMOUSMIDDLEBUTTON = 2,
|
||||
rsMOUSERIGHTBUTTON = 3,
|
||||
rsMOUSEWHEELUPBUTTON = 4,
|
||||
rsMOUSEWHEELDOWNBUTTON = 5,
|
||||
rsMOUSEX1BUTTON = 6,
|
||||
rsMOUSEX2BUTTON = 7,
|
||||
};
|
||||
typedef enum RsKeyCodes RsKeyCodes;
|
||||
|
||||
typedef struct RsKeyStatus RsKeyStatus;
|
||||
struct RsKeyStatus
|
||||
{
|
||||
RwInt32 keyCharCode;
|
||||
};
|
||||
|
||||
typedef struct RsPadButtonStatus RsPadButtonStatus;
|
||||
struct RsPadButtonStatus
|
||||
{
|
||||
RwInt32 padID;
|
||||
};
|
||||
|
||||
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
|
||||
RsInitialize(void);
|
||||
|
||||
extern RwBool
|
||||
RsRegisterImageLoader(void);
|
||||
|
||||
extern RwBool
|
||||
RsRwInitialize(void *param);
|
||||
|
||||
extern RwBool
|
||||
RsSelectDevice(void);
|
||||
|
||||
extern RwBool
|
||||
RsInputDeviceAttach(RsInputDeviceType inputDevice,
|
||||
RsInputEventHandler inputEventHandler);
|
||||
|
||||
#ifdef _WIN32
|
||||
extern RwUInt32
|
||||
#else
|
||||
extern double
|
||||
#endif
|
||||
RsTimer(void);
|
||||
|
||||
extern void
|
||||
RsCameraShowRaster(RwCamera *camera);
|
||||
|
||||
extern RwBool
|
||||
RsCameraBeginUpdate(RwCamera *camera);
|
||||
|
||||
//TODO
|
||||
//extern void
|
||||
//RsMouseSetVisibility(RwBool visible);
|
||||
|
||||
extern RwImage*
|
||||
RsGrabScreen(RwCamera *camera);
|
||||
|
||||
extern void
|
||||
RsMouseSetPos(RwV2d *pos);
|
||||
|
||||
extern void
|
||||
RsRwTerminate(void);
|
||||
|
||||
extern void
|
||||
RsTerminate(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* SKELETON_H */
|
||||
BIN
src/skel/win/gta3.ico
Normal file
BIN
src/skel/win/gta3.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 158 KiB |
21
src/skel/win/resource.h
Normal file
21
src/skel/win/resource.h
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by dungeon.rc
|
||||
//
|
||||
#define IDD_DIALOG1 104
|
||||
#define IDC_DEVICESEL 1000
|
||||
#define IDC_VIDMODE 1001
|
||||
#define IDEXIT 1002
|
||||
#define IDC_SELECTDEVICE 1005
|
||||
|
||||
#define IDI_MAIN_ICON 1042
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 104
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
3432
src/skel/win/win.cpp
Normal file
3432
src/skel/win/win.cpp
Normal file
File diff suppressed because it is too large
Load diff
91
src/skel/win/win.h
Normal file
91
src/skel/win/win.h
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
|
||||
// DON'T include directly. crossplatform.h includes this if you're using D3D9 backend(win.cpp).
|
||||
|
||||
#if (!defined(_PLATFORM_WIN_H))
|
||||
#define _PLATFORM_WIN_H
|
||||
|
||||
#if (!defined(RSREGSETBREAKALLOC))
|
||||
#define RSREGSETBREAKALLOC(_name) /* No op */
|
||||
#endif /* (!defined(RSREGSETBREAKALLOC)) */
|
||||
|
||||
#ifdef __DINPUT_INCLUDED__
|
||||
/* platform specfic global data */
|
||||
typedef struct
|
||||
{
|
||||
HWND window;
|
||||
HINSTANCE instance;
|
||||
RwBool fullScreen;
|
||||
RwV2d lastMousePos;
|
||||
|
||||
DWORD field_14;
|
||||
|
||||
LPDIRECTINPUT8 dinterface;
|
||||
LPDIRECTINPUTDEVICE8 mouse;
|
||||
LPDIRECTINPUTDEVICE8 joy1;
|
||||
LPDIRECTINPUTDEVICE8 joy2;
|
||||
}
|
||||
psGlobalType;
|
||||
|
||||
#define PSGLOBAL(var) (((psGlobalType *)(RsGlobal.ps))->var)
|
||||
|
||||
enum eJoypads
|
||||
{
|
||||
JOYSTICK1 = 0,
|
||||
JOYSTICK2,
|
||||
MAX_JOYSTICKS
|
||||
};
|
||||
|
||||
enum eJoypadState
|
||||
{
|
||||
JOYPAD_UNUSED,
|
||||
JOYPAD_ATTACHED,
|
||||
};
|
||||
|
||||
struct tJoy
|
||||
{
|
||||
eJoypadState m_State;
|
||||
bool m_bInitialised;
|
||||
bool m_bHasAxisZ;
|
||||
bool m_bHasAxisR;
|
||||
int m_nVendorID;
|
||||
int m_nProductID;
|
||||
};
|
||||
|
||||
class CJoySticks
|
||||
{
|
||||
public:
|
||||
tJoy m_aJoys[MAX_JOYSTICKS];
|
||||
|
||||
CJoySticks();
|
||||
void ClearJoyInfo(int joyID);
|
||||
};
|
||||
|
||||
extern CJoySticks AllValidWinJoys;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#ifdef __DINPUT_INCLUDED__
|
||||
HRESULT _InputInitialise();
|
||||
HRESULT CapturePad(RwInt32 padID);
|
||||
void _InputAddJoyStick(LPDIRECTINPUTDEVICE8 lpDevice, INT num);
|
||||
HRESULT _InputAddJoys();
|
||||
HRESULT _InputGetMouseState(DIMOUSESTATE2 *state);
|
||||
void _InputShutdown();
|
||||
BOOL CALLBACK _InputEnumDevicesCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext );
|
||||
BOOL _InputTranslateKey(RsKeyCodes *rs, UINT flag, UINT key);
|
||||
BOOL _InputTranslateShiftKey(RsKeyCodes *rs, UINT key, BOOLEAN bDown);
|
||||
BOOL _InputIsExtended(INT flag);
|
||||
#endif
|
||||
|
||||
void CenterVideo(void);
|
||||
void CloseClip(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* (!defined(_PLATFORM_WIN_H)) */
|
||||
47
src/skel/win/win.rc
Normal file
47
src/skel/win/win.rc
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
#include "resource.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
//#if !defined(__GNU_C__)
|
||||
//#include "afxres.h"
|
||||
//#else
|
||||
#include "winresrc.h"
|
||||
//#endif /* !defined(__GNU_C__) */
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 90
|
||||
STYLE DS_MODALFRAME | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_CAPTION |
|
||||
WS_SYSMENU
|
||||
CAPTION "Device Selection"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
COMBOBOX IDC_DEVICESEL,7,25,172,33,CBS_DROPDOWNLIST | WS_VSCROLL |
|
||||
WS_TABSTOP
|
||||
COMBOBOX IDC_VIDMODE,7,46,172,74,CBS_DROPDOWNLIST | WS_VSCROLL |
|
||||
WS_TABSTOP
|
||||
DEFPUSHBUTTON "EXIT",IDEXIT,103,69,52,14
|
||||
DEFPUSHBUTTON "OK",IDOK,28,69,50,14
|
||||
LTEXT "Please select the Device To Use:",IDC_SELECTDEVICE,7,7,
|
||||
137,8
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_MAIN_ICON ICON DISCARDABLE "gta3.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
Loading…
Add table
Add a link
Reference in a new issue