|
|
|
|
//HEADER_GOES_HERE
|
|
|
|
|
|
|
|
|
|
#include "../types.h"
|
|
|
|
|
|
|
|
|
|
void __fastcall town_clear_upper_buf(BYTE *pBuff)
|
|
|
|
|
{
|
|
|
|
|
/// ASSERT: assert(gpBuffer);
|
|
|
|
|
|
|
|
|
|
#if (_MSC_VER >= 800) && (_MSC_VER <= 1200)
|
|
|
|
|
__asm {
|
|
|
|
|
mov edi, pBuff
|
|
|
|
|
mov edx, 30
|
|
|
|
|
mov ebx, 1
|
|
|
|
|
xor eax, eax
|
|
|
|
|
label1:
|
|
|
|
|
cmp edi, gpBufEnd
|
|
|
|
|
jb label4
|
|
|
|
|
add edi, edx
|
|
|
|
|
mov ecx, ebx
|
|
|
|
|
rep stosd
|
|
|
|
|
add edi, edx
|
|
|
|
|
sub edi, 768 + 64
|
|
|
|
|
or edx, edx
|
|
|
|
|
jz label2
|
|
|
|
|
sub edx, 2
|
|
|
|
|
inc ebx
|
|
|
|
|
jmp label1
|
|
|
|
|
label2:
|
|
|
|
|
mov edx, 2
|
|
|
|
|
mov ebx, 15
|
|
|
|
|
label3:
|
|
|
|
|
cmp edi, gpBufEnd
|
|
|
|
|
jb label4
|
|
|
|
|
add edi, edx
|
|
|
|
|
mov ecx, ebx
|
|
|
|
|
rep stosd
|
|
|
|
|
add edi, edx
|
|
|
|
|
sub edi, 768 + 64
|
|
|
|
|
dec ebx
|
|
|
|
|
add edx, 2
|
|
|
|
|
cmp edx, 32
|
|
|
|
|
jnz label3
|
|
|
|
|
label4:
|
|
|
|
|
nop
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
int i, j, k;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
|
|
|
|
|
dst = pBuff;
|
|
|
|
|
|
|
|
|
|
for(i = 30, j = 1; i >= 0 && dst >= gpBufEnd; i -= 2, j++, dst -= 768 + 64) {
|
|
|
|
|
dst += i;
|
|
|
|
|
for(k = 0; k < 4 * j; k++)
|
|
|
|
|
*dst++ = 0;
|
|
|
|
|
dst += i;
|
|
|
|
|
}
|
|
|
|
|
for(i = 2, j = 15; i != 32 && dst >= gpBufEnd; i += 2, j--, dst -= 768 + 64) {
|
|
|
|
|
dst += i;
|
|
|
|
|
for(k = 0; k < 4 * j; k++)
|
|
|
|
|
*dst++ = 0;
|
|
|
|
|
dst += i;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
// 69CF0C: using guessed type int gpBufEnd;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_clear_low_buf(BYTE *pBuff)
|
|
|
|
|
{
|
|
|
|
|
/// ASSERT: assert(gpBuffer);
|
|
|
|
|
|
|
|
|
|
#if (_MSC_VER >= 800) && (_MSC_VER <= 1200)
|
|
|
|
|
__asm {
|
|
|
|
|
mov edi, pBuff
|
|
|
|
|
mov edx, 30
|
|
|
|
|
mov ebx, 1
|
|
|
|
|
xor eax, eax
|
|
|
|
|
label1:
|
|
|
|
|
cmp edi, gpBufEnd
|
|
|
|
|
jb label2
|
|
|
|
|
add edi, 64
|
|
|
|
|
jmp label3
|
|
|
|
|
label2:
|
|
|
|
|
add edi, edx
|
|
|
|
|
mov ecx, ebx
|
|
|
|
|
rep stosd
|
|
|
|
|
add edi, edx
|
|
|
|
|
label3:
|
|
|
|
|
sub edi, 768 + 64
|
|
|
|
|
or edx, edx
|
|
|
|
|
jz label4
|
|
|
|
|
sub edx, 2
|
|
|
|
|
inc ebx
|
|
|
|
|
jmp label1
|
|
|
|
|
label4:
|
|
|
|
|
mov edx, 2
|
|
|
|
|
mov ebx, 15
|
|
|
|
|
label5:
|
|
|
|
|
cmp edi, gpBufEnd
|
|
|
|
|
jb label6
|
|
|
|
|
add edi, 64
|
|
|
|
|
jmp label7
|
|
|
|
|
label6:
|
|
|
|
|
add edi, edx
|
|
|
|
|
mov ecx, ebx
|
|
|
|
|
rep stosd
|
|
|
|
|
add edi, edx
|
|
|
|
|
label7:
|
|
|
|
|
sub edi, 768 + 64
|
|
|
|
|
dec ebx
|
|
|
|
|
add edx, 2
|
|
|
|
|
cmp edx, 32
|
|
|
|
|
jnz label5
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
int i, j, k;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
|
|
|
|
|
dst = pBuff;
|
|
|
|
|
|
|
|
|
|
for(i = 30, j = 1; i >= 0; i -= 2, j++, dst -= 768 + 64) {
|
|
|
|
|
if(dst < gpBufEnd) {
|
|
|
|
|
dst += i;
|
|
|
|
|
for(k = 0; k < 4 * j; k++)
|
|
|
|
|
*dst++ = 0;
|
|
|
|
|
dst += i;
|
|
|
|
|
} else {
|
|
|
|
|
dst += 64;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for(i = 2, j = 15; i != 32; i += 2, j--, dst -= 768 + 64) {
|
|
|
|
|
if(dst < gpBufEnd) {
|
|
|
|
|
dst += i;
|
|
|
|
|
for(k = 0; k < 4 * j; k++)
|
|
|
|
|
*dst++ = 0;
|
|
|
|
|
dst += i;
|
|
|
|
|
} else {
|
|
|
|
|
dst += 64;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
// 69CF0C: using guessed type int gpBufEnd;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
WORD *pMap;
|
|
|
|
|
|
|
|
|
|
dst = pBuff;
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
|
|
|
|
|
for(i = 0; i < 12; i += 2) {
|
|
|
|
|
level_cel_block = pMap[i];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
level_cel_block = pMap[i + 1];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst + 32);
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
town_draw_clipped_town(pBuff, x, y, sx, sy, 0);
|
|
|
|
|
}
|
|
|
|
|
// 69CF14: using guessed type int level_cel_block;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int sy, int some_flag)
|
|
|
|
|
{
|
|
|
|
|
unsigned int v6; // edx
|
|
|
|
|
int v7; // edi
|
|
|
|
|
char v8; // al
|
|
|
|
|
char v9; // al
|
|
|
|
|
int v10; // esi
|
|
|
|
|
int v11; // ebx
|
|
|
|
|
int v12; // esi
|
|
|
|
|
int v13; // ebx
|
|
|
|
|
int v14; // eax
|
|
|
|
|
int v15; // eax
|
|
|
|
|
int v16; // esi
|
|
|
|
|
int v17; // ebx
|
|
|
|
|
char v18; // al
|
|
|
|
|
int v19; // esi
|
|
|
|
|
int v20; // ebx
|
|
|
|
|
int v21; // edi
|
|
|
|
|
char v22; // al
|
|
|
|
|
char v23; // al
|
|
|
|
|
int v24; // esi
|
|
|
|
|
int v25; // ebx
|
|
|
|
|
int v26; // edi
|
|
|
|
|
char *v27; // [esp+Ch] [ebp-Ch]
|
|
|
|
|
int xa; // [esp+10h] [ebp-8h]
|
|
|
|
|
int v29; // [esp+14h] [ebp-4h]
|
|
|
|
|
|
|
|
|
|
xa = x;
|
|
|
|
|
v6 = 112 * x;
|
|
|
|
|
v27 = (char *)gpBuffer + screen_y_times_768[sy] + sx;
|
|
|
|
|
v7 = v6 + y;
|
|
|
|
|
v29 = v6 + y;
|
|
|
|
|
v8 = dItem[v6 / 0x70][y];
|
|
|
|
|
if (v8) {
|
|
|
|
|
v9 = v8 - 1;
|
|
|
|
|
v10 = v9;
|
|
|
|
|
v11 = sx - item[v10]._iAnimWidth2;
|
|
|
|
|
if (v9 == pcursitem)
|
|
|
|
|
CelDrawHdrClrHL(
|
|
|
|
|
ICOL_BLUE,
|
|
|
|
|
v11,
|
|
|
|
|
sy,
|
|
|
|
|
item[v10]._iAnimData,
|
|
|
|
|
item[v10]._iAnimFrame,
|
|
|
|
|
item[v10]._iAnimWidth,
|
|
|
|
|
0,
|
|
|
|
|
8);
|
|
|
|
|
Cel2DrawHdrOnly(v11, sy, item[v10]._iAnimData, item[v10]._iAnimFrame, item[v10]._iAnimWidth, 0, 8);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v7] & DFLAG_MONSTER) {
|
|
|
|
|
v12 = -1 - dMonster[x][y - 1]; // -1 - *(&dword_52D204 + v7); /* check */
|
|
|
|
|
v13 = sx - towner[v12]._tAnimWidth2;
|
|
|
|
|
if (v12 == pcursmonst)
|
|
|
|
|
CelDrawHdrClrHL(
|
|
|
|
|
166,
|
|
|
|
|
v13,
|
|
|
|
|
sy,
|
|
|
|
|
towner[v12]._tAnimData,
|
|
|
|
|
towner[v12]._tAnimFrame,
|
|
|
|
|
towner[v12]._tAnimWidth,
|
|
|
|
|
0,
|
|
|
|
|
8);
|
|
|
|
|
Cel2DrawHdrOnly(v13, sy, towner[v12]._tAnimData, towner[v12]._tAnimFrame, towner[v12]._tAnimWidth, 0, 8);
|
|
|
|
|
}
|
|
|
|
|
v14 = dMonster[0][v7];
|
|
|
|
|
if (v14 > 0) {
|
|
|
|
|
v15 = v14 - 1;
|
|
|
|
|
v16 = v15;
|
|
|
|
|
v17 = sx - towner[v15]._tAnimWidth2;
|
|
|
|
|
if (v15 == pcursmonst)
|
|
|
|
|
CelDrawHdrClrHL(
|
|
|
|
|
166,
|
|
|
|
|
v17,
|
|
|
|
|
sy,
|
|
|
|
|
towner[v16]._tAnimData,
|
|
|
|
|
towner[v16]._tAnimFrame,
|
|
|
|
|
towner[v16]._tAnimWidth,
|
|
|
|
|
0,
|
|
|
|
|
8);
|
|
|
|
|
Cel2DrawHdrOnly(v17, sy, towner[v16]._tAnimData, towner[v16]._tAnimFrame, towner[v16]._tAnimWidth, 0, 8);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v7] & DFLAG_PLAYER) {
|
|
|
|
|
v18 = -1 - dPlayer[x][y - 1]; // -1 - *((_BYTE *)&themeLoc[49].height + v7 + 3);
|
|
|
|
|
v19 = v18;
|
|
|
|
|
v20 = sy + plr[v19]._pyoff;
|
|
|
|
|
v21 = sx + plr[v19]._pxoff - plr[v19]._pAnimWidth2;
|
|
|
|
|
if (v18 == pcursplr)
|
|
|
|
|
Cl2DecodeClrHL(165, v21, v20, plr[v19]._pAnimData, plr[v19]._pAnimFrame, plr[v19]._pAnimWidth, 0, 8);
|
|
|
|
|
Cl2DecodeFrm4(v21, v20, plr[v19]._pAnimData, plr[v19]._pAnimFrame, plr[v19]._pAnimWidth, 0, 8);
|
|
|
|
|
if (some_flag && plr[v19]._peflag)
|
|
|
|
|
town_draw_clipped_e_flag((BYTE *)v27 - 64, xa - 1, y + 1, sx - 64, sy);
|
|
|
|
|
v7 = v29;
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v7] & DFLAG_DEAD_PLAYER)
|
|
|
|
|
DrawDeadPlayer(xa, y, sx, sy, 0, 8, 1);
|
|
|
|
|
v22 = dPlayer[0][v7];
|
|
|
|
|
if (v22 > 0) {
|
|
|
|
|
v23 = v22 - 1;
|
|
|
|
|
v24 = v23;
|
|
|
|
|
v25 = sy + plr[v24]._pyoff;
|
|
|
|
|
v26 = sx + plr[v24]._pxoff - plr[v24]._pAnimWidth2;
|
|
|
|
|
if (v23 == pcursplr)
|
|
|
|
|
Cl2DecodeClrHL(165, v26, v25, plr[v24]._pAnimData, plr[v24]._pAnimFrame, plr[v24]._pAnimWidth, 0, 8);
|
|
|
|
|
Cl2DecodeFrm4(v26, v25, plr[v24]._pAnimData, plr[v24]._pAnimFrame, plr[v24]._pAnimWidth, 0, 8);
|
|
|
|
|
if (some_flag && plr[v24]._peflag)
|
|
|
|
|
town_draw_clipped_e_flag((BYTE *)v27 - 64, xa - 1, y + 1, sx - 64, sy);
|
|
|
|
|
v7 = v29;
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v7] & DFLAG_MISSILE)
|
|
|
|
|
DrawClippedMissile(xa, y, sx, sy, 0, 8, FALSE);
|
|
|
|
|
}
|
|
|
|
|
// 4B8CC0: using guessed type char pcursitem;
|
|
|
|
|
// 4B8CC2: using guessed type char pcursplr;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_lower(int x, int y, int sx, int sy, int a5, int some_flag)
|
|
|
|
|
{
|
|
|
|
|
int i, j;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
WORD *pMap;
|
|
|
|
|
|
|
|
|
|
/// ASSERT: assert(gpBuffer);
|
|
|
|
|
|
|
|
|
|
if(some_flag) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx + 32 + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 1; i < 17; i += 2) {
|
|
|
|
|
level_cel_block = pMap[i];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
town_draw_clipped_town(&gpBuffer[sx + screen_y_times_768[sy]], x, y, sx, sy, 0);
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
x++;
|
|
|
|
|
y--;
|
|
|
|
|
sx += 64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(j = 0; j < a5 - some_flag; j++) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 16; i += 2) {
|
|
|
|
|
level_cel_block = pMap[i];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
level_cel_block = pMap[i + 1];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst + 32);
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
town_draw_clipped_town(&gpBuffer[sx + screen_y_times_768[sy]], x, y, sx, sy, 1);
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
x++;
|
|
|
|
|
y--;
|
|
|
|
|
sx += 64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(some_flag) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 16; i += 2) {
|
|
|
|
|
level_cel_block = pMap[i];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
town_draw_clipped_town(&gpBuffer[sx + screen_y_times_768[sy]], x, y, sx, sy, 0);
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 69CF14: using guessed type int level_cel_block;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int a4, int a5, int sx, int sy)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
WORD *pMap;
|
|
|
|
|
|
|
|
|
|
if(a4 == 0) {
|
|
|
|
|
dst = pBuff;
|
|
|
|
|
} else {
|
|
|
|
|
dst = &pBuff[768 * 32 * a4];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
|
|
|
|
|
for(i = 0; i < 6; i++) {
|
|
|
|
|
if(a4 <= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i + 2];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
level_cel_block = pMap[2 * i + 3];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst + 32);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(a5 < 8) {
|
|
|
|
|
town_draw_clipped_town_2((int)pBuff, x, y, a4, a5, sx, sy, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 69CF14: using guessed type int level_cel_block;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, int sx, int sy, int some_flag)
|
|
|
|
|
{
|
|
|
|
|
unsigned int v8; // edx
|
|
|
|
|
int v9; // ebx
|
|
|
|
|
char v10; // al
|
|
|
|
|
char v11; // al
|
|
|
|
|
int v12; // esi
|
|
|
|
|
int v13; // edi
|
|
|
|
|
int v14; // esi
|
|
|
|
|
int v15; // edi
|
|
|
|
|
int v16; // eax
|
|
|
|
|
int v17; // eax
|
|
|
|
|
int v18; // esi
|
|
|
|
|
int v19; // edi
|
|
|
|
|
char v20; // al
|
|
|
|
|
int v21; // esi
|
|
|
|
|
int v22; // ebx
|
|
|
|
|
int v23; // edi
|
|
|
|
|
char v24; // al
|
|
|
|
|
char v25; // al
|
|
|
|
|
int v26; // esi
|
|
|
|
|
int v27; // ebx
|
|
|
|
|
int v28; // edi
|
|
|
|
|
int v29; // [esp+Ch] [ebp-Ch]
|
|
|
|
|
int xa; // [esp+10h] [ebp-8h]
|
|
|
|
|
int v31; // [esp+14h] [ebp-4h]
|
|
|
|
|
|
|
|
|
|
xa = y;
|
|
|
|
|
v8 = 112 * y;
|
|
|
|
|
v9 = v8 + a3;
|
|
|
|
|
v29 = x;
|
|
|
|
|
v31 = v8 + a3;
|
|
|
|
|
v10 = dItem[v8 / 0x70][a3];
|
|
|
|
|
if (v10) {
|
|
|
|
|
v11 = v10 - 1;
|
|
|
|
|
v12 = v11;
|
|
|
|
|
v13 = sx - item[v12]._iAnimWidth2;
|
|
|
|
|
if (v11 == pcursitem)
|
|
|
|
|
CelDrawHdrClrHL(
|
|
|
|
|
ICOL_BLUE,
|
|
|
|
|
v13,
|
|
|
|
|
sy,
|
|
|
|
|
item[v12]._iAnimData,
|
|
|
|
|
item[v12]._iAnimFrame,
|
|
|
|
|
item[v12]._iAnimWidth,
|
|
|
|
|
a5,
|
|
|
|
|
8);
|
|
|
|
|
Cel2DrawHdrOnly(v13, sy, item[v12]._iAnimData, item[v12]._iAnimFrame, item[v12]._iAnimWidth, a5, 8);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v9] & DFLAG_MONSTER) {
|
|
|
|
|
v14 = -1 - dMonster[y][a3 - 1]; // -1 - *(&dword_52D204 + v9); /* check */
|
|
|
|
|
v15 = sx - towner[v14]._tAnimWidth2;
|
|
|
|
|
if (v14 == pcursmonst)
|
|
|
|
|
CelDrawHdrClrHL(
|
|
|
|
|
166,
|
|
|
|
|
v15,
|
|
|
|
|
sy,
|
|
|
|
|
towner[v14]._tAnimData,
|
|
|
|
|
towner[v14]._tAnimFrame,
|
|
|
|
|
towner[v14]._tAnimWidth,
|
|
|
|
|
a5,
|
|
|
|
|
8);
|
|
|
|
|
Cel2DrawHdrOnly(v15, sy, towner[v14]._tAnimData, towner[v14]._tAnimFrame, towner[v14]._tAnimWidth, a5, 8);
|
|
|
|
|
}
|
|
|
|
|
v16 = dMonster[0][v9];
|
|
|
|
|
if (v16 > 0) {
|
|
|
|
|
v17 = v16 - 1;
|
|
|
|
|
v18 = v17;
|
|
|
|
|
v19 = sx - towner[v17]._tAnimWidth2;
|
|
|
|
|
if (v17 == pcursmonst)
|
|
|
|
|
CelDrawHdrClrHL(
|
|
|
|
|
166,
|
|
|
|
|
v19,
|
|
|
|
|
sy,
|
|
|
|
|
towner[v18]._tAnimData,
|
|
|
|
|
towner[v18]._tAnimFrame,
|
|
|
|
|
towner[v18]._tAnimWidth,
|
|
|
|
|
a5,
|
|
|
|
|
8);
|
|
|
|
|
Cel2DrawHdrOnly(v19, sy, towner[v18]._tAnimData, towner[v18]._tAnimFrame, towner[v18]._tAnimWidth, a5, 8);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v9] & DFLAG_PLAYER) {
|
|
|
|
|
v20 = -1 - dPlayer[y][a3 - 1]; // -1 - *((_BYTE *)&themeLoc[49].height + v9 + 3);
|
|
|
|
|
v21 = v20;
|
|
|
|
|
v22 = sy + plr[v21]._pyoff;
|
|
|
|
|
v23 = sx + plr[v21]._pxoff - plr[v21]._pAnimWidth2;
|
|
|
|
|
if (v20 == pcursplr)
|
|
|
|
|
Cl2DecodeClrHL(165, v23, v22, plr[v21]._pAnimData, plr[v21]._pAnimFrame, plr[v21]._pAnimWidth, a5, 8);
|
|
|
|
|
Cl2DecodeFrm4(v23, v22, plr[v21]._pAnimData, plr[v21]._pAnimFrame, plr[v21]._pAnimWidth, a5, 8);
|
|
|
|
|
if (some_flag && plr[v21]._peflag)
|
|
|
|
|
town_draw_clipped_e_flag_2((BYTE *)(v29 - 64), xa - 1, a3 + 1, a4, a5, sx - 64, sy);
|
|
|
|
|
v9 = v31;
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v9] & DFLAG_DEAD_PLAYER)
|
|
|
|
|
DrawDeadPlayer(xa, a3, sx, sy, a5, 8, 1);
|
|
|
|
|
v24 = dPlayer[0][v9];
|
|
|
|
|
if (v24 > 0) {
|
|
|
|
|
v25 = v24 - 1;
|
|
|
|
|
v26 = v25;
|
|
|
|
|
v27 = sy + plr[v26]._pyoff;
|
|
|
|
|
v28 = sx + plr[v26]._pxoff - plr[v26]._pAnimWidth2;
|
|
|
|
|
if (v25 == pcursplr)
|
|
|
|
|
Cl2DecodeClrHL(165, v28, v27, plr[v26]._pAnimData, plr[v26]._pAnimFrame, plr[v26]._pAnimWidth, a5, 8);
|
|
|
|
|
Cl2DecodeFrm4(v28, v27, plr[v26]._pAnimData, plr[v26]._pAnimFrame, plr[v26]._pAnimWidth, a5, 8);
|
|
|
|
|
if (some_flag && plr[v26]._peflag)
|
|
|
|
|
town_draw_clipped_e_flag_2((BYTE *)(v29 - 64), xa - 1, a3 + 1, a4, a5, sx - 64, sy);
|
|
|
|
|
v9 = v31;
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[0][v9] & DFLAG_MISSILE)
|
|
|
|
|
DrawClippedMissile(xa, a3, sx, sy, a5, 8, FALSE);
|
|
|
|
|
}
|
|
|
|
|
// 4B8CC0: using guessed type char pcursitem;
|
|
|
|
|
// 4B8CC2: using guessed type char pcursplr;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_lower_2(int x, int y, int sx, int sy, int a5, int a6, int some_flag)
|
|
|
|
|
{
|
|
|
|
|
int i, j, dir;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
WORD *pMap;
|
|
|
|
|
|
|
|
|
|
/// ASSERT: assert(gpBuffer);
|
|
|
|
|
|
|
|
|
|
dir = 2 * a6 + 2;
|
|
|
|
|
|
|
|
|
|
if(some_flag) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx - (768 * 32 - 32) + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 7; i++) {
|
|
|
|
|
if(a6 <= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i + 3];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
if(dir < 8) {
|
|
|
|
|
town_draw_clipped_town_2((int)&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
x++;
|
|
|
|
|
y--;
|
|
|
|
|
sx += 64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(j = 0; j < a5 - some_flag; j++) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx - 768 * 32 + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 7; i++) {
|
|
|
|
|
if(a6 <= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i + 2];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
level_cel_block = pMap[2 * i + 3];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst + 32);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
if(dir < 8) {
|
|
|
|
|
town_draw_clipped_town_2((int)&gpBuffer[sx + screen_y_times_768[sy] - 768 * 16 * dir], x, y, a6, dir, sx, sy, 1);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
x++;
|
|
|
|
|
y--;
|
|
|
|
|
sx += 64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(some_flag) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx - 768 * 32 + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 7; i++) {
|
|
|
|
|
if(a6 <= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i + 2];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawLowerScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
if(dir < 8) {
|
|
|
|
|
town_draw_clipped_town_2((int)&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 69CF14: using guessed type int level_cel_block;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_e_flag(BYTE *pBuff, int x, int y, int a4, int dir, int sx, int sy)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
WORD *pMap;
|
|
|
|
|
|
|
|
|
|
dst = pBuff;
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
|
|
|
|
|
for(i = 0; i < 7; i++) {
|
|
|
|
|
if(a4 >= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawUpperScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
level_cel_block = pMap[2 * i + 1];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawUpperScreen(dst + 32);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
town_draw_town_all(pBuff, x, y, a4, dir, sx, sy, 0);
|
|
|
|
|
}
|
|
|
|
|
// 69CF14: using guessed type int level_cel_block;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_town_all(BYTE *buffer, int x, int y, int a4, int dir, int sx, int sy, int some_flag)
|
|
|
|
|
{
|
|
|
|
|
char ii, pnum;
|
|
|
|
|
int mi;
|
|
|
|
|
int xx, yy;
|
|
|
|
|
|
|
|
|
|
if (dItem[x][y]) {
|
|
|
|
|
ii = dItem[x][y] - 1;
|
|
|
|
|
xx = sx - item[ii]._iAnimWidth2;
|
|
|
|
|
if (ii == pcursitem)
|
|
|
|
|
CelDecodeClr(ICOL_BLUE, xx, sy, item[ii]._iAnimData, item[ii]._iAnimFrame, item[ii]._iAnimWidth, 0, dir);
|
|
|
|
|
CelDrawHdrOnly(xx, sy, item[ii]._iAnimData, item[ii]._iAnimFrame, item[ii]._iAnimWidth, 0, dir);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[x][y] & DFLAG_MONSTER) {
|
|
|
|
|
mi = -1 - dMonster[x][y - 1];
|
|
|
|
|
xx = sx - towner[mi]._tAnimWidth2;
|
|
|
|
|
if (mi == pcursmonst)
|
|
|
|
|
CelDecodeClr(PAL16_BEIGE + 6, xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir);
|
|
|
|
|
CelDrawHdrOnly(xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir);
|
|
|
|
|
}
|
|
|
|
|
if (dMonster[x][y] > 0) {
|
|
|
|
|
mi = dMonster[x][y] - 1;
|
|
|
|
|
xx = sx - towner[mi]._tAnimWidth2;
|
|
|
|
|
if (mi == pcursmonst)
|
|
|
|
|
CelDecodeClr(PAL16_BEIGE + 6, xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir);
|
|
|
|
|
CelDrawHdrOnly(xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[x][y] & DFLAG_PLAYER) {
|
|
|
|
|
pnum = -1 - dPlayer[x][y - 1];
|
|
|
|
|
yy = sy + plr[pnum]._pyoff;
|
|
|
|
|
xx = sx + plr[pnum]._pxoff - plr[pnum]._pAnimWidth2;
|
|
|
|
|
if (pnum == pcursplr)
|
|
|
|
|
Cl2DecodeFrm2(PAL16_BEIGE + 5, xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir);
|
|
|
|
|
Cl2DecodeFrm1(xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir);
|
|
|
|
|
if (some_flag && plr[pnum]._peflag)
|
|
|
|
|
town_draw_e_flag(buffer - 64, x - 1, y + 1, a4, dir, sx - 64, sy);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[x][y] & DFLAG_DEAD_PLAYER)
|
|
|
|
|
DrawDeadPlayer(x, y, sx, sy, 0, dir, 0);
|
|
|
|
|
if (dPlayer[x][y] > 0) {
|
|
|
|
|
pnum = dPlayer[x][y] - 1;
|
|
|
|
|
yy = sy + plr[pnum]._pyoff;
|
|
|
|
|
xx = sx + plr[pnum]._pxoff - plr[pnum]._pAnimWidth2;
|
|
|
|
|
if (pnum == pcursplr)
|
|
|
|
|
Cl2DecodeFrm2(PAL16_BEIGE + 5, xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir);
|
|
|
|
|
Cl2DecodeFrm1(xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir);
|
|
|
|
|
if (some_flag && plr[pnum]._peflag)
|
|
|
|
|
town_draw_e_flag(buffer - 64, x - 1, y + 1, a4, dir, sx - 64, sy);
|
|
|
|
|
}
|
|
|
|
|
if (dFlags[x][y] & DFLAG_MISSILE)
|
|
|
|
|
DrawMissile(x, y, sx, sy, 0, dir, FALSE);
|
|
|
|
|
}
|
|
|
|
|
// 4B8CC0: using guessed type char pcursitem;
|
|
|
|
|
// 4B8CC2: using guessed type char pcursplr;
|
|
|
|
|
|
|
|
|
|
void __fastcall town_draw_upper(int x, int y, int sx, int sy, int a5, int a6, int some_flag)
|
|
|
|
|
{
|
|
|
|
|
int i, j, dir;
|
|
|
|
|
BYTE *dst;
|
|
|
|
|
WORD *pMap;
|
|
|
|
|
|
|
|
|
|
/// ASSERT: assert(gpBuffer);
|
|
|
|
|
|
|
|
|
|
dir = 2 * a6 + 2;
|
|
|
|
|
if(dir > 8) {
|
|
|
|
|
dir = 8;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(some_flag) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx + 32 + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 7; i++) {
|
|
|
|
|
if(a6 >= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i + 1];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawUpperScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
town_draw_town_all(&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0);
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_upper_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_upper_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
x++;
|
|
|
|
|
y--;
|
|
|
|
|
sx += 64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(j = 0; j < a5 - some_flag; j++) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 7; i++) {
|
|
|
|
|
if(a6 >= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawUpperScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
level_cel_block = pMap[2 * i + 1];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawUpperScreen(dst + 32);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
town_draw_town_all(&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 1);
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_upper_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_upper_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
x++;
|
|
|
|
|
y--;
|
|
|
|
|
sx += 64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(some_flag) {
|
|
|
|
|
if(y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {
|
|
|
|
|
level_cel_block = dPiece[x][y];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
dst = &gpBuffer[sx + screen_y_times_768[sy]];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
for(i = 0; i < 7; i++) {
|
|
|
|
|
if(a6 >= i) {
|
|
|
|
|
level_cel_block = pMap[2 * i];
|
|
|
|
|
if(level_cel_block != 0) {
|
|
|
|
|
drawUpperScreen(dst);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dst -= 768 * 32;
|
|
|
|
|
}
|
|
|
|
|
town_draw_town_all(&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0);
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_upper_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
town_clear_upper_buf(&gpBuffer[sx + screen_y_times_768[sy]]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 69CF14: using guessed type int level_cel_block;
|
|
|
|
|
|
|
|
|
|
void __fastcall T_DrawGame(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
int v2; // esi
|
|
|
|
|
int v3; // edi
|
|
|
|
|
int v4; // ebx
|
|
|
|
|
int v5; // ebx
|
|
|
|
|
int v6; // esi
|
|
|
|
|
int v7; // ebx
|
|
|
|
|
int v8; // esi
|
|
|
|
|
int v9; // ebx
|
|
|
|
|
int v10; // esi
|
|
|
|
|
signed int v11; // [esp+Ch] [ebp-10h]
|
|
|
|
|
signed int a6; // [esp+10h] [ebp-Ch]
|
|
|
|
|
signed int a6a; // [esp+10h] [ebp-Ch]
|
|
|
|
|
signed int a5; // [esp+14h] [ebp-8h]
|
|
|
|
|
int ya; // [esp+18h] [ebp-4h]
|
|
|
|
|
|
|
|
|
|
v2 = ScrollInfo._sxoff + 64;
|
|
|
|
|
v3 = x - 10;
|
|
|
|
|
ya = y - 1;
|
|
|
|
|
v4 = ScrollInfo._syoff + 175;
|
|
|
|
|
dword_5C2FF8 = 10;
|
|
|
|
|
a5 = 10;
|
|
|
|
|
scr_pix_width = 640;
|
|
|
|
|
scr_pix_height = 352;
|
|
|
|
|
dword_5C2FFC = 11;
|
|
|
|
|
v11 = 5;
|
|
|
|
|
if (chrflag || questlog) {
|
|
|
|
|
ya = y - 3;
|
|
|
|
|
v3 += 2;
|
|
|
|
|
v2 = ScrollInfo._sxoff + 352;
|
|
|
|
|
a5 = 6;
|
|
|
|
|
}
|
|
|
|
|
if (invflag || sbookflag) {
|
|
|
|
|
ya -= 2;
|
|
|
|
|
v3 += 2;
|
|
|
|
|
v2 -= 32;
|
|
|
|
|
a5 = 6;
|
|
|
|
|
}
|
|
|
|
|
switch (ScrollInfo._sdir) {
|
|
|
|
|
case DIR_SW:
|
|
|
|
|
v4 = ScrollInfo._syoff + 143;
|
|
|
|
|
--v3;
|
|
|
|
|
--ya;
|
|
|
|
|
goto LABEL_15;
|
|
|
|
|
case DIR_W:
|
|
|
|
|
v4 = ScrollInfo._syoff + 143;
|
|
|
|
|
--v3;
|
|
|
|
|
--ya;
|
|
|
|
|
goto LABEL_14;
|
|
|
|
|
case DIR_NW:
|
|
|
|
|
goto LABEL_12;
|
|
|
|
|
case DIR_N:
|
|
|
|
|
goto LABEL_14;
|
|
|
|
|
case DIR_NE:
|
|
|
|
|
goto LABEL_15;
|
|
|
|
|
case DIR_E:
|
|
|
|
|
v2 -= 64;
|
|
|
|
|
--v3;
|
|
|
|
|
++ya;
|
|
|
|
|
goto LABEL_14;
|
|
|
|
|
case DIR_SE:
|
|
|
|
|
v2 -= 64;
|
|
|
|
|
--v3;
|
|
|
|
|
++ya;
|
|
|
|
|
LABEL_12:
|
|
|
|
|
++a5;
|
|
|
|
|
break;
|
|
|
|
|
case DIR_OMNI:
|
|
|
|
|
v2 -= 64;
|
|
|
|
|
v4 = ScrollInfo._syoff + 143;
|
|
|
|
|
v3 -= 2;
|
|
|
|
|
LABEL_14:
|
|
|
|
|
++a5;
|
|
|
|
|
LABEL_15:
|
|
|
|
|
v11 = 6;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
a6 = 0;
|
|
|
|
|
gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[160];
|
|
|
|
|
do {
|
|
|
|
|
town_draw_upper(v3, ya++, v2, v4, a5, a6, 0);
|
|
|
|
|
v5 = v4 + 16;
|
|
|
|
|
v6 = v2 - 32;
|
|
|
|
|
town_draw_upper(v3++, ya, v6, v5, a5, a6, 1);
|
|
|
|
|
v2 = v6 + 32;
|
|
|
|
|
v4 = v5 + 16;
|
|
|
|
|
++a6;
|
|
|
|
|
} while (a6 < 7);
|
|
|
|
|
gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[512];
|
|
|
|
|
if (v11 > 0) {
|
|
|
|
|
do {
|
|
|
|
|
town_draw_lower(v3, ya++, v2, v4, a5, 0);
|
|
|
|
|
v7 = v4 + 16;
|
|
|
|
|
v8 = v2 - 32;
|
|
|
|
|
town_draw_lower(v3++, ya, v8, v7, a5, 1);
|
|
|
|
|
v2 = v8 + 32;
|
|
|
|
|
v4 = v7 + 16;
|
|
|
|
|
--v11;
|
|
|
|
|
} while (v11);
|
|
|
|
|
}
|
|
|
|
|
a6a = 0;
|
|
|
|
|
do {
|
|
|
|
|
town_draw_lower_2(v3, ya++, v2, v4, a5, a6a, 0);
|
|
|
|
|
v9 = v4 + 16;
|
|
|
|
|
v10 = v2 - 32;
|
|
|
|
|
town_draw_lower_2(v3++, ya, v10, v9, a5, a6a, 1);
|
|
|
|
|
v2 = v10 + 32;
|
|
|
|
|
v4 = v9 + 16;
|
|
|
|
|
++a6a;
|
|
|
|
|
} while (a6a < 7);
|
|
|
|
|
}
|
|
|
|
|
// 4B8968: using guessed type int sbookflag;
|
|
|
|
|
// 5C2FF8: using guessed type int dword_5C2FF8;
|
|
|
|
|
// 5C2FFC: using guessed type int dword_5C2FFC;
|
|
|
|
|
// 5C3000: using guessed type int scr_pix_width;
|
|
|
|
|
// 5C3004: using guessed type int scr_pix_height;
|
|
|
|
|
// 69BD04: using guessed type int questlog;
|
|
|
|
|
// 69CF0C: using guessed type int gpBufEnd;
|
|
|
|
|
|
|
|
|
|
void __fastcall T_DrawZoom(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
int v2; // edi
|
|
|
|
|
int v3; // ebx
|
|
|
|
|
int v4; // esi
|
|
|
|
|
int v5; // esi
|
|
|
|
|
int v6; // edi
|
|
|
|
|
int v7; // esi
|
|
|
|
|
int v8; // edi
|
|
|
|
|
int v9; // esi
|
|
|
|
|
int v10; // edi
|
|
|
|
|
_WORD *v11; // edi
|
|
|
|
|
char *v12; // esi
|
|
|
|
|
char *v13; // ebx
|
|
|
|
|
signed int v14; // edx
|
|
|
|
|
signed int v15; // ecx
|
|
|
|
|
short v16; // ax
|
|
|
|
|
int v17; // eax
|
|
|
|
|
signed int v18; // [esp+Ch] [ebp-10h]
|
|
|
|
|
signed int v19; // [esp+Ch] [ebp-10h]
|
|
|
|
|
signed int a6; // [esp+10h] [ebp-Ch]
|
|
|
|
|
signed int a6a; // [esp+10h] [ebp-Ch]
|
|
|
|
|
int a6b; // [esp+10h] [ebp-Ch]
|
|
|
|
|
signed int a5; // [esp+14h] [ebp-8h]
|
|
|
|
|
int a5a; // [esp+14h] [ebp-8h]
|
|
|
|
|
int ya; // [esp+18h] [ebp-4h]
|
|
|
|
|
|
|
|
|
|
v18 = 0;
|
|
|
|
|
v2 = ScrollInfo._sxoff + 64;
|
|
|
|
|
dword_5C2FF8 = 6;
|
|
|
|
|
dword_5C2FFC = 6;
|
|
|
|
|
v3 = x - 6;
|
|
|
|
|
a5 = 6;
|
|
|
|
|
v4 = ScrollInfo._syoff + 143;
|
|
|
|
|
ya = y - 1;
|
|
|
|
|
scr_pix_width = 384;
|
|
|
|
|
scr_pix_height = 192;
|
|
|
|
|
switch (ScrollInfo._sdir) {
|
|
|
|
|
case DIR_SW:
|
|
|
|
|
v4 = ScrollInfo._syoff + 111;
|
|
|
|
|
v3 = x - 7;
|
|
|
|
|
ya = y - 2;
|
|
|
|
|
goto LABEL_9;
|
|
|
|
|
case DIR_W:
|
|
|
|
|
v4 = ScrollInfo._syoff + 111;
|
|
|
|
|
v3 = x - 7;
|
|
|
|
|
ya = y - 2;
|
|
|
|
|
goto LABEL_8;
|
|
|
|
|
case DIR_NW:
|
|
|
|
|
goto LABEL_6;
|
|
|
|
|
case DIR_N:
|
|
|
|
|
goto LABEL_8;
|
|
|
|
|
case DIR_NE:
|
|
|
|
|
goto LABEL_9;
|
|
|
|
|
case DIR_E:
|
|
|
|
|
v2 = ScrollInfo._sxoff;
|
|
|
|
|
v3 = x - 7;
|
|
|
|
|
ya = y;
|
|
|
|
|
goto LABEL_8;
|
|
|
|
|
case DIR_SE:
|
|
|
|
|
v2 = ScrollInfo._sxoff;
|
|
|
|
|
v3 = x - 7;
|
|
|
|
|
ya = y;
|
|
|
|
|
LABEL_6:
|
|
|
|
|
a5 = 7;
|
|
|
|
|
break;
|
|
|
|
|
case DIR_OMNI:
|
|
|
|
|
v2 = ScrollInfo._sxoff;
|
|
|
|
|
v4 = ScrollInfo._syoff + 111;
|
|
|
|
|
v3 = x - 8;
|
|
|
|
|
LABEL_8:
|
|
|
|
|
a5 = 7;
|
|
|
|
|
LABEL_9:
|
|
|
|
|
v18 = 1;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
a6 = 0;
|
|
|
|
|
gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[143];
|
|
|
|
|
do {
|
|
|
|
|
town_draw_upper(v3, ya++, v2, v4, a5, a6, 0);
|
|
|
|
|
v5 = v4 + 16;
|
|
|
|
|
v6 = v2 - 32;
|
|
|
|
|
town_draw_upper(v3++, ya, v6, v5, a5, a6, 1);
|
|
|
|
|
v2 = v6 + 32;
|
|
|
|
|
v4 = v5 + 16;
|
|
|
|
|
++a6;
|
|
|
|
|
} while (a6 < 7);
|
|
|
|
|
gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[320];
|
|
|
|
|
if (v18 > 0) {
|
|
|
|
|
do {
|
|
|
|
|
town_draw_lower(v3, ya++, v2, v4, a5, 0);
|
|
|
|
|
v7 = v4 + 16;
|
|
|
|
|
v8 = v2 - 32;
|
|
|
|
|
town_draw_lower(v3++, ya, v8, v7, a5, 1);
|
|
|
|
|
v2 = v8 + 32;
|
|
|
|
|
v4 = v7 + 16;
|
|
|
|
|
--v18;
|
|
|
|
|
} while (v18);
|
|
|
|
|
}
|
|
|
|
|
a6a = 0;
|
|
|
|
|
do {
|
|
|
|
|
town_draw_lower_2(v3, ya++, v2, v4, a5, a6a, 0);
|
|
|
|
|
v9 = v4 + 16;
|
|
|
|
|
v10 = v2 - 32;
|
|
|
|
|
town_draw_lower_2(v3++, ya, v10, v9, a5, a6a, 1);
|
|
|
|
|
v2 = v10 + 32;
|
|
|
|
|
v4 = v9 + 16;
|
|
|
|
|
++a6a;
|
|
|
|
|
} while (a6a < 7);
|
|
|
|
|
if (chrflag || questlog) {
|
|
|
|
|
a5a = 392064;
|
|
|
|
|
goto LABEL_23;
|
|
|
|
|
}
|
|
|
|
|
if (invflag || sbookflag) {
|
|
|
|
|
a5a = 391744;
|
|
|
|
|
LABEL_23:
|
|
|
|
|
a6b = 245168;
|
|
|
|
|
v19 = 160;
|
|
|
|
|
goto LABEL_24;
|
|
|
|
|
}
|
|
|
|
|
a6b = 245088;
|
|
|
|
|
a5a = 391744;
|
|
|
|
|
v19 = 320;
|
|
|
|
|
LABEL_24:
|
|
|
|
|
v11 = (_WORD *)((char *)gpBuffer + a5a);
|
|
|
|
|
v12 = (char *)gpBuffer + a6b;
|
|
|
|
|
v13 = (char *)&gpBuffer[a5a + 768];
|
|
|
|
|
v14 = 176;
|
|
|
|
|
do {
|
|
|
|
|
v15 = v19;
|
|
|
|
|
do {
|
|
|
|
|
_LOBYTE(v16) = *v12++;
|
|
|
|
|
_HIBYTE(v16) = v16;
|
|
|
|
|
*v11 = v16;
|
|
|
|
|
*(_WORD *)v13 = v16;
|
|
|
|
|
++v11;
|
|
|
|
|
v13 += 2;
|
|
|
|
|
--v15;
|
|
|
|
|
} while (v15);
|
|
|
|
|
v12 += -v19 - 768;
|
|
|
|
|
v17 = 2 * (v19 + 768);
|
|
|
|
|
v13 -= v17;
|
|
|
|
|
v11 = (_WORD *)((char *)v11 - v17);
|
|
|
|
|
--v14;
|
|
|
|
|
} while (v14);
|
|
|
|
|
}
|
|
|
|
|
// 4B8968: using guessed type int sbookflag;
|
|
|
|
|
// 5C2FF8: using guessed type int dword_5C2FF8;
|
|
|
|
|
// 5C2FFC: using guessed type int dword_5C2FFC;
|
|
|
|
|
// 5C3000: using guessed type int scr_pix_width;
|
|
|
|
|
// 5C3004: using guessed type int scr_pix_height;
|
|
|
|
|
// 69BD04: using guessed type int questlog;
|
|
|
|
|
// 69CF0C: using guessed type int gpBufEnd;
|
|
|
|
|
|
|
|
|
|
void __fastcall T_DrawView(int StartX, int StartY)
|
|
|
|
|
{
|
|
|
|
|
light_table_index = 0;
|
|
|
|
|
cel_transparency_active = 0;
|
|
|
|
|
if (zoomflag)
|
|
|
|
|
T_DrawGame(StartX, StartY);
|
|
|
|
|
else
|
|
|
|
|
T_DrawZoom(StartX, StartY);
|
|
|
|
|
if (automapflag)
|
|
|
|
|
DrawAutomap();
|
|
|
|
|
if (stextflag && !qtextflag)
|
|
|
|
|
DrawSText();
|
|
|
|
|
if (invflag) {
|
|
|
|
|
DrawInv();
|
|
|
|
|
} else if (sbookflag) {
|
|
|
|
|
DrawSpellBook();
|
|
|
|
|
}
|
|
|
|
|
DrawDurIcon();
|
|
|
|
|
if (chrflag) {
|
|
|
|
|
DrawChr();
|
|
|
|
|
} else if (questlog) {
|
|
|
|
|
DrawQuestLog();
|
|
|
|
|
} else if (plr[myplr]._pStatPts && !spselflag) {
|
|
|
|
|
DrawLevelUpIcon();
|
|
|
|
|
}
|
|
|
|
|
if (uitemflag)
|
|
|
|
|
DrawUniqueInfo();
|
|
|
|
|
if (qtextflag)
|
|
|
|
|
DrawQText();
|
|
|
|
|
if (spselflag)
|
|
|
|
|
DrawSpellList();
|
|
|
|
|
if (dropGoldFlag)
|
|
|
|
|
DrawGoldSplit(dropGoldValue);
|
|
|
|
|
if (helpflag)
|
|
|
|
|
DrawHelp();
|
|
|
|
|
if (msgflag)
|
|
|
|
|
DrawDiabloMsg();
|
|
|
|
|
if (PauseMode && !deathflag)
|
|
|
|
|
gmenu_draw_pause();
|
|
|
|
|
DrawPlrMsg();
|
|
|
|
|
gmenu_draw();
|
|
|
|
|
doom_draw();
|
|
|
|
|
DrawInfoBox();
|
|
|
|
|
DrawLifeFlask();
|
|
|
|
|
DrawManaFlask();
|
|
|
|
|
}
|
|
|
|
|
// 4B84DC: using guessed type int dropGoldFlag;
|
|
|
|
|
// 4B8968: using guessed type int sbookflag;
|
|
|
|
|
// 4B8C98: using guessed type int spselflag;
|
|
|
|
|
// 52569C: using guessed type int zoomflag;
|
|
|
|
|
// 525740: using guessed type int PauseMode;
|
|
|
|
|
// 52B9F1: using guessed type char msgflag;
|
|
|
|
|
// 646D00: using guessed type char qtextflag;
|
|
|
|
|
// 69BD04: using guessed type int questlog;
|
|
|
|
|
// 69BEF8: using guessed type int light_table_index;
|
|
|
|
|
// 69CF94: using guessed type int cel_transparency_active;
|
|
|
|
|
// 6AA705: using guessed type char stextflag;
|
|
|
|
|
|
|
|
|
|
void __cdecl SetTownMicros()
|
|
|
|
|
{
|
|
|
|
|
int i, x, y, lv;
|
|
|
|
|
WORD *pMap, *pPiece;
|
|
|
|
|
|
|
|
|
|
for(y = 0; y < MAXDUNY; y++) {
|
|
|
|
|
for(x = 0; x < MAXDUNX; x++) {
|
|
|
|
|
lv = dPiece[x][y];
|
|
|
|
|
pMap = dpiece_defs_map_1[IsometricCoord(x, y)];
|
|
|
|
|
if(lv != 0) {
|
|
|
|
|
lv--;
|
|
|
|
|
pPiece = (WORD *)&pLevelPieces[32 * lv];
|
|
|
|
|
for(i = 0; i < 16; i++) {
|
|
|
|
|
pMap[i] = pPiece[(i & 1) + 14 - (i & 0xE)];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for(i = 0; i < 16; i++) {
|
|
|
|
|
pMap[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(zoomflag) {
|
|
|
|
|
scr_pix_width = 640;
|
|
|
|
|
scr_pix_height = 352;
|
|
|
|
|
dword_5C2FF8 = 10;
|
|
|
|
|
dword_5C2FFC = 11;
|
|
|
|
|
} else {
|
|
|
|
|
scr_pix_width = 384;
|
|
|
|
|
scr_pix_height = 224;
|
|
|
|
|
dword_5C2FF8 = 6;
|
|
|
|
|
dword_5C2FFC = 7;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 52569C: using guessed type int zoomflag;
|
|
|
|
|
// 5C2FF8: using guessed type int dword_5C2FF8;
|
|
|
|
|
// 5C2FFC: using guessed type int dword_5C2FFC;
|
|
|
|
|
// 5C3000: using guessed type int scr_pix_width;
|
|
|
|
|
// 5C3004: using guessed type int scr_pix_height;
|
|
|
|
|
|
|
|
|
|
void __fastcall T_FillSector(unsigned char *P3Tiles, unsigned char *pSector, int xi, int yi, int w, int h)
|
|
|
|
|
{
|
|
|
|
|
int i, j, xx, yy;
|
|
|
|
|
long v1, v2, v3, v4, ii;
|
|
|
|
|
|
|
|
|
|
ii = 4;
|
|
|
|
|
yy = yi;
|
|
|
|
|
for(j = 0; j < h; j++) {
|
|
|
|
|
xx = xi;
|
|
|
|
|
for(i = 0; i < w; i++) {
|
|
|
|
|
#if (_MSC_VER >= 800) && (_MSC_VER <= 1200)
|
|
|
|
|
__asm {
|
|
|
|
|
mov esi, pSector
|
|
|
|
|
mov eax, ii
|
|
|
|
|
add esi, eax
|
|
|
|
|
xor eax, eax
|
|
|
|
|
lodsw
|
|
|
|
|
or eax, eax
|
|
|
|
|
jz label1
|
|
|
|
|
dec eax
|
|
|
|
|
mov esi, P3Tiles
|
|
|
|
|
shl eax, 3
|
|
|
|
|
add esi, eax
|
|
|
|
|
xor eax, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v1, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v2, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v3, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v4, eax
|
|
|
|
|
jmp label2
|
|
|
|
|
label1:
|
|
|
|
|
mov v1, eax
|
|
|
|
|
mov v2, eax
|
|
|
|
|
mov v3, eax
|
|
|
|
|
mov v4, eax
|
|
|
|
|
label2:
|
|
|
|
|
nop
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
WORD *Map;
|
|
|
|
|
|
|
|
|
|
Map = (WORD *)&pSector[ii];
|
|
|
|
|
if(*Map) {
|
|
|
|
|
v1 = *((WORD *)&P3Tiles[(*Map-1)*8])+1;
|
|
|
|
|
v2 = *((WORD *)&P3Tiles[(*Map-1)*8]+1)+1;
|
|
|
|
|
v3 = *((WORD *)&P3Tiles[(*Map-1)*8]+2)+1;
|
|
|
|
|
v4 = *((WORD *)&P3Tiles[(*Map-1)*8]+3)+1;
|
|
|
|
|
} else {
|
|
|
|
|
v1 = 0;
|
|
|
|
|
v2 = 0;
|
|
|
|
|
v3 = 0;
|
|
|
|
|
v4 = 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
dPiece[xx][yy] = v1;
|
|
|
|
|
dPiece[xx + 1][yy] = v2;
|
|
|
|
|
dPiece[xx][yy + 1] = v3;
|
|
|
|
|
dPiece[xx + 1][yy + 1] = v4;
|
|
|
|
|
xx += 2;
|
|
|
|
|
ii += 2;
|
|
|
|
|
}
|
|
|
|
|
yy += 2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void __fastcall T_FillTile(unsigned char *P3Tiles, int xx, int yy, int t)
|
|
|
|
|
{
|
|
|
|
|
long v1, v2, v3, v4;
|
|
|
|
|
|
|
|
|
|
#if (_MSC_VER >= 800) && (_MSC_VER <= 1200)
|
|
|
|
|
__asm {
|
|
|
|
|
mov eax, t
|
|
|
|
|
dec eax
|
|
|
|
|
mov esi, P3Tiles
|
|
|
|
|
shl eax, 3
|
|
|
|
|
add esi, eax
|
|
|
|
|
xor eax, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v1, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v2, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v3, eax
|
|
|
|
|
lodsw
|
|
|
|
|
inc eax
|
|
|
|
|
mov v4, eax
|
|
|
|
|
jmp label1
|
|
|
|
|
mov v1, eax
|
|
|
|
|
mov v2, eax
|
|
|
|
|
mov v3, eax
|
|
|
|
|
mov v4, eax
|
|
|
|
|
label1:
|
|
|
|
|
nop
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
v1 = *((WORD *)&P3Tiles[(t-1)*8])+1;
|
|
|
|
|
v2 = *((WORD *)&P3Tiles[(t-1)*8]+1)+1;
|
|
|
|
|
v3 = *((WORD *)&P3Tiles[(t-1)*8]+2)+1;
|
|
|
|
|
v4 = *((WORD *)&P3Tiles[(t-1)*8]+3)+1;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
dPiece[xx][yy] = v1;
|
|
|
|
|
dPiece[xx + 1][yy] = v2;
|
|
|
|
|
dPiece[xx][yy + 1] = v3;
|
|
|
|
|
dPiece[xx + 1][yy + 1] = v4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void __cdecl T_Pass3()
|
|
|
|
|
{
|
|
|
|
|
int xx, yy, x;
|
|
|
|
|
unsigned char *P3Tiles, *pSector;
|
|
|
|
|
|
|
|
|
|
for(yy = 0; yy < MAXDUNY; yy += 2) {
|
|
|
|
|
for(xx = 0; xx < MAXDUNX; xx += 2) {
|
|
|
|
|
dPiece[xx][yy] = 0;
|
|
|
|
|
dPiece[xx + 1][yy] = 0;
|
|
|
|
|
dPiece[xx][yy + 1] = 0;
|
|
|
|
|
dPiece[xx + 1][yy + 1] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
P3Tiles = LoadFileInMem("Levels\\TownData\\Town.TIL", 0);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector1s.DUN", 0);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 46, 46, 25, 25);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector2s.DUN", 0);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 46, 0, 25, 23);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector3s.DUN", 0);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 0, 46, 23, 25);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector4s.DUN", 0);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 0, 0, 23, 23);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
|
|
|
|
|
if(gbMaxPlayers == 1) {
|
|
|
|
|
if(!(plr[myplr].pTownWarps & 1)) {
|
|
|
|
|
T_FillTile(P3Tiles, 48, 20, 320);
|
|
|
|
|
}
|
|
|
|
|
if(!(plr[myplr].pTownWarps & 2)) {
|
|
|
|
|
T_FillTile(P3Tiles, 16, 68, 332);
|
|
|
|
|
T_FillTile(P3Tiles, 16, 70, 331);
|
|
|
|
|
}
|
|
|
|
|
if(!(plr[myplr].pTownWarps & 4)) {
|
|
|
|
|
for(x = 36; x < 46; x++) {
|
|
|
|
|
T_FillTile(P3Tiles, x, 78, random(0, 4) + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(quests[13]._qactive != 3 && quests[13]._qactive) {
|
|
|
|
|
T_FillTile(P3Tiles, 60, 70, 342);
|
|
|
|
|
} else {
|
|
|
|
|
T_FillTile(P3Tiles, 60, 70, 71);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mem_free_dbg(P3Tiles);
|
|
|
|
|
}
|
|
|
|
|
// 45FDE6: could not find valid save-restore pair for edi
|
|
|
|
|
// 679660: using guessed type char gbMaxPlayers;
|
|
|
|
|
|
|
|
|
|
void __fastcall CreateTown(int entry)
|
|
|
|
|
{
|
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
|
|
dminx = 10;
|
|
|
|
|
dminy = 10;
|
|
|
|
|
dmaxx = 84;
|
|
|
|
|
dmaxy = 84;
|
|
|
|
|
|
|
|
|
|
if(entry == 0) {
|
|
|
|
|
ViewX = 75;
|
|
|
|
|
ViewY = 68;
|
|
|
|
|
} else if(entry == 1) {
|
|
|
|
|
ViewX = 25;
|
|
|
|
|
ViewY = 31;
|
|
|
|
|
} else if(entry == 7) {
|
|
|
|
|
if(TWarpFrom == 5) {
|
|
|
|
|
ViewX = 49;
|
|
|
|
|
ViewY = 22;
|
|
|
|
|
}
|
|
|
|
|
if(TWarpFrom == 9) {
|
|
|
|
|
ViewX = 18;
|
|
|
|
|
ViewY = 69;
|
|
|
|
|
}
|
|
|
|
|
if(TWarpFrom == 13) {
|
|
|
|
|
ViewX = 41;
|
|
|
|
|
ViewY = 81;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
T_Pass3();
|
|
|
|
|
memset(dTransVal, 0, sizeof(dTransVal));
|
|
|
|
|
memset(dFlags, 0, sizeof(dFlags));
|
|
|
|
|
memset(dPlayer, 0, sizeof(dPlayer));
|
|
|
|
|
memset(dMonster, 0, sizeof(dMonster));
|
|
|
|
|
memset(dObject, 0, sizeof(dObject));
|
|
|
|
|
memset(dItem, 0, sizeof(dItem));
|
|
|
|
|
memset(dArch, 0, sizeof(dArch));
|
|
|
|
|
|
|
|
|
|
for(y = 0; y < MAXDUNY; y++) {
|
|
|
|
|
for(x = 0; x < MAXDUNX; x++) {
|
|
|
|
|
if(dPiece[x][y] == 360) {
|
|
|
|
|
dArch[x][y] = 1;
|
|
|
|
|
} else if(dPiece[x][y] == 358) {
|
|
|
|
|
dArch[x][y] = 2;
|
|
|
|
|
} else if(dPiece[x][y] == 129) {
|
|
|
|
|
dArch[x][y] = 6;
|
|
|
|
|
} else if(dPiece[x][y] == 130) {
|
|
|
|
|
dArch[x][y] = 7;
|
|
|
|
|
} else if(dPiece[x][y] == 128) {
|
|
|
|
|
dArch[x][y] = 8;
|
|
|
|
|
} else if(dPiece[x][y] == 117) {
|
|
|
|
|
dArch[x][y] = 9;
|
|
|
|
|
} else if(dPiece[x][y] == 157) {
|
|
|
|
|
dArch[x][y] = 10;
|
|
|
|
|
} else if(dPiece[x][y] == 158) {
|
|
|
|
|
dArch[x][y] = 11;
|
|
|
|
|
} else if(dPiece[x][y] == 156) {
|
|
|
|
|
dArch[x][y] = 12;
|
|
|
|
|
} else if(dPiece[x][y] == 162) {
|
|
|
|
|
dArch[x][y] = 13;
|
|
|
|
|
} else if(dPiece[x][y] == 160) {
|
|
|
|
|
dArch[x][y] = 14;
|
|
|
|
|
} else if(dPiece[x][y] == 214) {
|
|
|
|
|
dArch[x][y] = 15;
|
|
|
|
|
} else if(dPiece[x][y] == 212) {
|
|
|
|
|
dArch[x][y] = 16;
|
|
|
|
|
} else if(dPiece[x][y] == 217) {
|
|
|
|
|
dArch[x][y] = 17;
|
|
|
|
|
} else if(dPiece[x][y] == 216) {
|
|
|
|
|
dArch[x][y] = 18;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetTownMicros();
|
|
|
|
|
}
|
|
|
|
|
// 5CF328: using guessed type int dmaxx;
|
|
|
|
|
// 5CF32C: using guessed type int dmaxy;
|
|
|
|
|
// 5D2458: using guessed type int dminx;
|
|
|
|
|
// 5D245C: using guessed type int dminy;
|
|
|
|
|
// 6ABB30: using guessed type int TWarpFrom;
|