mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-27 08:45:00 +01:00
change track loading to use stdio (FILE)
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
#include "peep/staff.h"
|
||||
#include "ride/ride.h"
|
||||
#include "util/sawyercoding.h"
|
||||
#include "util/util.h"
|
||||
#include "world/banner.h"
|
||||
#include "world/map.h"
|
||||
#include "world/park.h"
|
||||
@@ -247,12 +248,8 @@ static int editor_load_landscape_from_sv4(const char *path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get length
|
||||
fseek(fp, 0, SEEK_END);
|
||||
fpLength = ftell(fp);
|
||||
rewind(fp);
|
||||
|
||||
// Read whole file into a buffer
|
||||
fpLength = fsize(fp);
|
||||
fpBuffer = malloc(fpLength);
|
||||
fread(fpBuffer, fpLength, 1, fp);
|
||||
fclose(fp);
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include <windows.h>
|
||||
#include "../addresses.h"
|
||||
#include "../platform/osinterface.h"
|
||||
#include "../util/sawyercoding.h"
|
||||
#include "../util/util.h"
|
||||
#include "ride.h"
|
||||
#include "track.h"
|
||||
|
||||
@@ -229,26 +229,10 @@ void track_load_list(ride_list_item item)
|
||||
RCT2_CALLPROC_X(0x006CED50, 0, 0, 0, *((uint16*)&item), 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00676EBA
|
||||
*/
|
||||
static uint8 sub_676EBA()
|
||||
static void read(void *dst, void **src, int length)
|
||||
{
|
||||
int eax, ebx, ecx, edx, esi, edi, ebp;
|
||||
RCT2_CALLFUNC_X(0x00676EBA, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
|
||||
return eax & 0xFF;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00676EAF
|
||||
*/
|
||||
static void sub_676EAF(uint8 *esi, int ecx)
|
||||
{
|
||||
do {
|
||||
*esi++ = sub_676EBA();
|
||||
} while (--ecx != 0);
|
||||
memcpy(dst, *src, length);
|
||||
*((char**)src) += length;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -258,10 +242,11 @@ static void sub_676EAF(uint8 *esi, int ecx)
|
||||
*/
|
||||
int sub_67726A(const char *path)
|
||||
{
|
||||
HANDLE *hFile;
|
||||
FILE *fp;
|
||||
long fpLength;
|
||||
const char *ch;
|
||||
char trackFilename[MAX_PATH], *dst;
|
||||
int i;
|
||||
char trackFilename[MAX_PATH], *fpBuffer, *decoded, *src, *dst;
|
||||
int i, decodedLength;
|
||||
uint8* edi;
|
||||
|
||||
RCT2_GLOBAL(0x009AAC54, uint8) = 1;
|
||||
@@ -275,30 +260,41 @@ int sub_67726A(const char *path)
|
||||
}
|
||||
*dst = 0;
|
||||
|
||||
hFile = osinterface_file_open(path);
|
||||
if (hFile == INVALID_HANDLE_VALUE)
|
||||
fp = fopen(path, "rb");
|
||||
if (fp == NULL)
|
||||
return 0;
|
||||
|
||||
RCT2_GLOBAL(0x009E382C, HANDLE) = hFile;
|
||||
if (!RCT2_CALLPROC_X(0x006770C1, 0, 0, 0, 0, 0, 0, 0)) {
|
||||
CloseHandle(hFile);
|
||||
return 0;
|
||||
}
|
||||
// Read whole file into a buffer
|
||||
fpLength = fsize(fp);
|
||||
fpBuffer = malloc(fpLength);
|
||||
fread(fpBuffer, fpLength, 1, fp);
|
||||
fclose(fp);
|
||||
|
||||
RCT2_CALLPROC_EBPSAFE(0x00676E7A);
|
||||
// Validate the checksum
|
||||
// Not the same checksum algorithm as scenarios and saved games
|
||||
// sub_6770C1();
|
||||
|
||||
// Decode the track data
|
||||
decoded = malloc(0x10000);
|
||||
decodedLength = sawyercoding_decode_td6(fpBuffer, decoded, fpLength);
|
||||
realloc(decoded, decodedLength);
|
||||
free(fpBuffer);
|
||||
|
||||
// Read decoded data
|
||||
src = decoded;
|
||||
memset((void*)0x009D81D8, 0, 67);
|
||||
sub_676EAF((void*)0x009D8178, 32);
|
||||
read((void*)0x009D8178, &src, 32);
|
||||
|
||||
uint8 al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al >= 2)
|
||||
sub_676EAF((void*)0x009D8198, 40);
|
||||
read((void*)0x009D8198, &src, 40);
|
||||
|
||||
sub_676EAF((void*)0x009D81C0, 24);
|
||||
read((void*)0x009D81C0, &src, 24);
|
||||
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al != 0)
|
||||
sub_676EAF((void*)0x009D81D8, al == 1 ? 140 : 67);
|
||||
read((void*)0x009D81D8, &src, al == 1 ? 140 : 67);
|
||||
|
||||
sub_676EAF((void*)0x009D821B, 24572);
|
||||
read((void*)0x009D821B, &src, 24572);
|
||||
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al < 2) {
|
||||
if (RCT2_GLOBAL(0x009D8178, uint8) == 20) {
|
||||
@@ -317,9 +313,9 @@ int sub_67726A(const char *path)
|
||||
memset(edi, 255, (uint8*)0x009DE217 - edi);
|
||||
}
|
||||
}
|
||||
free(decoded);
|
||||
|
||||
CloseHandle(hFile);
|
||||
|
||||
//
|
||||
al = RCT2_GLOBAL(0x009D817F, uint8) >> 2;
|
||||
if (al > 2)
|
||||
return 0;
|
||||
|
||||
@@ -345,4 +345,9 @@ int sawyercoding_encode_sv4(char *src, char *dst, int length)
|
||||
*((uint32*)&dst[encodedLength]) = checksum;
|
||||
|
||||
return encodedLength + 4;
|
||||
}
|
||||
|
||||
int sawyercoding_decode_td6(char *src, char *dst, int length)
|
||||
{
|
||||
return decode_chunk_rle(src, dst, length - 4);
|
||||
}
|
||||
@@ -43,5 +43,6 @@ int sawyercoding_write_chunk_buffer(uint8 *dst_file, uint8* buffer, sawyercoding
|
||||
int sawyercoding_decode_sv4(char *src, char *dst, int length);
|
||||
int sawyercoding_decode_sc4(char *src, char *dst, int length);
|
||||
int sawyercoding_encode_sv4(char *src, char *dst, int length);
|
||||
int sawyercoding_decode_td6(char *src, char *dst, int length);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -39,4 +39,16 @@ int mph_to_kmph(int mph)
|
||||
// 1 mph = 1.60934 kmph
|
||||
// RCT2 approximates as 1.609375
|
||||
return (mph * 1648) / 1024;
|
||||
}
|
||||
|
||||
long fsize(FILE *fp)
|
||||
{
|
||||
long originalPosition, size;
|
||||
|
||||
originalPosition = ftell(fp);
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size = ftell(fp);
|
||||
fseek(fp, originalPosition, SEEK_SET);
|
||||
|
||||
return size;
|
||||
}
|
||||
@@ -21,8 +21,12 @@
|
||||
#ifndef _UTIL_H_
|
||||
#define _UTIL_H_
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
int squaredmetres_to_squaredfeet(int squaredMetres);
|
||||
int metres_to_feet(int metres);
|
||||
int mph_to_kmph(int mph);
|
||||
|
||||
long fsize(FILE *fp);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user