diff --git a/Source/automap.cpp b/Source/automap.cpp index c573ee72e..c1163deb5 100644 --- a/Source/automap.cpp +++ b/Source/automap.cpp @@ -9,42 +9,42 @@ 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 AutoMapScale; // idb +int AutoMapXOfs; // weak +int AutoMapYOfs; // weak int AutoMapPosBits; // weak -int AutoMapXPos; // weak -int AutoMapYPos; // weak -int AMPlayerX; // weak -int AMPlayerY; // 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) +#define COLOR_PLAYER (PAL8_ORANGE + 1) // color for bright map lines (doors, stairs etc.) -#define COLOR_BRIGHT PAL8_YELLOW +#define COLOR_BRIGHT PAL8_YELLOW // color for dim map lines/dots -#define COLOR_DIM (PAL16_YELLOW+8) +#define COLOR_DIM (PAL16_YELLOW + 8) -#define MAPFLAG_TYPE 0x000F +#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 +#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; + 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; @@ -54,144 +54,135 @@ void __cdecl InitAutomapOnce() 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 ); + 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); } void __cdecl StartAutomap() { - AutoMapXOfs = 0; - AutoMapYOfs = 0; - automapflag = 1; + AutoMapXOfs = 0; + AutoMapYOfs = 0; + automapflag = 1; } // 4B84B0: using guessed type int AutoMapXOfs; // 4B84B4: using guessed type int AutoMapYOfs; void __cdecl AutomapUp() { - --AutoMapXOfs; - --AutoMapYOfs; + --AutoMapXOfs; + --AutoMapYOfs; } // 4B84B0: using guessed type int AutoMapXOfs; // 4B84B4: using guessed type int AutoMapYOfs; void __cdecl AutomapDown() { - ++AutoMapXOfs; - ++AutoMapYOfs; + ++AutoMapXOfs; + ++AutoMapYOfs; } // 4B84B0: using guessed type int AutoMapXOfs; // 4B84B4: using guessed type int AutoMapYOfs; void __cdecl AutomapLeft() { - --AutoMapXOfs; - ++AutoMapYOfs; + --AutoMapXOfs; + ++AutoMapYOfs; } // 4B84B0: using guessed type int AutoMapXOfs; // 4B84B4: using guessed type int AutoMapYOfs; void __cdecl AutomapRight() { - ++AutoMapXOfs; - --AutoMapYOfs; + ++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; - } + 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; @@ -201,15 +192,14 @@ void __cdecl AutomapZoomIn() void __cdecl AutomapZoomOut() { - if ( AutoMapScale > 50 ) - { - AutoMapScale -= 5; - AutoMapPosBits = (AutoMapScale << 6) / 100; - AutoMapXPos = AutoMapPosBits >> 1; - AutoMapYPos = AutoMapXPos >> 1; - AMPlayerX = AutoMapYPos >> 1; - AMPlayerY = AMPlayerX >> 1; - } + 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; @@ -219,88 +209,88 @@ void __cdecl AutomapZoomOut() 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(); + 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; // 69BD04: using guessed type int questlog; @@ -308,333 +298,329 @@ void __cdecl DrawAutomap() 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); - } + 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; - } + 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; @@ -646,132 +632,127 @@ LABEL_25: 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; + 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); - } + 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[(UCHAR)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; - } + 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; + 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;