You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
784 lines
22 KiB
784 lines
22 KiB
//HEADER_GOES_HERE |
|
|
|
#include "../types.h" |
|
|
|
// BUGFIX: only the first 256 elements are ever read |
|
USHORT automaptype[512]; |
|
static int MapX; |
|
static int MapY; |
|
BOOL automapflag; // idb |
|
char AMbyte_4B7E4C[32]; |
|
unsigned char automapview[DMAXX][DMAXY]; |
|
int AutoMapScale; // idb |
|
int AutoMapXOfs; // weak |
|
int AutoMapYOfs; // weak |
|
int AutoMapPosBits; // weak |
|
int AutoMapXPos; // weak |
|
int AutoMapYPos; // weak |
|
int AMPlayerX; // weak |
|
int AMPlayerY; // weak |
|
|
|
// color used to draw the player's arrow |
|
#define COLOR_PLAYER (PAL8_ORANGE+1) |
|
// color for bright map lines (doors, stairs etc.) |
|
#define COLOR_BRIGHT PAL8_YELLOW |
|
// color for dim map lines/dots |
|
#define COLOR_DIM (PAL16_YELLOW+8) |
|
|
|
#define MAPFLAG_TYPE 0x000F |
|
// these are in the second byte |
|
#define MAPFLAG_VERTDOOR 0x01 |
|
#define MAPFLAG_HORZDOOR 0x02 |
|
#define MAPFLAG_VERTARCH 0x04 |
|
#define MAPFLAG_HORZARCH 0x08 |
|
#define MAPFLAG_VERTGRATE 0x10 |
|
#define MAPFLAG_HORZGRATE 0x20 |
|
#define MAPFLAG_SQUARE 0x40 |
|
#define MAPFLAG_STAIRS 0x80 |
|
|
|
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; |
|
|
|
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, sizeof(automaptype)); |
|
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, sizeof(automapview)); |
|
v13 = 0; |
|
do |
|
{ |
|
v14 = (unsigned char *)dFlags + v13; |
|
v15 = 112; |
|
do |
|
{ |
|
*v14 &= ~DFLAG_EXPLORED; |
|
v14 += 112; |
|
--v15; |
|
} |
|
while ( v15 ); |
|
++v13; |
|
} |
|
while ( v13 < 112 ); |
|
} |
|
// 5BB1ED: using guessed type char leveltype; |
|
|
|
void __cdecl StartAutomap() |
|
{ |
|
AutoMapXOfs = 0; |
|
AutoMapYOfs = 0; |
|
automapflag = 1; |
|
} |
|
// 4B84B0: using guessed type int AutoMapXOfs; |
|
// 4B84B4: using guessed type int AutoMapYOfs; |
|
|
|
void __cdecl AutomapUp() |
|
{ |
|
--AutoMapXOfs; |
|
--AutoMapYOfs; |
|
} |
|
// 4B84B0: using guessed type int AutoMapXOfs; |
|
// 4B84B4: using guessed type int AutoMapYOfs; |
|
|
|
void __cdecl AutomapDown() |
|
{ |
|
++AutoMapXOfs; |
|
++AutoMapYOfs; |
|
} |
|
// 4B84B0: using guessed type int AutoMapXOfs; |
|
// 4B84B4: using guessed type int AutoMapYOfs; |
|
|
|
void __cdecl AutomapLeft() |
|
{ |
|
--AutoMapXOfs; |
|
++AutoMapYOfs; |
|
} |
|
// 4B84B0: using guessed type int AutoMapXOfs; |
|
// 4B84B4: using guessed type int AutoMapYOfs; |
|
|
|
void __cdecl AutomapRight() |
|
{ |
|
++AutoMapXOfs; |
|
--AutoMapYOfs; |
|
} |
|
// 4B84B0: using guessed type int AutoMapXOfs; |
|
// 4B84B4: using guessed type int AutoMapYOfs; |
|
|
|
void __cdecl AutomapZoomIn() |
|
{ |
|
if ( AutoMapScale < 200 ) |
|
{ |
|
AutoMapScale += 5; |
|
AutoMapPosBits = (AutoMapScale << 6) / 100; |
|
AutoMapXPos = AutoMapPosBits >> 1; |
|
AutoMapYPos = AutoMapXPos >> 1; |
|
AMPlayerX = AutoMapYPos >> 1; |
|
AMPlayerY = AMPlayerX >> 1; |
|
} |
|
} |
|
// 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; |
|
|
|
void __cdecl AutomapZoomOut() |
|
{ |
|
if ( AutoMapScale > 50 ) |
|
{ |
|
AutoMapScale -= 5; |
|
AutoMapPosBits = (AutoMapScale << 6) / 100; |
|
AutoMapXPos = AutoMapPosBits >> 1; |
|
AutoMapYPos = AutoMapXPos >> 1; |
|
AMPlayerX = AutoMapYPos >> 1; |
|
AMPlayerY = AMPlayerX >> 1; |
|
} |
|
} |
|
// 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; |
|
|
|
void __cdecl DrawAutomap() |
|
{ |
|
int cells; |
|
int screen_x; |
|
int screen_y; |
|
int i, j; |
|
int mapx, mapy; |
|
|
|
if ( leveltype == DTYPE_TOWN ) { |
|
DrawAutomapGame(); |
|
return; |
|
} |
|
|
|
gpBufEnd = (unsigned char *)&gpBuffer->row[352]; |
|
|
|
MapX = (ViewX - 16) >> 1; |
|
while ( MapX + AutoMapXOfs < 0 ) |
|
AutoMapXOfs++; |
|
while ( MapX + AutoMapXOfs >= DMAXX ) |
|
AutoMapXOfs--; |
|
MapX += AutoMapXOfs; |
|
|
|
MapY = (ViewY - 16) >> 1; |
|
while ( MapY + AutoMapYOfs < 0 ) |
|
AutoMapYOfs++; |
|
while ( MapY + AutoMapYOfs >= DMAXY ) |
|
AutoMapYOfs--; |
|
MapY += AutoMapYOfs; |
|
|
|
cells = AMbyte_4B7E4C[(AutoMapScale - 50) / 5]; |
|
if ( ScrollInfo._sxoff + ScrollInfo._syoff ) |
|
cells++; |
|
mapx = MapX - cells; |
|
mapy = MapY - 1; |
|
|
|
if ( cells & 1 ) { |
|
screen_x = 384 - AutoMapPosBits * ((cells - 1) >> 1); |
|
screen_y = 336 - AutoMapXPos * ((cells + 1) >> 1); |
|
} else { |
|
screen_x = 384 - AutoMapPosBits * (cells >> 1) + AutoMapXPos; |
|
screen_y = 336 - AutoMapXPos * (cells >> 1) - AutoMapYPos; |
|
} |
|
if ( ViewX & 1 ) { |
|
screen_x -= AutoMapYPos; |
|
screen_y -= AMPlayerX; |
|
} |
|
if ( ViewY & 1 ) { |
|
screen_x += AutoMapYPos; |
|
screen_y -= AMPlayerX; |
|
} |
|
|
|
screen_x += AutoMapScale * ScrollInfo._sxoff / 100 >> 1; |
|
screen_y += AutoMapScale * ScrollInfo._syoff / 100 >> 1; |
|
if ( invflag || sbookflag ) { |
|
screen_x -= 160; |
|
} |
|
if ( chrflag || questlog ) { |
|
screen_x += 160; |
|
} |
|
|
|
for ( i = 0; i <= cells + 1; i++ ) { |
|
int x = screen_x; |
|
int y; |
|
|
|
for ( j = 0; j < cells; j++ ) { |
|
USHORT maptype = GetAutomapType(mapx + j, mapy - j, TRUE); |
|
if ( maptype ) |
|
DrawAutomapType(x, screen_y, maptype); |
|
x += AutoMapPosBits; |
|
} |
|
mapy++; |
|
x = screen_x - AutoMapXPos; |
|
y = screen_y + AutoMapYPos; |
|
for ( j = 0; j <= cells; j++ ) { |
|
USHORT maptype = GetAutomapType(mapx + j, mapy - j, TRUE); |
|
if ( maptype ) |
|
DrawAutomapType(x, y, maptype); |
|
x += AutoMapPosBits; |
|
} |
|
mapx++; |
|
screen_y += AutoMapXPos; |
|
} |
|
DrawAutomapPlr(); |
|
DrawAutomapGame(); |
|
} |
|
// 4B8968: using guessed type int sbookflag; |
|
// 5BB1ED: using guessed type char leveltype; |
|
// 69BD04: using guessed type int questlog; |
|
// 69CF0C: using guessed type int gpBufEnd; |
|
|
|
void __fastcall DrawAutomapType(int screen_x, int screen_y, USHORT automap_type) |
|
{ |
|
BOOL do_vert; |
|
BOOL do_horz; |
|
BOOL do_cave_horz; |
|
BOOL do_cave_vert; |
|
int x1, y1, x2, y2; |
|
|
|
UCHAR flags = automap_type >> 8; |
|
|
|
if ( flags & MAPFLAG_SQUARE ) { |
|
ENG_set_pixel(screen_x, screen_y, COLOR_DIM); |
|
ENG_set_pixel(screen_x - AMPlayerX, screen_y - AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x - AMPlayerX, screen_y + AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x + AMPlayerX, screen_y - AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x + AMPlayerX, screen_y + AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x - AutoMapYPos, screen_y, COLOR_DIM); |
|
ENG_set_pixel(screen_x + AutoMapYPos, screen_y, COLOR_DIM); |
|
ENG_set_pixel(screen_x, screen_y - AMPlayerX, COLOR_DIM); |
|
ENG_set_pixel(screen_x, screen_y + AMPlayerX, COLOR_DIM); |
|
ENG_set_pixel(screen_x + AMPlayerX - AutoMapXPos, screen_y + AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x - AMPlayerX + AutoMapXPos, screen_y + AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x - AutoMapYPos, screen_y + AMPlayerX, COLOR_DIM); |
|
ENG_set_pixel(screen_x + AutoMapYPos, screen_y + AMPlayerX, COLOR_DIM); |
|
ENG_set_pixel(screen_x - AMPlayerX, screen_y + AutoMapYPos - AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x + AMPlayerX, screen_y + AutoMapYPos - AMPlayerY, COLOR_DIM); |
|
ENG_set_pixel(screen_x, screen_y + AutoMapYPos, COLOR_DIM); |
|
} |
|
|
|
if ( flags & MAPFLAG_STAIRS ) { |
|
DrawLine(screen_x - AMPlayerX, screen_y - AMPlayerX - AMPlayerY, screen_x + AMPlayerX + AutoMapYPos, screen_y + AMPlayerY, COLOR_BRIGHT); |
|
DrawLine(screen_x - AutoMapYPos, screen_y - AMPlayerX, screen_x + AutoMapYPos, screen_y + AMPlayerX, COLOR_BRIGHT); |
|
DrawLine(screen_x - AutoMapYPos - AMPlayerX, screen_y - AMPlayerY, screen_x + AMPlayerX, screen_y + AMPlayerX + AMPlayerY, COLOR_BRIGHT); |
|
DrawLine(screen_x - AutoMapXPos, screen_y, screen_x, screen_y + AutoMapYPos, COLOR_BRIGHT); |
|
} |
|
|
|
do_vert = FALSE; |
|
do_horz = FALSE; |
|
do_cave_horz = FALSE; |
|
do_cave_vert = FALSE; |
|
switch ( automap_type & MAPFLAG_TYPE ) { |
|
case 1: // stand-alone column or other unpassable object |
|
x1 = screen_x - AutoMapYPos; |
|
y1 = screen_y - AutoMapYPos; |
|
x2 = x1 + AutoMapXPos; |
|
y2 = screen_y - AMPlayerX; |
|
DrawLine(screen_x, y1, x1, y2, COLOR_DIM); |
|
DrawLine(screen_x, y1, x2, y2, COLOR_DIM); |
|
DrawLine(screen_x, screen_y, x1, y2, COLOR_DIM); |
|
DrawLine(screen_x, screen_y, x2, y2, COLOR_DIM); |
|
return; |
|
case 2: |
|
case 5: |
|
do_vert = TRUE; |
|
break; |
|
case 4: |
|
do_vert = TRUE; |
|
do_horz = TRUE; |
|
break; |
|
case 3: |
|
case 6: |
|
do_horz = TRUE; |
|
break; |
|
case 8: |
|
do_vert = TRUE; |
|
do_cave_horz = TRUE; |
|
break; |
|
case 9: |
|
do_horz = TRUE; |
|
do_cave_vert = TRUE; |
|
break; |
|
case 10: |
|
do_cave_horz = TRUE; |
|
break; |
|
case 11: |
|
do_cave_vert = TRUE; |
|
break; |
|
case 12: |
|
do_cave_horz = TRUE; |
|
do_cave_vert = TRUE; |
|
break; |
|
} |
|
|
|
if ( do_vert ) { // right-facing obstacle |
|
if ( flags & MAPFLAG_VERTDOOR ) { // two wall segments with a door in the middle |
|
x1 = screen_x - AutoMapXPos; |
|
x2 = screen_x - AutoMapYPos; |
|
y1 = screen_y - AutoMapYPos; |
|
y2 = screen_y - AMPlayerX; |
|
|
|
DrawLine(screen_x, y1, screen_x - AMPlayerX, y1 + AMPlayerY, COLOR_DIM); |
|
DrawLine(x1, screen_y, x1 + AMPlayerX, screen_y - AMPlayerY, COLOR_DIM); |
|
DrawLine(x2, y1, x1, y2, COLOR_BRIGHT); |
|
DrawLine(x2, y1, screen_x, y2, COLOR_BRIGHT); |
|
DrawLine(x2, screen_y, x1, y2, COLOR_BRIGHT); |
|
DrawLine(x2, screen_y, screen_x, y2, COLOR_BRIGHT); |
|
} |
|
if ( flags & MAPFLAG_VERTGRATE ) { // right-facing half-wall |
|
DrawLine(screen_x - AutoMapYPos, screen_y - AMPlayerX, screen_x - AutoMapXPos, screen_y, COLOR_DIM); |
|
flags |= MAPFLAG_VERTARCH; |
|
} |
|
if ( flags & MAPFLAG_VERTARCH ) { // window or passable column |
|
x1 = screen_x - AutoMapYPos; |
|
y1 = screen_y - AutoMapYPos; |
|
x2 = x1 + AutoMapXPos; |
|
y2 = screen_y - AMPlayerX; |
|
|
|
DrawLine(screen_x, y1, x1, y2, COLOR_DIM); |
|
DrawLine(screen_x, y1, x2, y2, COLOR_DIM); |
|
DrawLine(screen_x, screen_y, x1, y2, COLOR_DIM); |
|
DrawLine(screen_x, screen_y, x2, y2, COLOR_DIM); |
|
} |
|
if ( !( flags & (MAPFLAG_VERTDOOR | MAPFLAG_VERTGRATE | MAPFLAG_VERTARCH )) ) |
|
DrawLine(screen_x, screen_y - AutoMapYPos, screen_x - AutoMapXPos, screen_y, COLOR_DIM); |
|
} |
|
|
|
if ( do_horz ) { // left-facing obstacle |
|
if ( flags & MAPFLAG_HORZDOOR ) { |
|
x1 = screen_x + AutoMapYPos; |
|
x2 = screen_x + AutoMapXPos; |
|
y1 = screen_y - AutoMapYPos; |
|
y2 = screen_y - AMPlayerX; |
|
|
|
DrawLine(screen_x, y1, screen_x + AMPlayerX, y1 + AMPlayerY, COLOR_DIM); |
|
DrawLine(x2, screen_y, x2 - AMPlayerX, screen_y - AMPlayerY, COLOR_DIM); |
|
DrawLine(x1, y1, screen_x, y2, COLOR_BRIGHT); |
|
DrawLine(x1, y1, x2, y2, COLOR_BRIGHT); |
|
DrawLine(x1, screen_y, screen_x, y2, COLOR_BRIGHT); |
|
DrawLine(x1, screen_y, x2, y2, COLOR_BRIGHT); |
|
} |
|
if ( flags & MAPFLAG_HORZGRATE ) { |
|
DrawLine(screen_x + AutoMapYPos, screen_y - AMPlayerX, screen_x + AutoMapXPos, screen_y, COLOR_DIM); |
|
flags |= MAPFLAG_HORZARCH; |
|
} |
|
if ( flags & MAPFLAG_HORZARCH ) { |
|
x1 = screen_x - AutoMapYPos; |
|
y1 = screen_y - AutoMapYPos; |
|
x2 = x1 + AutoMapXPos; |
|
y2 = screen_y - AMPlayerX; |
|
|
|
DrawLine(screen_x, y1, x1, y2, COLOR_DIM); |
|
DrawLine(screen_x, y1, x2, y2, COLOR_DIM); |
|
DrawLine(screen_x, screen_y, x1, y2, COLOR_DIM); |
|
DrawLine(screen_x, screen_y, x2, y2, COLOR_DIM); |
|
} |
|
if ( !( flags & ( MAPFLAG_HORZDOOR | MAPFLAG_HORZGRATE | MAPFLAG_HORZARCH )) ) |
|
DrawLine(screen_x, screen_y - AutoMapYPos, screen_x + AutoMapXPos, screen_y, COLOR_DIM); |
|
} |
|
|
|
// for caves the horz/vert flags are switched |
|
if ( do_cave_horz ) { |
|
if ( flags & MAPFLAG_VERTDOOR ) { |
|
x1 = screen_x - AutoMapXPos; |
|
x2 = screen_x - AutoMapYPos; |
|
y1 = screen_y + AutoMapYPos; |
|
y2 = screen_y + AMPlayerX; |
|
|
|
DrawLine(screen_x, y1, screen_x - AMPlayerX, y1 - AMPlayerY, COLOR_DIM); |
|
DrawLine(x1, screen_y, x1 + AMPlayerX, screen_y + AMPlayerY, COLOR_DIM); |
|
DrawLine(x2, y1, x1, y2, COLOR_BRIGHT); |
|
DrawLine(x2, y1, screen_x, y2, COLOR_BRIGHT); |
|
DrawLine(x2, screen_y, x1, y2, COLOR_BRIGHT); |
|
DrawLine(x2, screen_y, screen_x, y2, COLOR_BRIGHT); |
|
} else |
|
DrawLine(screen_x, screen_y + AutoMapYPos, screen_x - AutoMapXPos, screen_y, COLOR_DIM); |
|
} |
|
|
|
if ( do_cave_vert ) { |
|
if ( flags & MAPFLAG_HORZDOOR ) { |
|
x1 = screen_x + AutoMapYPos; |
|
x2 = screen_x + AutoMapXPos; |
|
y1 = screen_y + AutoMapYPos; |
|
y2 = screen_y + AMPlayerX; |
|
|
|
DrawLine(screen_x, y1, screen_x + AMPlayerX, y1 - AMPlayerY, COLOR_DIM); |
|
DrawLine(x2, screen_y, x2 - AMPlayerX, screen_y + AMPlayerY, COLOR_DIM); |
|
DrawLine(x1, y1, screen_x, y2, COLOR_BRIGHT); |
|
DrawLine(x1, y1, x2, y2, COLOR_BRIGHT); |
|
DrawLine(x1, screen_y, screen_x, y2, COLOR_BRIGHT); |
|
DrawLine(x1, screen_y, x2, y2, COLOR_BRIGHT); |
|
} else |
|
DrawLine(screen_x, screen_y + AutoMapYPos, screen_x + AutoMapXPos, screen_y, COLOR_DIM); |
|
} |
|
} |
|
|
|
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: |
|
DrawLine(v3, v4, v3, v4 + AutoMapYPos, 153); |
|
DrawLine(v3, AutoMapYPos + v4, v3 + AMPlayerY, v4 + AMPlayerX, 153); |
|
v10 = v4 + AMPlayerX; |
|
v9 = v3 - AMPlayerY; |
|
v5 = AutoMapYPos + v4; |
|
goto LABEL_19; |
|
case DIR_SW: |
|
DrawLine( |
|
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); |
|
DrawLine(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: |
|
DrawLine(v3, v4, v3 - AutoMapYPos, v4, 153); |
|
DrawLine(v3 - AutoMapYPos, v4, v3 - AMPlayerX, v4 - AMPlayerY, 153); |
|
v5 = v4; |
|
v10 = v4 + AMPlayerY; |
|
v9 = v3 - AMPlayerX; |
|
goto LABEL_24; |
|
case DIR_NW: |
|
DrawLine(v3, v4, v3 - AutoMapYPos, v4 - AMPlayerX, 153); |
|
DrawLine(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: |
|
DrawLine(v3, v4, v3, v4 - AutoMapYPos, 153); |
|
DrawLine(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: |
|
DrawLine(v3, v4, v3 + AutoMapYPos, v4 - AMPlayerX, 153); |
|
DrawLine(AutoMapYPos + v3, v4 - AMPlayerX, v3 + AMPlayerX, v4 - AMPlayerX, 153); |
|
v10 = v4; |
|
v9 = v3 + AMPlayerX + AMPlayerY; |
|
v5 = v4 - AMPlayerX; |
|
goto LABEL_17; |
|
case DIR_E: |
|
DrawLine(v3, v4, v3 + AutoMapYPos, v4, 153); |
|
DrawLine(AutoMapYPos + v3, v4, v3 + AMPlayerX, v4 - AMPlayerY, 153); |
|
DrawLine(AutoMapYPos + v3, v4, v3 + AMPlayerX, v4 + AMPlayerY, 153); |
|
break; |
|
case DIR_SE: |
|
DrawLine( |
|
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); |
|
DrawLine(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: |
|
DrawLine(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; |
|
|
|
USHORT __fastcall GetAutomapType(int x, int y, BOOL view) |
|
{ |
|
if ( view ) { |
|
if ( x == -1 && y >= 0 && y < DMAXY && automapview[0][y] ) |
|
return ~GetAutomapType(0, y, FALSE) & (MAPFLAG_SQUARE << 8); |
|
if ( y == -1 ) { |
|
if ( x < 0 ) |
|
return 0; |
|
if ( x < DMAXX && automapview[x][0] ) |
|
return ~GetAutomapType(x, 0, FALSE) & (MAPFLAG_SQUARE << 8); |
|
} |
|
} |
|
|
|
if ( x >= 0 && x < DMAXX && y >= 0 && y < DMAXY ) { |
|
if ( automapview[x][y] || !view ) { |
|
USHORT type = automaptype[(UCHAR)dungeon[x][y]]; |
|
if ( type == 7 && GetAutomapType(x - 1, y, FALSE) & (MAPFLAG_HORZARCH << 8) |
|
&& GetAutomapType(x, y - 1, FALSE) & (MAPFLAG_VERTARCH << 8) ) { |
|
type = 1; |
|
} |
|
return type; |
|
} |
|
} |
|
return 0; |
|
} |
|
|
|
void __cdecl DrawAutomapGame() |
|
{ |
|
char desc[256]; |
|
int nextline = 20; |
|
|
|
if ( gbMaxPlayers > 1 ) { |
|
strcat(strcpy(desc, "game: "), szPlayerName); |
|
PrintGameStr(8, 20, desc, COL_GOLD); |
|
nextline = 35; |
|
if ( szPlayerDescript[0] ) { |
|
strcat(strcpy(desc, "password: "), szPlayerDescript); |
|
PrintGameStr(8, 35, desc, COL_GOLD); |
|
nextline = 50; |
|
} |
|
} |
|
if ( setlevel ) |
|
PrintGameStr(8, nextline, quest_level_names[setlvlnum], COL_GOLD); |
|
else if ( currlevel ) { |
|
sprintf(desc, "Level: %i", currlevel); |
|
PrintGameStr(8, nextline, desc, COL_GOLD); |
|
} |
|
} |
|
// 5CF31D: using guessed type char setlevel; |
|
|
|
void __fastcall SetAutomapView(int x, int y) |
|
{ |
|
int xx = (x - 16) >> 1; |
|
int yy = (y - 16) >> 1; |
|
|
|
if ( xx < 0 || xx >= DMAXX || yy < 0 || yy >= DMAXY ) { |
|
return; |
|
} |
|
|
|
automapview[xx][yy] = 1; |
|
|
|
USHORT maptype = GetAutomapType(xx, yy, FALSE); |
|
USHORT solid = maptype & 0x4000; |
|
|
|
switch ( maptype & 0xF ) { |
|
case 2: |
|
if ( solid ) { |
|
if ( GetAutomapType(xx, yy + 1, FALSE) == 0x4007 ) |
|
automapview[xx][yy + 1] = 1; |
|
} |
|
else if ( GetAutomapType(xx - 1, yy, FALSE) & 0x4000 ) |
|
automapview[xx - 1][yy] = 1; |
|
break; |
|
case 3: |
|
if ( solid ) { |
|
if ( GetAutomapType(xx + 1, yy, FALSE) == 0x4007 ) |
|
automapview[xx + 1][yy] = 1; |
|
} |
|
else if ( GetAutomapType(xx, yy - 1, FALSE) & 0x4000 ) |
|
automapview[xx][yy - 1] = 1; |
|
break; |
|
case 4: |
|
if ( solid ) { |
|
if ( GetAutomapType(xx, yy + 1, FALSE) == 0x4007 ) |
|
automapview[xx][yy + 1] = 1; |
|
if ( GetAutomapType(xx + 1, yy, FALSE) == 0x4007 ) |
|
automapview[xx + 1][yy] = 1; |
|
} |
|
else { |
|
if ( GetAutomapType(xx - 1, yy, FALSE) & 0x4000 ) |
|
automapview[xx - 1][yy] = 1; |
|
if ( GetAutomapType(xx, yy - 1, FALSE) & 0x4000 ) |
|
automapview[xx][yy - 1] = 1; |
|
if ( GetAutomapType(xx - 1, yy - 1, FALSE) & 0x4000 ) |
|
automapview[xx - 1][yy - 1] = 1; |
|
} |
|
break; |
|
case 5: |
|
if ( solid ) { |
|
if ( GetAutomapType(xx, yy - 1, FALSE) & 0x4000 ) |
|
automapview[xx][yy - 1] = 1; |
|
if ( GetAutomapType(xx, yy + 1, FALSE) == 0x4007 ) |
|
automapview[xx][yy + 1] = 1; |
|
} |
|
else if ( GetAutomapType(xx - 1, yy, FALSE) & 0x4000 ) |
|
automapview[xx - 1][yy] = 1; |
|
break; |
|
case 6: |
|
if ( solid ) { |
|
if ( GetAutomapType(xx - 1, yy, FALSE) & 0x4000 ) |
|
automapview[xx - 1][yy] = 1; |
|
if ( GetAutomapType(xx + 1, yy, FALSE) == 0x4007 ) |
|
automapview[xx + 1][yy] = 1; |
|
} |
|
else if ( GetAutomapType(xx, yy - 1, FALSE) & 0x4000 ) |
|
automapview[xx][yy - 1] = 1; |
|
} |
|
} |
|
|
|
void __cdecl AutomapZoomReset() |
|
{ |
|
AutoMapXOfs = 0; |
|
AutoMapYOfs = 0; |
|
AutoMapPosBits = (AutoMapScale << 6) / 100; |
|
AutoMapXPos = AutoMapPosBits >> 1; |
|
AutoMapYPos = AutoMapXPos >> 1; |
|
AMPlayerX = AutoMapYPos >> 1; |
|
AMPlayerY = AMPlayerX >> 1; |
|
} |
|
// 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;
|
|
|