994 lines
26 KiB
C++
994 lines
26 KiB
C++
/*
|
|
* UNPUBLISHED -- Rights reserved under the copyright laws of the
|
|
* United States. Use of a copyright notice is precautionary only and
|
|
* does not imply publication or disclosure.
|
|
*
|
|
* THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
|
|
* OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION,
|
|
* DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
|
|
* EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT.
|
|
*/
|
|
|
|
#include "../types.h"
|
|
|
|
short automaptype[512];
|
|
int AMdword_4B7E40; // weak
|
|
int AMdword_4B7E44; // weak
|
|
bool automapflag; // idb
|
|
char AMbyte_4B7E4C[32];
|
|
char automapview[40][40];
|
|
int AutoMapScale; // idb
|
|
int AutoMapXOfs; // weak
|
|
int AutoMapYOfs; // weak
|
|
int AutoMapPosBits; // weak
|
|
int AutoMapXPos; // weak
|
|
int AutoMapYPos; // weak
|
|
int AMPlayerX; // weak
|
|
int AMPlayerY; // weak
|
|
|
|
//----- (00401DA4) --------------------------------------------------------
|
|
void __cdecl InitAutomapOnce()
|
|
{
|
|
automapflag = 0;
|
|
AutoMapScale = 50;
|
|
AutoMapPosBits = 32;
|
|
AutoMapXPos = 16;
|
|
AutoMapYPos = 8;
|
|
AMPlayerX = 4;
|
|
AMPlayerY = 2;
|
|
}
|
|
// 4B84B8: using guessed type int AutoMapPosBits;
|
|
// 4B84BC: using guessed type int AutoMapXPos;
|
|
// 4B84C0: using guessed type int AutoMapYPos;
|
|
// 4B84C4: using guessed type int AMPlayerX;
|
|
// 4B84C8: using guessed type int AMPlayerY;
|
|
|
|
//----- (00401DE8) --------------------------------------------------------
|
|
void __cdecl InitAutomap()
|
|
{
|
|
signed int v0; // edi
|
|
signed int v1; // ecx
|
|
int v2; // esi
|
|
char v3; // al
|
|
int v4; // esi
|
|
char v5; // al
|
|
char *v6; // ecx
|
|
unsigned char *v7; // eax
|
|
int v8; // ecx
|
|
unsigned char *v9; // edx
|
|
unsigned int i; // esi
|
|
unsigned char v11; // bl
|
|
_BYTE *v12; // edx
|
|
signed int v13; // ecx
|
|
_BYTE *v14; // eax
|
|
signed int v15; // edx
|
|
int size; // [esp+Ch] [ebp-4h]
|
|
|
|
v0 = 50;
|
|
v1 = 0;
|
|
do
|
|
{
|
|
v2 = (v0 << 6) / 100;
|
|
v3 = 2 * (320 / v2);
|
|
v4 = 320 % v2;
|
|
v5 = v3 + 1;
|
|
AMbyte_4B7E4C[v1] = v5;
|
|
if ( v4 )
|
|
AMbyte_4B7E4C[v1] = v5 + 1;
|
|
if ( v4 >= 32 * v0 / 100 )
|
|
++AMbyte_4B7E4C[v1];
|
|
v0 += 5;
|
|
++v1;
|
|
}
|
|
while ( v1 < 31 );
|
|
memset(automaptype, 0, 0x400u);
|
|
switch ( leveltype )
|
|
{
|
|
case DTYPE_CATHEDRAL:
|
|
v6 = "Levels\\L1Data\\L1.AMP";
|
|
break;
|
|
case DTYPE_CATACOMBS:
|
|
v6 = "Levels\\L2Data\\L2.AMP";
|
|
break;
|
|
case DTYPE_CAVES:
|
|
v6 = "Levels\\L3Data\\L3.AMP";
|
|
break;
|
|
case DTYPE_HELL:
|
|
v6 = "Levels\\L4Data\\L4.AMP";
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
v7 = LoadFileInMem(v6, &size);
|
|
size = (unsigned int)size >> 1;
|
|
v9 = v7;
|
|
for ( i = 1; i <= size; ++i )
|
|
{
|
|
v11 = *v9;
|
|
v12 = v9 + 1;
|
|
_LOWORD(v0) = v11;
|
|
_LOBYTE(v8) = *v12;
|
|
v9 = v12 + 1;
|
|
_LOWORD(v8) = (unsigned char)v8;
|
|
v8 = v0 + (v8 << 8);
|
|
automaptype[i] = v8;
|
|
}
|
|
mem_free_dbg(v7);
|
|
memset(automapview, 0, 0x640u);
|
|
v13 = 0;
|
|
do
|
|
{
|
|
v14 = (unsigned char *)dFlags + v13;
|
|
v15 = 112;
|
|
do
|
|
{
|
|
*v14 &= 0x7Fu;
|
|
v14 += 112;
|
|
--v15;
|
|
}
|
|
while ( v15 );
|
|
++v13;
|
|
}
|
|
while ( v13 < 112 );
|
|
}
|
|
// 5BB1ED: using guessed type char leveltype;
|
|
|
|
//----- (00401EF4) --------------------------------------------------------
|
|
void __cdecl StartAutomap()
|
|
{
|
|
AutoMapXOfs = 0;
|
|
AutoMapYOfs = 0;
|
|
automapflag = 1;
|
|
}
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
|
|
//----- (00401F0D) --------------------------------------------------------
|
|
void __cdecl AutomapUp()
|
|
{
|
|
--AutoMapXOfs;
|
|
--AutoMapYOfs;
|
|
}
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
|
|
//----- (00401F1A) --------------------------------------------------------
|
|
void __cdecl AutomapDown()
|
|
{
|
|
++AutoMapXOfs;
|
|
++AutoMapYOfs;
|
|
}
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
|
|
//----- (00401F27) --------------------------------------------------------
|
|
void __cdecl AutomapLeft()
|
|
{
|
|
--AutoMapXOfs;
|
|
++AutoMapYOfs;
|
|
}
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
|
|
//----- (00401F34) --------------------------------------------------------
|
|
void __cdecl AutomapRight()
|
|
{
|
|
++AutoMapXOfs;
|
|
--AutoMapYOfs;
|
|
}
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
|
|
//----- (00401F41) --------------------------------------------------------
|
|
void __cdecl AutomapZoomIn()
|
|
{
|
|
if ( AutoMapScale < 200 )
|
|
{
|
|
AutoMapScale += 5;
|
|
AutoMapPosBits = (AutoMapScale << 6) / 100;
|
|
AutoMapXPos = AutoMapPosBits >> 1;
|
|
AutoMapYPos = AutoMapPosBits >> 2;
|
|
AMPlayerX = AutoMapPosBits >> 3;
|
|
AMPlayerY = AutoMapPosBits >> 4;
|
|
}
|
|
}
|
|
// 4B84B8: using guessed type int AutoMapPosBits;
|
|
// 4B84BC: using guessed type int AutoMapXPos;
|
|
// 4B84C0: using guessed type int AutoMapYPos;
|
|
// 4B84C4: using guessed type int AMPlayerX;
|
|
// 4B84C8: using guessed type int AMPlayerY;
|
|
|
|
//----- (00401F80) --------------------------------------------------------
|
|
void __cdecl AutomapZoomOut()
|
|
{
|
|
if ( AutoMapScale > 50 )
|
|
{
|
|
AutoMapScale -= 5;
|
|
AutoMapPosBits = (AutoMapScale << 6) / 100;
|
|
AutoMapXPos = AutoMapPosBits >> 1;
|
|
AutoMapYPos = AutoMapPosBits >> 2;
|
|
AMPlayerX = AutoMapPosBits >> 3;
|
|
AMPlayerY = AutoMapPosBits >> 4;
|
|
}
|
|
}
|
|
// 4B84B8: using guessed type int AutoMapPosBits;
|
|
// 4B84BC: using guessed type int AutoMapXPos;
|
|
// 4B84C0: using guessed type int AutoMapYPos;
|
|
// 4B84C4: using guessed type int AMPlayerX;
|
|
// 4B84C8: using guessed type int AMPlayerY;
|
|
|
|
//----- (00401FBD) --------------------------------------------------------
|
|
void __cdecl DrawAutomap()
|
|
{
|
|
int v0; // eax
|
|
int v1; // ecx
|
|
int v2; // edx
|
|
int v3; // edx
|
|
int v4; // ecx
|
|
int v5; // eax
|
|
int v6; // esi
|
|
int v7; // edx
|
|
int v8; // edx
|
|
int v9; // esi
|
|
int v10; // ebx
|
|
int v11; // edi
|
|
int v12; // esi
|
|
int v13; // edi
|
|
int v14; // esi
|
|
int v15; // ebp
|
|
short v16; // ax
|
|
int v17; // ebp
|
|
short v18; // ax
|
|
int v19; // [esp+0h] [ebp-18h]
|
|
int screen_x; // [esp+4h] [ebp-14h]
|
|
int screen_xa; // [esp+4h] [ebp-14h]
|
|
int v22; // [esp+8h] [ebp-10h]
|
|
int ty; // [esp+Ch] [ebp-Ch]
|
|
int tya; // [esp+Ch] [ebp-Ch]
|
|
int v25; // [esp+10h] [ebp-8h]
|
|
int screen_y; // [esp+14h] [ebp-4h]
|
|
|
|
if ( leveltype )
|
|
{
|
|
screen_buf_end = (int)gpBuffer->row[352].col_unused_1;
|
|
v0 = AutoMapXOfs;
|
|
v1 = (ViewX - 16) >> 1;
|
|
v2 = AutoMapXOfs + v1;
|
|
if ( AutoMapXOfs + v1 < 0 )
|
|
{
|
|
do
|
|
{
|
|
++v0;
|
|
++v2;
|
|
}
|
|
while ( v2 < 0 );
|
|
AutoMapXOfs = v0;
|
|
}
|
|
v3 = v0 + v1;
|
|
if ( v0 + v1 >= 40 )
|
|
{
|
|
do
|
|
{
|
|
--v0;
|
|
--v3;
|
|
}
|
|
while ( v3 >= 40 );
|
|
AutoMapXOfs = v0;
|
|
}
|
|
v4 = v0 + v1;
|
|
AMdword_4B7E40 = v4;
|
|
v5 = AutoMapYOfs;
|
|
v6 = (ViewY - 16) >> 1;
|
|
v7 = AutoMapYOfs + v6;
|
|
if ( AutoMapYOfs + v6 < 0 )
|
|
{
|
|
do
|
|
{
|
|
++v5;
|
|
++v7;
|
|
}
|
|
while ( v7 < 0 );
|
|
AutoMapYOfs = v5;
|
|
}
|
|
v8 = v5 + v6;
|
|
if ( v5 + v6 >= 40 )
|
|
{
|
|
do
|
|
{
|
|
--v5;
|
|
--v8;
|
|
}
|
|
while ( v8 >= 40 );
|
|
AutoMapYOfs = v5;
|
|
}
|
|
v9 = v5 + v6;
|
|
AMdword_4B7E44 = v9;
|
|
v10 = AMbyte_4B7E4C[(AutoMapScale - 50) / 5];
|
|
if ( ScrollInfo._sxoff + ScrollInfo._syoff )
|
|
++v10;
|
|
v22 = v4 - v10;
|
|
v19 = v9 - 1;
|
|
if ( v10 & 1 )
|
|
{
|
|
v11 = 384 - AutoMapPosBits * ((v10 - 1) >> 1);
|
|
v12 = 336 - AutoMapXPos * ((v10 + 1) >> 1);
|
|
}
|
|
else
|
|
{
|
|
v11 = AutoMapXPos - AutoMapPosBits * (v10 >> 1) + 384;
|
|
v12 = 336 - AutoMapXPos * (v10 >> 1) - AutoMapYPos;
|
|
}
|
|
if ( ViewX & 1 )
|
|
{
|
|
v11 -= AutoMapYPos;
|
|
v12 -= AMPlayerX;
|
|
}
|
|
if ( ViewY & 1 )
|
|
{
|
|
v11 += AutoMapYPos;
|
|
v12 -= AMPlayerX;
|
|
}
|
|
v13 = (AutoMapScale * ScrollInfo._sxoff / 100 >> 1) + v11;
|
|
v14 = (AutoMapScale * ScrollInfo._syoff / 100 >> 1) + v12;
|
|
if ( invflag || sbookflag )
|
|
v13 -= 160;
|
|
if ( chrflag || questlog )
|
|
v13 += 160;
|
|
if ( v10 + 1 >= 0 )
|
|
{
|
|
v25 = v10 + 2;
|
|
do
|
|
{
|
|
v15 = 0;
|
|
screen_x = v13;
|
|
if ( v10 > 0 )
|
|
{
|
|
ty = v19;
|
|
do
|
|
{
|
|
v16 = GetAutomapType(v22 + v15, ty, 1);
|
|
if ( v16 )
|
|
DrawAutomapType(screen_x, v14, v16);
|
|
screen_x += AutoMapPosBits;
|
|
++v15;
|
|
--ty;
|
|
}
|
|
while ( v15 < v10 );
|
|
}
|
|
++v19;
|
|
screen_xa = 0;
|
|
v17 = v13 - AutoMapXPos;
|
|
screen_y = v14 + AutoMapYPos;
|
|
if ( v10 >= 0 )
|
|
{
|
|
tya = v19;
|
|
do
|
|
{
|
|
v18 = GetAutomapType(v22 + screen_xa, tya, 1);
|
|
if ( v18 )
|
|
DrawAutomapType(v17, screen_y, v18);
|
|
v17 += AutoMapPosBits;
|
|
++screen_xa;
|
|
--tya;
|
|
}
|
|
while ( screen_xa <= v10 );
|
|
}
|
|
++v22;
|
|
v14 += AutoMapXPos;
|
|
--v25;
|
|
}
|
|
while ( v25 );
|
|
}
|
|
DrawAutomapPlr();
|
|
DrawAutomapGame();
|
|
}
|
|
else
|
|
{
|
|
DrawAutomapGame();
|
|
}
|
|
}
|
|
// 4B7E40: using guessed type int AMdword_4B7E40;
|
|
// 4B7E44: using guessed type int AMdword_4B7E44;
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
// 4B84B8: using guessed type int AutoMapPosBits;
|
|
// 4B84BC: using guessed type int AutoMapXPos;
|
|
// 4B84C0: using guessed type int AutoMapYPos;
|
|
// 4B84C4: using guessed type int AMPlayerX;
|
|
// 4B8968: using guessed type int sbookflag;
|
|
// 5BB1ED: using guessed type char leveltype;
|
|
// 69BD04: using guessed type int questlog;
|
|
// 69CF0C: using guessed type int screen_buf_end;
|
|
|
|
//----- (00402233) --------------------------------------------------------
|
|
void __fastcall DrawAutomapType(int screen_x, int screen_y, short automap_type)
|
|
{
|
|
short v3; // al
|
|
int v4; // ebx
|
|
int v5; // edi
|
|
int a3; // ST2C_4
|
|
int a1; // ST28_4
|
|
int a2; // ST24_4
|
|
int v9; // edx
|
|
int v10; // ST28_4
|
|
int v11; // ST2C_4
|
|
int v12; // ST24_4
|
|
int v13; // ST2C_4
|
|
int v14; // ST28_4
|
|
int v15; // ST24_4
|
|
int v16; // ST28_4
|
|
int v17; // ST24_4
|
|
int v18; // ST2C_4
|
|
int v19; // ST2C_4
|
|
int v20; // ST28_4
|
|
int v21; // ST24_4
|
|
int v22; // ST28_4
|
|
int v23; // ST2C_4
|
|
int v24; // ST24_4
|
|
int v25; // ST28_4
|
|
int v26; // ST24_4
|
|
int v27; // ST2C_4
|
|
int v28; // [esp-Ch] [ebp-34h]
|
|
int v29; // [esp-8h] [ebp-30h]
|
|
signed int v30; // [esp+Ch] [ebp-1Ch]
|
|
signed int v31; // [esp+10h] [ebp-18h]
|
|
signed int v32; // [esp+14h] [ebp-14h]
|
|
char v33; // [esp+27h] [ebp-1h]
|
|
int automap_typea; // [esp+30h] [ebp+8h]
|
|
int automap_typeb; // [esp+30h] [ebp+8h]
|
|
int automap_typec; // [esp+30h] [ebp+8h]
|
|
int automap_typed; // [esp+30h] [ebp+8h]
|
|
int automap_typee; // [esp+30h] [ebp+8h]
|
|
int automap_typef; // [esp+30h] [ebp+8h]
|
|
int automap_typeg; // [esp+30h] [ebp+8h]
|
|
|
|
v3 = automap_type;
|
|
v4 = screen_x;
|
|
v5 = screen_y;
|
|
v33 = _HIBYTE(automap_type);
|
|
if ( automap_type & 0x4000 )
|
|
{
|
|
ENG_set_pixel(screen_x, screen_y, 200);
|
|
ENG_set_pixel(v4 - AMPlayerX, v5 - AMPlayerY, 200);
|
|
ENG_set_pixel(v4 - AMPlayerX, AMPlayerY + v5, 200);
|
|
ENG_set_pixel(AMPlayerX + v4, v5 - AMPlayerY, 200);
|
|
ENG_set_pixel(AMPlayerX + v4, AMPlayerY + v5, 200);
|
|
ENG_set_pixel(v4 - AutoMapYPos, v5, 200);
|
|
ENG_set_pixel(AutoMapYPos + v4, v5, 200);
|
|
ENG_set_pixel(v4, v5 - AMPlayerX, 200);
|
|
ENG_set_pixel(v4, AMPlayerX + v5, 200);
|
|
ENG_set_pixel(v4 + AMPlayerX - AutoMapXPos, AMPlayerY + v5, 200);
|
|
ENG_set_pixel(v4 + AutoMapXPos - AMPlayerX, AMPlayerY + v5, 200);
|
|
ENG_set_pixel(v4 - AutoMapYPos, AMPlayerX + v5, 200);
|
|
ENG_set_pixel(AutoMapYPos + v4, AMPlayerX + v5, 200);
|
|
ENG_set_pixel(v4 - AMPlayerX, v5 + AutoMapYPos - AMPlayerY, 200);
|
|
ENG_set_pixel(AMPlayerX + v4, v5 + AutoMapYPos - AMPlayerY, 200);
|
|
ENG_set_pixel(v4, AutoMapYPos + v5, 200);
|
|
v3 = automap_type;
|
|
}
|
|
if ( automap_type < 0 )
|
|
{
|
|
engine_draw_automap_pixels(v4 - AMPlayerX, v5 - AMPlayerX - AMPlayerY, v4 + AMPlayerX + AutoMapYPos, AMPlayerY + v5, 144);
|
|
engine_draw_automap_pixels(v4 - AutoMapYPos, v5 - AMPlayerX, AutoMapYPos + v4, AMPlayerX + v5, 144);
|
|
engine_draw_automap_pixels(v4 - AutoMapYPos - AMPlayerX, v5 - AMPlayerY, AMPlayerX + v4, v5 + AMPlayerX + AMPlayerY, 144);
|
|
engine_draw_automap_pixels(v4 - AutoMapXPos, v5, v4, v5 + AutoMapYPos, 144);
|
|
v3 = automap_type;
|
|
}
|
|
v31 = 0;
|
|
v30 = 0;
|
|
v32 = 0;
|
|
switch ( v3 & 0xF )
|
|
{
|
|
case 1:
|
|
a3 = v4 - AutoMapYPos + AutoMapXPos;
|
|
a1 = v4 - AutoMapYPos;
|
|
a2 = v5 - AutoMapYPos;
|
|
automap_typea = v5 - AMPlayerX;
|
|
engine_draw_automap_pixels(v4, v5 - AutoMapYPos, v4 - AutoMapYPos, v5 - AMPlayerX, 200);
|
|
engine_draw_automap_pixels(v4, a2, a3, automap_typea, 200);
|
|
engine_draw_automap_pixels(v4, v5, a1, automap_typea, 200);
|
|
v9 = v5;
|
|
v29 = automap_typea;
|
|
v28 = a3;
|
|
goto LABEL_36;
|
|
case 2:
|
|
case 5:
|
|
goto LABEL_8;
|
|
case 3:
|
|
case 6:
|
|
goto LABEL_17;
|
|
case 4:
|
|
v31 = 1;
|
|
goto LABEL_8;
|
|
case 7:
|
|
goto LABEL_25;
|
|
case 8:
|
|
v30 = 1;
|
|
LABEL_8:
|
|
if ( automap_type & 0x100 )
|
|
{
|
|
v10 = v4 - AutoMapXPos;
|
|
v11 = v4 - AutoMapYPos;
|
|
v12 = v5 - AutoMapYPos;
|
|
automap_typeb = v5 - AMPlayerX;
|
|
engine_draw_automap_pixels(v4, v5 - AutoMapYPos, v4 - AMPlayerX, v5 - AutoMapYPos + AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v10, v5, v10 + AMPlayerX, v5 - AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v11, v12, v10, automap_typeb, 144);
|
|
engine_draw_automap_pixels(v11, v12, v4, automap_typeb, 144);
|
|
engine_draw_automap_pixels(v11, v5, v10, automap_typeb, 144);
|
|
engine_draw_automap_pixels(v11, v5, v4, automap_typeb, 144);
|
|
}
|
|
if ( v33 & 0x10 )
|
|
{
|
|
engine_draw_automap_pixels(v4 - AutoMapYPos, v5 - AMPlayerX, v4 - AutoMapXPos, v5, 200);
|
|
v33 |= 4u;
|
|
}
|
|
if ( v33 & 4 )
|
|
{
|
|
v13 = v4 - AutoMapYPos + AutoMapXPos;
|
|
v14 = v4 - AutoMapYPos;
|
|
v15 = v5 - AutoMapYPos;
|
|
automap_typec = v5 - AMPlayerX;
|
|
engine_draw_automap_pixels(v4, v5 - AutoMapYPos, v4 - AutoMapYPos, v5 - AMPlayerX, 200);
|
|
engine_draw_automap_pixels(v4, v15, v13, automap_typec, 200);
|
|
engine_draw_automap_pixels(v4, v5, v14, automap_typec, 200);
|
|
engine_draw_automap_pixels(v4, v5, v13, automap_typec, 200);
|
|
}
|
|
if ( !(v33 & 0x15) )
|
|
engine_draw_automap_pixels(v4, v5 - AutoMapYPos, v4 - AutoMapXPos, v5, 200);
|
|
if ( v31 )
|
|
goto LABEL_17;
|
|
goto LABEL_25;
|
|
case 9:
|
|
v32 = 1;
|
|
LABEL_17:
|
|
if ( v33 & 2 )
|
|
{
|
|
v16 = AutoMapYPos + v4;
|
|
v17 = v5 - AutoMapYPos;
|
|
v18 = v4 + AutoMapXPos;
|
|
automap_typed = v5 - AMPlayerX;
|
|
engine_draw_automap_pixels(v4, v5 - AutoMapYPos, v4 + AMPlayerX, v5 - AutoMapYPos + AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v18, v5, v18 - AMPlayerX, v5 - AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v16, v17, v4, automap_typed, 144);
|
|
engine_draw_automap_pixels(v16, v17, v18, automap_typed, 144);
|
|
engine_draw_automap_pixels(v16, v5, v4, automap_typed, 144);
|
|
engine_draw_automap_pixels(v16, v5, v18, automap_typed, 144);
|
|
}
|
|
if ( v33 & 0x20 )
|
|
{
|
|
engine_draw_automap_pixels(AutoMapYPos + v4, v5 - AMPlayerX, v4 + AutoMapXPos, v5, 200);
|
|
v33 |= 8u;
|
|
}
|
|
if ( v33 & 8 )
|
|
{
|
|
v19 = v4 - AutoMapYPos + AutoMapXPos;
|
|
v20 = v4 - AutoMapYPos;
|
|
v21 = v5 - AutoMapYPos;
|
|
automap_typee = v5 - AMPlayerX;
|
|
engine_draw_automap_pixels(v4, v5 - AutoMapYPos, v4 - AutoMapYPos, v5 - AMPlayerX, 200);
|
|
engine_draw_automap_pixels(v4, v21, v19, automap_typee, 200);
|
|
engine_draw_automap_pixels(v4, v5, v20, automap_typee, 200);
|
|
engine_draw_automap_pixels(v4, v5, v19, automap_typee, 200);
|
|
}
|
|
if ( !(v33 & 0x2A) )
|
|
engine_draw_automap_pixels(v4, v5 - AutoMapYPos, v4 + AutoMapXPos, v5, 200);
|
|
LABEL_25:
|
|
if ( v30 )
|
|
goto LABEL_26;
|
|
goto LABEL_32;
|
|
case 0xA:
|
|
goto LABEL_26;
|
|
case 0xB:
|
|
goto LABEL_33;
|
|
case 0xC:
|
|
v32 = 1;
|
|
LABEL_26:
|
|
if ( v33 & 1 )
|
|
{
|
|
v22 = v4 - AutoMapXPos;
|
|
v23 = v4 - AutoMapYPos;
|
|
v24 = AutoMapYPos + v5;
|
|
automap_typef = AMPlayerX + v5;
|
|
engine_draw_automap_pixels(v4, AutoMapYPos + v5, v4 - AMPlayerX, AutoMapYPos + v5 - AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v22, v5, v22 + AMPlayerX, v5 + AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v23, v24, v22, automap_typef, 144);
|
|
engine_draw_automap_pixels(v23, v24, v4, automap_typef, 144);
|
|
engine_draw_automap_pixels(v23, v5, v22, automap_typef, 144);
|
|
engine_draw_automap_pixels(v23, v5, v4, automap_typef, 144);
|
|
}
|
|
else
|
|
{
|
|
engine_draw_automap_pixels(v4, AutoMapYPos + v5, v4 - AutoMapXPos, v5, 200);
|
|
}
|
|
LABEL_32:
|
|
if ( v32 )
|
|
{
|
|
LABEL_33:
|
|
if ( v33 & 2 )
|
|
{
|
|
v25 = AutoMapYPos + v4;
|
|
v26 = AutoMapYPos + v5;
|
|
v27 = v4 + AutoMapXPos;
|
|
automap_typeg = AMPlayerX + v5;
|
|
engine_draw_automap_pixels(v4, AutoMapYPos + v5, v4 + AMPlayerX, AutoMapYPos + v5 - AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v27, v5, v27 - AMPlayerX, v5 + AMPlayerY, 200);
|
|
engine_draw_automap_pixels(v25, v26, v4, automap_typeg, 144);
|
|
engine_draw_automap_pixels(v25, v26, v27, automap_typeg, 144);
|
|
engine_draw_automap_pixels(v25, v5, v4, automap_typeg, 144);
|
|
engine_draw_automap_pixels(v25, v5, v27, automap_typeg, 144);
|
|
}
|
|
else
|
|
{
|
|
v29 = v5;
|
|
v28 = v4 + AutoMapXPos;
|
|
v9 = AutoMapYPos + v5;
|
|
LABEL_36:
|
|
engine_draw_automap_pixels(v4, v9, v28, v29, 200);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
// 4B84BC: using guessed type int AutoMapXPos;
|
|
// 4B84C0: using guessed type int AutoMapYPos;
|
|
// 4B84C4: using guessed type int AMPlayerX;
|
|
// 4B84C8: using guessed type int AMPlayerY;
|
|
|
|
//----- (004029A8) --------------------------------------------------------
|
|
void __cdecl DrawAutomapPlr()
|
|
{
|
|
int v0; // ebx
|
|
int v1; // eax
|
|
int v2; // ecx
|
|
int v3; // esi
|
|
int v4; // edi
|
|
int v5; // edx
|
|
int v6; // ecx
|
|
int v7; // eax
|
|
int v8; // ecx
|
|
int v9; // [esp-Ch] [ebp-20h]
|
|
int v10; // [esp-8h] [ebp-1Ch]
|
|
int v11; // [esp+Ch] [ebp-8h]
|
|
int v12; // [esp+10h] [ebp-4h]
|
|
|
|
v0 = myplr;
|
|
if ( plr[myplr]._pmode == PM_WALK3 )
|
|
{
|
|
v1 = plr[v0]._px;
|
|
v2 = plr[v0]._py;
|
|
if ( plr[v0]._pdir == 2 )
|
|
++v1;
|
|
else
|
|
++v2;
|
|
}
|
|
else
|
|
{
|
|
v1 = plr[v0].WorldX;
|
|
v2 = plr[v0].WorldY;
|
|
}
|
|
v11 = v1 - 2 * AutoMapXOfs - ViewX;
|
|
v12 = v2 - 2 * AutoMapYOfs - ViewY;
|
|
v3 = (AutoMapScale * ScrollInfo._sxoff / 100 >> 1)
|
|
+ (AutoMapScale * plr[v0]._pxoff / 100 >> 1)
|
|
+ AutoMapYPos * (v11 - v12)
|
|
+ 384;
|
|
if ( invflag || sbookflag )
|
|
v3 = (AutoMapScale * ScrollInfo._sxoff / 100 >> 1)
|
|
+ (AutoMapScale * plr[v0]._pxoff / 100 >> 1)
|
|
+ AutoMapYPos * (v11 - v12)
|
|
+ 224;
|
|
if ( chrflag || questlog )
|
|
v3 += 160;
|
|
v4 = AMPlayerX * (v12 + v11)
|
|
+ (AutoMapScale * ScrollInfo._syoff / 100 >> 1)
|
|
+ (AutoMapScale * plr[v0]._pyoff / 100 >> 1)
|
|
+ 336
|
|
- AMPlayerX;
|
|
switch ( plr[v0]._pdir )
|
|
{
|
|
case DIR_S:
|
|
engine_draw_automap_pixels(v3, v4, v3, v4 + AutoMapYPos, 153);
|
|
engine_draw_automap_pixels(v3, AutoMapYPos + v4, v3 + AMPlayerY, v4 + AMPlayerX, 153);
|
|
v10 = v4 + AMPlayerX;
|
|
v9 = v3 - AMPlayerY;
|
|
v5 = AutoMapYPos + v4;
|
|
goto LABEL_19;
|
|
case DIR_SW:
|
|
engine_draw_automap_pixels(
|
|
v3,
|
|
AMPlayerX * (v12 + v11)
|
|
+ (AutoMapScale * ScrollInfo._syoff / 100 >> 1)
|
|
+ (AutoMapScale * plr[v0]._pyoff / 100 >> 1)
|
|
+ 336
|
|
- AMPlayerX,
|
|
v3 - AutoMapYPos,
|
|
AMPlayerX * (v12 + v11)
|
|
+ (AutoMapScale * ScrollInfo._syoff / 100 >> 1)
|
|
+ (AutoMapScale * plr[v0]._pyoff / 100 >> 1)
|
|
+ 336,
|
|
153);
|
|
engine_draw_automap_pixels(v3 - AutoMapYPos, AMPlayerX + v4, v3 - AMPlayerY - AMPlayerX, v4, 153);
|
|
v7 = AMPlayerX;
|
|
v8 = v3;
|
|
v5 = AMPlayerX + v4;
|
|
v10 = AMPlayerX + v4;
|
|
goto LABEL_23;
|
|
case DIR_W:
|
|
engine_draw_automap_pixels(v3, v4, v3 - AutoMapYPos, v4, 153);
|
|
engine_draw_automap_pixels(v3 - AutoMapYPos, v4, v3 - AMPlayerX, v4 - AMPlayerY, 153);
|
|
v5 = v4;
|
|
v10 = v4 + AMPlayerY;
|
|
v9 = v3 - AMPlayerX;
|
|
goto LABEL_24;
|
|
case DIR_NW:
|
|
engine_draw_automap_pixels(v3, v4, v3 - AutoMapYPos, v4 - AMPlayerX, 153);
|
|
engine_draw_automap_pixels(v3 - AutoMapYPos, v4 - AMPlayerX, v3 - AMPlayerX, v4 - AMPlayerX, 153);
|
|
v7 = AMPlayerX;
|
|
v8 = v3 - AMPlayerY;
|
|
v10 = v4;
|
|
v5 = v4 - AMPlayerX;
|
|
LABEL_23:
|
|
v9 = v8 - v7;
|
|
LABEL_24:
|
|
v6 = v3 - AutoMapYPos;
|
|
goto LABEL_25;
|
|
case DIR_N:
|
|
engine_draw_automap_pixels(v3, v4, v3, v4 - AutoMapYPos, 153);
|
|
engine_draw_automap_pixels(v3, v4 - AutoMapYPos, v3 - AMPlayerY, v4 - AMPlayerX, 153);
|
|
v10 = v4 - AMPlayerX;
|
|
v5 = v4 - AutoMapYPos;
|
|
v9 = v3 + AMPlayerY;
|
|
LABEL_19:
|
|
v6 = v3;
|
|
goto LABEL_25;
|
|
case DIR_NE:
|
|
engine_draw_automap_pixels(v3, v4, v3 + AutoMapYPos, v4 - AMPlayerX, 153);
|
|
engine_draw_automap_pixels(AutoMapYPos + v3, v4 - AMPlayerX, v3 + AMPlayerX, v4 - AMPlayerX, 153);
|
|
v10 = v4;
|
|
v9 = v3 + AMPlayerX + AMPlayerY;
|
|
v5 = v4 - AMPlayerX;
|
|
goto LABEL_17;
|
|
case DIR_E:
|
|
engine_draw_automap_pixels(v3, v4, v3 + AutoMapYPos, v4, 153);
|
|
engine_draw_automap_pixels(AutoMapYPos + v3, v4, v3 + AMPlayerX, v4 - AMPlayerY, 153);
|
|
engine_draw_automap_pixels(AutoMapYPos + v3, v4, v3 + AMPlayerX, v4 + AMPlayerY, 153);
|
|
break;
|
|
case DIR_SE:
|
|
engine_draw_automap_pixels(
|
|
v3,
|
|
AMPlayerX * (v12 + v11)
|
|
+ (AutoMapScale * ScrollInfo._syoff / 100 >> 1)
|
|
+ (AutoMapScale * plr[v0]._pyoff / 100 >> 1)
|
|
+ 336
|
|
- AMPlayerX,
|
|
v3 + AutoMapYPos,
|
|
AMPlayerX * (v12 + v11)
|
|
+ (AutoMapScale * ScrollInfo._syoff / 100 >> 1)
|
|
+ (AutoMapScale * plr[v0]._pyoff / 100 >> 1)
|
|
+ 336,
|
|
153);
|
|
engine_draw_automap_pixels(AutoMapYPos + v3, AMPlayerX + v4, v3 + AMPlayerX + AMPlayerY, v4, 153);
|
|
v5 = AMPlayerX + v4;
|
|
v10 = AMPlayerX + v4;
|
|
v9 = v3 + AMPlayerX;
|
|
LABEL_17:
|
|
v6 = AutoMapYPos + v3;
|
|
LABEL_25:
|
|
engine_draw_automap_pixels(v6, v5, v9, v10, 153);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
// 4B84C0: using guessed type int AutoMapYPos;
|
|
// 4B84C4: using guessed type int AMPlayerX;
|
|
// 4B84C8: using guessed type int AMPlayerY;
|
|
// 4B8968: using guessed type int sbookflag;
|
|
// 69BD04: using guessed type int questlog;
|
|
|
|
//----- (00402D83) --------------------------------------------------------
|
|
short __fastcall GetAutomapType(int tx, int ty, bool view)
|
|
{
|
|
int v3; // edi
|
|
int v4; // esi
|
|
int v6; // eax
|
|
short v7; // bp
|
|
|
|
v3 = ty;
|
|
v4 = tx;
|
|
if ( view )
|
|
{
|
|
if ( tx == -1 && ty >= 0 && ty < 40 && automapview[0][ty] )
|
|
{
|
|
tx = 0;
|
|
return ~GetAutomapType(tx, ty, 0) & 0x4000;
|
|
}
|
|
if ( ty == -1 )
|
|
{
|
|
if ( tx < 0 )
|
|
return 0;
|
|
if ( tx < 40 && automapview[tx][0] )
|
|
{
|
|
ty = 0;
|
|
return ~GetAutomapType(tx, ty, 0) & 0x4000;
|
|
}
|
|
}
|
|
}
|
|
if ( tx < 0 )
|
|
return 0;
|
|
if ( tx >= 40 )
|
|
return 0;
|
|
if ( ty < 0 )
|
|
return 0;
|
|
if ( ty >= 40 )
|
|
return 0;
|
|
v6 = ty + 40 * tx;
|
|
if ( !automapview[0][v6] && view )
|
|
return 0;
|
|
v7 = automaptype[(unsigned char)dungeon[0][v6]];
|
|
if ( v7 == 7 && ((unsigned short)GetAutomapType(tx - 1, ty, 0) >> 8) & 8 )
|
|
{
|
|
if ( ((unsigned short)GetAutomapType(v4, v3 - 1, 0) >> 8) & 4 )
|
|
v7 = 1;
|
|
}
|
|
return v7;
|
|
}
|
|
|
|
//----- (00402E4A) --------------------------------------------------------
|
|
void __cdecl DrawAutomapGame()
|
|
{
|
|
int v0; // esi
|
|
char *v1; // eax
|
|
char *v2; // eax
|
|
char v3[256]; // [esp+4h] [ebp-100h]
|
|
|
|
v0 = 20;
|
|
if ( (unsigned char)gbMaxPlayers > 1u )
|
|
{
|
|
v1 = strcpy(v3, "game: ");
|
|
strcat(v1, szPlayerName);
|
|
PrintGameStr(8, 20, v3, 3);
|
|
v0 = 35;
|
|
if ( szPlayerDescript[0] )
|
|
{
|
|
v2 = strcpy(v3, "password: ");
|
|
strcat(v2, szPlayerDescript);
|
|
PrintGameStr(8, 35, v3, 3);
|
|
v0 = 50;
|
|
}
|
|
}
|
|
if ( setlevel )
|
|
{
|
|
PrintGameStr(8, v0, quest_level_names[(unsigned char)setlvlnum], 3);
|
|
}
|
|
else if ( currlevel )
|
|
{
|
|
sprintf(v3, "Level: %i", currlevel);
|
|
PrintGameStr(8, v0, v3, 3);
|
|
}
|
|
}
|
|
// 5CCB10: using guessed type char setlvlnum;
|
|
// 5CF31D: using guessed type char setlevel;
|
|
// 679660: using guessed type char gbMaxPlayers;
|
|
|
|
//----- (00402F27) --------------------------------------------------------
|
|
void __fastcall SetAutomapView(int x, int y)
|
|
{
|
|
signed int v2; // esi
|
|
signed int v3; // edi
|
|
int v4; // ebx
|
|
short v5; // ax
|
|
short v6; // cx
|
|
int v7; // eax
|
|
int v8; // eax
|
|
int v9; // eax
|
|
int v10; // eax
|
|
short v11; // ax
|
|
int v12; // edi
|
|
|
|
v2 = (x - 16) >> 1;
|
|
v3 = (y - 16) >> 1;
|
|
if ( v2 < 0 || v2 >= 40 || v3 < 0 || v3 >= 40 )
|
|
return;
|
|
v4 = v3 + 40 * v2;
|
|
automapview[0][v4] = 1;
|
|
v5 = GetAutomapType((x - 16) >> 1, (y - 16) >> 1, 0);
|
|
v6 = v5 & 0x4000;
|
|
v7 = (v5 & 0xF) - 2;
|
|
if ( !v7 )
|
|
{
|
|
if ( v6 )
|
|
{
|
|
LABEL_19:
|
|
if ( GetAutomapType(v2, v3 + 1, 0) == 0x4007 )
|
|
automapview[0][v4 + 1] = 1;
|
|
return;
|
|
}
|
|
goto LABEL_35;
|
|
}
|
|
v8 = v7 - 1;
|
|
if ( !v8 )
|
|
{
|
|
if ( v6 )
|
|
{
|
|
v11 = GetAutomapType(v2 + 1, v3, 0);
|
|
LABEL_32:
|
|
if ( v11 == 0x4007 )
|
|
automapview[1][v4] = 1;
|
|
return;
|
|
}
|
|
LABEL_14:
|
|
if ( GetAutomapType(v2, v3 - 1, 0) & 0x4000 )
|
|
automapview[0][v4 - 1] = 1; // AMbyte_4B7E4C[v4 + 31] = 1;
|
|
return;
|
|
}
|
|
v9 = v8 - 1;
|
|
if ( v9 )
|
|
{
|
|
v10 = v9 - 1;
|
|
if ( v10 )
|
|
{
|
|
if ( v10 != 1 )
|
|
return;
|
|
if ( v6 )
|
|
{
|
|
if ( GetAutomapType(v2 - 1, v3, 0) & 0x4000 )
|
|
automapview[-1][v4] = 1; // *((_BYTE *)&AMdword_4B7E44 + v4) = 1;
|
|
LABEL_13:
|
|
v11 = GetAutomapType(v2 + 1, v3, 0);
|
|
goto LABEL_32;
|
|
}
|
|
goto LABEL_14;
|
|
}
|
|
if ( v6 )
|
|
{
|
|
if ( GetAutomapType(v2, v3 - 1, 0) & 0x4000 )
|
|
automapview[0][v4 - 1] = 1; // AMbyte_4B7E4C[v4 + 31] = 1;
|
|
goto LABEL_19;
|
|
}
|
|
LABEL_35:
|
|
if ( GetAutomapType(v2 - 1, v3, 0) & 0x4000 )
|
|
automapview[-1][v4] = 1; // *((_BYTE *)&AMdword_4B7E44 + v4) = 1;
|
|
return;
|
|
}
|
|
if ( v6 )
|
|
{
|
|
if ( GetAutomapType(v2, v3 + 1, 0) == 0x4007 )
|
|
automapview[0][v4 + 1] = 1;
|
|
goto LABEL_13;
|
|
}
|
|
if ( GetAutomapType(v2 - 1, v3, 0) & 0x4000 )
|
|
automapview[-1][v4] = 1; // *((_BYTE *)&AMdword_4B7E44 + v4) = 1;
|
|
v12 = v3 - 1;
|
|
if ( GetAutomapType(v2, v12, 0) & 0x4000 )
|
|
automapview[0][v4 - 1] = 1; // AMbyte_4B7E4C[v4 + 31] = 1;
|
|
if ( GetAutomapType(v2 - 1, v12, 0) & 0x4000 )
|
|
automapview[-1][v4 - 1] = 1; /* *((_BYTE *)&AMdword_4B7E40 + v4 + 3) = 1; fix */
|
|
}
|
|
// 4B7E40: using guessed type int AMdword_4B7E40;
|
|
// 4B7E44: using guessed type int AMdword_4B7E44;
|
|
|
|
//----- (004030DD) --------------------------------------------------------
|
|
void __cdecl AutomapZoomReset()
|
|
{
|
|
AutoMapXOfs = 0;
|
|
AutoMapYOfs = 0;
|
|
AutoMapPosBits = (AutoMapScale << 6) / 100;
|
|
AutoMapXPos = AutoMapPosBits >> 1;
|
|
AutoMapYPos = AutoMapPosBits >> 2;
|
|
AMPlayerX = AutoMapPosBits >> 3;
|
|
AMPlayerY = AutoMapPosBits >> 4;
|
|
}
|
|
// 4B84B0: using guessed type int AutoMapXOfs;
|
|
// 4B84B4: using guessed type int AutoMapYOfs;
|
|
// 4B84B8: using guessed type int AutoMapPosBits;
|
|
// 4B84BC: using guessed type int AutoMapXPos;
|
|
// 4B84C0: using guessed type int AutoMapYPos;
|
|
// 4B84C4: using guessed type int AMPlayerX;
|
|
// 4B84C8: using guessed type int AMPlayerY;
|