From 88ea1d4463a3ffc7d2956c44ccb60e18da4642ab Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Sat, 6 Apr 2019 20:24:07 -0500 Subject: [PATCH] Cleanup DRLG_L3.cpp --- Source/drlg_l3.cpp | 2045 ++++++++++++++++---------------------------- Source/drlg_l3.h | 14 +- 2 files changed, 764 insertions(+), 1295 deletions(-) diff --git a/Source/drlg_l3.cpp b/Source/drlg_l3.cpp index a6c98eccd..42341c4c3 100644 --- a/Source/drlg_l3.cpp +++ b/Source/drlg_l3.cpp @@ -260,80 +260,49 @@ int __cdecl DRLG_L3Anvil() void __cdecl FixL3Warp() { - int v0; // ecx - signed int v1; // esi - char *v2; // eax - char v3; // dl - signed int v4; // eax - - v0 = 0; - while (2) { - v1 = 0; - v2 = (char *)&dungeon[1][v0 + 1]; - do { - v3 = *(v2 - 41); - if (v3 == 125 && *(v2 - 1) == 125 && *(v2 - 40) == 125 && *v2 == 125) { - v4 = v1; - dungeon[v4][v0] = -100; - dungeon[v4 + 1][v0] = -101; - dungeon[v4][v0 + 1] = -103; - dungeon[v4 + 1][v0 + 1] = -102; + int i, j; + + for(j = 0; j < 40; j++) { + for(i = 0; i < 40; i++) { + if(dungeon[i][j] == 125 && dungeon[i + 1][j] == 125 && dungeon[i][j + 1] == 125 && dungeon[i + 1][j + 1] == 125) { + dungeon[i][j] = 156; + dungeon[i + 1][j] = 155; + dungeon[i][j + 1] = 153; + dungeon[i + 1][j + 1] = 154; return; } - if (v3 == 5 && *v2 == 7) - *(v2 - 41) = 7; - ++v1; - v2 += 40; - } while (v1 < 40); - if (++v0 < 40) - continue; - break; + if(dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 7) { + dungeon[i][j] = 7; + } + } } } void __cdecl FixL3HallofHeroes() { - signed int v0; // ecx - char *v1; // eax - signed int v2; // edx - signed int v3; // ecx - char *v4; // eax - signed int v5; // edx + int i, j; - v0 = 0; - do { - v1 = (char *)dungeon + v0; - v2 = 40; - do { - if (*v1 == 5 && v1[41] == 7) - *v1 = 7; - v1 += 40; - --v2; - } while (v2); - ++v0; - } while (v0 < 40); - v3 = 0; - do { - v4 = (char *)dungeon + v3; - v5 = 40; - do { - if (*v4 == 5) { - if (v4[41] == 12 && v4[40] == 7) { - *v4 = 7; - v4[1] = 7; - v4[41] = 7; - } - if (*v4 == 5 && v4[41] == 12 && v4[1] == 7) { - *v4 = 7; - v4[40] = 7; - v4[41] = 7; - } + for(j = 0; j < 40; j++) { + for(i = 0; i < 40; i++) { + if(dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 7) { + dungeon[i][j] = 7; + } + } + } + for(j = 0; j < 40; j++) { + for(i = 0; i < 40; i++) { + if(dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 12 && dungeon[i + 1][j] == 7) { + dungeon[i][j] = 7; + dungeon[i][j + 1] = 7; + dungeon[i + 1][j + 1] = 7; + } + if(dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 12 && dungeon[i][j + 1] == 7) { + dungeon[i][j] = 7; + dungeon[i + 1][j] = 7; + dungeon[i + 1][j + 1] = 7; } - v4 += 40; - --v5; - } while (v5); - ++v3; - } while (v3 < 40); + } + } } void __fastcall DRLG_L3LockRec(int x, int y) @@ -396,16 +365,10 @@ BOOLEAN __cdecl DRLG_L3Lockout() } // 528380: using guessed type int lockoutcnt; -void __fastcall CreateL3Dungeon(int rseed, int entry) +void __fastcall CreateL3Dungeon(unsigned int rseed, int entry) { - int v2; // esi - int v3; // edi - int v4; // esi - signed int v5; // eax - signed int *v6; // [esp+8h] [ebp-8h] - int(*v7)[112]; // [esp+Ch] [ebp-4h] - - v2 = entry; + int i, j; + SetRndSeed(rseed); dminx = 16; dminy = 16; @@ -413,23 +376,23 @@ void __fastcall CreateL3Dungeon(int rseed, int entry) dmaxy = 96; DRLG_InitTrans(); DRLG_InitSetPC(); - DRLG_L3(v2); + DRLG_L3(entry); DRLG_L3Pass3(); - v3 = 0; - v7 = dPiece; - do { - v4 = 0; - v6 = (signed int *)v7; - do { - v5 = *v6; - if (*v6 >= 56 && v5 <= 147 || v5 >= 154 && v5 <= 161 || v5 == 150 || v5 == 152) - DoLighting(v4, v3, 7, -1); - v6 += 112; - ++v4; - } while (v4 < 112); - v7 = (int(*)[112])((char *)v7 + 4); - ++v3; - } while ((signed int)v7 < (signed int)dPiece[1]); + + for(j = 0; j < 112; j++) { + for(i = 0; i < 112; i++) { + if(dPiece[i][j] >= 56 && dPiece[i][j] <= 147) { + DoLighting(i, j, 7, -1); + } else if(dPiece[i][j] >= 154 && dPiece[i][j] <= 161) { + DoLighting(i, j, 7, -1); + } else if(dPiece[i][j] == 150) { + DoLighting(i, j, 7, -1); + } else if(dPiece[i][j] == 152) { + DoLighting(i, j, 7, -1); + } + } + } + DRLG_SetPC(); } // 5CF328: using guessed type int dmaxx; @@ -587,202 +550,141 @@ void __fastcall DRLG_L3(int entry) void __cdecl InitL3Dungeon() { - int i; // edx - int j; // ecx + int i, j; memset(dungeon, 0, sizeof(dungeon)); - for (i = 0; i < 40; i++) { - for (j = 0; j < 40; j++) { + for(j = 0; j < 40; j++) { + for(i = 0; i < 40; i++) { dungeon[i][j] = 0; dflags[i][j] = 0; } } } -int __fastcall DRLG_L3FillRoom(int x1, int y1, int x2, int y2) +BOOL __fastcall DRLG_L3FillRoom(int x1, int y1, int x2, int y2) { - int v4; // esi - int v5; // eax - int v6; // edi - int v7; // edx - int v8; // ecx - char *v9; // ecx - int v10; // eax - int v11; // ebx - char *v12; // edx - int v13; // eax - int i; // ebx - int v16; // ecx - char *v17; // ebx - int v18; // edi - int v21; // [esp+Ch] [ebp-4h] - int x2a; // [esp+18h] [ebp+8h] - int y2a; // [esp+1Ch] [ebp+Ch] - - v4 = x1; - v5 = y1; - v21 = y1; - if (x1 <= 1) - return 0; - v6 = x2; - if (x2 >= 34 || y1 <= 1 || y2 >= 38) - return 0; - v7 = 0; - v8 = v5; - x2a = v5; - if (v5 <= y2) { - do { - if (v4 <= v6) { - v9 = (char *)&dungeon[v4][v8]; - v10 = v6 - v4 + 1; - do { - v7 += (unsigned char)*v9; - v9 += 40; - --v10; - } while (v10); - } - v8 = x2a++ + 1; - } while (x2a <= y2); - if (!v7) { - v5 = v21; - goto LABEL_12; - } - return 0; - } -LABEL_12: - v11 = v5 + 1; - if (v5 + 1 < y2) { - v8 = v4 + 1; - do { - if (v8 < v6) { - v12 = (char *)&dungeon[v8][v11]; - v13 = v6 - v8; - do { - *v12 = 1; - v12 += 40; - --v13; - } while (v13); - } - ++v11; - } while (v11 < y2); - v5 = v21; - } - for (i = v5; i <= y2; ++i) { - if (random(0, 2)) - dungeon[v4][i] = 1; - if (random(0, 2)) - dungeon[v6][i] = 1; - } - if (v4 <= v6) { - v16 = y2; - v17 = (char *)&dungeon[v4][y2]; - v18 = v6 - v4 + 1; - y2a = v21 - y2; - do { - if (random(0, 2)) - v17[y2a] = 1; - if (random(0, 2)) - *v17 = 1; - v17 += 40; - --v18; - } while (v18); - } - return 1; + int i, j, v; + + if(x1 <= 1 || x2 >= 34 || y1 <= 1 || y2 >= 38) { + return FALSE; + } + + v = 0; + for(j = y1; j <= y2; j++) { + for(i = x1; i <= x2; i++) { + v += dungeon[i][j]; + } + } + + if(v != 0) { + return FALSE; + } + + for(j = y1 + 1; j < y2; j++) { + for(i = x1 + 1; i < x2; i++) { + dungeon[i][j] = 1; + } + } + for(j = y1; j <= y2; j++) { + if(random(0, 2) != 0) { + dungeon[x1][j] = 1; + } + if(random(0, 2) != 0) { + dungeon[x2][j] = 1; + } + } + for(i = x1; i <= x2; i++) { + if(random(0, 2) != 0) { + dungeon[i][y1] = 1; + } + if(random(0, 2) != 0) { + dungeon[i][y2] = 1; + } + } + + return TRUE; } void __fastcall DRLG_L3CreateBlock(int x, int y, int obs, int dir) { - int v4; // esi - int v5; // edi - int v6; // eax - int v9; // ebx - BOOLEAN v10; // zf - BOOLEAN v11; // zf - int y2; // [esp+Ch] [ebp-14h] - int x2; // [esp+10h] [ebp-10h] - int i; // [esp+14h] [ebp-Ch] - int v16; // [esp+18h] [ebp-8h] - int max; // [esp+1Ch] [ebp-4h] - - v4 = obs; - v5 = obs; - v16 = y; - for (i = x;; i = v4) { - v6 = random(0, 2); - max = v6 + 3; - v9 = random(0, 2) + 3; - if (!dir) { - y2 = v16 - 1; - v5 = v16 - 1 - v9; - if (max < obs) { - v4 = i + random(0, max); - } - if (max == obs) - v4 = i; - if (max > obs) { - v4 = i - random(0, max); - } - x2 = v4 + max; - } - if (dir == 3) { - x2 = i - 1; - v4 = i - 1 - max; - v10 = v9 == obs; - if (v9 < obs) { - v5 = v16 + random(0, v9); - v10 = v9 == obs; - } - if (v10) - v5 = v16; - if (v9 > obs) { - v5 = v16 - random(0, v9); - } - y2 = v5 + v9; + int blksizex, blksizey, x1, y1, x2, y2; + BOOL contflag; + + blksizex = random(0, 2) + 3; + blksizey = random(0, 2) + 3; + + if(dir == 0) { + y2 = y - 1; + y1 = y2 - blksizey; + if(blksizex < obs) { + x1 = random(0, blksizex) + x; } - if (dir == 2) { - v5 = v16 + 1; - y2 = v16 + 1 + v9; - if (max < obs) { - v4 = i + random(0, max); - } - if (max == obs) - v4 = i; - if (max > obs) { - v4 = i - random(0, max); - } - x2 = v4 + max; - } - if (dir == 1) { - v4 = i + 1; - v11 = v9 == obs; - x2 = i + 1 + max; - if (v9 < obs) { - v5 = v16 + random(0, v9); - v11 = v9 == obs; - } - if (v11) - v5 = v16; - if (v9 > obs) { - v5 = v16 - random(0, v9); - } - y2 = v5 + v9; + if(blksizex == obs) { + x1 = x; + } + if(blksizex > obs) { + x1 = x - random(0, blksizex); + } + x2 = blksizex + x1; + } + if(dir == 3) { + x2 = x - 1; + x1 = x2 - blksizex; + if(blksizey < obs) { + y1 = random(0, blksizey) + y; + } + if(blksizey == obs) { + y1 = y; + } + if(blksizey > obs) { + y1 = y - random(0, blksizey); + } + y2 = y1 + blksizey; + } + if(dir == 2) { + y1 = y + 1; + y2 = y1 + blksizey; + if(blksizex < obs) { + x1 = random(0, blksizex) + x; + } + if(blksizex == obs) { + x1 = x; + } + if(blksizex > obs) { + x1 = x - random(0, blksizex); + } + x2 = blksizex + x1; + } + if(dir == 1) { + x1 = x + 1; + x2 = x1 + blksizex; + if(blksizey < obs) { + y1 = random(0, blksizey) + y; + } + if(blksizey == obs) { + y1 = y; + } + if(blksizey > obs) { + y1 = y - random(0, blksizey); + } + y2 = y1 + blksizey; + } + + if(DRLG_L3FillRoom(x1, y1, x2, y2) == TRUE) { + contflag = random(0, 4); + if(contflag && dir != 2) { + DRLG_L3CreateBlock(x1, y1, blksizey, 0); + } + if(contflag && dir != 3) { + DRLG_L3CreateBlock(x2, y1, blksizex, 1); + } + if(contflag && dir != 0) { + DRLG_L3CreateBlock(x1, y2, blksizey, 2); + } + if(contflag && dir != 1) { + DRLG_L3CreateBlock(x1, y1, blksizex, 3); } - if (DRLG_L3FillRoom(v4, v5, x2, y2) != 1) - break; - if (!random(0, 4)) - break; - if (dir != 2) - DRLG_L3CreateBlock(v4, v5, v9, 0); - if (dir != 3) - DRLG_L3CreateBlock(x2, v5, max, 1); - if (dir) - DRLG_L3CreateBlock(v4, y2, v9, 2); - if (dir == 1) - break; - dir = 3; - obs = max; - v16 = v5; } } @@ -807,255 +709,145 @@ void __fastcall DRLG_L3FloorArea(int x1, int y1, int x2, int y2) void __cdecl DRLG_L3FillDiags() { - signed int v0; // ebx - char *v1; // esi - signed int v2; // ebp - int v3; // ecx - int v4; // edi - - v0 = 0; - do { - v1 = (char *)&dungeon[1][v0 + 1]; - v2 = 39; - do { - v3 = (unsigned char)*v1; - v4 = v3 - + 2 * ((unsigned char)*(v1 - 40) + 2 * ((unsigned char)*(v1 - 1) + 2 * (unsigned char)*(v1 - 41))); - if (v4 == 6) { - if (!random(0, 2)) { - *(v1 - 41) = 1; - goto LABEL_11; + int i, j, v; + + for(j = 0; j < 39; j++) { + for(i = 0; i < 39; i++) { + v = dungeon[i + 1][j + 1] + 2 * dungeon[i][j + 1] + 4 * dungeon[i + 1][j] + 8 * dungeon[i][j]; + if(v == 6) { + if(random(0, 2) == 0) { + dungeon[i][j] = 1; + } else { + dungeon[i + 1][j + 1] = 1; } - *v1 = 1; } - if (v4 == 9) { - if (random(0, 2)) - *(v1 - 40) = 1; - else - *(v1 - 1) = 1; + if(v == 9) { + if(random(0, 2) == 0) { + dungeon[i + 1][j] = 1; + } else { + dungeon[i][j + 1] = 1; + } } - LABEL_11: - v1 += 40; - --v2; - } while (v2); - ++v0; - } while (v0 < 39); + } + } } void __cdecl DRLG_L3FillSingles() { - signed int v0; // ecx - char *v1; // eax - signed int v2; // edx - - v0 = 1; - do { - v1 = (char *)&dungeon[0][v0 + 39]; - v2 = 38; - do { - if (!v1[1] - && (unsigned char)*v1 + (unsigned char)v1[40] + (unsigned char)*(v1 - 40) == 3 - && (unsigned char)*(v1 - 39) + (unsigned char)v1[41] == 2 - && (unsigned char)v1[2] + (unsigned char)*(v1 - 38) + (unsigned char)v1[42] == 3) { - v1[1] = 1; + int i, j; + + for(j = 1; j < 39; j++) { + for(i = 1; i < 39; i++) { + if(dungeon[i][j] == 0 + && dungeon[i][j - 1] + dungeon[i - 1][j - 1] + dungeon[i + 1][j - 1] == 3 + && dungeon[i + 1][j] + dungeon[i - 1][j] == 2 + && dungeon[i][j + 1] + dungeon[i - 1][j + 1] + dungeon[i + 1][j + 1] == 3) { + dungeon[i][j] = 1; } - v1 += 40; - --v2; - } while (v2); - ++v0; - } while (v0 < 39); + } + } } void __cdecl DRLG_L3FillStraights() { - int v0; // esi - char *v1; // ecx - signed int v2; // eax - char *v3; // ebx - int v4; // edi - int v5; // ebx - char v6; // al - char *v7; // ecx - signed int v8; // eax - char *v9; // ebx - int v10; // edi - int v11; // ebx - char v12; // al - signed int v13; // ebx - signed int v14; // eax - signed int v15; // esi - signed int i; // edi - signed int v17; // ebx - signed int v18; // eax - signed int v19; // esi - signed int j; // edi - //int v21; // [esp+Ch] [ebp-14h] - char *v22; // [esp+Ch] [ebp-14h] - char *v23; // [esp+Ch] [ebp-14h] - char *v24; // [esp+10h] [ebp-10h] - signed int v25; // [esp+14h] [ebp-Ch] - signed int v26; // [esp+14h] [ebp-Ch] - signed int v27; // [esp+18h] [ebp-8h] - signed int v28; // [esp+18h] [ebp-8h] - int v29; // [esp+1Ch] [ebp-4h] - int v30; // [esp+1Ch] [ebp-4h] - - v27 = 0; - v0 = 0; /* v21 */ - do { - v1 = (char *)v27; - v2 = 0; - v29 = 0; - v3 = (char *)&dungeon[0][v27 + 1]; - v4 = 40 * v0; - v25 = 0; - v22 = (char *)&dungeon[0][v27 + 1]; - do { - if (*(v3 - 1) || *v3 != 1) { - if (v2 > 3) { - if (random(0, 2)) { - if (v0 < v29) { - v5 = v29 - v0; - v24 = (char *)dungeon + v4 + v27; - do { - v6 = random(0, 2); - v1 = v24; - v24 += 40; - --v5; - *v1 = v6; - } while (v5); - v3 = v22; - } - } + int i, j, xc, xs, yc, ys, k; + + for(j = 0; j < 39; j++) { + xs = 0; + for(i = 0; i < 37; i++) { + if(dungeon[i][j] == 0 && dungeon[i][j + 1] == 1) { + if(xs == 0) { + xc = i; } - v2 = 0; + xs++; } else { - if (!v2) { - v0 = v29; - v4 = v25; + if(xs > 3 && random(0, 2) != 0) { + for(k = xc; k < i; k++) { + dungeon[k][j] = random(0, 2); + } } - ++v2; + xs = 0; } - v25 += 40; - ++v29; - v3 += 40; - v22 = v3; - } while (v25 < 1480); - ++v27; - } while (v27 < 39); - v28 = 0; - do { - v7 = (char *)v28; - v8 = 0; - v30 = 0; - v9 = (char *)&dungeon[0][v28 + 1]; - v26 = 0; - v10 = 40 * v0; - v23 = (char *)&dungeon[0][v28 + 1]; - do { - if (*(v9 - 1) != 1 || *v9) { - if (v8 > 3) { - if (random(0, 2)) { - if (v0 < v30) { - v11 = v30 - v0; - v24 = (char *)&dungeon[0][v10 + 1 + v28]; - do { - v12 = random(0, 2); - v7 = v24; - v24 += 40; - --v11; - *v7 = v12; - } while (v11); - v9 = v23; - } - } + } + } + for(j = 0; j < 39; j++) { + xs = 0; + for(i = 0; i < 37; i++) { + if(dungeon[i][j] == 1 && dungeon[i][j + 1] == 0) { + if(xs == 0) { + xc = i; } - v8 = 0; + xs++; } else { - if (!v8) { - v0 = v30; - v10 = v26; + if(xs > 3 && random(0, 2) != 0) { + for(k = xc; k < i; k++) { + dungeon[k][j + 1] = random(0, 2); + } } - ++v8; + xs = 0; } - v26 += 40; - ++v30; - v9 += 40; - v23 = v9; - } while (v26 < 1480); - ++v28; - } while (v28 < 39); - v13 = 0; - do { - v14 = 0; - v15 = 0; - do { - if (dungeon[v13][v15] || dungeon[v13 + 1][v15] != 1) { - if (v14 > 3) { - if (random(0, 2)) { - for (i = (signed int)v24; i < v15; ++i) { - dungeon[v13][i] = random(0, 2); - } - } + } + } + for(i = 0; i < 39; i++) { + ys = 0; + for(j = 0; j < 37; j++) { + if(dungeon[i][j] == 0 && dungeon[i + 1][j] == 1) { + if(ys == 0) { + yc = j; } - v14 = 0; + ys++; } else { - if (!v14) - v24 = (char *)v15; - ++v14; - } - ++v15; - } while (v15 < 37); - ++v13; - } while (v13 < 39); - v17 = 0; - do { - v18 = 0; - v19 = 0; - do { - if (dungeon[v17][v19] != 1 || dungeon[v17 + 1][v19]) { - if (v18 > 3) { - if (random(0, 2)) { - for (j = (signed int)v24; j < v19; ++j) { - dungeon[v17 + 1][j] = random(0, 2); - } + if(ys > 3 && random(0, 2) != 0) { + for(k = yc; k < j; k++) { + dungeon[i][k] = random(0, 2); } } - v18 = 0; + ys = 0; + } + } + } + for(i = 0; i < 39; i++) { + ys = 0; + for(j = 0; j < 37; j++) { + if(dungeon[i][j] == 1 && dungeon[i + 1][j] == 0) { + if(ys == 0) { + yc = j; + } + ys++; } else { - if (!v18) - v24 = (char *)v19; - ++v18; + if(ys > 3 && random(0, 2) != 0) { + for(k = yc; k < j; k++) { + dungeon[i + 1][k] = random(0, 2); + } + } + ys = 0; } - ++v19; - } while (v19 < 37); - ++v17; - } while (v17 < 39); + } + } } void __cdecl DRLG_L3Edges() { - char *v0; // eax + int i, j; - memset(dungeon[39], 0, sizeof(char[40])); - v0 = (char *)&dungeon[0][39]; - do { - *v0 = 0; - v0 += 40; - } while ((signed int)v0 < (signed int)&dungeon[40][39]); + for(j = 0; j < 40; j++) { + dungeon[39][j] = 0; + } + for(i = 0; i < 40; i++) { + dungeon[i][39] = 0; + } } int __cdecl DRLG_L3GetFloorArea() { - int gfa; // eax - int i; // edx - int j; // esi + int i, j, gfa; gfa = 0; - for (i = 0; i < 40; i++) { - for (j = 0; j < 40; j++) + for(j = 0; j < 40; j++) { + for(i = 0; i < 40; i++) { gfa += dungeon[i][j]; + } } return gfa; @@ -1063,431 +855,274 @@ int __cdecl DRLG_L3GetFloorArea() void __cdecl DRLG_L3MakeMegas() { - signed int v0; // edi - char *v1; // esi - signed int v2; // ebp - int v3; // ecx - int v4; // eax - char *v5; // eax - - v0 = 0; - do { - v1 = (char *)&dungeon[0][v0 + 1]; - v2 = 39; - do { - v3 = (unsigned char)v1[40]; - v4 = v3 + 2 * ((unsigned char)*v1 + 2 * ((unsigned char)v1[39] + 2 * (unsigned char)*(v1 - 1))); - if (v4 == 6) { - if (!random(0, 2)) { - v4 = 12; - goto LABEL_9; + int i, j, v; + + for(j = 0; j < 39; j++) { + for(i = 0; i < 39; i++) { + v = dungeon[i + 1][j + 1] + 2 * dungeon[i][j + 1] + 4 * dungeon[i + 1][j] + 8 * dungeon[i][j]; + if(v == 6) { + if(random(0, 2) == 0) { + v = 12; + } else { + v = 5; } - v4 = 5; } - if (v4 == 9) { - v4 = (random(0, 2) != 0) + 13; + if(v == 9) { + if(random(0, 2) == 0) { + v = 13; + } else { + v = 14; + } } - LABEL_9: - --v2; - *(v1 - 1) = L3ConvTbl[v4]; - v1 += 40; - } while (v2); - dungeon[39][v0++] = 8; - } while (v0 < 39); - v5 = (char *)&dungeon[0][39]; - do { - *v5 = 8; - v5 += 40; - } while ((signed int)v5 < (signed int)&dungeon[40][39]); + dungeon[i][j] = L3ConvTbl[v]; + } + dungeon[39][j] = 8; + } + for(i = 0; i < 40; i++) { + dungeon[i][39] = 8; + } } void __cdecl DRLG_L3River() { - signed int v0; // ebx - int v1; // esi - int v2; // edi - char v3; // al - char v4; // al - signed int v5; // edx - int v6; // eax - int v7; // ebx - unsigned char v8; // al - unsigned char v9; // al - int v10; // eax - char *v11; // eax - signed int v12; // eax - int v13; // ecx - BOOLEAN v14; // zf - int v15; // eax - signed int v16; // eax - int v17; // eax - signed int v18; // eax - signed int v19; // eax - signed int v20; // edi - int v21; // eax - int v22; // eax - int v23; // edx - int v24; // ecx - int v25; // ecx - int v26; // esi - int v27; // ecx - int v28; // edx - int v29; // ecx - int v30; // edx - int v31; // ecx - int v32; // edx - BOOLEAN v33; // sf - //unsigned char v34; // of - int river[3][100]; // [esp+Ch] [ebp-4E8h] - int v36; // [esp+4BCh] [ebp-38h] - int v37; // [esp+4C0h] [ebp-34h] - int v38; // [esp+4C4h] [ebp-30h] - int v39; // [esp+4C8h] [ebp-2Ch] - int v40; // [esp+4CCh] [ebp-28h] - int v41; // [esp+4D0h] [ebp-24h] - int v42; // [esp+4D4h] [ebp-20h] - int v43; // [esp+4D8h] [ebp-1Ch] - int v44; // [esp+4DCh] [ebp-18h] - int v45; // [esp+4E0h] [ebp-14h] - int v46; // [esp+4E4h] [ebp-10h] - int v47; // [esp+4E8h] [ebp-Ch] - int v48; // [esp+4ECh] [ebp-8h] - int max; // [esp+4F0h] [ebp-4h] - - v0 = 0; - v39 = 0; - v41 = 0; - while (v39 < 4) { - v47 = 0; - do { - if (v41 >= 200) { - v5 = max; - break; - } - ++v41; - v1 = 0; - v2 = 0; - while (1) { - v3 = dungeon[v1][v2]; - if ((unsigned char)v3 >= 0x19u && (unsigned char)v3 <= 0x1Cu) - break; - if (v0 >= 100) - return; - v1 = random(0, 40); - v2 = random(0, 40); - ++v0; - while (1) { - v4 = dungeon[v1][v2]; - if ((unsigned char)v4 >= 0x19u && (unsigned char)v4 <= 0x1Cu) - break; - if (v2 >= 40) - break; - if (++v1 >= 40) { - v1 = 0; - ++v2; + int rx, ry, px, py, dir, pdir, nodir, nodir2, dircheck; + int river[3][100]; + int rivercnt, riveramt; + int i, trys, found, bridge, lpcnt; + BOOL bail; + + rivercnt = 0; + bail = FALSE; + trys = 0; + + while(trys < 200 && rivercnt < 4) { + bail = FALSE; + while(!bail && trys < 200) { + trys++; + rx = 0; + ry = 0; + i = 0; + while((dungeon[rx][ry] < 25 || dungeon[rx][ry] > 28) && i < 100) { + rx = random(0, 40); + ry = random(0, 40); + i++; + while((dungeon[rx][ry] < 25 || dungeon[rx][ry] > 28) && ry < 40) { + rx++; + if(rx >= 40) { + rx = 0; + ry++; } } } - if (v0 >= 100) + if(i >= 100) { return; - switch (dungeon[v1][v2]) { - case 0x19: - v48 = 3; - v42 = 2; + } + switch(dungeon[rx][ry]) { + case 25: + dir = 3; + nodir = 2; river[2][0] = 40; break; - case 0x1A: - v48 = 0; - v42 = 1; + case 26: + dir = 0; + nodir = 1; river[2][0] = 38; break; - case 0x1B: - v42 = 0; - v48 = 1; + case 27: + dir = 1; + nodir = 0; river[2][0] = 41; break; - case 0x1C: - v48 = 2; - v42 = 3; + case 28: + dir = 2; + nodir = 3; river[2][0] = 39; break; } - v43 = 0; - max = 1; - v5 = 1; - river[0][0] = v1; - river[1][0] = v2; - v46 = 4; - v45 = 40 * v1; - while (v5 < 100) { - v38 = v1; - v36 = v45; - v37 = v2; - if (v43) { - v48 = ((_BYTE)v48 + 1) & 3; - v7 = v48; + river[0][0] = rx; + river[1][0] = ry; + riveramt = 1; + nodir2 = 4; + dircheck = 0; + while(dircheck < 4 && riveramt < 100) { + px = rx; + py = ry; + if(dircheck == 0) { + dir = random(0, 4); } else { - v6 = random(0, 4); - v5 = max; - v7 = v6; - v48 = v6; + dir = (dir + 1) & 3; } - while (1) { - ++v43; - if (v7 != v42 && v7 != v46) - break; - v7 = ((_BYTE)v7 + 1) & 3; + dircheck++; + while(dir == nodir || dir == nodir2) { + dir = (dir + 1) & 3; + dircheck++; } - v48 = v7; - if (!v7) { - if (v2 <= 0) - goto LABEL_44; - --v2; + if(dir == 0 && ry > 0) { + ry--; } - if (v7 == 1) { - if (v2 >= 40) - goto LABEL_44; - ++v2; + if(dir == 1 && ry < 40) { + ry++; } - if (v7 != 2) - goto LABEL_41; - if (v1 < 40) { - ++v1; - v45 += 40; - LABEL_41: - if (v7 == 3 && v1 > 0) { - --v1; - v45 -= 40; - } + if(dir == 2 && rx < 40) { + rx++; } - LABEL_44: - if (dungeon[0][v45 + v2] == 7) { - v43 = 0; - if (v7 < 2) { - v8 = random(0, 2); - v5 = max; - river[2][max] = v8 + 17; - } - if (v7 > 1) { - v9 = random(0, 2); - v5 = max; - river[2][max] = v9 + 15; - } - v10 = v40; - river[0][v5] = v1; - river[1][v5++] = v2; - max = v5; - if (v7 || v10 != 2) { - if (v7 != 3) - goto LABEL_58; - if (v10 != 1) - goto LABEL_70; + if(dir == 3 && rx > 0) { + rx--; + } + if(dungeon[rx][ry] == 7) { + dircheck = 0; + if(dir < 2) { + river[2][riveramt] = (BYTE)random(0, 2) + 17; } - if (v5 > 2) - river[1][v5 + 98] = 22; - if (!v7) { - v46 = 1; - LABEL_59: - if (v10 == 3) - goto LABEL_62; - goto LABEL_60; + if(dir > 1) { + river[2][riveramt] = (BYTE)random(0, 2) + 15; } - v46 = 2; - LABEL_58: - if (!v7) - goto LABEL_59; - LABEL_60: - if (v7 != 2) - goto LABEL_67; - if (v10 != 1) - goto LABEL_79; - LABEL_62: - if (v5 > 2) - river[1][v5 + 98] = 21; - if (!v7) { - v46 = 1; - goto LABEL_83; + river[0][riveramt] = rx; + river[1][riveramt] = ry; + riveramt++; + if(dir == 0 && pdir == 2 || dir == 3 && pdir == 1) { + if(riveramt > 2) { + river[2][riveramt - 2] = 22; + } + if(dir == 0) { + nodir2 = 1; + } else { + nodir2 = 2; + } } - v46 = 3; - LABEL_67: - if (v7 != 1 || v10 != 2) { - if (v7 != 3) - goto LABEL_76; - LABEL_70: - if (v10) - goto LABEL_83; + if(dir == 0 && pdir == 3 || dir == 2 && pdir == 1) { + if(riveramt > 2) { + river[2][riveramt - 2] = 21; + } + if(dir == 0) { + nodir2 = 1; + } else { + nodir2 = 3; + } } - if (v5 > 2) - river[1][v5 + 98] = 20; - if (v7 == 1) { - v46 = 0; - goto LABEL_77; + if(dir == 1 && pdir == 2 || dir == 3 && pdir == 0) { + if(riveramt > 2) { + river[2][riveramt - 2] = 20; + } + if(dir == 1) { + nodir2 = 0; + } else { + nodir2 = 2; + } } - v46 = 2; - LABEL_76: - if (v7 != 1) - goto LABEL_78; - LABEL_77: - if (v10 != 3) { - LABEL_78: - if (v7 != 2) - goto LABEL_83; - LABEL_79: - if (v10) - goto LABEL_83; + if(dir == 1 && pdir == 3 || dir == 2 && pdir == 0) { + if(riveramt > 2) { + river[2][riveramt - 2] = 19; + } + if(dir == 1) { + nodir2 = 0; + } else { + nodir2 = 3; + } } - if (v5 > 2) - river[1][v5 + 98] = 19; - v46 = v7 != 1 ? 3 : 0; - LABEL_83: - v40 = v7; + pdir = dir; } else { - v1 = v38; - v2 = v37; - v45 = v36; - if (v43 >= 4) - break; + rx = px; + ry = py; } } - if (v48) { - v13 = v40; - goto LABEL_94; + if(dir == 0 && dungeon[rx][ry - 1] == 10 && dungeon[rx][ry - 2] == 8) { + river[0][riveramt] = rx; + river[1][riveramt] = ry - 1; + river[2][riveramt] = 24; + if(pdir == 2) { + river[2][riveramt - 1] = 22; + } + if(pdir == 3) { + river[2][riveramt - 1] = 21; + } + bail = TRUE; } - v11 = (char *)&dungeon[v1][v2]; - if (*(v11 - 1) == 10 && *(v11 - 2) == 8) { - v12 = v5; - river[1][v12] = v2 - 1; - v13 = v40; - v14 = v40 == 2; - river[0][v12] = v1; - river[2][v12] = 24; - if (v14) - river[1][v12 + 99] = 22; - if (v13 == 3) - river[1][v12 + 99] = 21; - v47 = 1; - LABEL_94: - if (v48 == 1) { - v15 = v2 + 40 * v1; - if (dungeon[0][v15 + 1] == 2 && dungeon[0][v15 + 2] == 8) { - v16 = v5; - river[0][v16] = v1; - river[1][v16] = v2 + 1; - river[2][v16] = 42; - if (v13 == 2) - river[1][v16 + 99] = 20; - if (v13 == 3) - river[1][v16 + 99] = 19; - v47 = 1; - goto LABEL_102; - } - } else { - LABEL_102: - if (v48 == 2) { - v17 = v2 + 40 * v1; - if (dungeon[1][v17] != 4 || dungeon[2][v17] != 8) - goto LABEL_118; - v18 = v5; - river[0][v18] = v1 + 1; - river[1][v18] = v2; - river[2][v18] = 43; - if (!v13) - river[1][v18 + 99] = 19; - if (v13 == 1) - river[1][v18 + 99] = 21; - v47 = 1; - } - if (v48 == 3 - && dungeon[v1 - 1][v2] == 9 // *((_BYTE *)&dMonster[111][10 * v1 + 102] + v2) == 9 /* check */ - && dungeon[0][8 * (5 * v1 - 10) + v2] == 8) { - v19 = v5; - river[0][v19] = v1 - 1; - river[1][v19] = v2; - river[2][v19] = 23; - if (!v13) - river[1][v19 + 99] = 20; - if (v13 == 1) - river[1][v19 + 99] = 22; - v47 = 1; - } + if(dir == 1 && dungeon[rx][ry + 1] == 2 && dungeon[rx][ry + 2] == 8) { + river[0][riveramt] = rx; + river[1][riveramt] = ry + 1; + river[2][riveramt] = 42; + if(pdir == 2) { + river[2][riveramt - 1] = 20; } + if(pdir == 3) { + river[2][riveramt - 1] = 19; + } + bail = TRUE; } - LABEL_118: - v0 = 0; - } while (!v47); - if (v47 == 1 && v5 >= 7) { - v20 = 0; - v47 = 0; - LABEL_124: - while (v47 < 30) { - ++v47; - v21 = random(0, max); - v44 = v21; - v22 = v21; - v23 = river[2][v22]; - if (v23 == 15 || v23 == 16) { - v24 = river[1][v22] + 40 * river[0][v22]; - if (dungeon[0][v24 - 1] == 7 && dungeon[0][v24 + 1] == 7) /* *((_BYTE *)&dMonster[111][111] + v24 + 3) check */ - v20 = 1; + if(dir == 2 && dungeon[rx + 1][ry] == 4 && dungeon[rx + 2][ry] == 8) { + river[0][riveramt] = rx + 1; + river[1][riveramt] = ry; + river[2][riveramt] = 43; + if(pdir == 0) { + river[2][riveramt - 1] = 19; } - if (v23 == 17 || v23 == 18) { - v25 = river[1][v22] + 40 * river[0][v22]; - if (dungeon[-1][v25] == 7 && dungeon[1][v25] == 7) /* *((_BYTE *)&dMonster[111][102] + v25) check */ - v20 = 2; + if(pdir == 1) { + river[2][riveramt - 1] = 21; } - v26 = 0; - if (max > 0) { - while (1) { - if (!v20) - goto LABEL_124; - if (v20 != 1) - goto LABEL_142; - v27 = river[1][v22]; - v28 = river[1][v26]; - if ((v27 - 1 == v28 || v27 + 1 == v28) && river[0][v22] == river[0][v26]) - break; - LABEL_147: - if (++v26 >= max) - goto LABEL_148; + bail = TRUE; + } + if(dir == 3 && dungeon[rx - 1][ry] == 9 && dungeon[rx - 2][ry] == 8) { + river[0][riveramt] = rx - 1; + river[1][riveramt] = ry; + river[2][riveramt] = 23; + if(pdir == 0) { + river[2][riveramt - 1] = 20; + } + if(pdir == 1) { + river[2][riveramt - 1] = 22; + } + bail = TRUE; + } + } + if(bail == TRUE && riveramt < 7) { + bail = FALSE; + } + if(bail == TRUE) { + found = 0; + lpcnt = 0; + while(found == 0 && lpcnt < 30) { + lpcnt++; + bridge = random(0, riveramt); + if((river[2][bridge] == 15 || river[2][bridge] == 16) + && dungeon[river[0][bridge]][river[1][bridge] - 1] == 7 + && dungeon[river[0][bridge]][river[1][bridge] + 1] == 7) { + found = 1; + } + if((river[2][bridge] == 17 || river[2][bridge] == 18) + && dungeon[river[0][bridge] - 1][river[1][bridge]] == 7 + && dungeon[river[0][bridge] + 1][river[1][bridge]] == 7) { + found = 2; + } + for(i = 0; i < riveramt && found != 0; i++) { + if(found == 1 + && (river[1][bridge] - 1 == river[1][i] || river[1][bridge] + 1 == river[1][i]) + && river[0][bridge] == river[0][i]) { + found = 0; } - v20 = 0; - LABEL_142: - if (v20 == 2) { - v29 = river[0][v22]; - v30 = river[0][v26]; - if ((v29 - 1 == v30 || v29 + 1 == v30) && river[1][v22] == river[1][v26]) - v20 = 0; + if(found == 2 + && (river[0][bridge] - 1 == river[0][i] || river[0][bridge] + 1 == river[0][i]) + && river[1][bridge] == river[1][i]) { + found = 0; } - goto LABEL_147; } - LABEL_148: - if (v20) - break; } - v0 = 0; - if (v20) { - river[2][v44] = v20 == 1 ? 44 : 45; - v31 = max; - ++v39; - v44 = 0; - if (max >= 0) { - do { - v32 = v44++; - //v34 = __OFSUB__(v44, v31); - v14 = v44 == v31; - v33 = v44 - v31 < 0; - dungeon[river[0][v32]][river[1][v32]] = river[2][v32]; - } while (v33 | v14); //} while ((unsigned char)(v33 ^ v34) | v14); + if(found != 0) { + if(found == 1) { + river[2][bridge] = 44; + } else { + river[2][bridge] = 45; } + rivercnt++; + for(bridge = 0; bridge <= riveramt; bridge++) { + dungeon[river[0][bridge]][river[1][bridge]] = river[2][bridge]; + } + } else { + bail = FALSE; } } - if (v41 >= 200) - return; } } -// 410FAD: using guessed type int var_1C8[100]; -// 410FAD: using guessed type int var_4E8[100]; -// 410FAD: using guessed type int var_358[98]; void __cdecl DRLG_L3Pool() { @@ -1697,255 +1332,138 @@ void __cdecl DRLG_L3PoolFix() } while (v0 < 40); } -int __fastcall DRLG_L3PlaceMiniSet(const unsigned char *miniset, int tmin, int tmax, int cx, int cy, BOOLEAN setview, int ldir) +BOOL __fastcall DRLG_L3PlaceMiniSet(const unsigned char *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir) { - int v7; // ebx - int v8; // esi - int v9; // edi - int v10; // edx - int v11; // esi - signed int v12; // ebx - int v13; // edi - signed int i; // eax - int v15; // ecx - unsigned char v16; // dl - int v17; // eax - int v18; // ecx - int v19; // edi - char *v20; // edx - char v21; // bl - const unsigned char *v23; // [esp+Ch] [ebp-24h] - int v24; // [esp+10h] [ebp-20h] - int v25; // [esp+14h] [ebp-1Ch] - int v26; // [esp+18h] [ebp-18h] - signed int v27; // [esp+1Ch] [ebp-14h] - int v28; // [esp+20h] [ebp-10h] - int v29; // [esp+24h] [ebp-Ch] - int v30; // [esp+28h] [ebp-8h] - int max; // [esp+2Ch] [ebp-4h] - - v7 = miniset[1]; - v8 = tmin; - v9 = *miniset; - v23 = miniset; - v10 = tmax - tmin; - v28 = *miniset; - v29 = miniset[1]; - if (v10) - v24 = v8 + random(0, v10); - else - v24 = 1; - v25 = 0; - if (v24 <= 0) { - v11 = tmax; + int sx, sy, sw, sh, xx, yy, i, ii, numt, trys; + BOOL found; + + sw = miniset[0]; + sh = miniset[1]; + + if(tmax - tmin == 0) { + numt = 1; } else { - max = 40 - v9; - v30 = 40 - v7; - do { - v11 = random(0, max); - v27 = 0; - tmax = random(0, v30); - while (1) { - if (v27 >= 200) - return 1; - ++v27; - v12 = 1; - if (cx != -1 && v11 >= cx - v28 && v11 <= cx + 12) { - v11 = random(0, max); - tmax = random(0, v30); - v12 = 0; - } - if (cy != -1 && tmax >= cy - v29 && tmax <= cy + 12) { - v11 = random(0, max); - tmax = random(0, v30); - v12 = 0; - } - v13 = 0; - for (i = 2; v13 < v29; ++v13) { - if (v12 != 1) - break; - v26 = 0; - if (v28 > 0) { - v15 = tmax + v13 + 40 * v11; - do { - if (v12 != 1) - break; - v16 = v23[i]; - if (v16 && dungeon[0][v15] != v16) - v12 = 0; - if (dflags[0][v15]) - v12 = 0; - ++i; - ++v26; - v15 += 40; - } while (v26 < v28); + numt = random(0, tmax - tmin) + tmin; + } + + for(i = 0; i < numt; i++) { + sx = random(0, 40 - sw); + sy = random(0, 40 - sh); + found = FALSE; + trys = 0; + while(!found && trys < 200) { + trys++; + found = TRUE; + if(cx != -1 && sx >= cx - sw && sx <= cx + 12) { + sx = random(0, 40 - sw); + sy = random(0, 40 - sh); + found = FALSE; + } + if(cy != -1 && sy >= cy - sh && sy <= cy + 12) { + sx = random(0, 40 - sw); + sy = random(0, 40 - sh); + found = FALSE; + } + ii = 2; + for(yy = 0; yy < sh && found == TRUE; yy++) { + for(xx = 0; xx < sw && found == TRUE; xx++) { + if(miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) { + found = FALSE; } - } - v17 = 0; - if (v12) - break; - if (++v11 == max) { - v11 = 0; - if (++tmax == v30) - tmax = 0; + if(dflags[xx + sx][yy + sy] != 0) { + found = FALSE; + } + ii++; } } - if (v27 >= 200) - return 1; - v18 = v28 * v29 + 2; - if (v29 > 0) { - do { - v19 = v28; - if (v28 > 0) { - v20 = (char *)&dungeon[v11][v17 + tmax]; - do { - v21 = v23[v18]; - if (v21) - *v20 = v21; - ++v18; - v20 += 40; - --v19; - } while (v19); + if(!found) { + sx++; + if(sx == 40 - sw) { + sx = 0; + sy++; + if(sy == 40 - sh) { + sy = 0; } - ++v17; - } while (v17 < v29); + } + } + } + if(trys >= 200) { + return TRUE; + } + ii = sw * sh + 2; + for(yy = 0; yy < sh; yy++) { + for(xx = 0; xx < sw; xx++) { + if(miniset[ii] != 0) { + dungeon[xx + sx][yy + sy] = miniset[ii]; + } + ii++; } - ++v25; - } while (v25 < v24); + } } - if (setview == 1) { - ViewX = 2 * v11 + 17; - ViewY = 2 * tmax + 19; + + if(setview == TRUE) { + ViewX = 2 * sx + 17; + ViewY = 2 * sy + 19; } - if (!ldir) { - LvlViewX = 2 * v11 + 17; - LvlViewY = 2 * tmax + 19; + if(ldir == 0) { + LvlViewX = 2 * sx + 17; + LvlViewY = 2 * sy + 19; } - return 0; + + return FALSE; } // 5CF320: using guessed type int LvlViewY; // 5CF324: using guessed type int LvlViewX; void __fastcall DRLG_L3PlaceRndSet(const unsigned char *miniset, int rndper) { - const unsigned char *v2; // ebx - int v3; // ecx - int v4; // eax - char *v5; // ecx - int v6; // esi - signed int i; // edx - int v8; // edi - int v9; // eax - unsigned char v10; // cl - int v11; // edi - unsigned char v12; // al - char v13; // al - int j; // edx - int v15; // esi - unsigned char *v16; // eax - unsigned char v17; // cl - BOOLEAN v18; // zf - int v19; // [esp+8h] [ebp-30h] - int v20; // [esp+10h] [ebp-28h] - char *v21; // [esp+14h] [ebp-24h] - int v22; // [esp+18h] [ebp-20h] - int v23; // [esp+1Ch] [ebp-1Ch] - int v24; // [esp+20h] [ebp-18h] - int v25; // [esp+24h] [ebp-14h] - int v26; // [esp+28h] [ebp-10h] - int v27; // [esp+2Ch] [ebp-Ch] - int v28; // [esp+30h] [ebp-8h] - signed int v29; // [esp+34h] [ebp-4h] - - v2 = miniset; - v19 = rndper; - v3 = miniset[1]; - v4 = 0; - v23 = 40 - v3; - v27 = *v2; - v28 = v3; - v24 = 0; - if (40 - v3 > 0) { - v22 = 40 - *v2; - v21 = (char *)dungeon[-1]; - while (v22 <= 0) { - LABEL_44: - v4 = v24++ + 1; - if (v24 >= v23) - return; - } - v26 = 0; - v20 = v22; - v5 = &v21[v4]; - v25 = (int)&v21[v4]; - while (1) { - v6 = 0; - v29 = 1; - for (i = 2; v6 < v28; ++v6) { - if (v29 != 1) - break; - v8 = 0; - if (v27 > 0) { - v9 = v24 + v6 + v26; - do { - if (v29 != 1) - break; - v10 = v2[i]; - if (v10 && dungeon[0][v9] != v10) - v29 = 0; - if (dflags[0][v9]) - v29 = 0; - ++i; - ++v8; - v9 += 40; - } while (v8 < v27); - v5 = (char *)v25; + int sx, sy, sw, sh, xx, yy, ii, kk; + BOOL found; + + sw = miniset[0]; + sh = miniset[1]; + + for(sy = 0; sy < 40 - sh; sy++) { + for(sx = 0; sx < 40 - sw; sx++) { + found = TRUE; + ii = 2; + for(yy = 0; yy < sh && found == TRUE; yy++) { + for(xx = 0; xx < sw && found == TRUE; xx++) { + if(miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) { + found = FALSE; + } + if(dflags[xx + sx][yy + sy] != 0) { + found = FALSE; + } + ii++; } } - v11 = v27 * v28 + 2; - v12 = v2[v11]; - if (v12 < 0x54u || v12 > 0x64u) - goto LABEL_33; - if (v29 == 1) - break; - LABEL_43: - v26 += 40; - v5 += 40; - v18 = v20-- == 1; - v25 = (int)v5; - if (v18) - goto LABEL_44; - } - v13 = *v5; - if ((unsigned char)*v5 >= 0x54u && (unsigned char)v13 <= 0x64u) - v29 = 0; - if ((unsigned char)v5[80] >= 0x54u && (unsigned char)v13 <= 0x64u) - v29 = 0; - if ((unsigned char)v5[41] >= 0x54u && (unsigned char)v13 <= 0x64u) - v29 = 0; - if ((unsigned char)v5[39] >= 0x54u && (unsigned char)v13 <= 0x64u) - v29 = 0; - LABEL_33: - if (v29 == 1) { - if (random(0, 100) < v19) { - for (j = 0; j < v28; ++j) { - v15 = v27; - if (v27 > 0) { - v16 = (unsigned char *)dungeon + j + v26 + v24; - do { - v17 = v2[v11]; - if (v17) - *v16 = v17; - ++v11; - v16 += 40; - --v15; - } while (v15); + kk = sw * sh + 2; + if(miniset[kk] >= 84 && miniset[kk] <= 100 && found == TRUE) { + if(dungeon[sx - 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) { + found = FALSE; + } + if(dungeon[sx + 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) { + found = FALSE; + } + if(dungeon[sx][sy + 1] >= 84 && dungeon[sx - 1][sy] <= 100) { + found = FALSE; + } + if(dungeon[sx][sy - 1] >= 84 && dungeon[sx - 1][sy] <= 100) { + found = FALSE; + } + } + if(found == TRUE && random(0, 100) < rndper) { + for(yy = 0; yy < sh; yy++) { + for(xx = 0; xx < sw; xx++) { + if(miniset[kk] != 0) { + dungeon[xx + sx][yy + sy] = miniset[kk]; + } + kk++; } } } - v5 = (char *)v25; } - goto LABEL_43; } } @@ -2212,100 +1730,100 @@ void __cdecl DRLG_L3Wood() FenceDoorFix(); } -BOOLEAN __fastcall WoodVertU(int i, int y) +BOOL __fastcall WoodVertU(int i, int y) { - int v2; // eax - char v3; // cl - char *v4; // eax - unsigned char v5; // cl - char v6; // al - BOOLEAN result; // eax - - v2 = i; - v3 = dungeon[i + 1][y]; - result = 0; - if ((unsigned char)v3 > 0x98u || (unsigned char)v3 < 0x82u) { - v4 = (char *)&dungeon[v2][y]; - v5 = *(v4 - 40); - if (v5 > 0x98u || v5 < 0x82u) { - v6 = *v4; - if (v6 == 7 || v6 == 10 || v6 == 126 || v6 == -127 || v6 == -122 || v6 == -120) - result = 1; - } - } - return result; + if((dungeon[i + 1][y] > 152 || dungeon[i + 1][y] < 130) + && (dungeon[i - 1][y] > 152 || dungeon[i - 1][y] < 130)) { + if(dungeon[i][y] == 7) { + return TRUE; + } + if(dungeon[i][y] == 10) { + return TRUE; + } + if(dungeon[i][y] == 126) { + return TRUE; + } + if(dungeon[i][y] == 129) { + return TRUE; + } + if(dungeon[i][y] == 134) { + return TRUE; + } + if(dungeon[i][y] == 136) { + return TRUE; + } + } + + return FALSE; } -BOOLEAN __fastcall WoodVertD(int i, int y) +BOOL __fastcall WoodVertD(int i, int y) { - int v2; // eax - char v3; // cl - char *v4; // eax - unsigned char v5; // cl - char v6; // al - BOOLEAN result; // eax - - v2 = i; - v3 = dungeon[i + 1][y]; - result = 0; - if ((unsigned char)v3 > 0x98u || (unsigned char)v3 < 0x82u) { - v4 = (char *)&dungeon[v2][y]; - v5 = *(v4 - 40); - if (v5 > 0x98u || v5 < 0x82u) { - v6 = *v4; - if (v6 == 7 || v6 == 2 || v6 == -122 || v6 == -120) - result = 1; - } - } - return result; + if((dungeon[i + 1][y] > 152 || dungeon[i + 1][y] < 130) + && (dungeon[i - 1][y] > 152 || dungeon[i - 1][y] < 130)) { + if(dungeon[i][y] == 7) { + return TRUE; + } + if(dungeon[i][y] == 2) { + return TRUE; + } + if(dungeon[i][y] == 134) { + return TRUE; + } + if(dungeon[i][y] == 136) { + return TRUE; + } + } + + return FALSE; } -BOOLEAN __fastcall WoodHorizL(int x, int j) +BOOL __fastcall WoodHorizL(int x, int j) { - int v2; // eax - char v3; // cl - char *v4; // eax - unsigned char v5; // cl - char v6; // al - BOOLEAN result; // eax + if((dungeon[x][j + 1] > 152 || dungeon[x][j + 1] < 130) + && (dungeon[x][j - 1] > 152 || dungeon[x][j - 1] < 130)) { + if(dungeon[x][j] == 7) { + return TRUE; + } + if(dungeon[x][j] == 9) { + return TRUE; + } + if(dungeon[x][j] == 121) { + return TRUE; + } + if(dungeon[x][j] == 124) { + return TRUE; + } + if(dungeon[x][j] == 135) { + return TRUE; + } + if(dungeon[x][j] == 137) { + return TRUE; + } + } - v2 = x; - v3 = dungeon[x][j + 1]; - result = 0; - if ((unsigned char)v3 > 0x98u || (unsigned char)v3 < 0x82u) { - v4 = (char *)&dungeon[v2][j]; - v5 = *(v4 - 1); - if (v5 > 0x98u || v5 < 0x82u) { - v6 = *v4; - if (v6 == 7 || v6 == 9 || v6 == 121 || v6 == 124 || v6 == -121 || v6 == -119) - result = 1; - } - } - return result; + return FALSE; } -BOOLEAN __fastcall WoodHorizR(int x, int j) +BOOL __fastcall WoodHorizR(int x, int j) { - int v2; // eax - char v3; // cl - char *v4; // eax - unsigned char v5; // cl - char v6; // al - BOOLEAN result; // eax + if((dungeon[x][j + 1] > 152 || dungeon[x][j + 1] < 130) + && (dungeon[x][j - 1] > 152 || dungeon[x][j - 1] < 130)) { + if(dungeon[x][j] == 7) { + return TRUE; + } + if(dungeon[x][j] == 4) { + return TRUE; + } + if(dungeon[x][j] == 135) { + return TRUE; + } + if(dungeon[x][j] == 137) { + return TRUE; + } + } - v2 = x; - v3 = dungeon[x][j + 1]; - result = 0; - if ((unsigned char)v3 > 0x98u || (unsigned char)v3 < 0x82u) { - v4 = (char *)&dungeon[v2][j]; - v5 = *(v4 - 1); - if (v5 > 0x98u || v5 < 0x82u) { - v6 = *v4; - if (v6 == 7 || v6 == 4 || v6 == -121 || v6 == -119) - result = 1; - } - } - return result; + return FALSE; } void __cdecl DRLG_L3Pass3() @@ -2409,91 +1927,64 @@ void __cdecl DRLG_L3Pass3() void __fastcall LoadL3Dungeon(char *sFileName, int vx, int vy) { - char *v3; // esi - unsigned char *v4; // eax - char *v5; // esi - int v6; // edi - int v7; // ecx - _BYTE *v8; // eax - _BYTE *v9; // edx - int v10; // ebx - signed int v11; // ecx - _BYTE *v12; // eax - signed int v13; // edx - int v14; // edi - signed int v15; // eax - int v16; // [esp+Ch] [ebp-8h] - signed int *v17; // [esp+Ch] [ebp-8h] - int v18; // [esp+10h] [ebp-4h] - int(*v19)[112]; // [esp+10h] [ebp-4h] - - v3 = sFileName; + int i, j, rw, rh; + BYTE *pLevelMap, *lm; + InitL3Dungeon(); dminx = 16; dminy = 16; dmaxx = 96; dmaxy = 96; DRLG_InitTrans(); - v4 = LoadFileInMem(v3, 0); - v5 = (char *)v4; - v18 = 0; - v6 = *v4; - v4 += 2; - v7 = *v4; - v8 = v4 + 2; - if (v7 > 0) { - do { - if (v6 > 0) { - v16 = v6; - v9 = (unsigned char *)dungeon + v18; - do { - if (*v8) - *v9 = *v8; - else - *v9 = 7; - v9 += 40; - v8 += 2; - --v16; - } while (v16); + pLevelMap = LoadFileInMem(sFileName, 0); + + lm = pLevelMap; + rw = *lm; + lm += 2; + rh = *lm; + lm += 2; + + for(j = 0; j < rh; j++) { + for(i = 0; i < rw; i++) { + if(*lm != 0) { + dungeon[i][j] = *lm; + } else { + dungeon[i][j] = 7; } - ++v18; - } while (v18 < v7); + lm += 2; + } } - v10 = 0; - v11 = 0; - do { - v12 = (unsigned char *)dungeon + v11; - v13 = 40; - do { - if (!*v12) - *v12 = 8; - v12 += 40; - --v13; - } while (v13); - ++v11; - } while (v11 < 40); + for(j = 0; j < 40; j++) { + for(i = 0; i < 40; i++) { + if(dungeon[i][j] == 0) { + dungeon[i][j] = 8; + } + } + } + abyssx = 112; DRLG_L3Pass3(); DRLG_Init_Globals(); ViewX = 31; ViewY = 83; - SetMapMonsters((unsigned char *)v5, 0, 0); - SetMapObjects((unsigned char *)v5, 0, 0); - v19 = dPiece; - do { - v14 = 0; - v17 = (signed int *)v19; - do { - v15 = *v17; - if (*v17 >= 56 && v15 <= 147 || v15 >= 154 && v15 <= 161 || v15 == 150 || v15 == 152) - DoLighting(v14, v10, 7, -1); - v17 += 112; - ++v14; - } while (v14 < 112); - v19 = (int(*)[112])((char *)v19 + 4); - ++v10; - } while ((signed int)v19 < (signed int)dPiece[1]); - mem_free_dbg(v5); + SetMapMonsters(pLevelMap, 0, 0); + SetMapObjects(pLevelMap, 0, 0); + + for(j = 0; j < 112; j++) { + for(i = 0; i < 112; i++) { + if(dPiece[i][j] >= 56 && dPiece[i][j] <= 147) { + DoLighting(i, j, 7, -1); + } else if(dPiece[i][j] >= 154 && dPiece[i][j] <= 161) { + DoLighting(i, j, 7, -1); + } else if(dPiece[i][j] == 150) { + DoLighting(i, j, 7, -1); + } else if(dPiece[i][j] == 152) { + DoLighting(i, j, 7, -1); + } + } + } + + mem_free_dbg(pLevelMap); } // 52837C: using guessed type int abyssx; // 5CF328: using guessed type int dmaxx; @@ -2503,59 +1994,37 @@ void __fastcall LoadL3Dungeon(char *sFileName, int vx, int vy) void __fastcall LoadPreL3Dungeon(char *sFileName, int vx, int vy) { - char *v3; // esi - unsigned char *v4; // eax - unsigned char *v5; // esi - int v6; // edx - int v7; // edi - _BYTE *v8; // eax - _BYTE *v9; // ecx - signed int v10; // ecx - _BYTE *v11; // eax - signed int v12; // edx - int v13; // [esp+8h] [ebp-8h] - int v14; // [esp+Ch] [ebp-4h] - - v3 = sFileName; + int i, j, rw, rh; + BYTE *pLevelMap, *lm; + InitL3Dungeon(); DRLG_InitTrans(); - v4 = LoadFileInMem(v3, 0); - v5 = v4; - v14 = 0; - v6 = *v4; - v4 += 2; - v7 = *v4; - v8 = v4 + 2; - if (v7 > 0) { - do { - if (v6 > 0) { - v13 = v6; - v9 = (unsigned char *)dungeon + v14; - do { - if (*v8) - *v9 = *v8; - else - *v9 = 7; - v9 += 40; - v8 += 2; - --v13; - } while (v13); + pLevelMap = LoadFileInMem(sFileName, 0); + + lm = pLevelMap; + rw = *lm; + lm += 2; + rh = *lm; + lm += 2; + + for(j = 0; j < rh; j++) { + for(i = 0; i < rw; i++) { + if(*lm != 0) { + dungeon[i][j] = *lm; + } else { + dungeon[i][j] = 7; } - ++v14; - } while (v14 < v7); + lm += 2; + } } - v10 = 0; - do { - v11 = (unsigned char *)dungeon + v10; - v12 = 40; - do { - if (!*v11) - *v11 = 8; - v11 += 40; - --v12; - } while (v12); - ++v10; - } while (v10 < 40); - memcpy(pdungeon, dungeon, 0x640u); - mem_free_dbg(v5); + for(j = 0; j < 40; j++) { + for(i = 0; i < 40; i++) { + if(dungeon[i][j] == 0) { + dungeon[i][j] = 8; + } + } + } + + memcpy(pdungeon, dungeon, sizeof(pdungeon)); + mem_free_dbg(pLevelMap); } diff --git a/Source/drlg_l3.h b/Source/drlg_l3.h index 75209cffd..7f2fd9998 100644 --- a/Source/drlg_l3.h +++ b/Source/drlg_l3.h @@ -14,10 +14,10 @@ void __cdecl FixL3Warp(); void __cdecl FixL3HallofHeroes(); void __fastcall DRLG_L3LockRec(int x, int y); BOOLEAN __cdecl DRLG_L3Lockout(); -void __fastcall CreateL3Dungeon(int rseed, int entry); +void __fastcall CreateL3Dungeon(unsigned int rseed, int entry); void __fastcall DRLG_L3(int entry); void __cdecl InitL3Dungeon(); -int __fastcall DRLG_L3FillRoom(int x1, int y1, int x2, int y2); +BOOL __fastcall DRLG_L3FillRoom(int x1, int y1, int x2, int y2); void __fastcall DRLG_L3CreateBlock(int x, int y, int obs, int dir); void __fastcall DRLG_L3FloorArea(int x1, int y1, int x2, int y2); void __cdecl DRLG_L3FillDiags(); @@ -31,13 +31,13 @@ void __cdecl DRLG_L3Pool(); BOOL __fastcall DRLG_L3SpawnEdge(int x, int y, int *totarea); BOOL __fastcall DRLG_L3Spawn(int x, int y, int *totarea); void __cdecl DRLG_L3PoolFix(); -int __fastcall DRLG_L3PlaceMiniSet(const unsigned char *miniset, int tmin, int tmax, int cx, int cy, BOOLEAN setview, int ldir); +BOOL __fastcall DRLG_L3PlaceMiniSet(const unsigned char *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir); void __fastcall DRLG_L3PlaceRndSet(const unsigned char *miniset, int rndper); void __cdecl DRLG_L3Wood(); -BOOLEAN __fastcall WoodVertU(int i, int y); -BOOLEAN __fastcall WoodVertD(int i, int y); -BOOLEAN __fastcall WoodHorizL(int x, int j); -BOOLEAN __fastcall WoodHorizR(int x, int j); +BOOL __fastcall WoodVertU(int i, int y); +BOOL __fastcall WoodVertD(int i, int y); +BOOL __fastcall WoodHorizL(int x, int j); +BOOL __fastcall WoodHorizR(int x, int j); void __cdecl DRLG_L3Pass3(); void __fastcall LoadL3Dungeon(char *sFileName, int vx, int vy); void __fastcall LoadPreL3Dungeon(char *sFileName, int vx, int vy);