Refactored the code in Tiles.cpp.

Removed the font check in create_message_window script function.
This commit is contained in:
NovaRain
2019-05-11 10:04:47 +08:00
parent 1891612f38
commit f7fa62a078
4 changed files with 72 additions and 79 deletions
@@ -10,6 +10,12 @@
#define OBJ_TYPE_MISC (5) #define OBJ_TYPE_MISC (5)
#define OBJ_TYPE_SPATIAL (6) #define OBJ_TYPE_SPATIAL (6)
#define ART_TYPE_INTERFACE (6)
#define ART_TYPE_INVENT (7)
#define ART_TYPE_HEADS (8)
#define ART_TYPE_BACKGRND (9)
#define ART_TYPE_SKILLDEX (10)
#define WEAPON_TYPE_NONE (0) #define WEAPON_TYPE_NONE (0)
#define WEAPON_TYPE_UNARMED (1) #define WEAPON_TYPE_UNARMED (1)
#define WEAPON_TYPE_MELEE (2) #define WEAPON_TYPE_MELEE (2)
+2 -2
View File
@@ -934,8 +934,8 @@ void __stdcall DialogOut(const char* text) {
push eax; // DisplayMsg push eax; // DisplayMsg
mov al, byte ptr ds:[0x6AB718]; mov al, byte ptr ds:[0x6AB718];
push eax; // ColorIndex push eax; // ColorIndex
push 0x74; // y push 116; // y
mov ecx, 0xC0; // x mov ecx, 192; // x
mov eax, text; // DisplayText mov eax, text; // DisplayText
xor ebx, ebx; // ? xor ebx, ebx; // ?
xor edx, edx; // ? xor edx, edx; // ?
+5 -5
View File
@@ -198,9 +198,9 @@ static void __declspec(naked) resume_game() {
static void __declspec(naked) create_message_window() { static void __declspec(naked) create_message_window() {
__asm { __asm {
pushad pushad
mov ebx, dword ptr ds:[_curr_font_num]; //mov ebx, dword ptr ds:[_curr_font_num];
cmp ebx, 0x65; //cmp ebx, 0x65;
je end; //je end;
mov ecx, eax; mov ecx, eax;
call interpretPopShort_; call interpretPopShort_;
@@ -224,8 +224,8 @@ next:
push eax; // a9 push eax; // a9
push 0; // *DisplayText push 0; // *DisplayText
push eax; // ColorIndex push eax; // ColorIndex
push 0x74; // y push 116; // y
mov ecx, 0xC0; // x mov ecx, 192; // x
mov eax, esi; // text mov eax, esi; // text
xor ebx, ebx; // ? xor ebx, ebx; // ?
xor edx, edx; // ? xor edx, edx; // ?
+59 -72
View File
@@ -24,36 +24,8 @@
#include "FileSystem.h" #include "FileSystem.h"
#include "Tiles.h" #include "Tiles.h"
struct sArt { typedef int (_stdcall *functype)();
long flags; static const functype art_init = (functype)art_init_;
char path[16];
char* names;
long d18;
long total;
sArt(char* str) {
flags = 0;
strncpy_s(path, str, 16);
names = 0;
d18 = 0;
total = 0;
}
};
struct OverrideEntry {
//DWORD id;
DWORD xtiles;
DWORD ytiles;
DWORD replacementid;
OverrideEntry(DWORD _xtiles, DWORD _ytiles, DWORD _repid) {
xtiles = _xtiles;
ytiles = _ytiles;
replacementid = _repid;
}
};
static OverrideEntry** overrides;
static DWORD origTileCount = 0;
static const DWORD Tiles_0E[] = { static const DWORD Tiles_0E[] = {
0x484255, 0x48429D, 0x484377, 0x484385, 0x48A897, 0x48A89A, 0x4B2231, 0x484255, 0x48429D, 0x484377, 0x484385, 0x48A897, 0x48A89A, 0x4B2231,
@@ -76,6 +48,41 @@ static const DWORD Tiles_C0[] = {
0x4B247B, 0x4B2A77, 0x4B2BD5, 0x4B247B, 0x4B2A77, 0x4B2BD5,
}; };
struct sArt {
long flags;
char path[16];
char* names;
long d18;
long total;
sArt(char* str) {
flags = 0;
strncpy_s(path, str, 16);
names = 0;
d18 = 0;
total = 0;
}
};
struct tilestruct {
short tile[2];
};
struct OverrideEntry {
DWORD xtiles;
DWORD ytiles;
DWORD replacementid;
OverrideEntry(DWORD _xtiles, DWORD _ytiles, DWORD _repid)
: xtiles(_xtiles), ytiles(_ytiles), replacementid(_repid) {
}
};
static OverrideEntry** overrides;
static DWORD origTileCount = 0;
static DWORD tileMode;
static BYTE* mask;
static DWORD db_fopen(const char* path, const char* mode) { static DWORD db_fopen(const char* path, const char* mode) {
DWORD result; DWORD result;
__asm { __asm {
@@ -154,24 +161,20 @@ static void* mem_realloc(void* lpmem, DWORD msize) {
return result; return result;
} }
typedef int (_stdcall *functype)();
static const functype _art_init = (functype)art_init_;
static BYTE* mask;
static void CreateMask() { static void CreateMask() {
mask = new BYTE[80*36]; mask = new BYTE[80 * 36];
DWORD file = db_fopen("art\\tiles\\grid000.frm", "r"); DWORD file = db_fopen("art\\tiles\\grid000.frm", "r");
db_fseek(file, 0x4a); db_fseek(file, 0x4A);
db_freadByteCount(file, mask, 80*36); db_freadByteCount(file, mask, 80 * 36);
db_fclose(file); db_fclose(file);
} }
static WORD ByteSwapW(WORD w) { static WORD ByteSwapW(WORD w) {
return ((w & 0xff) << 8) | ((w & 0xff00) >> 8); return ((w & 0xFF) << 8) | ((w & 0xFF00) >> 8);
} }
static DWORD ByteSwapD(DWORD w) { static DWORD ByteSwapD(DWORD w) {
return ((w & 0xff) << 24) | ((w & 0xff00) << 8) | ((w & 0xff0000) >> 8) | ((w & 0xff000000) >> 24); return ((w & 0xFF) << 24) | ((w & 0xFF00) << 8) | ((w & 0xFF0000) >> 8) | ((w & 0xFF000000) >> 24);
} }
static int ProcessTile(sArt* tiles, int tile, int listpos) { static int ProcessTile(sArt* tiles, int tile, int listpos) {
@@ -182,7 +185,7 @@ static int ProcessTile(sArt* tiles, int tile, int listpos) {
DWORD art = db_fopen(buf, "r"); DWORD art = db_fopen(buf, "r");
if (!art) return 0; if (!art) return 0;
db_fseek(art, 0x3e); db_fseek(art, 0x3E);
int width = db_freadShort(art); //80; int width = db_freadShort(art); //80;
if (width == 80) { if (width == 80) {
db_fclose(art); db_fclose(art);
@@ -231,11 +234,8 @@ static int ProcessTile(sArt* tiles, int tile, int listpos) {
return xsize * ysize; return xsize * ysize;
} }
static DWORD tileMode; static int _stdcall ArtInitHook() {
static int _stdcall ArtInitHook2() { if (art_init()) return -1;
if (_art_init()) {
return 1;
}
CreateMask(); CreateMask();
@@ -272,27 +272,18 @@ static int _stdcall ArtInitHook2() {
return 0; return 0;
} }
static void __declspec(naked) ArtInitHook() { static void __declspec(naked) iso_init_hook() {
__asm { __asm {
pushad; mov ebx, dword ptr ds:[_read_callback];
mov eax, dword ptr ds:[_read_callback]; xor eax, eax;
push eax; mov dword ptr ds:[_read_callback], eax;
xor eax, eax; call ArtInitHook;
mov dword ptr ds:[_read_callback], eax; mov dword ptr ds:[_read_callback], ebx;
call ArtInitHook2;
pop eax;
mov dword ptr ds:[_read_callback], eax;
popad;
xor eax, eax;
retn; retn;
} }
} }
struct tilestruct { static void __fastcall SquareLoadCheck(tilestruct* data) {
short tile[2];
};
static void _stdcall SquareLoadCheck(tilestruct* data) {
for (DWORD y = 0; y < 100; y++) { for (DWORD y = 0; y < 100; y++) {
for (DWORD x = 0; x < 100; x++) { for (DWORD x = 0; x < 100; x++) {
for (DWORD z = 0; z < 2; z++) { for (DWORD z = 0; z < 2; z++) {
@@ -312,16 +303,13 @@ static void _stdcall SquareLoadCheck(tilestruct* data) {
} }
} }
static void __declspec(naked) SquareLoadHook() { static void __declspec(naked) square_load_hook() {
__asm { __asm {
mov edi, edx; mov ecx, edx;
call db_freadIntCount_; call db_freadIntCount_;
test eax, eax; test eax, eax;
jnz end; jnz end;
pushad; jmp SquareLoadCheck;
push edi;
call SquareLoadCheck;
popad;
end: end:
retn; retn;
} }
@@ -356,11 +344,10 @@ end:
} }
void TilesInit() { void TilesInit() {
tileMode = GetPrivateProfileIntA("Misc", "AllowLargeTiles", 0, ini); if (tileMode = GetPrivateProfileIntA("Misc", "AllowLargeTiles", 0, ini)) {
if (tileMode) {
dlog("Applying allow large tiles patch.", DL_INIT); dlog("Applying allow large tiles patch.", DL_INIT);
HookCall(0x481D72, &ArtInitHook); HookCall(0x481D72, iso_init_hook);
HookCall(0x48434C, SquareLoadHook); HookCall(0x48434C, square_load_hook);
dlogr(" Done", DL_INIT); dlogr(" Done", DL_INIT);
} }