mirror of
https://github.com/lindbergh-loader/lindbergh-loader.git
synced 2026-09-22 22:48:03 +03:00
Merge pull request #88 from dkeruza-neo/master
Resolution patches for 2Spicy and HOD-Ex
This commit is contained in:
@@ -22,7 +22,6 @@ sdk-extensions:
|
||||
|
||||
finish-args:
|
||||
- --env=LD_LIBRARY_PATH=/app/lib32:$LD_LIBRARY_PATH
|
||||
- --env=LDFLAGS="-L/app/lib32"
|
||||
- --env=PATH=/app/bin:/usr/bin
|
||||
- --allow=multiarch
|
||||
- --share=ipc
|
||||
|
||||
+183
-182
@@ -29,10 +29,10 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t srcAddress;
|
||||
uint32_t srcSize;
|
||||
uint32_t destAddress;
|
||||
uint32_t destSize;
|
||||
uint32_t srcAddress;
|
||||
uint32_t srcSize;
|
||||
uint32_t destAddress;
|
||||
uint32_t destSize;
|
||||
} BaseboardCommand;
|
||||
|
||||
BaseboardCommand jvsCommand = {0};
|
||||
@@ -40,16 +40,16 @@ BaseboardCommand serialCommand = {0};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t *data;
|
||||
uint32_t offset;
|
||||
uint32_t size;
|
||||
uint32_t *data;
|
||||
uint32_t offset;
|
||||
uint32_t size;
|
||||
} readData_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t offset;
|
||||
uint32_t *data;
|
||||
uint32_t size;
|
||||
uint32_t offset;
|
||||
uint32_t *data;
|
||||
uint32_t size;
|
||||
} writeData_t;
|
||||
|
||||
FILE *sram = NULL;
|
||||
@@ -63,224 +63,225 @@ int jvsPacketSize = -1;
|
||||
|
||||
int initBaseboard()
|
||||
{
|
||||
char *sramPath = getConfig()->sramPath;
|
||||
char *sramPath = getConfig()->sramPath;
|
||||
|
||||
sram = fopen(sramPath, "a");
|
||||
sram = fopen(sramPath, "a");
|
||||
|
||||
// Create file if it doesn't exist
|
||||
if (sram == NULL)
|
||||
{
|
||||
printf("Error: Cannot open %s\n", sramPath);
|
||||
return 1;
|
||||
}
|
||||
fclose(sram);
|
||||
sram = fopen(sramPath, "rb+");
|
||||
fseek(sram, 0, SEEK_SET);
|
||||
|
||||
if (getConfig()->emulateJVS == 0 && strcmp(getConfig()->jvsPath, "none") != 0)
|
||||
{
|
||||
jvsFileDescriptor = openJVSSerial(getConfig()->jvsPath);
|
||||
if (jvsFileDescriptor < 0)
|
||||
// Create file if it doesn't exist
|
||||
if (sram == NULL)
|
||||
{
|
||||
printf("Error: Failed to open %s for JVS\n", getConfig()->jvsPath);
|
||||
return -1;
|
||||
printf("Error: Cannot open %s\n", sramPath);
|
||||
return 1;
|
||||
}
|
||||
fclose(sram);
|
||||
sram = fopen(sramPath, "rb+");
|
||||
fseek(sram, 0, SEEK_SET);
|
||||
|
||||
if (getConfig()->emulateJVS == 0 && strcmp(getConfig()->jvsPath, "none") != 0)
|
||||
{
|
||||
jvsFileDescriptor = openJVSSerial(getConfig()->jvsPath);
|
||||
if (jvsFileDescriptor < 0)
|
||||
{
|
||||
printf("Error: Failed to open %s for JVS\n", getConfig()->jvsPath);
|
||||
return -1;
|
||||
}
|
||||
|
||||
initJVSSerial(jvsFileDescriptor);
|
||||
startJVSFrameThread(&jvsFileDescriptor);
|
||||
}
|
||||
|
||||
initJVSSerial(jvsFileDescriptor);
|
||||
startJVSFrameThread(&jvsFileDescriptor);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t baseboardRead(int fd, void *buf, size_t count)
|
||||
{
|
||||
memcpy(buf, &sharedMemory[sharedMemoryIndex], count);
|
||||
return count;
|
||||
memcpy(buf, &sharedMemory[sharedMemoryIndex], count);
|
||||
return count;
|
||||
}
|
||||
|
||||
ssize_t baseboardWrite(int fd, const void *buf, size_t count)
|
||||
{
|
||||
memcpy(&sharedMemory[sharedMemoryIndex], buf, count);
|
||||
return count;
|
||||
memcpy(&sharedMemory[sharedMemoryIndex], buf, count);
|
||||
return count;
|
||||
}
|
||||
|
||||
int baseboardSelect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict timeout)
|
||||
int baseboardSelect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds,
|
||||
struct timeval *restrict timeout)
|
||||
{
|
||||
return selectReply;
|
||||
return selectReply;
|
||||
}
|
||||
|
||||
int baseboardIoctl(int fd, unsigned int request, void *data)
|
||||
{
|
||||
switch (request)
|
||||
{
|
||||
|
||||
case BASEBOARD_GET_VERSION:
|
||||
{
|
||||
uint8_t versionData[4] = {0x00, 0x19, 0x20, 0x07};
|
||||
memcpy(data, versionData, 4);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_INIT:
|
||||
{
|
||||
// selectReply = -1; Considering adding this in
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_READY: // Not sure if this is what it should be called
|
||||
{
|
||||
selectReply = 0;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_SEEK_SHM:
|
||||
{
|
||||
sharedMemoryIndex = (unsigned int)data;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_READ_SRAM:
|
||||
{
|
||||
readData_t *_data = data;
|
||||
fseek(sram, _data->offset, SEEK_SET);
|
||||
fread(_data->data, 1, _data->size, sram);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_WRITE_SRAM:
|
||||
{
|
||||
writeData_t *_data = data;
|
||||
fseek(sram, _data->offset, SEEK_SET);
|
||||
fwrite(_data->data, 1, _data->size, sram);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_REQUEST:
|
||||
{
|
||||
uint32_t *_data = data;
|
||||
|
||||
switch (_data[0])
|
||||
switch (request)
|
||||
{
|
||||
|
||||
case BASEBOARD_GET_SERIAL: // bcCmdSysInfoGetReq
|
||||
case BASEBOARD_GET_VERSION:
|
||||
{
|
||||
serialCommand.destAddress = _data[1];
|
||||
serialCommand.destSize = _data[2];
|
||||
uint8_t versionData[4] = {0x00, 0x19, 0x20, 0x07};
|
||||
memcpy(data, versionData, 4);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_WRITE_FLASH: // bcCmdSysFlashWrite
|
||||
case BASEBOARD_INIT:
|
||||
{
|
||||
log_warn("The game attempted to write to the baseboard flash\n");
|
||||
// selectReply = -1; Considering adding this in
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_PROCESS_JVS:
|
||||
case BASEBOARD_READY: // Not sure if this is what it should be called
|
||||
{
|
||||
jvsCommand.srcAddress = _data[1];
|
||||
jvsCommand.srcSize = _data[2];
|
||||
jvsCommand.destAddress = _data[3];
|
||||
jvsCommand.destSize = _data[4];
|
||||
memcpy(inputBuffer, &sharedMemory[jvsCommand.srcAddress], jvsCommand.srcSize);
|
||||
selectReply = 0;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
if (getConfig()->emulateJVS)
|
||||
{
|
||||
processPacket(&jvsPacketSize);
|
||||
}
|
||||
else if (jvsFileDescriptor >= 0)
|
||||
{
|
||||
for (int i = 0; i < jvsCommand.srcSize; i++)
|
||||
case BASEBOARD_SEEK_SHM:
|
||||
{
|
||||
sharedMemoryIndex = (unsigned int)data;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_READ_SRAM:
|
||||
{
|
||||
readData_t *_data = data;
|
||||
fseek(sram, _data->offset, SEEK_SET);
|
||||
fread(_data->data, 1, _data->size, sram);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_WRITE_SRAM:
|
||||
{
|
||||
writeData_t *_data = data;
|
||||
fseek(sram, _data->offset, SEEK_SET);
|
||||
fwrite(_data->data, 1, _data->size, sram);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_REQUEST:
|
||||
{
|
||||
uint32_t *_data = data;
|
||||
|
||||
switch (_data[0])
|
||||
{
|
||||
write(jvsFileDescriptor, &inputBuffer[i], 1);
|
||||
if (inputBuffer[i] == 0xF0)
|
||||
{
|
||||
setSenseLine(3);
|
||||
}
|
||||
else if (inputBuffer[i] == 0xF1)
|
||||
{
|
||||
setSenseLine(1);
|
||||
}
|
||||
|
||||
case BASEBOARD_GET_SERIAL: // bcCmdSysInfoGetReq
|
||||
{
|
||||
serialCommand.destAddress = _data[1];
|
||||
serialCommand.destSize = _data[2];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_WRITE_FLASH: // bcCmdSysFlashWrite
|
||||
{
|
||||
log_warn("The game attempted to write to the baseboard flash\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_PROCESS_JVS:
|
||||
{
|
||||
jvsCommand.srcAddress = _data[1];
|
||||
jvsCommand.srcSize = _data[2];
|
||||
jvsCommand.destAddress = _data[3];
|
||||
jvsCommand.destSize = _data[4];
|
||||
memcpy(inputBuffer, &sharedMemory[jvsCommand.srcAddress], jvsCommand.srcSize);
|
||||
|
||||
if (getConfig()->emulateJVS)
|
||||
{
|
||||
processPacket(&jvsPacketSize);
|
||||
}
|
||||
else if (jvsFileDescriptor >= 0)
|
||||
{
|
||||
for (int i = 0; i < jvsCommand.srcSize; i++)
|
||||
{
|
||||
write(jvsFileDescriptor, &inputBuffer[i], 1);
|
||||
if (inputBuffer[i] == 0xF0)
|
||||
{
|
||||
setSenseLine(3);
|
||||
}
|
||||
else if (inputBuffer[i] == 0xF1)
|
||||
{
|
||||
setSenseLine(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_GET_SENSE_LINE:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Error: Unknown baseboard command %X\n", _data[0]);
|
||||
}
|
||||
|
||||
// Acknowledge the command
|
||||
_data[0] |= 0xF0000000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_GET_SENSE_LINE:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Error: Unknown baseboard command %X\n", _data[0]);
|
||||
}
|
||||
|
||||
// Acknowledge the command
|
||||
_data[0] |= 0xF0000000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_RECEIVE:
|
||||
{
|
||||
uint32_t *_data = data;
|
||||
|
||||
switch (_data[0] & 0xFFF)
|
||||
case BASEBOARD_RECEIVE:
|
||||
{
|
||||
uint32_t *_data = data;
|
||||
|
||||
case BASEBOARD_GET_SERIAL:
|
||||
{
|
||||
memcpy(&sharedMemory[serialCommand.destAddress + 96], SERIAL_STRING, strlen(SERIAL_STRING));
|
||||
_data[1] = 1; // Set the status to success
|
||||
}
|
||||
break;
|
||||
switch (_data[0] & 0xFFF)
|
||||
{
|
||||
|
||||
case BASEBOARD_GET_SENSE_LINE:
|
||||
{
|
||||
_data[2] = getSenseLine();
|
||||
_data[1] = 1; // Set the status to success
|
||||
}
|
||||
break;
|
||||
case BASEBOARD_GET_SERIAL:
|
||||
{
|
||||
memcpy(&sharedMemory[serialCommand.destAddress + 96], SERIAL_STRING, strlen(SERIAL_STRING));
|
||||
_data[1] = 1; // Set the status to success
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_PROCESS_JVS:
|
||||
{
|
||||
if (getConfig()->emulateJVS)
|
||||
{
|
||||
memcpy(&sharedMemory[jvsCommand.destAddress], outputBuffer, jvsPacketSize);
|
||||
_data[2] = jvsCommand.destAddress;
|
||||
_data[3] = jvsPacketSize;
|
||||
_data[1] = 1; // Set the status to success
|
||||
}
|
||||
else if (jvsFileDescriptor >= 0)
|
||||
{
|
||||
JVSFrame frame = readJVSFrameFromThread();
|
||||
memcpy(&sharedMemory[jvsCommand.destAddress], frame.buffer, frame.size);
|
||||
_data[2] = jvsCommand.destAddress;
|
||||
_data[3] = frame.size;
|
||||
_data[1] = frame.ready;
|
||||
}
|
||||
case BASEBOARD_GET_SENSE_LINE:
|
||||
{
|
||||
_data[2] = getSenseLine();
|
||||
_data[1] = 1; // Set the status to success
|
||||
}
|
||||
break;
|
||||
|
||||
case BASEBOARD_PROCESS_JVS:
|
||||
{
|
||||
if (getConfig()->emulateJVS)
|
||||
{
|
||||
memcpy(&sharedMemory[jvsCommand.destAddress], outputBuffer, jvsPacketSize);
|
||||
_data[2] = jvsCommand.destAddress;
|
||||
_data[3] = jvsPacketSize;
|
||||
_data[1] = 1; // Set the status to success
|
||||
}
|
||||
else if (jvsFileDescriptor >= 0)
|
||||
{
|
||||
JVSFrame frame = readJVSFrameFromThread();
|
||||
memcpy(&sharedMemory[jvsCommand.destAddress], frame.buffer, frame.size);
|
||||
_data[2] = jvsCommand.destAddress;
|
||||
_data[3] = frame.size;
|
||||
_data[1] = frame.ready;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Error: Unknown baseboard receive command %X\n", _data[0] & 0xFFF);
|
||||
}
|
||||
|
||||
// Acknowledge the command
|
||||
_data[0] |= 0xF0000000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Error: Unknown baseboard receive command %X\n", _data[0] & 0xFFF);
|
||||
printf("Error: Unknown baseboard ioctl %X\n", request);
|
||||
}
|
||||
|
||||
// Acknowledge the command
|
||||
_data[0] |= 0xF0000000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Error: Unknown baseboard ioctl %X\n", request);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -76,10 +76,7 @@ int initCardReader()
|
||||
|
||||
int carReaderGetFdIdx(int fd)
|
||||
{
|
||||
if (fd == serialFD[0].fd)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
return (fd == serialFD[0].fd) ? 0 : 1;
|
||||
}
|
||||
|
||||
uint8_t cardReaderGenChecksum(int fdIdx)
|
||||
|
||||
@@ -174,6 +174,8 @@ static int detectGame(uint32_t elf_crc)
|
||||
config.gameStatus = WORKING;
|
||||
config.jvsIOType = SEGA_TYPE_1;
|
||||
config.gameType = ABC;
|
||||
config.width = 640;
|
||||
config.height = 480;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -188,6 +190,8 @@ static int detectGame(uint32_t elf_crc)
|
||||
config.gameStatus = WORKING;
|
||||
config.jvsIOType = SEGA_TYPE_1;
|
||||
config.gameType = ABC;
|
||||
config.width = 640;
|
||||
config.height = 480;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -249,6 +253,8 @@ static int detectGame(uint32_t elf_crc)
|
||||
config.gameNativeResolutions = "";
|
||||
config.gameType = DRIVING;
|
||||
config.gameStatus = WORKING;
|
||||
config.width = 1280;
|
||||
config.height = 768;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -262,6 +268,8 @@ static int detectGame(uint32_t elf_crc)
|
||||
config.gameNativeResolutions = "1280x768";
|
||||
config.gameType = DRIVING;
|
||||
config.gameStatus = WORKING;
|
||||
config.width = 1280;
|
||||
config.height = 768;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -275,6 +283,8 @@ static int detectGame(uint32_t elf_crc)
|
||||
config.gameNativeResolutions = "";
|
||||
config.gameType = DRIVING;
|
||||
config.gameStatus = WORKING;
|
||||
config.width = 1280;
|
||||
config.height = 768;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// #pragma once
|
||||
|
||||
int loadNewCursor(const char *cursorFileName, void **cursor, int customWidth, int customHeight);
|
||||
void loadCursors();
|
||||
|
||||
+5
-19
@@ -302,6 +302,7 @@ void __attribute__((constructor)) hook_init()
|
||||
}
|
||||
|
||||
getGPUVendor();
|
||||
|
||||
if (initPatch() != 0)
|
||||
exit(1);
|
||||
|
||||
@@ -763,6 +764,7 @@ FILE *fopen(const char *restrict pathname, const char *restrict mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cachedShaderFilesLoaded)
|
||||
{
|
||||
void *addr = __builtin_return_address(0);
|
||||
@@ -1079,17 +1081,11 @@ ssize_t read(int fd, void *buf, size_t count)
|
||||
return driveboardRead(fd, buf, count);
|
||||
}
|
||||
|
||||
if (fd == hooks[SERIAL0] && getConfig()->emulateCardreader)
|
||||
if ((fd == hooks[SERIAL0] || fd == hooks[SERIAL1]) && getConfig()->emulateCardreader)
|
||||
{
|
||||
return cardReaderRead(fd, buf, count);
|
||||
}
|
||||
|
||||
if (fd == hooks[SERIAL1] && getConfig()->emulateCardreader)
|
||||
{
|
||||
return cardReaderRead(fd, buf, count);
|
||||
}
|
||||
|
||||
// If we don't hook the serial just reply with nothing
|
||||
if (fd == hooks[SERIAL0] || fd == hooks[SERIAL1])
|
||||
{
|
||||
if (gId == PRIMEVAL_HUNT && getConfig()->emulateTouchscreen == 1)
|
||||
@@ -1136,11 +1132,6 @@ size_t fread(void *buf, size_t size, size_t count, FILE *stream)
|
||||
return freadReplace(buf, size, count, fileRead[FILE_RW2]);
|
||||
}
|
||||
|
||||
// if (stream == fileHooks[FILE_HARLEY])
|
||||
// {
|
||||
// return harleyFreadReplace(buf, size, count, fileHooks[FILE_HARLEY]);
|
||||
// }
|
||||
|
||||
if (stream == fileHooks[FILE_FONT_ABC])
|
||||
{
|
||||
memcpy(buf, fontABC + fontABCidx, size * count);
|
||||
@@ -1278,12 +1269,7 @@ ssize_t write(int fd, const void *buf, size_t count)
|
||||
return driveboardWrite(fd, buf, count);
|
||||
}
|
||||
|
||||
if (fd == hooks[SERIAL0] && getConfig()->emulateCardreader)
|
||||
{
|
||||
return cardReaderWrite(fd, buf, count);
|
||||
}
|
||||
|
||||
if (fd == hooks[SERIAL1] && getConfig()->emulateCardreader)
|
||||
if ((fd == hooks[SERIAL0] || fd == hooks[SERIAL1]) && getConfig()->emulateCardreader)
|
||||
{
|
||||
return cardReaderWrite(fd, buf, count);
|
||||
}
|
||||
@@ -1685,7 +1671,7 @@ int setenv(const char *name, const char *value, int overwrite)
|
||||
/**
|
||||
* @brief Hook for the getenv function.
|
||||
*
|
||||
* This function iFake the TEA_DIR environment variable to games that require it to run
|
||||
* This function "Fakes" the TEA_DIR environment variable to games that require it to run
|
||||
* @param name The name of the environment variable.
|
||||
*/
|
||||
char *getenv(const char *name)
|
||||
|
||||
@@ -212,8 +212,8 @@ void *readJVSFrameThread(void * arg)
|
||||
* @param fd
|
||||
* @return 0|1
|
||||
*/
|
||||
int startJVSFrameThread(int * fd) {
|
||||
int fdlocal = *((int *) fd);
|
||||
int startJVSFrameThread(int *fd)
|
||||
{
|
||||
printf("SERIAL: starting thread.\n");
|
||||
|
||||
// Clean shared JVS frame buffer
|
||||
@@ -236,17 +236,21 @@ int startJVSFrameThread(int * fd) {
|
||||
* Return a JVSFrame structure with empty or full data, no in between
|
||||
* @return
|
||||
*/
|
||||
JVSFrame readJVSFrameFromThread() {
|
||||
JVSFrame readJVSFrameFromThread()
|
||||
{
|
||||
JVSFrame frame;
|
||||
// Lock while reading/writing to shared frame
|
||||
pthread_mutex_lock(&jvsBuffer_lock);
|
||||
|
||||
// Check if we have a valid frame
|
||||
if (jvsFrameBuffer.ready == 1) {
|
||||
if (jvsFrameBuffer.ready == 1)
|
||||
{
|
||||
frame = jvsFrameBuffer;
|
||||
// It has been red, we disable this frame
|
||||
// It has been read, we disable this frame
|
||||
jvsFrameBuffer.ready = 0;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
frame.ready = 0;
|
||||
frame.size = 0;
|
||||
memset(frame.buffer, 0, JVSBUFFER_SIZE);
|
||||
|
||||
@@ -2136,6 +2136,7 @@ int initPatch()
|
||||
detourFunction(0x084d44fc, amDipswSetLed);
|
||||
detourFunction(0x084d4485, amDipswGetData);
|
||||
patchMemory(0x0804edb2, "9090909090"); //__intel_new_proc_init_P
|
||||
detourFunction(0x08178e6c, stubRetOne); // _ZN7am_ctrl18SetNetworkAddrEth0Ejj.
|
||||
|
||||
detourFunction(0x0804e594, gl_XGetProcAddressARB);
|
||||
srtvElfShaderPatcher();
|
||||
|
||||
+193
-5
@@ -1267,6 +1267,172 @@ void glVertex3fHOD4(GLfloat x, GLfloat y, GLfloat z)
|
||||
_glVertex3f(x, y, z);
|
||||
}
|
||||
|
||||
void tooSpicySC(uint32_t param_1, uint32_t param_2)
|
||||
{
|
||||
myEnableScaling = true;
|
||||
SDL_WarpMouseInWindow(SDLwindow, 1280 / 2, 768 / 2);
|
||||
((void (*)(uint32_t, uint32_t))0x082fa77c)(param_1, param_2);
|
||||
}
|
||||
|
||||
void tooSpicyPR(uint32_t param_1, uint32_t param_2)
|
||||
{
|
||||
myEnableScaling = false;
|
||||
((void (*)(uint32_t, uint32_t))0x081eb4d4)(param_1, param_2);
|
||||
}
|
||||
|
||||
int tooSpicyVsprintf(char *str, const char *format, va_list arg)
|
||||
{
|
||||
int (*_vsprintf)(char *str, const char *format, va_list arg) = dlsym(RTLD_NEXT, "vsprintf");
|
||||
|
||||
int res = _vsprintf(str, format, arg);
|
||||
|
||||
if (strcmp(str, "Additional 475") == 0)
|
||||
{
|
||||
myEnableScaling = false;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void glVertex3f2SP(GLfloat x, GLfloat y, GLfloat z)
|
||||
{
|
||||
int (*_glVertex3f)(GLfloat x, GLfloat y, GLfloat z) = dlsym(RTLD_NEXT, "glVertex3f");
|
||||
|
||||
void *returnAddress = __builtin_return_address(0);
|
||||
|
||||
float scaleX = gWidth / 1280.0f;
|
||||
float scaleY = gHeight / 768.0f;
|
||||
|
||||
float TestX = ((((gWidth - 1280.0) / 2.0) * 1.1116317809) / 1280.0) * (1.5 / scaleX);
|
||||
float TestY = ((((gHeight - 768.0) / 2.0) * 0.666979044) / 768.0) * (1.5 / scaleX);
|
||||
|
||||
float OffsetX = TestX; // test
|
||||
float OffsetY = TestY;
|
||||
|
||||
float scaleZ = fabs(z) / 1.510000;
|
||||
|
||||
float AdjOffsetX = OffsetX * scaleZ;
|
||||
float AdjOffsetY = OffsetY * scaleZ;
|
||||
|
||||
if (z == -3.000000f)
|
||||
{ // videos
|
||||
}
|
||||
else if (z == -1.010000f)
|
||||
{ // bd main
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z == -1.510000f)
|
||||
{ // logo - coin/start - 2D
|
||||
if (curTextureID == 497) // right
|
||||
{
|
||||
x -= OffsetX;
|
||||
y -= OffsetY;
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (curTextureID == 498)
|
||||
{ // deadend
|
||||
}
|
||||
else
|
||||
{
|
||||
x += OffsetX;
|
||||
y -= OffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
}
|
||||
else if (z == -1.460000f)
|
||||
{ // 2D title
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z == -1.490000f)
|
||||
{ // 2D title
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z == -1.500000f)
|
||||
{ // 2D title
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z == -1.310000f)
|
||||
{ // 2D
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z == -1.210000f)
|
||||
{ // 2D
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z == -1.5109999180f)
|
||||
{ // 2D
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z == -1.200000f)
|
||||
{ // target - select
|
||||
|
||||
if (curTextureID == 454 || curTextureID == 461 || curTextureID == 456)
|
||||
{ // 457 X - 454 461 456 O
|
||||
|
||||
if (myEnableScaling)
|
||||
{
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (z == -1.710000f)
|
||||
{ // 2D
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else if (z > -1.85f)
|
||||
{ // 2d
|
||||
x += AdjOffsetX;
|
||||
y -= AdjOffsetY;
|
||||
|
||||
x *= scaleX;
|
||||
y *= scaleY;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
_glVertex3f(x, y, z);
|
||||
}
|
||||
|
||||
void glVertex3fHarley(GLfloat x, GLfloat y, GLfloat z)
|
||||
{
|
||||
int (*_glVertex3f)(GLfloat x, GLfloat y, GLfloat z) = dlsym(RTLD_NEXT, "glVertex3f");
|
||||
@@ -1286,11 +1452,6 @@ void glVertex3fHarley(GLfloat x, GLfloat y, GLfloat z)
|
||||
y *= scaleY;
|
||||
}
|
||||
void *addr = __builtin_return_address(0);
|
||||
// printf("glVertex3f is hooked: x=%f, y=%f, z=%f\n", x, y, z);
|
||||
// printf("z values: %.10f\n", z);
|
||||
|
||||
// if ( z == -3517.2272949219f){ //1360x768
|
||||
// if ( z == -4271.795898f){ //900p
|
||||
if (z == -5300.7529296875)
|
||||
{ // 1080p
|
||||
printf("glVertex3f hooked: x=%f, y=%f, z=%f, addr: %p\n", x, y, z, addr);
|
||||
@@ -2655,6 +2816,23 @@ int initResolutionPatches()
|
||||
{
|
||||
break;
|
||||
}
|
||||
setVariable(0x08785b80, gWidth); // main
|
||||
setVariable(0x08785b84, gHeight);
|
||||
|
||||
patchMemory(0x082a3222, "02");
|
||||
setVariable(0x08785ad8, 1360); // sprite res 1280x768
|
||||
setVariable(0x08785adc, 768);
|
||||
setVariable(0x087859b8, 1360); // sprite res 640x480
|
||||
setVariable(0x087859bc, 768);
|
||||
|
||||
patchMemory(0x081775d2, "b801000000"); // target
|
||||
patchMemory(0x0804e5d2, "909090909090");
|
||||
|
||||
// detourFunction(0x0804d254, glVertex3fHODEX);
|
||||
|
||||
setVariable(0x087aa080, gWidth); // render res
|
||||
patchMemory(0x0804e60c, "909090909090");
|
||||
patchMemory(0x0828cc2f, "909090909090");
|
||||
}
|
||||
break;
|
||||
case TOO_SPICY:
|
||||
@@ -2669,6 +2847,16 @@ int initResolutionPatches()
|
||||
{
|
||||
break;
|
||||
}
|
||||
setVariable(0x08202b22, gWidth); // render res
|
||||
patchMemory(0x08202b19, "74");
|
||||
setVariable(0x08664410, gWidth); // 1280x768
|
||||
setVariable(0x08664414, gHeight);
|
||||
detourFunction(0x0804d0d0, glVertex3f2SP);
|
||||
detourFunction(0x0804dda0, myGlBindTexture);
|
||||
replaceCallAtAddress(0x080d96ff, tooSpicySC);
|
||||
replaceCallAtAddress(0x080da026, tooSpicyPR);
|
||||
detourFunction(0x0804ce10, tooSpicyVsprintf);
|
||||
patchMemory(0x081f96b9, "02"); // 5
|
||||
}
|
||||
break;
|
||||
case TOO_SPICY_TEST:
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#ifndef __i386__
|
||||
#define __i386__
|
||||
|
||||
#include "log.h"
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#undef __x86_64__
|
||||
|
||||
Reference in New Issue
Block a user