Files
devilution/Source/engine.cpp
T
Robin Eklind 8ed5573766 engine: clean up CelDecDatLightEntry and Cel2DecDatLightEntry (#524)
Now, these functions no longer use references. Instead they
use pointer to pointer. Furthermore, they've been simplified
to for loops, as essentially, the decompiled functions were
unrolled loops (as seen in the memset function).
2018-12-30 03:52:50 +01:00

2444 lines
57 KiB
C++

//HEADER_GOES_HERE
#include "../types.h"
static float engine_cpp_init_value = INFINITY;
char gbPixelCol; // automap pixel color 8-bit (palette entry)
int dword_52B970; // BOOLEAN flip - if y < x
int orgseed; // weak
int sgnWidth;
int sglGameSeed; // weak
static CRITICAL_SECTION sgMemCrit;
int SeedCount; // weak
int dword_52B99C; // BOOLEAN valid - if x/y are in bounds
const int rand_increment = 1; // unused
const int rand_multiplier = 0x015A4E35; // unused
void __fastcall CelDrawDatOnly(char *pDecodeTo, char *pRLEBytes, int dwRLESize, int dwRLEWdt)
{
char *v4; // esi
char *v5; // edi
int v6; // edx
unsigned int v7; // eax
unsigned int v8; // ecx
char v9; // cf
unsigned int v10; // ecx
char *v11; // [esp+4h] [ebp-8h]
v11 = pRLEBytes;
if (pDecodeTo && pRLEBytes) {
v4 = pRLEBytes;
v5 = pDecodeTo;
do {
v6 = dwRLEWdt;
do {
while (1) {
v7 = (unsigned char)*v4++;
if ((v7 & 0x80u) == 0)
break;
_LOBYTE(v7) = -(char)v7;
v5 += v7;
v6 -= v7;
if (!v6)
goto LABEL_14;
}
v6 -= v7;
v8 = v7 >> 1;
if (v7 & 1) {
*v5++ = *v4++;
if (!v8)
continue;
}
v9 = v8 & 1;
v10 = v7 >> 2;
if (v9) {
*(_WORD *)v5 = *(_WORD *)v4;
v4 += 2;
v5 += 2;
if (!v10)
continue;
}
qmemcpy(v5, v4, 4 * v10);
v4 += 4 * v10;
v5 += 4 * v10;
} while (v6);
LABEL_14:
v5 += -dwRLEWdt - 768;
} while (&v11[dwRLESize] != v4);
}
}
void __fastcall CelDecodeOnly(int screen_x, int screen_y, void *pCelBuff, int frame, int frame_width)
{
if (gpBuffer) {
if (pCelBuff)
CelDrawDatOnly(
(char *)gpBuffer + screen_y_times_768[screen_y] + screen_x,
(char *)pCelBuff + *((_DWORD *)pCelBuff + frame),
*((_DWORD *)pCelBuff + frame + 1) - *((_DWORD *)pCelBuff + frame),
frame_width);
}
}
void __fastcall CelDecDatOnly(char *pBuff, char *pCelBuff, int frame, int frame_width)
{
if (pCelBuff) {
if (pBuff)
CelDrawDatOnly(
pBuff,
&pCelBuff[*(_DWORD *)&pCelBuff[4 * frame]],
*(_DWORD *)&pCelBuff[4 * frame + 4] - *(_DWORD *)&pCelBuff[4 * frame],
frame_width);
}
}
void __fastcall CelDrawHdrOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction)
{
int v7; // edx
char *v8; // eax
int v9; // edi
int v10; // ecx
int v11; // [esp+Ch] [ebp-8h]
int v12; // [esp+10h] [ebp-4h]
v12 = screen_y;
v11 = screen_x;
if (gpBuffer) {
if (pCelBuff) {
v7 = *(_DWORD *)&pCelBuff[4 * frame];
v8 = &pCelBuff[v7];
v9 = *(unsigned short *)&pCelBuff[v7 + always_0];
if (*(_WORD *)&pCelBuff[v7 + always_0]) {
if (direction != 8 && *(_WORD *)&v8[direction])
v10 = *(unsigned short *)&v8[direction] - v9;
else
v10 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v7 - v9;
CelDrawDatOnly(
(char *)gpBuffer + screen_y_times_768[v12 - 16 * always_0] + v11,
&v8[v9],
v10,
frame_width);
}
}
}
}
void __fastcall CelDecodeHdrOnly(char *pBuff, char *pCelBuff, int frame, int frame_width, int always_0, int direction)
{
int v6; // esi
char *v7; // eax
int v8; // ebx
int v9; // edx
int v10; // edx
if (pCelBuff) {
if (pBuff) {
v6 = *(_DWORD *)&pCelBuff[4 * frame];
v7 = &pCelBuff[v6];
v8 = *(unsigned short *)&pCelBuff[v6 + always_0];
if (*(_WORD *)&pCelBuff[v6 + always_0]) {
v9 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v6;
if (direction != 8 && *(_WORD *)&v7[direction])
v10 = *(unsigned short *)&v7[direction] - v8;
else
v10 = v9 - v8;
CelDrawDatOnly(pBuff, &v7[v8], v10, frame_width);
}
}
}
}
void __fastcall CelDecDatLightOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width)
{
char *v4; // esi
char *v5; // edi
char *v6; // ebx
int v7; // edx
int v8; // eax
int v9; // ST00_4
char *a3; // [esp+Ch] [ebp-10h]
if (pDecodeTo && pRLEBytes) {
a3 = &pLightTbl[256 * light_table_index];
v4 = pRLEBytes;
v5 = pDecodeTo;
v6 = &pRLEBytes[frame_content_size];
do {
v7 = frame_width;
do {
while (1) {
v8 = (unsigned char)*v4++;
if ((v8 & 0x80u) != 0) /* check sign */
break;
v9 = v7 - v8;
CelDecDatLightEntry(v8, a3, &v5, &v4);
v7 = v9;
if (!v9)
goto LABEL_9;
}
_LOBYTE(v8) = -(char)v8;
v5 += v8;
v7 -= v8;
} while (v7);
LABEL_9:
v5 += -frame_width - 768;
} while (v6 != v4);
}
}
// 69BEF8: using guessed type int light_table_index;
void __fastcall CelDecDatLightEntry(unsigned char n, char *LightIndex, char **pDecodeTo, char **pRLEBytes)
{
int i;
for (i = 0; i < n; i++) {
**pDecodeTo = LightIndex[**pRLEBytes];
(*pRLEBytes)++;
(*pDecodeTo)++;
}
}
void __fastcall CelDecDatLightTrans(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width)
{
char *v4; // esi
int v5; // edi
char *v6; // ebx
int v7; // edx
unsigned int v8; // eax
unsigned int v10; // ecx
char v11; // cf
unsigned int v12; // ecx
char *v13; // esi
_BYTE *v14; // edi
_BYTE *v18; // edi
unsigned int v21; // ecx
_BYTE *v25; // edi
char *v26; // [esp-4h] [ebp-24h]
char *v27; // [esp+Ch] [ebp-14h]
int v28; // [esp+14h] [ebp-Ch]
int _EAX;
char *_EBX;
if (pDecodeTo && pRLEBytes) {
v27 = &pLightTbl[256 * light_table_index];
v4 = pRLEBytes;
v5 = (int)pDecodeTo;
v6 = &pRLEBytes[frame_content_size];
v28 = (unsigned char)pDecodeTo & 1;
do {
v7 = frame_width;
do {
while (1) {
v8 = (unsigned char)*v4++;
if ((v8 & 0x80u) != 0)
break;
v26 = v6;
_EBX = v27;
v7 -= v8;
if ((v5 & 1) == v28) {
v10 = v8 >> 1;
if (!(v8 & 1))
goto LABEL_10;
++v4;
++v5;
if (v10) {
LABEL_17:
v11 = v10 & 1;
v21 = v10 >> 1;
if (!v11)
goto LABEL_26;
_EAX = *v4;
ASM_XLAT(_EAX, _EBX);
*(_BYTE *)v5 = _EAX;
v4 += 2;
v5 += 2;
if (v21) {
LABEL_26:
do {
_EAX = *(_DWORD *)v4;
v4 += 4;
ASM_XLAT(_EAX, _EBX);
*(_BYTE *)v5 = _EAX;
v25 = (_BYTE *)(v5 + 2);
_EAX = __ROR4__(_EAX, 16);
ASM_XLAT(_EAX, _EBX);
*v25 = _EAX;
v5 = (int)(v25 + 2);
--v21;
} while (v21);
}
goto LABEL_20;
}
} else {
v10 = v8 >> 1;
if (!(v8 & 1))
goto LABEL_17;
_EAX = *v4++;
ASM_XLAT(_EAX, _EBX);
*(_BYTE *)v5++ = _EAX;
if (v10) {
LABEL_10:
v11 = v10 & 1;
v12 = v10 >> 1;
if (!v11)
goto LABEL_27;
v13 = v4 + 1;
v14 = (_BYTE *)(v5 + 1);
_EAX = *v13;
v4 = v13 + 1;
ASM_XLAT(_EAX, _EBX);
*v14 = _EAX;
v5 = (int)(v14 + 1);
if (v12) {
LABEL_27:
do {
_EAX = *(_DWORD *)v4;
v4 += 4;
v18 = (_BYTE *)(v5 + 1);
_EAX = __ROR4__(_EAX, 8);
ASM_XLAT(_EAX, _EBX);
*v18 = _EAX;
_EAX = __ROR4__(_EAX, 16);
v18 += 2;
ASM_XLAT(_EAX, _EBX);
*v18 = _EAX;
v5 = (int)(v18 + 1);
--v12;
} while (v12);
}
goto LABEL_20;
}
}
LABEL_20:
v6 = v26;
if (!v7)
goto LABEL_23;
}
_LOBYTE(v8) = -(char)v8;
v5 += v8;
v7 -= v8;
} while (v7);
LABEL_23:
v5 -= frame_width + 768;
v28 = ((_BYTE)v28 + 1) & 1;
} while (v6 != v4);
}
}
// 69BEF8: using guessed type int light_table_index;
void __fastcall CelDecodeLightOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width)
{
int v5; // ebx
int v6; // esi
char *v7; // edx
char *v8; // ecx
int v9; // [esp-8h] [ebp-14h]
v5 = screen_y;
if (gpBuffer && pCelBuff) {
v6 = *(_DWORD *)&pCelBuff[4 * frame];
v7 = &pCelBuff[v6];
v8 = (char *)gpBuffer + screen_y_times_768[v5] + screen_x;
v9 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v6;
if (light_table_index)
CelDecDatLightOnly(v8, v7, v9, frame_width);
else
CelDrawDatOnly(v8, v7, v9, frame_width);
}
}
// 69BEF8: using guessed type int light_table_index;
void __fastcall CelDecodeHdrLightOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction)
{
int v7; // esi
char *v8; // ecx
int v9; // edi
char *v10; // edx
int v11; // ebx
int v12; // ebx
char *v13; // edx
char *v14; // ecx
int v15; // [esp+Ch] [ebp-4h]
char *cel_buf; // [esp+18h] [ebp+8h]
v7 = screen_y;
v15 = screen_x;
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
v9 = *(_DWORD *)&pCelBuff[4 * frame];
v10 = &pCelBuff[v9];
v11 = *(unsigned short *)&pCelBuff[v9 + always_0];
cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + always_0];
if (v11) {
if (direction != 8 && *(_WORD *)&v10[direction])
v12 = *(unsigned short *)&v10[direction] - (_DWORD)cel_buf;
else
v12 = *(_DWORD *)&v8[4 * frame + 4] - v9 - (_DWORD)cel_buf;
v13 = &v10[(_DWORD)cel_buf];
v14 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * always_0] + v15;
if (light_table_index)
CelDecDatLightOnly(v14, v13, v12, frame_width);
else
CelDrawDatOnly(v14, v13, v12, frame_width);
}
}
}
}
// 69BEF8: using guessed type int light_table_index;
void __fastcall CelDecodeHdrLightTrans(char *pBuff, char *pCelBuff, int frame, int frame_width, int always_0, int direction)
{
char *v6; // eax
int v7; // esi
char *v8; // edx
int v9; // ebx
int v10; // eax
int v11; // eax
char *v12; // edx
v6 = pCelBuff;
if (pCelBuff) {
if (pBuff) {
v7 = *(_DWORD *)&pCelBuff[4 * frame];
v8 = &pCelBuff[v7];
v9 = *(unsigned short *)&v6[v7 + always_0];
if (*(_WORD *)&v6[v7 + always_0]) {
v10 = *(_DWORD *)&v6[4 * frame + 4] - v7;
if (direction != 8 && *(_WORD *)&v8[direction])
v11 = *(unsigned short *)&v8[direction] - v9;
else
v11 = v10 - v9;
v12 = &v8[v9];
if (cel_transparency_active) {
CelDecDatLightTrans(pBuff, v12, v11, frame_width);
} else if (light_table_index) {
CelDecDatLightOnly(pBuff, v12, v11, frame_width);
} else {
CelDrawDatOnly(pBuff, v12, v11, frame_width);
}
}
}
}
}
// 69BEF8: using guessed type int light_table_index;
// 69CF94: using guessed type int cel_transparency_active;
void __fastcall CelDrawHdrLightRed(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction, char always_1)
{
char *v8; // esi
int v9; // ebx
int v10; // eax
char *v11; // edi
int v12; // ecx
int v13; // esi
int v14; // eax
int v15; // eax
_BYTE *v16; // esi
char *v17; // edi
int v18; // edx
int v19; // eax
int v20; // ecx
int v21; // [esp+Ch] [ebp-4h]
char *v22; // [esp+Ch] [ebp-4h]
char *cel_buf; // [esp+18h] [ebp+8h]
char *cel_bufa; // [esp+18h] [ebp+8h]
int framea; // [esp+1Ch] [ebp+Ch]
int always_0a; // [esp+24h] [ebp+14h]
int directiona; // [esp+28h] [ebp+18h]
v21 = screen_x;
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
v9 = *(_DWORD *)&pCelBuff[4 * frame];
v10 = always_0;
v11 = &pCelBuff[v9];
v12 = *(unsigned short *)&pCelBuff[v9 + always_0];
cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + always_0];
if (v12) {
v13 = *(_DWORD *)&v8[4 * frame + 4] - v9;
if (direction != 8 && *(_WORD *)&v11[direction])
always_0a = *(unsigned short *)&v11[direction] - (_DWORD)cel_buf;
else
always_0a = v13 - (_DWORD)cel_buf;
directiona = (int)&v11[(_DWORD)cel_buf];
cel_bufa = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * v10] + v21;
v14 = -(light4flag != 0);
_LOWORD(v14) = v14 & 0xF400;
v15 = v14 + 4096;
framea = v15;
if (always_1 == 2) {
v15 += 256;
framea = v15;
}
if (always_1 >= 4)
framea = v15 + (always_1 << 8) - 256;
v22 = &pLightTbl[framea];
v16 = (_BYTE *)directiona;
v17 = cel_bufa;
do {
v18 = frame_width;
do {
while (1) {
v19 = (unsigned char)*v16++;
if ((v19 & 0x80u) == 0)
break;
_LOBYTE(v19) = -(char)v19;
v17 += v19;
v18 -= v19;
if (!v18)
goto LABEL_20;
}
v18 -= v19;
v20 = v19;
do {
_LOBYTE(v19) = *v16++;
*v17 = v22[v19];
--v20;
++v17;
} while (v20);
} while (v18);
LABEL_20:
v17 += -frame_width - 768;
} while ((_BYTE *)(directiona + always_0a) != v16);
}
}
}
}
// 525728: using guessed type int light4flag;
void __fastcall Cel2DecDatOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width)
{
char *v4; // esi
char *v5; // edi
int v6; // edx
unsigned int v7; // eax
unsigned int v8; // ecx
char v9; // cf
unsigned int v10; // ecx
char *v11; // [esp+4h] [ebp-8h]
v11 = pRLEBytes;
if (pDecodeTo && pRLEBytes && gpBuffer) {
v4 = pRLEBytes;
v5 = pDecodeTo;
do {
v6 = frame_width;
do {
while (1) {
v7 = (unsigned char)*v4++;
if ((v7 & 0x80u) == 0)
break;
_LOBYTE(v7) = -(char)v7;
v5 += v7;
v6 -= v7;
if (!v6)
goto LABEL_17;
}
v6 -= v7;
if (v5 < (char *)gpBufEnd) {
v8 = v7 >> 1;
if (!(v7 & 1) || (*v5 = *v4, ++v4, ++v5, v8)) {
v9 = v8 & 1;
v10 = v7 >> 2;
if (!v9 || (*(_WORD *)v5 = *(_WORD *)v4, v4 += 2, v5 += 2, v10)) {
qmemcpy(v5, v4, 4 * v10);
v4 += 4 * v10;
v5 += 4 * v10;
}
}
} else {
v4 += v7;
v5 += v7;
}
} while (v6);
LABEL_17:
v5 += -frame_width - 768;
} while (&v11[frame_content_size] != v4);
}
}
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall Cel2DrawHdrOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a6, int direction)
{
int v7; // edx
char *v8; // eax
int v9; // edi
int v10; // ecx
int v11; // [esp+Ch] [ebp-8h]
int v12; // [esp+10h] [ebp-4h]
v12 = screen_y;
v11 = screen_x;
if (gpBuffer) {
if (pCelBuff) {
v7 = *(_DWORD *)&pCelBuff[4 * frame];
v8 = &pCelBuff[v7];
v9 = *(unsigned short *)&pCelBuff[v7 + a6];
if (*(_WORD *)&pCelBuff[v7 + a6]) {
if (direction != 8 && *(_WORD *)&v8[direction])
v10 = *(unsigned short *)&v8[direction] - v9;
else
v10 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v7 - v9;
Cel2DecDatOnly(
(char *)gpBuffer + screen_y_times_768[v12 - 16 * a6] + v11,
&v8[v9],
v10,
frame_width);
}
}
}
}
void __fastcall Cel2DecodeHdrOnly(char *pBuff, char *pCelBuff, int frame, int frame_width, int a5, int direction)
{
int v6; // edi
char *v7; // esi
int v8; // ebx
int v9; // eax
int v10; // edx
int v11; // eax
if (pCelBuff) {
if (pBuff) {
v6 = *(_DWORD *)&pCelBuff[4 * frame];
v7 = &pCelBuff[v6];
v8 = *(unsigned short *)&pCelBuff[v6 + a5];
if (*(_WORD *)&pCelBuff[v6 + a5]) {
v9 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v6;
v10 = *(unsigned short *)&v7[direction];
if (direction == 8)
v10 = 0;
if (v10)
v11 = v10 - v8;
else
v11 = v9 - v8;
Cel2DecDatOnly(pBuff, &v7[v8], v11, frame_width);
}
}
}
}
void __fastcall Cel2DecDatLightOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width)
{
char *v4; // esi
char *v5; // edi
char *v6; // ebx
int v7; // edx
int v8; // eax
int v9; // ST00_4
char *a3; // [esp+Ch] [ebp-10h]
if (pDecodeTo && pRLEBytes && gpBuffer) {
a3 = &pLightTbl[256 * light_table_index];
v4 = pRLEBytes;
v5 = pDecodeTo;
v6 = &pRLEBytes[frame_content_size];
do {
v7 = frame_width;
do {
while (1) {
v8 = (unsigned __int8)*v4++;
if ((v8 & 0x80u) == 0) /* check sign */
break;
_LOBYTE(v8) = -(char)v8;
v5 += v8;
v7 -= v8;
if (!v7)
goto LABEL_13;
}
v7 -= v8;
if (v5 < (char *)gpBufEnd) {
v9 = v7;
Cel2DecDatLightEntry(v8, a3, &v5, &v4);
v7 = v9;
} else {
v4 += v8;
v5 += v8;
}
} while (v7);
LABEL_13:
v5 += -frame_width - 768;
} while (v6 != v4);
}
}
// 69BEF8: using guessed type int light_table_index;
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall Cel2DecDatLightEntry(unsigned char n, char *LightIndex, char **pDecodeTo, char **pRLEBytes)
{
int i;
for (i = 0; i < n; i++) {
**pDecodeTo = LightIndex[**pRLEBytes];
(*pRLEBytes)++;
(*pDecodeTo)++;
}
}
void __fastcall Cel2DecDatLightTrans(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width)
{
char *v4; // esi
unsigned int v5; // edi
char *v6; // ebx
int v7; // edx
unsigned int v8; // eax
unsigned int v10; // ecx
char v11; // cf
unsigned int v12; // ecx
char *v13; // esi
_BYTE *v14; // edi
_BYTE *v18; // edi
unsigned int v21; // ecx
_BYTE *v25; // edi
char *v26; // [esp-4h] [ebp-24h]
char *v27; // [esp+Ch] [ebp-14h]
int v28; // [esp+14h] [ebp-Ch]
int _EAX;
char *_EBX;
if (pDecodeTo && pRLEBytes && gpBuffer) {
v27 = &pLightTbl[256 * light_table_index];
v4 = pRLEBytes;
v5 = (unsigned int)pDecodeTo;
v6 = &pRLEBytes[frame_content_size];
v28 = (unsigned char)pDecodeTo & 1;
do {
v7 = frame_width;
do {
while (1) {
v8 = (unsigned char)*v4++;
if ((v8 & 0x80u) != 0)
break;
v26 = v6;
_EBX = v27;
v7 -= v8;
if (v5 < (unsigned int)gpBufEnd) {
if ((v5 & 1) == v28) {
v10 = v8 >> 1;
if (!(v8 & 1))
goto LABEL_13;
++v4;
++v5;
if (v10) {
LABEL_20:
v11 = v10 & 1;
v21 = v10 >> 1;
if (!v11)
goto LABEL_29;
_EAX = *v4;
ASM_XLAT(_EAX, _EBX);
*(_BYTE *)v5 = _EAX;
v4 += 2;
v5 += 2;
if (v21) {
LABEL_29:
do {
_EAX = *(_DWORD *)v4;
v4 += 4;
ASM_XLAT(_EAX, _EBX);
*(_BYTE *)v5 = _EAX;
v25 = (_BYTE *)(v5 + 2);
_EAX = __ROR4__(_EAX, 16);
ASM_XLAT(_EAX, _EBX);
*v25 = _EAX;
v5 = (unsigned int)(v25 + 2);
--v21;
} while (v21);
}
goto LABEL_23;
}
} else {
v10 = v8 >> 1;
if (!(v8 & 1))
goto LABEL_20;
_EAX = *v4++;
ASM_XLAT(_EAX, _EBX);
*(_BYTE *)v5++ = _EAX;
if (v10) {
LABEL_13:
v11 = v10 & 1;
v12 = v10 >> 1;
if (!v11)
goto LABEL_30;
v13 = v4 + 1;
v14 = (_BYTE *)(v5 + 1);
_EAX = *v13;
v4 = v13 + 1;
ASM_XLAT(_EAX, _EBX);
*v14 = _EAX;
v5 = (unsigned int)(v14 + 1);
if (v12) {
LABEL_30:
do {
_EAX = *(_DWORD *)v4;
v4 += 4;
v18 = (_BYTE *)(v5 + 1);
_EAX = __ROR4__(_EAX, 8);
ASM_XLAT(_EAX, _EBX);
*v18 = _EAX;
_EAX = __ROR4__(_EAX, 16);
v18 += 2;
ASM_XLAT(_EAX, _EBX);
*v18 = _EAX;
v5 = (unsigned int)(v18 + 1);
--v12;
} while (v12);
}
goto LABEL_23;
}
}
} else {
v4 += v8;
v5 += v8;
}
LABEL_23:
v6 = v26;
if (!v7)
goto LABEL_26;
}
_LOBYTE(v8) = -(char)v8;
v5 += v8;
v7 -= v8;
} while (v7);
LABEL_26:
v5 -= frame_width + 768;
v28 = ((_BYTE)v28 + 1) & 1;
} while (v6 != v4);
}
}
// 69BEF8: using guessed type int light_table_index;
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall Cel2DecodeHdrLight(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a6, int direction)
{
int v7; // esi
char *v8; // eax
int v9; // edi
char *v10; // edx
int v11; // ebx
int v12; // eax
int v13; // edi
int v14; // eax
char *v15; // edx
char *v16; // ecx
char *cel_buf; // [esp+18h] [ebp+8h]
v7 = screen_y;
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
v9 = *(_DWORD *)&pCelBuff[4 * frame];
v10 = &pCelBuff[v9];
v11 = *(unsigned short *)&pCelBuff[v9 + a6];
cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + a6];
if (v11) {
v12 = *(_DWORD *)&v8[4 * frame + 4] - v9;
v13 = *(unsigned short *)&v10[direction];
if (direction == 8)
v13 = 0;
if (v13)
v14 = v13 - (_DWORD)cel_buf;
else
v14 = v12 - (_DWORD)cel_buf;
v15 = &v10[(_DWORD)cel_buf];
v16 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + screen_x;
if (light_table_index)
Cel2DecDatLightOnly(v16, v15, v14, frame_width);
else
Cel2DecDatOnly(v16, v15, v14, frame_width);
}
}
}
}
// 69BEF8: using guessed type int light_table_index;
void __fastcall Cel2DecodeLightTrans(char *dst_buf, char *pCelBuff, int frame, int frame_width, int a5, int direction)
{
char *v6; // eax
int v7; // esi
char *v8; // edx
int v9; // ebx
int v10; // eax
int v11; // esi
int v12; // eax
char *v13; // edx
v6 = pCelBuff;
if (pCelBuff) {
v7 = *(_DWORD *)&pCelBuff[4 * frame];
v8 = &pCelBuff[v7];
v9 = *(unsigned short *)&v6[v7 + a5];
if (*(_WORD *)&v6[v7 + a5]) {
v10 = *(_DWORD *)&v6[4 * frame + 4] - v7;
v11 = *(unsigned short *)&v8[direction];
if (direction == 8)
v11 = 0;
if (v11)
v12 = v11 - v9;
else
v12 = v10 - v9;
v13 = &v8[v9];
if (cel_transparency_active) {
Cel2DecDatLightTrans(dst_buf, v13, v12, frame_width);
} else if (light_table_index) {
Cel2DecDatLightOnly(dst_buf, v13, v12, frame_width);
} else {
Cel2DecDatOnly(dst_buf, v13, v12, frame_width);
}
}
}
}
// 69BEF8: using guessed type int light_table_index;
// 69CF94: using guessed type int cel_transparency_active;
void __fastcall Cel2DrawHdrLightRed(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction, char always_1)
{
char *v8; // esi
int v9; // ebx
char *v10; // edi
int v11; // ecx
int v12; // esi
int v13; // eax
int v14; // eax
_BYTE *v15; // esi
_BYTE *v16; // edi
int v17; // ecx
int v18; // edx
int v19; // ecx
int v20; // eax
_BYTE *v21; // [esp-4h] [ebp-14h]
int v22; // [esp+Ch] [ebp-4h]
char *cel_buf; // [esp+18h] [ebp+8h]
char *cel_bufa; // [esp+18h] [ebp+8h]
int framea; // [esp+1Ch] [ebp+Ch]
char *always_0a; // [esp+24h] [ebp+14h]
int directiona; // [esp+28h] [ebp+18h]
v22 = screen_x;
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
v9 = *(_DWORD *)&pCelBuff[4 * frame];
v10 = &pCelBuff[v9];
v11 = *(unsigned short *)&pCelBuff[v9 + always_0];
cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + always_0];
if (v11) {
v12 = *(_DWORD *)&v8[4 * frame + 4] - v9;
if (direction != 8 && *(_WORD *)&v10[direction])
framea = *(unsigned short *)&v10[direction] - (_DWORD)cel_buf;
else
framea = v12 - (_DWORD)cel_buf;
directiona = (int)&v10[(_DWORD)cel_buf];
always_0a = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * always_0] + v22;
v13 = -(light4flag != 0);
_LOWORD(v13) = v13 & 0xF400;
v14 = v13 + 4096;
if (always_1 == 2)
v14 += 256;
if (always_1 >= 4)
v14 = v14 + (always_1 << 8) - 256;
cel_bufa = &pLightTbl[v14];
v15 = (_BYTE *)directiona;
v16 = (unsigned char *)always_0a;
v17 = directiona + framea;
do {
v21 = (_BYTE *)v17;
v18 = frame_width;
v19 = 0;
do {
while (1) {
v20 = (unsigned char)*v15++;
if ((v20 & 0x80u) == 0)
break;
_LOBYTE(v20) = -(char)v20;
v16 += v20;
v18 -= v20;
if (!v18)
goto LABEL_21;
}
v18 -= v20;
if (v16 < gpBufEnd) {
do {
_LOBYTE(v19) = *v15++;
*v16 = cel_bufa[v19];
--v20;
++v16;
} while (v20);
} else {
v15 += v20;
v16 += v20;
}
} while (v18);
LABEL_21:
v17 = (int)v21;
v16 += -frame_width - 768;
} while (v21 != v15);
}
}
}
}
// 525728: using guessed type int light4flag;
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall CelDecodeRect(char *pBuff, int always_0, int dst_height, int dst_width, char *pCelBuff, int frame, int frame_width)
{
char *v7; // ebx
char *v8; // esi
char *v9; // edi
int v10; // ebx
int v11; // edx
unsigned int v12; // eax
unsigned int v13; // ecx
char v14; // cf
unsigned int v15; // ecx
int dst_widtha; // [esp+14h] [ebp+Ch]
if (pCelBuff && pBuff) {
v7 = &pCelBuff[4 * frame];
v8 = &pCelBuff[*(_DWORD *)v7];
v9 = &pBuff[dst_width * dst_height + always_0];
dst_widtha = frame_width + dst_width;
v10 = (int)&v8[*((_DWORD *)v7 + 1) - *(_DWORD *)v7];
do {
v11 = frame_width;
do {
while (1) {
v12 = (unsigned char)*v8++;
if ((v12 & 0x80u) == 0)
break;
_LOBYTE(v12) = -(char)v12;
v9 += v12;
v11 -= v12;
if (!v11)
goto LABEL_14;
}
v11 -= v12;
v13 = v12 >> 1;
if (v12 & 1) {
*v9++ = *v8++;
if (!v13)
continue;
}
v14 = v13 & 1;
v15 = v12 >> 2;
if (v14) {
*(_WORD *)v9 = *(_WORD *)v8;
v8 += 2;
v9 += 2;
if (!v15)
continue;
}
qmemcpy(v9, v8, 4 * v15);
v8 += 4 * v15;
v9 += 4 * v15;
} while (v11);
LABEL_14:
v9 -= dst_widtha;
} while ((char *)v10 != v8);
}
}
void __fastcall CelDecodeClr(BYTE colour, int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a7, int direction)
{
char *v8; // ebx
int v9; // eax
char *v10; // esi
char *v11; // edi
int v12; // edx
int v13; // eax
int v14; // ecx
char v15; // al
int v16; // [esp+Ch] [ebp-10h]
char *v17; // [esp+10h] [ebp-Ch]
int v18; // [esp+14h] [ebp-8h]
char v19; // [esp+18h] [ebp-4h]
v19 = colour;
if (pCelBuff) {
if (gpBuffer) {
v8 = &pCelBuff[4 * frame];
v17 = &pCelBuff[*(_DWORD *)v8];
v16 = *(unsigned short *)&v17[a7];
if (*(_WORD *)&v17[a7]) {
if (direction == 8)
v9 = 0;
else
v9 = *(unsigned short *)&v17[direction];
if (v9)
v18 = v9 - v16;
else
v18 = *((_DWORD *)v8 + 1) - *(_DWORD *)v8 - v16;
v10 = &v17[v16];
v11 = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + screen_x;
do {
v12 = frame_width;
do {
while (1) {
v13 = (unsigned char)*v10++;
if ((v13 & 0x80u) == 0)
break;
_LOBYTE(v13) = -(char)v13;
v11 += v13;
v12 -= v13;
if (!v12)
goto LABEL_20;
}
v12 -= v13;
v14 = v13;
do {
v15 = *v10++;
if (v15) {
*(v11 - 768) = v19;
*(v11 - 1) = v19;
v11[1] = v19;
v11[768] = v19;
}
++v11;
--v14;
} while (v14);
} while (v12);
LABEL_20:
v11 += -frame_width - 768;
} while (&v17[v16 + v18] != v10);
}
}
}
}
void __fastcall CelDrawHdrClrHL(char colour, int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a7, int direction)
{
char *v8; // ebx
int v9; // eax
char *v10; // esi
char *v11; // edi
int v12; // edx
int v13; // eax
int v14; // ecx
char v15; // al
int v16; // ecx
char v17; // al
int v18; // [esp+Ch] [ebp-10h]
char *v19; // [esp+10h] [ebp-Ch]
int v20; // [esp+14h] [ebp-8h]
char v21; // [esp+18h] [ebp-4h]
v21 = colour;
if (pCelBuff) {
if (gpBuffer) {
v8 = &pCelBuff[4 * frame];
v19 = &pCelBuff[*(_DWORD *)v8];
v18 = *(unsigned short *)&v19[a7];
if (*(_WORD *)&v19[a7]) {
if (direction == 8)
v9 = 0;
else
v9 = *(unsigned short *)&v19[direction];
if (v9)
v20 = v9 - v18;
else
v20 = *((_DWORD *)v8 + 1) - *(_DWORD *)v8 - v18;
v10 = &v19[v18];
v11 = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + screen_x;
do {
v12 = frame_width;
do {
while (1) {
v13 = (unsigned char)*v10++;
if ((v13 & 0x80u) == 0)
break;
_LOBYTE(v13) = -(char)v13;
v11 += v13;
v12 -= v13;
if (!v12)
goto LABEL_28;
}
v12 -= v13;
if (v11 < (char *)gpBufEnd) {
if (v11 >= (char *)gpBufEnd - 768) {
v16 = v13;
do {
v17 = *v10++;
if (v17) {
*(v11 - 768) = v21;
*(v11 - 1) = v21;
v11[1] = v21;
}
++v11;
--v16;
} while (v16);
} else {
v14 = v13;
do {
v15 = *v10++;
if (v15) {
*(v11 - 768) = v21;
*(v11 - 1) = v21;
v11[1] = v21;
v11[768] = v21;
}
++v11;
--v14;
} while (v14);
}
} else {
v10 += v13;
v11 += v13;
}
} while (v12);
LABEL_28:
v11 += -frame_width - 768;
} while (&v19[v18 + v20] != v10);
}
}
}
}
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall ENG_set_pixel(int screen_x, int screen_y, UCHAR pixel)
{
UCHAR *v3; // edi
if (screen_y >= 0 && screen_y < 640 && screen_x >= 64 && screen_x < 704) {
v3 = (UCHAR *)gpBuffer + screen_y_times_768[screen_y] + screen_x;
if (v3 < gpBufEnd)
*v3 = pixel;
}
}
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall engine_draw_pixel(int x, int y)
{
_BYTE *v2; // eax
if (dword_52B970) {
if (!dword_52B99C || x >= 0 && x < 640 && y >= 64 && y < 704) {
v2 = (unsigned char *)gpBuffer + screen_y_times_768[x] + y;
goto LABEL_14;
}
} else if (!dword_52B99C || y >= 0 && y < 640 && x >= 64 && x < 704) {
v2 = (unsigned char *)gpBuffer + screen_y_times_768[y] + x;
LABEL_14:
if (v2 < gpBufEnd)
*v2 = gbPixelCol;
return;
}
}
// 52B96C: using guessed type char gbPixelCol;
// 52B970: using guessed type int dword_52B970;
// 52B99C: using guessed type int dword_52B99C;
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall DrawLine(int x0, int y0, int x1, int y1, UCHAR col)
{
int v5; // ST18_4
int v6; // ST2C_4
int v7; // ST20_4
int v8; // [esp+Ch] [ebp-48h]
int v9; // [esp+10h] [ebp-44h]
int v10; // [esp+14h] [ebp-40h]
int v11; // [esp+18h] [ebp-3Ch]
signed int v12; // [esp+1Ch] [ebp-38h]
int v13; // [esp+20h] [ebp-34h]
int v14; // [esp+24h] [ebp-30h]
int v15; // [esp+28h] [ebp-2Ch]
int y; // [esp+2Ch] [ebp-28h]
int ya; // [esp+2Ch] [ebp-28h]
int yb; // [esp+2Ch] [ebp-28h]
int yc; // [esp+2Ch] [ebp-28h]
int j; // [esp+30h] [ebp-24h]
int i; // [esp+30h] [ebp-24h]
int x; // [esp+34h] [ebp-20h]
int xa; // [esp+34h] [ebp-20h]
int xb; // [esp+34h] [ebp-20h]
int xc; // [esp+34h] [ebp-20h]
int xd; // [esp+34h] [ebp-20h]
int xe; // [esp+34h] [ebp-20h]
int xf; // [esp+34h] [ebp-20h]
int xg; // [esp+34h] [ebp-20h]
int xh; // [esp+34h] [ebp-20h]
int v31; // [esp+38h] [ebp-1Ch]
int v32; // [esp+3Ch] [ebp-18h]
int v33; // [esp+3Ch] [ebp-18h]
int v34; // [esp+3Ch] [ebp-18h]
signed int v35; // [esp+40h] [ebp-14h]
signed int v36; // [esp+44h] [ebp-10h]
int v37; // [esp+48h] [ebp-Ch]
int v38; // [esp+48h] [ebp-Ch]
int v39; // [esp+4Ch] [ebp-8h]
int v40; // [esp+4Ch] [ebp-8h]
int v41; // [esp+50h] [ebp-4h]
int x2a; // [esp+5Ch] [ebp+8h]
v8 = y0;
v9 = x0;
gbPixelCol = col;
dword_52B99C = 0;
if (x0 < 64 || x0 >= 704)
dword_52B99C = 1;
if (x1 < 64 || x1 >= 704)
dword_52B99C = 1;
if (y0 < 160 || y0 >= 512)
dword_52B99C = 1;
if (y1 < 160 || y1 >= 512)
dword_52B99C = 1;
if (x1 - x0 < 0)
v36 = -1;
else
v36 = 1;
v11 = v36 * (x1 - x0);
if (y1 - y0 < 0)
v35 = -1;
else
v35 = 1;
v10 = v35 * (y1 - y0);
if (v35 == v36)
v12 = 1;
else
v12 = -1;
if (v11 >= v10) {
dword_52B970 = 0;
} else {
v8 = y0 ^ x0 ^ y0;
v9 = v8 ^ y0 ^ x0;
x2a = y1 ^ x1;
y1 ^= x2a;
x1 = y1 ^ x2a;
v5 = v10 ^ v11;
v10 ^= v5;
v11 = v10 ^ v5;
dword_52B970 = 1;
}
if (x1 >= v9) {
x = v9;
y = v8;
v32 = x1;
v13 = y1;
} else {
x = x1;
y = y1;
v32 = v9;
v13 = v8;
}
v31 = (v11 - 1) / 4;
v41 = (v11 - 1) % 4; /* (((v11 - 1) >> 31) ^ abs(v11 - 1) & 3) - ((v11 - 1) >> 31) */
engine_draw_pixel(x, y);
engine_draw_pixel(v32, v13);
v14 = 4 * v10 - 2 * v11;
if (v14 >= 0) {
v40 = 2 * (v10 - v11);
v15 = 4 * (v10 - v11);
v38 = v15 + v11;
for (i = 0; i < v31; ++i) {
xe = x + 1;
v34 = v32 - 1;
if (v38 <= 0) {
if (v40 <= v38) {
y += v12;
engine_draw_pixel(xe, y);
x = xe + 1;
engine_draw_pixel(x, y);
v13 -= v12;
engine_draw_pixel(v34, v13);
} else {
engine_draw_pixel(xe, y);
y += v12;
x = xe + 1;
engine_draw_pixel(x, y);
engine_draw_pixel(v34, v13);
v13 -= v12;
}
v32 = v34 - 1;
engine_draw_pixel(v32, v13);
v38 += v14;
} else {
v6 = v12 + y;
engine_draw_pixel(xe, v6);
y = v12 + v6;
x = xe + 1;
engine_draw_pixel(x, y);
v7 = v13 - v12;
engine_draw_pixel(v34, v7);
v13 = v7 - v12;
v32 = v34 - 1;
engine_draw_pixel(v32, v13);
v38 += v15;
}
}
if (v41) {
if (v38 <= 0) {
if (v40 <= v38) {
yc = v12 + y;
xh = x + 1;
engine_draw_pixel(xh, yc);
if (v41 > 1)
engine_draw_pixel(xh + 1, yc);
if (v41 > 2) {
if (v40 >= v38)
engine_draw_pixel(v32 - 1, v13);
else
engine_draw_pixel(v32 - 1, v13 - v12);
}
} else {
xg = x + 1;
engine_draw_pixel(xg, y);
if (v41 > 1)
engine_draw_pixel(xg + 1, v12 + y);
if (v41 > 2)
engine_draw_pixel(v32 - 1, v13);
}
} else {
yb = v12 + y;
xf = x + 1;
engine_draw_pixel(xf, yb);
if (v41 > 1)
engine_draw_pixel(xf + 1, v12 + yb);
if (v41 > 2)
engine_draw_pixel(v32 - 1, v13 - v12);
}
}
} else {
v39 = 2 * v10;
v37 = 4 * v10 - v11;
for (j = 0; j < v31; ++j) {
xa = x + 1;
v33 = v32 - 1;
if (v37 >= 0) {
if (v39 <= v37) {
y += v12;
engine_draw_pixel(xa, y);
x = xa + 1;
engine_draw_pixel(x, y);
v13 -= v12;
engine_draw_pixel(v33, v13);
} else {
engine_draw_pixel(xa, y);
y += v12;
x = xa + 1;
engine_draw_pixel(x, y);
engine_draw_pixel(v33, v13);
v13 -= v12;
}
v32 = v33 - 1;
engine_draw_pixel(v32, v13);
v37 += v14;
} else {
engine_draw_pixel(xa, y);
x = xa + 1;
engine_draw_pixel(x, y);
engine_draw_pixel(v33, v13);
v32 = v33 - 1;
engine_draw_pixel(v32, v13);
v37 += 4 * v10;
}
}
if (v41) {
if (v37 >= 0) {
if (v39 <= v37) {
ya = v12 + y;
xd = x + 1;
engine_draw_pixel(xd, ya);
if (v41 > 1)
engine_draw_pixel(xd + 1, ya);
if (v41 > 2)
engine_draw_pixel(v32 - 1, v13 - v12);
} else {
xc = x + 1;
engine_draw_pixel(xc, y);
if (v41 > 1)
engine_draw_pixel(xc + 1, v12 + y);
if (v41 > 2)
engine_draw_pixel(v32 - 1, v13);
}
} else {
xb = x + 1;
engine_draw_pixel(xb, y);
if (v41 > 1)
engine_draw_pixel(xb + 1, y);
if (v41 > 2)
engine_draw_pixel(v32 - 1, v13);
}
}
}
}
// 52B96C: using guessed type char gbPixelCol;
// 52B970: using guessed type int dword_52B970;
// 52B99C: using guessed type int dword_52B99C;
int __fastcall GetDirection(int x1, int y1, int x2, int y2)
{
int v4; // esi
int v5; // ecx
int v6; // edx
int result; // eax
int v8; // esi
int v9; // edx
v4 = x2 - x1;
v5 = y2 - y1;
if (v4 < 0) {
v8 = -v4;
v9 = 2 * v8;
if (v5 < 0) {
v5 = -v5;
result = 4;
if (v9 < v5)
result = 5;
} else {
result = 2;
if (v9 < v5)
result = 1;
}
if (2 * v5 < v8)
return 3;
} else {
v6 = 2 * v4;
if (v5 < 0) {
v5 = -v5;
result = 6;
if (v6 < v5)
result = 5;
} else {
result = 0;
if (v6 < v5)
result = 1;
}
if (2 * v5 < v4)
return 7;
}
return result;
}
void __fastcall SetRndSeed(int s)
{
SeedCount = 0;
sglGameSeed = s;
orgseed = s;
}
// 52B974: using guessed type int orgseed;
// 52B97C: using guessed type int sglGameSeed;
// 52B998: using guessed type int SeedCount;
int __cdecl GetRndSeed()
{
++SeedCount;
sglGameSeed = 0x015A4E35 * sglGameSeed + 1;
return abs(sglGameSeed);
}
// 52B97C: using guessed type int sglGameSeed;
// 52B998: using guessed type int SeedCount;
int __fastcall random(BYTE idx, int v)
{
if (v <= 0)
return 0;
if (v >= 0xFFFF)
return GetRndSeed() % v;
return (GetRndSeed() >> 16) % v;
}
struct engine_cpp_init_2 {
engine_cpp_init_2()
{
mem_init_mutex();
mem_atexit_mutex();
}
} _engine_cpp_init_2;
void __cdecl mem_init_mutex()
{
InitializeCriticalSection(&sgMemCrit);
}
void __cdecl mem_atexit_mutex()
{
atexit(mem_free_mutex);
}
void __cdecl mem_free_mutex()
{
DeleteCriticalSection(&sgMemCrit);
}
unsigned char *__fastcall DiabloAllocPtr(int dwBytes)
{
int v1; // ebx
unsigned char *v2; // ebx
int v3; // eax
v1 = dwBytes;
EnterCriticalSection(&sgMemCrit);
v2 = (unsigned char *)SMemAlloc(v1, "C:\\Src\\Diablo\\Source\\ENGINE.CPP", 2236, 0);
LeaveCriticalSection(&sgMemCrit);
if (!v2) {
v3 = GetLastError();
ErrDlg(IDD_DIALOG2, v3, "C:\\Src\\Diablo\\Source\\ENGINE.CPP", 2269);
}
return v2;
}
void __fastcall mem_free_dbg(void *p)
{
void *v1; // edi
v1 = p;
if (p) {
EnterCriticalSection(&sgMemCrit);
SMemFree(v1, "C:\\Src\\Diablo\\Source\\ENGINE.CPP", 2317, 0);
LeaveCriticalSection(&sgMemCrit);
}
}
unsigned char *__fastcall LoadFileInMem(char *pszName, int *pdwFileLen)
{
int *v2; // edi
char *v3; // ebx
int v4; // eax
int v5; // esi
char *v6; // edi
void *a1; // [esp+Ch] [ebp-4h]
v2 = pdwFileLen;
v3 = pszName;
WOpenFile(pszName, &a1, 0);
v4 = WGetFileSize(a1, 0);
v5 = v4;
if (v2)
*v2 = v4;
if (!v4)
TermMsg("Zero length SFILE:\n%s", v3);
v6 = (char *)DiabloAllocPtr(v5);
WReadFile(a1, v6, v5);
WCloseFile(a1);
return (unsigned char *)v6;
}
void __fastcall LoadFileWithMem(char *pszName, void *buf)
{
char *v2; // ebx
char *v3; // edi
int v4; // esi
void *a1; // [esp+Ch] [ebp-4h]
v2 = (char *)buf;
v3 = pszName;
if (!buf)
TermMsg("LoadFileWithMem(NULL):\n%s", pszName);
WOpenFile(v3, &a1, 0);
v4 = WGetFileSize(a1, 0);
if (!v4)
TermMsg("Zero length SFILE:\n%s", v3);
WReadFile(a1, v2, v4);
WCloseFile(a1);
}
void __fastcall Cl2ApplyTrans(unsigned char *p, unsigned char *ttbl, int last_frame)
{
int v3; // eax
int v4; // edi
int v5; // esi
unsigned char *v6; // eax
char v7; // bl
unsigned char v8; // bl
int v9; // edi
int i; // [esp+0h] [ebp-4h]
v3 = 1;
for (i = 1; i <= last_frame; ++i) {
v4 = *(_DWORD *)&p[4 * v3];
v5 = *(_DWORD *)&p[4 * v3 + 4] - v4 - 10;
v6 = &p[v4 + 10];
while (v5) {
v7 = *v6++;
--v5;
if (v7 < 0) {
v8 = -v7;
if ((char)v8 <= 65) {
v5 -= (char)v8;
if (v8) {
v9 = v8;
do {
*v6 = ttbl[*v6];
++v6;
--v9;
} while (v9);
}
} else {
--v5;
*v6 = ttbl[*v6];
++v6;
}
}
}
v3 = i + 1;
}
}
void __fastcall Cl2DecodeFrm1(int x, int y, char *pCelBuff, int nCel, int width, int dir1, int dir2)
{
char *v8; // edx
char *v9; // ecx
int v10; // ecx
int v11; // eax
char *pCelBuffa; // [esp+18h] [ebp+8h]
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
if (nCel > 0) {
v9 = *(char **)&pCelBuff[4 * nCel];
pCelBuffa = v9;
v10 = (int)&v9[(_DWORD)v8];
if (*(_WORD *)(v10 + dir1)) {
if (dir2 == 8 || (v11 = *(unsigned short *)(v10 + dir2), !*(_WORD *)(v10 + dir2)))
v11 = *((_DWORD *)v8 + nCel + 1) - (_DWORD)pCelBuffa;
Cl2DecDatFrm1(
(char *)gpBuffer + screen_y_times_768[y - 16 * dir1] + x,
(char *)(*(unsigned short *)(v10 + dir1) + v10),
v11 - *(unsigned short *)(v10 + dir1),
width);
}
}
}
}
}
void __fastcall Cl2DecDatFrm1(char *buffer, char *frame_content, int a3, int width) /* fix */
{
char *v4; // esi
char *v5; // edi
int v6; // eax
int v7; // ebx
int v8; // ecx
char v9; // dl
char v10; // dl
int v11; // edx
v4 = frame_content;
v5 = buffer;
v6 = 0;
v7 = width;
v8 = a3;
do {
_LOBYTE(v6) = *v4++;
--v8;
if ((v6 & 0x80u) == 0) {
do {
if (v6 <= v7) {
v11 = v6;
v5 += v6;
v6 = 0;
} else {
v11 = v7;
v5 += v7;
v6 -= v7;
}
v7 -= v11;
if (!v7) {
v7 = width;
v5 = &v5[-width - 768];
}
} while (v6);
} else {
_LOBYTE(v6) = -(char)v6;
if ((char)v6 <= 65) {
v8 -= v6;
v7 -= v6;
do {
v10 = *v4++;
*v5 = v10;
--v6;
++v5;
} while (v6);
} else {
_LOBYTE(v6) = v6 - 65;
--v8;
v9 = *v4++;
v7 -= v6;
do {
*v5 = v9;
--v6;
++v5;
} while (v6);
}
if (!v7) {
v7 = width;
v5 = &v5[-width - 768];
}
}
} while (v8);
}
void __fastcall Cl2DecodeFrm2(char colour, int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a7, int a8)
{
int v8; // ebx
char *v9; // edx
int v10; // eax
int v11; // [esp+Ch] [ebp-8h]
v11 = screen_x;
if (gpBuffer) {
if (pCelBuff) {
if (nCel > 0) {
v8 = *(_DWORD *)&pCelBuff[4 * nCel];
v9 = &pCelBuff[v8];
if (*(_WORD *)&pCelBuff[v8 + a7]) {
if (a8 == 8 || (v10 = *(unsigned short *)&v9[a8], !*(_WORD *)&v9[a8]))
v10 = *(_DWORD *)&pCelBuff[4 * nCel + 4] - v8;
Cl2DecDatFrm2(
(char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + v11,
&v9[*(unsigned short *)&pCelBuff[v8 + a7]],
v10 - *(unsigned short *)&pCelBuff[v8 + a7],
frame_width,
colour);
}
}
}
}
}
void __fastcall Cl2DecDatFrm2(char *buffer, char *frame_content, int a3, int frame_width, char colour)
{
char *v5; // esi
char *v6; // edi
int v7; // eax
int v8; // ebx
int v9; // ecx
char v10; // dl
char v11; // dh
char v12; // dh
int v13; // edx
v5 = frame_content;
v6 = buffer;
v7 = 0;
v8 = frame_width;
v9 = a3;
v10 = colour;
do {
_LOBYTE(v7) = *v5++;
--v9;
if ((v7 & 0x80u) != 0) {
_LOBYTE(v7) = -(char)v7;
if ((char)v7 <= 65) {
v9 -= v7;
v8 -= v7;
do {
v12 = *v5++;
if (v12) {
*(v6 - 1) = v10;
v6[1] = v10;
*(v6 - 768) = v10;
v6[768] = v10;
}
--v7;
++v6;
} while (v7);
goto LABEL_12;
}
_LOBYTE(v7) = v7 - 65;
--v9;
v11 = *v5++;
if (v11) {
*(v6 - 1) = v10;
v8 -= v7;
v6[v7] = v10;
do {
*(v6 - 768) = v10;
v6[768] = v10;
--v7;
++v6;
} while (v7);
LABEL_12:
if (!v8) {
v8 = frame_width;
v6 = &v6[-frame_width - 768];
}
continue;
}
}
do {
if (v7 <= v8) {
v13 = v7;
v6 += v7;
v7 = 0;
} else {
v13 = v8;
v6 += v8;
v7 -= v8;
}
v8 -= v13;
if (!v8) {
v8 = frame_width;
v6 = &v6[-frame_width - 768];
}
} while (v7);
v10 = colour;
} while (v9);
}
void __fastcall Cl2DecodeFrm3(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7, char a8)
{
char *v8; // edi
int v9; // ebx
char *v10; // esi
int v11; // eax
int v12; // eax
char *v13; // esi
int v14; // edi
int v15; // eax
int v16; // eax
char *pCelBuffa; // [esp+18h] [ebp+8h]
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
if (nCel > 0) {
v9 = *(_DWORD *)&pCelBuff[4 * nCel];
v10 = &pCelBuff[v9];
v11 = *(unsigned short *)&pCelBuff[v9 + a6];
pCelBuffa = (char *)*(unsigned short *)&pCelBuff[v9 + a6];
if (v11) {
if (a7 == 8 || (v12 = *(unsigned short *)&v10[a7], !*(_WORD *)&v10[a7]))
v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9;
v13 = &v10[(_DWORD)pCelBuffa];
v14 = v12 - (_DWORD)pCelBuffa;
v15 = -(light4flag != 0);
_LOWORD(v15) = v15 & 0xF400;
v16 = v15 + 4096;
if (a8 == 2)
v16 += 256;
if (a8 >= 4)
v16 = v16 + (a8 << 8) - 256;
Cl2DecDatLightTbl1(
(char *)gpBuffer + screen_y_times_768[screen_y - 16 * a6] + screen_x,
v13,
v14,
frame_width,
&pLightTbl[v16]);
}
}
}
}
}
// 525728: using guessed type int light4flag;
void __fastcall Cl2DecDatLightTbl1(char *a1, char *a2, int a3, int a4, char *unused_lindex) /* check 5th arg */
{
char *v5; // esi
char *v6; // edi
int v7; // ebx
int v8; // ecx
int v9; // eax
int v10; // edx
char v11; // dl
v5 = a2;
v6 = a1;
v7 = a4;
v8 = a3;
sgnWidth = a4;
v9 = 0;
v10 = 0;
do {
_LOBYTE(v9) = *v5++;
--v8;
if ((v9 & 0x80u) == 0) {
do {
if (v9 <= v7) {
v10 = v9;
v6 += v9;
v9 = 0;
} else {
v10 = v7;
v6 += v7;
v9 -= v7;
}
v7 -= v10;
if (!v7) {
v7 = sgnWidth;
v6 = &v6[-sgnWidth - 768];
}
} while (v9);
} else {
_LOBYTE(v9) = -(char)v9;
if ((char)v9 <= 65) {
v8 -= v9;
v7 -= v9;
do {
_LOBYTE(v10) = *v5++;
*v6 = unused_lindex[v10];
--v9;
++v6;
} while (v9);
} else {
_LOBYTE(v9) = v9 - 65;
--v8;
v7 -= v9;
_LOBYTE(v10) = *v5++;
v11 = unused_lindex[v10];
do {
*v6 = v11;
--v9;
++v6;
} while (v9);
}
if (!v7) {
v7 = sgnWidth;
v6 = &v6[-sgnWidth - 768];
}
}
} while (v8);
}
// 52B978: using guessed type int sgnWidth;
void __fastcall Cl2DecodeLightTbl(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7)
{
int v7; // esi
char *v8; // edi
int v9; // ebx
char *v10; // edx
int v11; // eax
int v12; // eax
int v13; // eax
char *v14; // edx
char *v15; // ecx
char *pCelBuffa; // [esp+18h] [ebp+8h]
v7 = screen_y;
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
if (nCel > 0) {
v9 = *(_DWORD *)&pCelBuff[4 * nCel];
v10 = &pCelBuff[v9];
v11 = *(unsigned short *)&pCelBuff[v9 + a6];
pCelBuffa = (char *)*(unsigned short *)&pCelBuff[v9 + a6];
if (v11) {
if (a7 == 8 || (v12 = *(unsigned short *)&v10[a7], !*(_WORD *)&v10[a7]))
v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9;
v13 = v12 - (_DWORD)pCelBuffa;
v14 = &v10[(_DWORD)pCelBuffa];
v15 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + screen_x;
if (light_table_index)
Cl2DecDatLightTbl1(
v15,
v14,
v13,
frame_width,
&pLightTbl[256 * light_table_index]);
else
Cl2DecDatFrm1(v15, v14, v13, frame_width);
}
}
}
}
}
// 69BEF8: using guessed type int light_table_index;
void __fastcall Cl2DecodeFrm4(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7)
{
int v7; // ebx
char *v8; // edx
char *v9; // ecx
int v10; // ecx
int v11; // eax
int v12; // [esp+Ch] [ebp-4h]
char *pCelBuffa; // [esp+18h] [ebp+8h]
v7 = screen_y;
v12 = screen_x;
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
if (nCel > 0) {
v9 = *(char **)&pCelBuff[4 * nCel];
pCelBuffa = v9;
v10 = (int)&v9[(_DWORD)v8];
if (*(_WORD *)(v10 + a6)) {
if (a7 == 8 || (v11 = *(unsigned short *)(v10 + a7), !*(_WORD *)(v10 + a7)))
v11 = *(_DWORD *)&v8[4 * nCel + 4] - (_DWORD)pCelBuffa;
Cl2DecDatFrm4(
(char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + v12,
(char *)(*(unsigned short *)(v10 + a6) + v10),
v11 - *(unsigned short *)(v10 + a6),
frame_width);
}
}
}
}
}
void __fastcall Cl2DecDatFrm4(char *buffer, char *a2, int a3, int frame_width)
{
char *v4; // esi
char *v5; // edi
int v6; // eax
int v7; // ebx
int v8; // ecx
char v9; // dl
char v10; // dl
int v11; // edx
v4 = a2;
v5 = buffer;
v6 = 0;
v7 = frame_width;
v8 = a3;
do {
_LOBYTE(v6) = *v4++;
--v8;
if ((v6 & 0x80u) != 0) {
_LOBYTE(v6) = -(char)v6;
if ((char)v6 <= 65) {
v8 -= v6;
if (v5 < (char *)gpBufEnd) {
v7 -= v6;
do {
v10 = *v4++;
*v5 = v10;
--v6;
++v5;
} while (v6);
goto LABEL_12;
}
v4 += v6;
} else {
_LOBYTE(v6) = v6 - 65;
--v8;
v9 = *v4++;
if (v5 < (char *)gpBufEnd) {
v7 -= v6;
do {
*v5 = v9;
--v6;
++v5;
} while (v6);
LABEL_12:
if (!v7) {
v7 = frame_width;
v5 = &v5[-frame_width - 768];
}
continue;
}
}
}
do {
if (v6 <= v7) {
v11 = v6;
v5 += v6;
v6 = 0;
} else {
v11 = v7;
v5 += v7;
v6 -= v7;
}
v7 -= v11;
if (!v7) {
v7 = frame_width;
v5 = &v5[-frame_width - 768];
}
} while (v6);
} while (v8);
}
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall Cl2DecodeClrHL(char colour, int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a7, int a8)
{
int v8; // ebx
char *v9; // edx
int v10; // ecx
int v11; // eax
int v12; // [esp+Ch] [ebp-8h]
char a5; // [esp+10h] [ebp-4h]
v12 = screen_x;
a5 = colour;
if (gpBuffer) {
if (pCelBuff) {
if (nCel > 0) {
v8 = *(_DWORD *)&pCelBuff[4 * nCel];
v9 = &pCelBuff[v8];
v10 = *(unsigned short *)&pCelBuff[v8 + a7];
if (*(_WORD *)&pCelBuff[v8 + a7]) {
if (a8 == 8 || (v11 = *(unsigned short *)&v9[a8], !*(_WORD *)&v9[a8]))
v11 = *(_DWORD *)&pCelBuff[4 * nCel + 4] - v8;
gpBufEnd -= 768;
Cl2DecDatClrHL(
(char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + v12,
&v9[v10],
v11 - v10,
frame_width,
a5);
gpBufEnd += 768;
}
}
}
}
}
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall Cl2DecDatClrHL(char *dst_buf, char *frame_content, int a3, int frame_width, char colour)
{
char *v5; // esi
char *v6; // edi
int v7; // eax
int v8; // ebx
int v9; // ecx
char v10; // dl
char v11; // dh
char v12; // dh
int v13; // edx
v5 = frame_content;
v6 = dst_buf;
v7 = 0;
v8 = frame_width;
v9 = a3;
v10 = colour;
do {
_LOBYTE(v7) = *v5++;
--v9;
if ((v7 & 0x80u) != 0) {
_LOBYTE(v7) = -(char)v7;
if ((char)v7 <= 65) {
v9 -= v7;
if (v6 < (char *)gpBufEnd) {
v8 -= v7;
do {
v12 = *v5++;
if (v12) {
*(v6 - 1) = v10;
v6[1] = v10;
*(v6 - 768) = v10;
v6[768] = v10;
}
--v7;
++v6;
} while (v7);
goto LABEL_15;
}
v5 += v7;
} else {
_LOBYTE(v7) = v7 - 65;
--v9;
v11 = *v5++;
if (v11 && v6 < (char *)gpBufEnd) {
*(v6 - 1) = v10;
v8 -= v7;
v6[v7] = v10;
do {
*(v6 - 768) = v10;
v6[768] = v10;
--v7;
++v6;
} while (v7);
LABEL_15:
if (!v8) {
v8 = frame_width;
v6 = &v6[-frame_width - 768];
}
continue;
}
}
}
do {
if (v7 <= v8) {
v13 = v7;
v6 += v7;
v7 = 0;
} else {
v13 = v8;
v6 += v8;
v7 -= v8;
}
v8 -= v13;
if (!v8) {
v8 = frame_width;
v6 = &v6[-frame_width - 768];
}
} while (v7);
v10 = colour;
} while (v9);
}
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall Cl2DecodeFrm5(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7, char a8)
{
char *v8; // edi
int v9; // ebx
char *v10; // esi
int v11; // eax
int v12; // eax
char *v13; // esi
int v14; // edi
int v15; // eax
int v16; // eax
char *pCelBuffa; // [esp+18h] [ebp+8h]
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
if (nCel > 0) {
v9 = *(_DWORD *)&pCelBuff[4 * nCel];
v10 = &pCelBuff[v9];
v11 = *(unsigned __int16 *)&pCelBuff[v9 + a6];
pCelBuffa = (char *)*(unsigned __int16 *)&pCelBuff[v9 + a6];
if (v11) {
if (a7 == 8 || (v12 = *(unsigned __int16 *)&v10[a7], !*(_WORD *)&v10[a7]))
v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9;
v13 = &v10[(_DWORD)pCelBuffa];
v14 = v12 - (_DWORD)pCelBuffa;
v15 = -(light4flag != 0);
_LOWORD(v15) = v15 & 0xF400;
v16 = v15 + 4096;
if (a8 == 2)
v16 += 256;
if (a8 >= 4)
v16 = v16 + (a8 << 8) - 256;
Cl2DecDatLightTbl2(
(char *)gpBuffer + screen_y_times_768[screen_y - 16 * a6] + screen_x,
v13,
v14,
frame_width,
&pLightTbl[v16]);
}
}
}
}
}
// 525728: using guessed type int light4flag;
void __fastcall Cl2DecDatLightTbl2(char *dst_buf, char *a2, int a3, int frame_width, char *a5) /* check 5th arg */
{
char *v5; // esi
char *v6; // edi
int v7; // ebx
int v8; // ecx
int v9; // eax
int v10; // edx
char v11; // dl
v5 = a2;
v6 = dst_buf;
v7 = frame_width;
v8 = a3;
sgnWidth = frame_width;
v9 = 0;
v10 = 0;
do {
_LOBYTE(v9) = *v5++;
--v8;
if ((v9 & 0x80u) != 0) {
_LOBYTE(v9) = -(char)v9;
if ((char)v9 <= 65) {
v8 -= v9;
if (v6 < (char *)gpBufEnd) {
v7 -= v9;
do {
_LOBYTE(v10) = *v5++;
*v6 = a5[v10];
--v9;
++v6;
} while (v9);
goto LABEL_12;
}
v5 += v9;
} else {
_LOBYTE(v9) = v9 - 65;
--v8;
_LOBYTE(v10) = *v5++;
v11 = a5[v10];
if (v6 < (char *)gpBufEnd) {
v7 -= v9;
do {
*v6 = v11;
--v9;
++v6;
} while (v9);
LABEL_12:
if (!v7) {
v7 = sgnWidth;
v6 = &v6[-sgnWidth - 768];
}
continue;
}
}
}
do {
if (v9 <= v7) {
v10 = v9;
v6 += v9;
v9 = 0;
} else {
v10 = v7;
v6 += v7;
v9 -= v7;
}
v7 -= v10;
if (!v7) {
v7 = sgnWidth;
v6 = &v6[-sgnWidth - 768];
}
} while (v9);
} while (v8);
}
// 52B978: using guessed type int sgnWidth;
// 69CF0C: using guessed type int gpBufEnd;
void __fastcall Cl2DecodeFrm6(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7)
{
int v7; // esi
char *v8; // edi
int v9; // ebx
char *v10; // edx
int v11; // eax
int v12; // eax
int v13; // eax
char *v14; // edx
char *v15; // ecx
char *pCelBuffa; // [esp+18h] [ebp+8h]
v7 = screen_y;
if (gpBuffer) {
v8 = pCelBuff;
if (pCelBuff) {
if (nCel > 0) {
v9 = *(_DWORD *)&pCelBuff[4 * nCel];
v10 = &pCelBuff[v9];
v11 = *(unsigned short *)&pCelBuff[v9 + a6];
pCelBuffa = (char *)*(unsigned short *)&pCelBuff[v9 + a6];
if (v11) {
if (a7 == 8 || (v12 = *(unsigned short *)&v10[a7], !*(_WORD *)&v10[a7]))
v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9;
v13 = v12 - (_DWORD)pCelBuffa;
v14 = &v10[(_DWORD)pCelBuffa];
v15 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + screen_x;
if (light_table_index)
Cl2DecDatLightTbl2(v15, v14, v13, frame_width, &pLightTbl[256 * light_table_index]);
else
Cl2DecDatFrm4(v15, v14, v13, frame_width);
}
}
}
}
}
// 69BEF8: using guessed type int light_table_index;
void __fastcall PlayInGameMovie(char *pszMovie)
{
char *v1; // esi
v1 = pszMovie;
PaletteFadeOut(8);
play_movie(v1, 0);
ClearScreenBuffer();
drawpanflag = 255;
scrollrt_draw_game_screen(1);
PaletteFadeIn(8);
drawpanflag = 255;
}
// 52571C: using guessed type int drawpanflag;