Browse Source

`PlaceUniqueMonst` is now near binary-exact.

It's just the both struct pointers that seem to load a bit differently.
pull/4/head
Dennis Duda 8 years ago
parent
commit
5de0a5083b
  1. 372
      Source/monster.cpp

372
Source/monster.cpp

@ -868,162 +868,187 @@ void __fastcall PlaceMonster(int i, int mtype, int x, int y)
void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize)
{
MonsterStruct *Monst = &monster[nummonsters];
UniqMonstStruct *Uniq = &UniqMonst[uniqindex];
int x;
int y;
int xp;
int yp;
char filestr[64];
int mtype;
if ( (uniquetrans + 19) << 8 < 6912 )
UniqMonstStruct *Uniq = &UniqMonst[uniqindex];
MonsterStruct *Monst = &monster[nummonsters];
int count = 0;
if ( (uniquetrans + 19) << 8 >= 6912 )
{
mtype = 0;
if ( nummtypes > 0 )
return;
}
int uniqtype;
for ( uniqtype = 0; uniqtype < nummtypes; uniqtype++ )
{
if ( Monsters[uniqtype].mtype == Uniq->mtype )
{
break;
}
}
while (true)
{
xp = random(91, 80) + 16;
yp = random(91, 80) + 16;
int count2 = 0;
for ( int x = xp - 3; x < xp + 3; x++ )
{
for ( int i = 0; i < nummtypes; i++ )
for ( int y = yp - 3; y < yp + 3; y++ )
{
if ( Monsters[i].mtype == Uniq->mtype )
if ( y >= 0 && y < 112 && x >= 0 && x < 112 && MonstPlace(x, y) )
{
break;
count2++;
}
mtype++;
}
}
do
{
for ( int i = 0; i < 1000; i++ )
if ( count2 < 9 ) {
count++;
if ( count < 1000 )
{
int count = 0;
x = random(91, 80) + 16;
y = random(91, 80) + 16;
continue;
}
}
for ( int xp = x - 3; xp < x + 3; xp++ )
{
for ( int yp = y - 3; yp < y + 3; yp++ )
{
if ( yp >= 0 && yp < 112 && xp >= 0 && xp < 112 && MonstPlace(xp, yp) )
{
++count;
}
}
}
if ( count >= 9 )
break;
}
if ( MonstPlace(xp, yp) )
{
break;
}
while ( !MonstPlace(x, y) );
}
if ( uniqindex == 3 )
if ( uniqindex == 3 )
{
xp = 2 * setpc_x + 24;
yp = 2 * setpc_y + 28;
}
if ( uniqindex == 8 )
{
xp = 2 * setpc_x + 22;
yp = 2 * setpc_y + 23;
}
if ( uniqindex == 2 )
{
BOOL zharflag = TRUE;
for ( int i = 0; i < themeCount; i++ )
{
x = 2 * setpc_x + 24;
y = 2 * setpc_y + 28;
if ( i == zharlib && zharflag == TRUE )
{
zharflag = FALSE;
xp = 2 * themeLoc[i].x + 20;
yp = 2 * themeLoc[i].y + 20;
}
}
if ( uniqindex == 8 )
}
if ( gbMaxPlayers == 1 )
{
if ( uniqindex == 4 )
{
x = 2 * setpc_x + 22;
y = 2 * setpc_y + 23;
xp = 32;
yp = 46;
}
if ( uniqindex == 2 )
if ( uniqindex == 5 )
{
int count2 = 1;
for ( int i = 0; i < themeCount; i++ )
{
if ( i == zharlib && count2 == 1 )
{
count2 = 0;
x = 2 * themeLoc[i].x + 20;
y = 2 * themeLoc[i].y + 20;
}
}
xp = 40;
yp = 45;
}
if ( gbMaxPlayers == 1 )
if ( uniqindex == 6 )
{
if ( uniqindex == 4 )
{
x = 32;
y = 46;
}
if ( uniqindex == 5 )
{
x = 40;
y = 45;
}
if ( uniqindex == 6 )
{
x = 38;
y = 49;
}
if ( uniqindex == 1 )
{
x = 35;
y = 47;
}
xp = 38;
yp = 49;
}
else
if ( uniqindex == 1 )
{
if ( uniqindex == 4 )
{
x = 2 * setpc_x + 19;
y = 2 * setpc_y + 22;
}
if ( uniqindex == 5 )
{
x = 2 * setpc_x + 21;
y = 2 * setpc_y + 19;
}
if ( uniqindex == 6 )
{
x = 2 * setpc_x + 21;
y = 2 * setpc_y + 25;
}
xp = 35;
yp = 47;
}
if ( uniqindex == 9 )
}
else
{
if ( uniqindex == 4 )
{
BOOL done = FALSE;
for ( x = 0; x < 112 && !done; x++ )
xp = 2 * setpc_x + 19;
yp = 2 * setpc_y + 22;
}
if ( uniqindex == 5 )
{
xp = 2 * setpc_x + 21;
yp = 2 * setpc_y + 19;
}
if ( uniqindex == 6 )
{
xp = 2 * setpc_x + 21;
yp = 2 * setpc_y + 25;
}
}
if ( uniqindex == 9 )
{
BOOL done = FALSE;
for ( yp = 0; yp < 112 && !done; yp++ )
{
for ( xp = 0; xp < 112 && !done; xp++ )
{
for ( y = 0; y < 112 && !done; y++ )
{
done = dPiece[x][y] == 367;
}
done = dPiece[xp][yp] == 367;
}
}
}
PlaceMonster(nummonsters, mtype, x, y);
Monst->_uniqtype = uniqindex + 1;
PlaceMonster(nummonsters, uniqtype, xp, yp);
Monst->_uniqtype = uniqindex + 1;
if ( Uniq->mlevel )
Monst->mLevel = 2 * Uniq->mlevel;
else
Monst->mLevel += 5;
if ( Uniq->mlevel )
{
Monst->mLevel = 2 * Uniq->mlevel;
}
else
{
Monst->mLevel += 5;
}
Monst->mExp *= 2;
Monst->mName = Uniq->mName;
Monst->_mmaxhp = Uniq->mmaxhp << 6;
Monst->mExp *= 2;
Monst->mName = Uniq->mName;
Monst->_mmaxhp = Uniq->mmaxhp << 6;
if ( gbMaxPlayers == 1 )
if ( gbMaxPlayers == 1 )
{
Monst->_mmaxhp = Monst->_mmaxhp >> 1;
if ( Monst->_mmaxhp < 64 )
{
Monst->_mmaxhp = Monst->_mmaxhp >> 1;
if ( Monst->_mmaxhp < 64 )
Monst->_mmaxhp = 64;
Monst->_mmaxhp = 64;
}
}
Monst->_mhitpoints = Monst->_mmaxhp;
Monst->_mAi = Uniq->mAi;
Monst->_mint = Uniq->mint;
Monst->mMinDamage = Uniq->mMinDamage;
Monst->mMinDamage2 = Uniq->mMinDamage;
Monst->mMagicRes = Uniq->mMagicRes;
Monst->mMaxDamage = Uniq->mMaxDamage;
Monst->mMaxDamage2 = Uniq->mMaxDamage;
Monst->mtalkmsg = Uniq->mtalkmsg;
Monst->mlid = AddLight(Monst->_mx, Monst->_my, 3);
Monst->_mhitpoints = Monst->_mmaxhp;
Monst->_mAi = Uniq->mAi;
Monst->_mint = Uniq->mint;
Monst->mMinDamage = Uniq->mMinDamage;
Monst->mMaxDamage = Uniq->mMaxDamage;
Monst->mMinDamage2 = Uniq->mMinDamage;
Monst->mMaxDamage2 = Uniq->mMaxDamage;
Monst->mMagicRes = Uniq->mMagicRes;
Monst->mtalkmsg = Uniq->mtalkmsg;
Monst->mlid = AddLight(Monst->_mx, Monst->_my, 3);
if ( gbMaxPlayers == 1 )
if ( gbMaxPlayers == 1 )
{
if ( Monst->mtalkmsg )
{
Monst->_mgoal = 6;
}
}
else
{
if ( Monst->_mAi == AI_LAZHELP )
{
Monst->mtalkmsg = 0;
}
if ( Monst->_mAi != AI_LAZURUS || quests[15]._qvar1 <= 3 )
{
if ( Monst->mtalkmsg )
{
@ -1032,77 +1057,62 @@ void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesi
}
else
{
if ( Monst->_mAi == AI_LAZHELP )
{
Monst->mtalkmsg = 0;
}
if ( Monst->_mAi != AI_LAZURUS || quests[15]._qvar1 <= 3 )
{
if ( Monst->mtalkmsg )
{
Monst->_mgoal = 6;
}
}
else
{
Monst->_mgoal = 1;
}
Monst->_mgoal = 1;
}
}
if ( gnDifficulty == DIFF_NIGHTMARE )
{
Monst->mLevel += 15;
Monst->_mmaxhp = 3 * Monst->_mmaxhp + 64;
Monst->_mhitpoints = 3 * Monst->_mmaxhp + 64;
Monst->mExp = 2 * (Monst->mExp + 1000);
Monst->mMinDamage = 2 * (Monst->mMinDamage + 2);
Monst->mMaxDamage = 2 * (Monst->mMaxDamage + 2);
Monst->mMinDamage2 = 2 * (Monst->mMinDamage2 + 2);
Monst->mMaxDamage2 = 2 * (Monst->mMaxDamage2 + 2);
}
if ( gnDifficulty == DIFF_NIGHTMARE )
{
Monst->mLevel += 15;
Monst->_mmaxhp = 3 * Monst->_mmaxhp + 64;
Monst->_mhitpoints = Monst->_mmaxhp;
Monst->mExp = 2 * (Monst->mExp + 1000);
Monst->mMinDamage = 2 * (Monst->mMinDamage + 2);
Monst->mMaxDamage = 2 * (Monst->mMaxDamage + 2);
Monst->mMinDamage2 = 2 * (Monst->mMinDamage2 + 2);
Monst->mMaxDamage2 = 2 * (Monst->mMaxDamage2 + 2);
}
if ( gnDifficulty == DIFF_HELL )
{
Monst->mLevel += 30;
Monst->_mmaxhp = 4 * Monst->_mmaxhp + 192;
Monst->_mhitpoints = 4 * Monst->_mmaxhp + 192;
Monst->mExp = 4 * (Monst->mExp + 1000);
Monst->mMinDamage = 4 * Monst->mMinDamage + 6;
Monst->mMaxDamage = 4 * Monst->mMaxDamage + 6;
Monst->mMinDamage2 = 4 * Monst->mMinDamage2 + 6;
Monst->mMaxDamage2 = 4 * Monst->mMaxDamage2 + 6;
}
if ( gnDifficulty == DIFF_HELL )
{
Monst->mLevel += 30;
Monst->_mmaxhp = 4 * Monst->_mmaxhp + 192;
Monst->_mhitpoints = Monst->_mmaxhp;
Monst->mExp = 4 * (Monst->mExp + 1000);
Monst->mMinDamage = 4 * Monst->mMinDamage + 6;
Monst->mMaxDamage = 4 * Monst->mMaxDamage + 6;
Monst->mMinDamage2 = 4 * Monst->mMinDamage2 + 6;
Monst->mMaxDamage2 = 4 * Monst->mMaxDamage2 + 6;
}
sprintf(filestr, "Monsters\\Monsters\\%s.TRN", Uniq->mName);
LoadFileWithMem(filestr, &pLightTbl[256 * (uniquetrans + 19)]);
sprintf(filestr, "Monsters\\Monsters\\%s.TRN", Uniq->mName);
LoadFileWithMem(filestr, &pLightTbl[256 * (uniquetrans + 19)]);
Monst->_uniqtrans = uniquetrans++;
Monst->_uniqtrans = uniquetrans++;
if ( Uniq->mUnqAttr & 4 )
{
Monst->mHit = Uniq->mUnqVar1;
Monst->mHit2 = Uniq->mUnqVar1;
}
if ( Uniq->mUnqAttr & 8 )
{
Monst->mArmorClass = Uniq->mUnqVar1;
}
if ( Uniq->mUnqAttr & 4 )
{
Monst->mHit = Uniq->mUnqVar1;
Monst->mHit2 = Uniq->mUnqVar1;
}
if ( Uniq->mUnqAttr & 8 )
{
Monst->mArmorClass = Uniq->mUnqVar1;
}
nummonsters++;
nummonsters++;
if ( Uniq->mUnqAttr & 1 )
{
PlaceGroup(miniontype, unpackfilesize, Uniq->mUnqAttr, nummonsters - 1);
}
if ( Uniq->mUnqAttr & 1 )
{
PlaceGroup(miniontype, unpackfilesize, Uniq->mUnqAttr, nummonsters - 1);
}
if ( Monst->_mAi != AI_GARG )
{
Monst->_mAnimData = Monst->MType->Anims[0].Frames[Monst->_mdir];
Monst->_mFlags &= 0xFFFFFFFB;
Monst->_mmode = 0;
Monst->_mAnimFrame = random(88, Monst->_mAnimLen - 1) + 1;
}
if ( Monst->_mAi != AI_GARG )
{
Monst->_mAnimData = Monst->MType->Anims[0].Frames[Monst->_mdir];
Monst->_mAnimFrame = random(88, Monst->_mAnimLen - 1) + 1;
Monst->_mFlags &= 0xFFFFFFFB;
Monst->_mmode = 0;
}
}

Loading…
Cancel
Save