diff --git a/Source/drlg_l1.cpp b/Source/drlg_l1.cpp index 65ccb88ca..11dff1cd3 100644 --- a/Source/drlg_l1.cpp +++ b/Source/drlg_l1.cpp @@ -212,7 +212,7 @@ void __fastcall LoadL1Dungeon(char *sFileName, int vx, int vy) DRLG_Init_Globals(); DRLG_InitL1Vals(); SetMapMonsters(v4, 0, 0); - SetMapObjects(v4, 0, 0); + SetMapObjects((char *)v4, 0, 0); mem_free_dbg(v4); } // 5CF328: using guessed type int dmaxx; diff --git a/Source/drlg_l2.cpp b/Source/drlg_l2.cpp index ca529dc6b..249351215 100644 --- a/Source/drlg_l2.cpp +++ b/Source/drlg_l2.cpp @@ -532,8 +532,8 @@ void __fastcall LoadL2Dungeon(char *sFileName, int vx, int vy) while ( (signed int)v25 < (signed int)dPiece[1] ); ViewX = v30; ViewY = vy; - SetMapMonsters((unsigned char *)ptr, 0, 0); - SetMapObjects((unsigned char *)ptr, 0, 0); + SetMapMonsters((unsigned char*)ptr, 0, 0); + SetMapObjects(ptr, 0, 0); mem_free_dbg(ptr); } diff --git a/Source/drlg_l3.cpp b/Source/drlg_l3.cpp index 0216e1da0..728a2c9cb 100644 --- a/Source/drlg_l3.cpp +++ b/Source/drlg_l3.cpp @@ -2860,8 +2860,8 @@ void __fastcall LoadL3Dungeon(char *sFileName, int vx, int vy) DRLG_Init_Globals(); ViewX = 31; ViewY = 83; - SetMapMonsters((unsigned char *)v5, 0, 0); - SetMapObjects((unsigned char *)v5, 0, 0); + SetMapMonsters((unsigned char*)v5, 0, 0); + SetMapObjects(v5, 0, 0); v19 = dPiece; do { diff --git a/Source/monster.cpp b/Source/monster.cpp index 4880a0f58..7f2c086e9 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1097,75 +1097,82 @@ void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesi void __cdecl PlaceQuestMonsters() { - int skeltype; // esi - CMonster *v2; // edi - unsigned char *setp; // esi + int skeltype; + unsigned char *setp; if ( setlevel ) { if ( setlvlnum == SL_SKELKING ) + { PlaceUniqueMonst(1, 0, 0); + } } else { - if ( QuestStatus(6) ) + if ( QuestStatus(QTYPE_BUTCH) ) + { PlaceUniqueMonst(9, 0, 0); + } + if ( currlevel == quests[12]._qlevel && gbMaxPlayers != 1 ) { skeltype = 0; - if ( nummtypes > 0 ) + + for ( skeltype = 0; skeltype < nummtypes; skeltype++ ) { - v2 = Monsters; - do + if ( IsSkel(Monsters[skeltype].mtype) ) { - if ( IsSkel((unsigned char)v2->mtype) ) - break; - ++skeltype; - ++v2; + break; } - while ( skeltype < nummtypes ); } + PlaceUniqueMonst(1, skeltype, 30); } - if ( QuestStatus(7) ) + + if ( QuestStatus(QTYPE_BOL) ) { setp = LoadFileInMem("Levels\\L1Data\\Banner1.DUN", 0); SetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y); mem_free_dbg(setp); } - if ( QuestStatus(9) ) + if ( QuestStatus(QTYPE_BLOOD) ) { setp = LoadFileInMem("Levels\\L2Data\\Blood2.DUN", 0); SetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y); mem_free_dbg(setp); } - if ( QuestStatus(8) ) + if ( QuestStatus(QTYPE_BLIND) ) { setp = LoadFileInMem("Levels\\L2Data\\Blind2.DUN", 0); SetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y); mem_free_dbg(setp); } - if ( QuestStatus(10) ) + if ( QuestStatus(QTYPE_ANVIL) ) { setp = LoadFileInMem("Levels\\L3Data\\Anvil.DUN", 0); SetMapMonsters(setp, 2 * setpc_x + 2, 2 * setpc_y + 2); mem_free_dbg(setp); } - if ( QuestStatus(11) ) + if ( QuestStatus(QTYPE_WARLRD) ) { setp = LoadFileInMem("Levels\\L4Data\\Warlord.DUN", 0); SetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y); mem_free_dbg(setp); - AddMonsterType((char)UniqMonst[8].mtype, 1); + AddMonsterType(UniqMonst[8].mtype, 1); + } + if ( QuestStatus(QTYPE_VEIL) ) + { + AddMonsterType(UniqMonst[7].mtype, 1); } - if ( QuestStatus(4) ) - AddMonsterType((char)UniqMonst[7].mtype, 1); - if ( QuestStatus(3) && zharlib == -1 ) + if ( QuestStatus(QTYPE_ZHAR) && zharlib == -1 ) + { quests[3]._qactive = 0; + } + if ( currlevel == quests[15]._qlevel && gbMaxPlayers != 1 ) { - AddMonsterType((char)UniqMonst[4].mtype, 4); - AddMonsterType((char)UniqMonst[5].mtype, 4); + AddMonsterType(UniqMonst[4].mtype, 4); + AddMonsterType(UniqMonst[5].mtype, 4); PlaceUniqueMonst(4, 0, 0); PlaceUniqueMonst(5, 0, 0); PlaceUniqueMonst(6, 0, 0); @@ -1175,138 +1182,98 @@ void __cdecl PlaceQuestMonsters() } } } -// 5CCB10: using guessed type char setlvlnum; -// 5CF31D: using guessed type char setlevel; -// 679660: using guessed type char gbMaxPlayers; -// 6AAA64: using guessed type int zharlib; -void __fastcall PlaceGroup(int mtype, int num, unsigned char leaderf, int leader) +void __fastcall PlaceGroup(int mtype, int num, int leaderf, int leader) { - int v4; // ecx - int *v5; // eax - int v6; // edx - int v7; // eax - int v8; // edi - int v9; // esi - int v10; // eax - int v12; // eax - int v13; // ecx - int v14; // eax - //int v15; // ST04_4 - int v16; // eax - //int v17; // ST04_4 - int v18; // eax - int *v19; // edx - int v20; // ecx - int v21; // ebx - int v22; // ecx - int mtypea; // [esp+Ch] [ebp-24h] - signed int v25; // [esp+14h] [ebp-1Ch] - int v26; // [esp+18h] [ebp-18h] - signed int i; // [esp+1Ch] [ebp-14h] - int v28; // [esp+20h] [ebp-10h] - int v29; // [esp+24h] [ebp-Ch] - int v30; // [esp+28h] [ebp-8h] - int v31; // [esp+2Ch] [ebp-4h] - - mtypea = mtype; - v4 = 0; - v31 = num; - v30 = 0; - v25 = 0; - do + int placed = 0; + int xp; + int yp; + int x1; + int y1; + + for ( int try1 = 0; try1 < 10; try1++ ) { - if ( v4 ) + while ( placed ) { - v30 = 0; - v5 = &monster[nummonsters]._my; - nummonsters -= v4; - do - { - v6 = *(v5 - 58); - v5 -= 57; - --v4; - dMonster[0][*v5 + 112 * v6] = 0; - } - while ( v4 ); + nummonsters--; + placed--; + dMonster[monster[nummonsters]._mx][monster[nummonsters]._my] = 0; } + if ( leaderf & 1 ) { - v7 = random(92, 8); - v8 = monster[leader]._mx + offset_x[v7]; - v9 = monster[leader]._my + offset_y[v7]; - v29 = monster[leader]._mx + offset_x[v7]; - v28 = monster[leader]._my + offset_y[v7]; + int offset = random(92, 8); + xp = monster[leader]._mx + offset_x[offset]; + yp = monster[leader]._my + offset_y[offset]; + x1 = monster[leader]._mx + offset_x[offset]; + y1 = monster[leader]._my + offset_y[offset]; } else { do { - v10 = random(93, 80); - v8 = v10 + 16; - v29 = v10 + 16; - v12 = random(93, 80); - v9 = v12 + 16; - v28 = v12 + 16; + xp = random(93, 80) + 16; + x1 = xp; + yp = random(93, 80) + 16; + y1 = yp; } - while ( !MonstPlace(v8, v12 + 16) ); + while ( !MonstPlace(xp, yp) ); } - if ( nummonsters + v31 > totalmonsters ) - v31 = totalmonsters - nummonsters; - v26 = 0; - for ( i = 0; v26 < v31; v9 += offset_x[random(94, 8)] ) + + if ( num + nummonsters > totalmonsters ) + num = totalmonsters - nummonsters; + + int try2 = 0; + for ( int j = 0; j < num; xp += offset_x[random(94, 8)], yp += offset_x[random(94, 8)] ) { - if ( i >= 100 ) + if ( try2 >= 100 ) + { break; - if ( !MonstPlace(v8, v9) - || (v13 = 112 * v29, dung_map[v8][v9] != dung_map[v29][v28]) - || leaderf & 2 - && ((v14 = abs(v8 - v29), v13 = 0, v14 >= 4) || (v16 = abs(v9 - v28), v13 = 0, v16 >= 4)) ) /* v15/v17 */ + } + + if ( !MonstPlace(xp, yp) + || (dung_map[x1][y1] != dung_map[xp][yp]) + || leaderf & 2 && ((abs(xp - x1) >= 4) || (abs(yp - y1) >= 4)) ) { - ++i; + try2++; + continue; } - else + + PlaceMonster(nummonsters, mtype, xp, yp); + if ( leaderf & 1 ) { - PlaceMonster(nummonsters, mtypea, v8, v9); - if ( leaderf & 1 ) + monster[nummonsters]._mmaxhp *= 2; + monster[nummonsters]._mhitpoints = monster[nummonsters]._mmaxhp; + monster[nummonsters]._mint = monster[leader]._mint; + + if ( leaderf & 2 ) { - v18 = nummonsters; - v19 = &monster[nummonsters]._mmaxhp; - v20 = 2 * *v19; - *v19 = v20; - monster[v18]._mhitpoints = v20; - v13 = 228 * leader; - monster[v18]._mint = monster[leader]._mint; - if ( leaderf & 2 ) - { - monster[v18].leader = leader; - monster[v18].leaderflag = 1; - monster[v18]._mAi = *(&monster[0]._mAi + v13); - } - if ( monster[v18]._mAi != AI_GARG ) - { - v21 = nummonsters; - v22 = (int)monster[v18].MType->Anims[0].Frames[monster[v18]._mdir]; - monster[v18]._mAFNum = v22; - monster[v21]._mAnimFrame = random(88, monster[v21]._mAnimLen - 1) + 1; - monster[v21]._mFlags &= 0xFFFFFFFB; - monster[v21]._mmode = MM_STAND; - } + monster[nummonsters].leader = leader; + monster[nummonsters].leaderflag = 1; + monster[nummonsters]._mAi = monster[leader]._mAi; } - ++nummonsters; - ++v30; - ++v26; + + if ( monster[nummonsters]._mAi != AI_GARG ) + { + monster[nummonsters]._mAFNum = (int)monster[nummonsters].MType->Anims[0].Frames[monster[nummonsters]._mdir]; + monster[nummonsters]._mAnimFrame = random(88, monster[nummonsters]._mAnimLen - 1) + 1; + monster[nummonsters]._mFlags &= 0xFFFFFFFB; + monster[nummonsters]._mmode = MM_STAND; + } + } - v8 += offset_x[random(94, 8)]; + ++nummonsters; + ++placed; + ++j; } - v4 = v30; - if ( v30 >= v31 ) + if ( placed >= num ) break; - ++v25; } - while ( v25 < 10 ); + if ( leaderf & 2 ) - monster[leader].unpackfilesize = v30; + { + monster[leader].unpackfilesize = placed; + } } // 658550: using guessed type int totalmonsters; @@ -1587,7 +1554,7 @@ void __fastcall SetMapMonsters(unsigned char *pMap, int startx, int starty) int startya; // [esp+20h] [ebp+8h] v12 = startx; - v3 = pMap; + v3 = (char *)pMap; AddMonsterType(MT_GOLEM, 2); AddMonster(1, 0, 0, 0, 0); AddMonster(1, 0, 0, 0, 0); diff --git a/Source/monster.h b/Source/monster.h index 73a3c05de..bc987b373 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -29,7 +29,7 @@ BOOL __fastcall MonstPlace(int xp, int yp); void __fastcall PlaceMonster(int i, int mtype, int x, int y); void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize); void __cdecl PlaceQuestMonsters(); -void __fastcall PlaceGroup(int mtype, int num, unsigned char leaderf, int leader); +void __fastcall PlaceGroup(int mtype, int num, int leaderf, int leader); void __cdecl LoadDiabMonsts(); void __cdecl InitMonsters(); void __cdecl PlaceUniques();