Browse Source

Cleaned up `PlaceGroup`

pull/4/head
Dennis Duda 8 years ago
parent
commit
834db70385
  1. 2
      Source/drlg_l1.cpp
  2. 4
      Source/drlg_l2.cpp
  3. 4
      Source/drlg_l3.cpp
  4. 227
      Source/monster.cpp
  5. 2
      Source/monster.h

2
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;

4
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);
}

4
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
{

227
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);

2
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();

Loading…
Cancel
Save