From df44956a78b0cf6b70672a4dd6aa1515dc165ff8 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sun, 22 Jul 2018 22:34:37 +0200 Subject: [PATCH 01/16] Cleaned up InitMonsterTRN. Including changed types used by that function. --- Source/dead.cpp | 2 +- Source/engine.cpp | 8 +- Source/engine.h | 2 +- Source/missiles.cpp | 8 +- Source/monster.cpp | 845 ++++++++++++++++++++++---------------------- Source/monster.h | 2 +- structs.h | 4 +- 7 files changed, 430 insertions(+), 441 deletions(-) diff --git a/Source/dead.cpp b/Source/dead.cpp index 28471d299..91314c242 100644 --- a/Source/dead.cpp +++ b/Source/dead.cpp @@ -83,7 +83,7 @@ void __cdecl InitDead() v10 = monster[v9].MType; v11 = (char *)(v8 - 8); v15 = (int *)8; - v14 = v10->Anims[4].Frames; + v14 = (int *)v10->Anims[4].Frames; do { v12 = v14; diff --git a/Source/engine.cpp b/Source/engine.cpp index ce9ba6560..2af359307 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -1950,12 +1950,12 @@ void __fastcall LoadFileWithMem(char *pszName, void *buf) WCloseFile(a1); } -void __fastcall Cl2ApplyTrans(char *p, char *ttbl, int last_frame) +void __fastcall Cl2ApplyTrans(unsigned char *p, unsigned char *ttbl, int last_frame) { int v3; // eax int v4; // edi int v5; // esi - char *v6; // eax + unsigned char *v6; // eax char v7; // bl unsigned char v8; // bl int v9; // edi @@ -1982,7 +1982,7 @@ void __fastcall Cl2ApplyTrans(char *p, char *ttbl, int last_frame) v9 = v8; do { - *v6 = ttbl[(unsigned char)*v6]; + *v6 = ttbl[*v6]; ++v6; --v9; } @@ -1992,7 +1992,7 @@ void __fastcall Cl2ApplyTrans(char *p, char *ttbl, int last_frame) else { --v5; - *v6 = ttbl[(unsigned char)*v6]; + *v6 = ttbl[*v6]; ++v6; } } diff --git a/Source/engine.h b/Source/engine.h index e4383f1ac..aa31d7433 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -54,7 +54,7 @@ void *__fastcall DiabloAllocPtr(int dwBytes); void __fastcall mem_free_dbg(void *p); unsigned char *__fastcall LoadFileInMem(char *pszName, int *pdwFileLen); void __fastcall LoadFileWithMem(char *pszName, void *buf); -void __fastcall Cl2ApplyTrans(char *p, char *ttbl, int last_frame); +void __fastcall Cl2ApplyTrans(unsigned char *p, unsigned char *ttbl, int last_frame); void __fastcall Cl2DecodeFrm1(int x, int y, char *pCelBuff, int nCel, int width, int dir1, int dir2); void __fastcall Cl2DecDatFrm1(char *buffer, char *frame_content, int a3, int width); void __fastcall Cl2DecodeFrm2(char colour, int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a7, int a8); diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 6e61ea863..6de49cbac 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3454,7 +3454,7 @@ void __fastcall AddRhino(int mi, int sx, int sy, int dx, int dy, int midir, int v13 = i; missile[v13]._miAnimFlags = 0; missile[v13]._mimfnum = midir; - missile[v13]._miAnimData = v12->Frames[midir]; + missile[v13]._miAnimData = (int)v12->Frames[midir]; missile[v13]._miAnimDelay = v12->Delay; missile[v13]._miAnimLen = v12->Rate; v14 = monster[v9].MType; @@ -3494,7 +3494,7 @@ void __fastcall miss_null_32(int mi, int sx, int sy, int dx, int dy, int midir, v12 = v10; missile[v12]._mimfnum = midir; missile[v12]._miAnimFlags = 0; - missile[v12]._miAnimData = v11->Frames[midir]; + missile[v12]._miAnimData = (int)v11->Frames[midir]; missile[v12]._miAnimDelay = v11->Delay; missile[v12]._miAnimLen = v11->Rate; v13 = monster[id].MType; @@ -6511,7 +6511,7 @@ void __fastcall mi_null_32(int i) missile[v2]._miyvel = -missile[v2]._miyvel; v14 = opposite[v13]; missile[v2]._mimfnum = v14; - v15 = monster[v4].MType->Anims[1].Frames[v14]; + v15 = (int)monster[v4].MType->Anims[1].Frames[v14]; ++missile[v2]._miVar2; missile[v2]._miAnimData = v15; if ( v10 > 0 ) @@ -7479,7 +7479,7 @@ void __cdecl missiles_process_charge() { v7 = &v5->Anims[5]; } - missile[v2]._miAnimData = v7->Frames[v3]; + missile[v2]._miAnimData = (int)v7->Frames[v3]; } } } diff --git a/Source/monster.cpp b/Source/monster.cpp index ec4495458..291f89908 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -311,7 +311,7 @@ int rnd20[4] = { 20, 30, 40, 50 }; int rnd60[4] = { 60, 70, 80, 90 }; // -void (__fastcall *AiProc[])(int i) = +void(__fastcall *AiProc[])(int i) = { &MAI_Zombie, &MAI_Fat, @@ -357,52 +357,32 @@ struct monster_cpp_init // 47F130: using guessed type int monster_inf; // 64CCE4: using guessed type int monster_cpp_init_value; -void __fastcall InitMonsterTRN(int monst, int special) +void __fastcall InitMonsterTRN(int monst, BOOL special) { - signed int i; // ecx - char *v5; // eax - int v6; // ebp - unsigned char v7; // al - int v8; // edi - AnimStruct *v9; // ebx - signed int v10; // [esp+8h] [ebp-8h] - int v11; // [esp+Ch] [ebp-4h] + unsigned char *trans_file = Monsters[monst].trans_file; - i = 256; - v5 = (char *)Monsters[monst].trans_file; - do + for (int i = 0; i < 256; ++i ) { - if ( *v5 == -1 ) - *v5 = 0; - ++v5; - --i; + if ( *trans_file == 255 ) + { + *trans_file = 0; + } + + ++trans_file; } - while ( i ); - v6 = 0; - v11 = (special != 0) + 5; - if ( v11 > 0 ) + + for (int anim_index = 0; anim_index < (special ? 6 : 5); ++anim_index ) { - do + if ( anim_index != 1 || Monsters[monst].mtype < MT_COUNSLR || Monsters[monst].mtype > MT_ADVOCATE ) { - if ( v6 != 1 || (v7 = Monsters[monst].mtype, v7 < MT_COUNSLR) || v7 > MT_ADVOCATE ) + for (int i = 0; i < 8; ++i ) { - v10 = 8; - v8 = 44 * v6 + monst * 328; - v9 = (AnimStruct *)((char *)Monsters[0].Anims + v8 + 4); - do - { - Cl2ApplyTrans( - (char *)v9->CMem, - (char *)Monsters[monst].trans_file, - *(int *)((char *)&Monsters[0].Anims[0].Rate + v8)); - v9 = (AnimStruct *)((char *)v9 + 4); - --v10; - } - while ( v10 ); + Cl2ApplyTrans( + Monsters[monst].Anims[anim_index].Frames[i], + Monsters[monst].trans_file, + Monsters[monst].Anims[anim_index].Rate); } - ++v6; } - while ( v6 < v11 ); } } @@ -414,14 +394,14 @@ void __cdecl InitLevelMonsters() monstimgtot = 0; MissileFileFlag = 0; - for(i = 0; i < 16; i++) + for ( i = 0; i < 16; i++ ) Monsters[i].mPlaceFlags = 0; ClrAllMonsters(); nummonsters = 0; totalmonsters = MAXMONSTERS; - for(i = 0; i < MAXMONSTERS; i++) + for ( i = 0; i < 200; i++ ) monstactive[i] = i; uniquetrans = 0; @@ -438,7 +418,7 @@ int __fastcall AddMonsterType(int type, int placeflag) done = 0; - for(i = 0; i < nummtypes; i++) + for ( i = 0; i < nummtypes; i++ ) { if ( done ) break; @@ -526,8 +506,8 @@ void __cdecl GetLevelMTypes() /* note-decompile this function again and check */ if ( IsSkel(v7) ) { if ( currlevel >= 15 * (char)*(v6 - 1) / 30 + 1 - && currlevel <= 15 * (char)*v6 / 30 + 1 - && MonstAvailTbl[v7] & 3 ) + && currlevel <= 15 * (char)*v6 / 30 + 1 + && MonstAvailTbl[v7] & 3 ) { skeltypes[max++] = v7; } @@ -553,7 +533,7 @@ void __cdecl GetLevelMTypes() /* note-decompile this function again and check */ while ( (signed int)v13 < (signed int)&monsterdata[111].mMaxDLvl ); if ( monstdebug ) { - for (i = 0; i < debugmonsttypes; i++) + for ( i = 0; i < debugmonsttypes; i++ ) AddMonsterType(DebugMonsters[i], 1); } else @@ -643,9 +623,9 @@ void __fastcall InitMonsterGFX(int monst) v2 = (unsigned char)Monsters[monst].mtype; v31 = v2; v3 = v2 << 7; - v4 = Monsters[monst].Anims[0].Frames; + v4 = (int *)Monsters[monst].Anims[0].Frames; v5 = (int *)((char *)monsterdata[0].Frames + v3); - v30 = Monsters[monst].Anims[0].Frames; + v30 = (int *)Monsters[monst].Anims[0].Frames; v28 = (int *)((char *)monsterdata[0].Frames + v3); do { @@ -697,7 +677,7 @@ void __fastcall InitMonsterGFX(int monst) Monsters[v1].mAFNum = *(&monsterdata[0].mAFNum + v3); if ( !v13 ) { - v15 = &Monsters[v1].trans_file; + v15 = (void **)&Monsters[v1].trans_file; v16 = LoadFileInMem(*(char **)((char *)&monsterdata[0].TransFile + v3), 0); v17 = *(int *)((char *)&monsterdata[0].has_special + v3); v18 = mon_id; @@ -821,7 +801,7 @@ void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) monster[v6].mName = v9; monster[v6].MType = monst; monster[v6].MData = v8; - monster[v6]._mAFNum = monst->Anims[0].Frames[rd]; + monster[v6]._mAFNum = (int)monst->Anims[0].Frames[rd]; v10 = monst->Anims[0].Delay; monster[v6]._mAnimDelay = v10; monster[v6]._mAnimCnt = random(88, v10 - 1); @@ -876,7 +856,7 @@ void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) monster[v6]._mFlags = v21; if ( monster[v6]._mAi == AI_GARG ) { - v22 = monst->Anims[5].Frames[v5]; + v22 = (int)monst->Anims[5].Frames[v5]; monster[v6]._mFlags |= 4u; monster[v6]._mAFNum = v22; monster[v6]._mAnimFrame = 1; @@ -926,7 +906,7 @@ void __cdecl ClrAllMonsters() int i; // edi int v6; // eax - for(i = 0; i < MAXMONSTERS; i++) + for ( i = 0; i < 200; i++ ) { ClearMVars(i); monster[i].mName = "Invalid Monster"; @@ -961,11 +941,11 @@ void __cdecl ClrAllMonsters() bool __fastcall MonstPlace(int xp, int yp) { if ( xp < 0 || xp >= 112 - || yp < 0 || yp >= 112 - || dMonster[xp][yp] - || dPlayer[xp][yp] - || dFlags[xp][yp] & 2 - || dFlags[xp][yp] & 8 ) + || yp < 0 || yp >= 112 + || dMonster[xp][yp] + || dPlayer[xp][yp] + || dFlags[xp][yp] & 2 + || dFlags[xp][yp] & 8 ) { return 0; } @@ -994,8 +974,8 @@ void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesi int i; // edx int v13; // edx BOOL v14; // edx - int (*v15)[112]; // ecx - int (*v16)[112]; // eax + int(*v15)[112]; // ecx + int(*v16)[112]; // eax int v17; // edi char v18; // al char *v19; // eax @@ -1184,7 +1164,7 @@ void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesi ++v16; } while ( v8 < 112 ); - v15 = (int (*)[112])((char *)v15 + 4); + v15 = (int(*)[112])((char *)v15 + 4); ++v10; } while ( (signed int)v15 < (signed int)dPiece[1] ); @@ -1234,7 +1214,7 @@ void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesi v3->mtalkmsg = 0; if ( v29 != AI_LAZURUS || quests[15]._qvar1 <= 3u ) { -LABEL_83: + LABEL_83: if ( v3->mtalkmsg ) _LOBYTE(v3->_mgoal) = 6; } @@ -1466,9 +1446,9 @@ void __fastcall PlaceGroup(int mtype, int num, unsigned char leaderf, int leader if ( i >= 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 */ + || (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 */ { ++i; } @@ -1493,7 +1473,7 @@ void __fastcall PlaceGroup(int mtype, int num, unsigned char leaderf, int leader if ( monster[v18]._mAi != AI_GARG ) { v21 = nummonsters; - v22 = monster[v18].MType->Anims[0].Frames[monster[v18]._mdir]; + 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; @@ -1717,7 +1697,7 @@ void __cdecl PlaceUniques() v2 = UniqMonst; while ( UniqMonst[v1].mlevel != currlevel ) { -LABEL_25: + LABEL_25: v1 = ++v0; v2 = &UniqMonst[v0]; if ( v2->mtype == -1 ) @@ -1760,7 +1740,7 @@ LABEL_25: } if ( v0 != 7 ) { -LABEL_20: + LABEL_20: if ( v0 == 8 && !quests[11]._qactive ) v3 = 0; goto LABEL_23; @@ -1770,7 +1750,7 @@ LABEL_20: v3 = 0; goto LABEL_20; } -LABEL_23: + LABEL_23: if ( v3 ) PlaceUniqueMonst(v0, v7, 8); goto LABEL_25; @@ -1825,7 +1805,7 @@ void __fastcall SetMapMonsters(unsigned char *pMap, int startx, int starty) { if ( *(_WORD *)v8 ) { - v10 = AddMonsterType(MonstConvTbl[*(unsigned short *)v8-1], 2); /* fix */ + v10 = AddMonsterType(MonstConvTbl[*(unsigned short *)v8 - 1], 2); /* fix */ v11 = nummonsters++; PlaceMonster(v11, v10, i + v12 + 16, startya); } @@ -1875,7 +1855,7 @@ void __fastcall NewMonsterAnim(int i, AnimStruct *anim, int md) int v5; // edx v3 = &monster[i]; - v3->_mAFNum = anim->Frames[md]; + v3->_mAFNum = (int)anim->Frames[md]; v4 = anim->Rate; v3->_mAnimCnt = 0; v3->_mAnimLen = v4; @@ -1971,10 +1951,10 @@ void __fastcall M_Enemy(int i) } if ( v7 < v23 ) goto LABEL_17; -LABEL_16: + LABEL_16: if ( v24 == -1 ) { -LABEL_17: + LABEL_17: v1->_mFlags &= 0xFFFFFFEF; v24 = v21; v27 = *((_BYTE *)v2 + 12); @@ -1982,7 +1962,7 @@ LABEL_17: v23 = v7; v25 = v19; } -LABEL_18: + LABEL_18: ++v21; v2 += 5430; } @@ -2001,8 +1981,8 @@ LABEL_18: if ( M_Talker(v9) && monster[v10].mtalkmsg ) continue; if ( !(v1->_mFlags & 0x20) - && ((abs(monster[v10]._mx - v1->_mx) >= 2 || abs(monster[v10]._my - v1->_my) >= 2) && !M_Ranged(v18) /* v11 */ - || !(v1->_mFlags & 0x20) && !(monster[v10]._mFlags & 0x20)) ) + && ((abs(monster[v10]._mx - v1->_mx) >= 2 || abs(monster[v10]._my - v1->_my) >= 2) && !M_Ranged(v18) /* v11 */ + || !(v1->_mFlags & 0x20) && !(monster[v10]._mFlags & 0x20)) ) { continue; } @@ -2026,10 +2006,10 @@ LABEL_18: } if ( v16 < v23 ) goto LABEL_40; -LABEL_39: + LABEL_39: if ( v24 == -1 ) { -LABEL_40: + LABEL_40: v1->_mFlags |= 0x10u; v24 = v17; v27 = monster[v10]._mfutx; @@ -2055,10 +2035,10 @@ LABEL_40: int __fastcall M_GetDir(int i) { return GetDirection( - monster[i]._mx, - monster[i]._my, - (unsigned char)monster[i]._menemyx, - (unsigned char)monster[i]._menemyy); + monster[i]._mx, + monster[i]._my, + (unsigned char)monster[i]._menemyx, + (unsigned char)monster[i]._menemyy); } void __fastcall M_CheckEFlag(int i) @@ -2080,8 +2060,8 @@ void __fastcall M_CheckEFlag(int i) if ( v2 | dArch[monster[v1]._mx - 1][monster[v1]._my + 1] ) monster[v1]._meflag = 1; else -LABEL_9: - monster[v1]._meflag = 0; + LABEL_9: + monster[v1]._meflag = 0; } void __fastcall M_StartStand(int i, int md) @@ -3000,7 +2980,7 @@ void __fastcall M_StartHeal(int i) if ( !monster[v1].MType ) TermMsg("M_StartHeal: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); v3 = monster[v2].MType; - v4 = v3->Anims[5].Frames[monster[v2]._mdir]; + v4 = (int)v3->Anims[5].Frames[monster[v2]._mdir]; monster[v2]._mAFNum = v4; v5 = v3->Anims[5].Rate; monster[v2]._mFlags |= 2u; @@ -3069,9 +3049,9 @@ int __fastcall M_DoStand(int i) v3 = monster[v2].MType; v4 = monster[v2]._mdir; if ( v3->mtype == MT_GOLEM ) - v5 = v3->Anims[1].Frames[v4]; + v5 = (int)v3->Anims[1].Frames[v4]; else - v5 = v3->Anims[0].Frames[v4]; + v5 = (int)v3->Anims[0].Frames[v4]; monster[v2]._mAFNum = v5; if ( monster[v2]._mAnimFrame == monster[v2]._mAnimLen ) M_Enemy(v1); @@ -3272,7 +3252,7 @@ void __fastcall M_TryM2MHit(int i, int mid, int hper, int mind, int maxd) if ( !monster[v5].MType ) TermMsg("M_TryM2MHit: Monster %d \"%s\" MType NULL", v5, monster[v7].mName); if ( (signed int)(monster[v7]._mhitpoints & 0xFFFFFFC0) > 0 - && (monster[v7].MType->mtype != MT_ILLWEAV || _LOBYTE(monster[v7]._mgoal) != 2) ) + && (monster[v7].MType->mtype != MT_ILLWEAV || _LOBYTE(monster[v7]._mgoal) != 2) ) { v8 = random(4, 100); if ( monster[v7]._mmode == MM_STONE ) @@ -3296,7 +3276,7 @@ void __fastcall M_TryM2MHit(int i, int mid, int hper, int mind, int maxd) if ( monster[v7]._mmode == MM_STONE ) { M2MStartKill(*(int *)v13, *(int *)arglist); -LABEL_15: + LABEL_15: monster[v7]._mmode = MM_STONE; return; } @@ -3385,7 +3365,7 @@ void __fastcall M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam) } if ( currlevel != 15 ) { -LABEL_20: + LABEL_20: if ( currlevel == 16 && v13 < 30 ) v13 = 30; goto LABEL_23; @@ -3395,7 +3375,7 @@ LABEL_20: v13 = 25; goto LABEL_20; } -LABEL_23: + LABEL_23: v14 = plr[v7]._pmode; if ( v14 && v14 != 4 || !plr[v7]._pBlockFlag ) { @@ -3406,9 +3386,9 @@ LABEL_23: v15 = random(98, 100); } v16 = (int *)(plr[v7]._pDexterity - + plr[v7]._pBaseToBlk - - 2 * SLOBYTE(monster[v6].mLevel) - + 2 * plr[v7]._pLevel); + + plr[v7]._pBaseToBlk + - 2 * SLOBYTE(monster[v6].mLevel) + + 2 * plr[v7]._pLevel); if ( (signed int)v16 < 0 ) v16 = 0; if ( (signed int)v16 > 100 ) @@ -3745,7 +3725,7 @@ int __fastcall M_DoFadein(int i) TermMsg("M_DoFadein: Invalid monster %d", i); v2 = v1; if ( (!(monster[v1]._mFlags & 2) || monster[v2]._mAnimFrame != 1) - && (monster[v1]._mFlags & 2 || monster[v2]._mAnimFrame != monster[v2]._mAnimLen) ) + && (monster[v1]._mFlags & 2 || monster[v2]._mAnimFrame != monster[v2]._mAnimLen) ) { return 0; } @@ -3769,7 +3749,7 @@ int __fastcall M_DoFadeout(int i) v2 = v1; v3 = monster[v1]._mFlags; if ( (!(monster[v1]._mFlags & 2) || monster[v2]._mAnimFrame != 1) - && (monster[v1]._mFlags & 2 || monster[v2]._mAnimFrame != monster[v2]._mAnimLen) ) + && (monster[v1]._mFlags & 2 || monster[v2]._mAnimFrame != monster[v2]._mAnimLen) ) { return 0; } @@ -3862,8 +3842,8 @@ int __fastcall M_DoTalk(int i) } } if ( monster[v2].mName == UniqMonst[2].mName - && monster[v2].mtalkmsg == QUEST_ZHAR1 - && !(monster[v2]._mFlags & 0x40) ) + && monster[v2].mtalkmsg == QUEST_ZHAR1 + && !(monster[v2]._mFlags & 0x40) ) { v5 = monster[v2]._my + 1; v6 = monster[v2]._mx + 1; @@ -4225,7 +4205,7 @@ int __fastcall M_DoDelay(int i) TermMsg("M_DoDelay: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); v3 = M_GetDir(v1); v4 = monster[v2]._mAi == AI_LAZURUS; - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v3]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v3]; if ( v4 ) { v5 = monster[v2]._mVar2; @@ -4287,56 +4267,56 @@ void __fastcall M_WalkDir(int i, int md) v4 = monster[v2].MType->Anims[1].Rate - 1; switch ( v3 ) { - case DIR_S: - M_StartWalk2(v2, 0, MWVel[v4][1], 0, -32, 1, 1, 0); - return; - case DIR_SW: - v17 = 1; - v8 = v4; - v15 = 1; - v13 = 0; - v11 = 32; - v9 = -MWVel[v8][1]; - goto LABEL_10; - case DIR_W: - M_StartWalk3(v2, -MWVel[v4][2], 0, 32, -16, -1, 1, 0, 1, 2); - return; - case DIR_NW: - v16 = 3; - v10 = v4; - v14 = 0; - v12 = -1; - v7 = -MWVel[v10][0]; - v6 = -MWVel[v10][1]; - goto LABEL_15; - case DIR_N: - M_StartWalk(v2, 0, -MWVel[v4][1], -1, -1, 4); - break; - case DIR_NE: - v16 = 5; - v5 = v4; - v14 = -1; - v12 = 0; - v6 = MWVel[v5][1]; - v7 = -MWVel[v5][0]; -LABEL_15: - M_StartWalk(v2, v6, v7, v12, v14, v16); - break; - case DIR_E: - M_StartWalk3(v2, MWVel[v4][2], 0, -32, -16, 1, -1, 1, 0, 6); - break; - case DIR_SE: - v17 = 7; - v8 = v4; - v15 = 0; - v13 = 1; - v9 = MWVel[v8][1]; - v11 = -32; -LABEL_10: - M_StartWalk2(v2, v9, MWVel[v8][0], v11, -16, v13, v15, v17); - break; - default: - return; + case DIR_S: + M_StartWalk2(v2, 0, MWVel[v4][1], 0, -32, 1, 1, 0); + return; + case DIR_SW: + v17 = 1; + v8 = v4; + v15 = 1; + v13 = 0; + v11 = 32; + v9 = -MWVel[v8][1]; + goto LABEL_10; + case DIR_W: + M_StartWalk3(v2, -MWVel[v4][2], 0, 32, -16, -1, 1, 0, 1, 2); + return; + case DIR_NW: + v16 = 3; + v10 = v4; + v14 = 0; + v12 = -1; + v7 = -MWVel[v10][0]; + v6 = -MWVel[v10][1]; + goto LABEL_15; + case DIR_N: + M_StartWalk(v2, 0, -MWVel[v4][1], -1, -1, 4); + break; + case DIR_NE: + v16 = 5; + v5 = v4; + v14 = -1; + v12 = 0; + v6 = MWVel[v5][1]; + v7 = -MWVel[v5][0]; + LABEL_15: + M_StartWalk(v2, v6, v7, v12, v14, v16); + break; + case DIR_E: + M_StartWalk3(v2, MWVel[v4][2], 0, -32, -16, 1, -1, 1, 0, 6); + break; + case DIR_SE: + v17 = 7; + v8 = v4; + v15 = 0; + v13 = 1; + v9 = MWVel[v8][1]; + v11 = -32; + LABEL_10: + M_StartWalk2(v2, v9, MWVel[v8][0], v11, -16, v13, v15, v17); + break; + default: + return; } } @@ -4365,16 +4345,16 @@ void __fastcall GroupUnity(int i) v3 = (unsigned char)monster[v2].leader; v4 = v3; v5 = LineClearF( - CheckNoSolid, - monster[v2]._mx, - monster[v2]._my, - monster[v4]._mfutx, - monster[v4]._mfuty); + CheckNoSolid, + monster[v2]._mx, + monster[v2]._my, + monster[v4]._mfutx, + monster[v4]._mfuty); if ( v5 ) { if ( monster[v2].leaderflag == 2 - && abs(monster[v2]._mx - monster[v4]._mfutx) < 4 - && abs(monster[v2]._my - monster[v4]._mfuty) < 4 ) + && abs(monster[v2]._mx - monster[v4]._mfutx) < 4 + && abs(monster[v2]._my - monster[v4]._mfuty) < 4 ) { ++monster[v4].unpackfilesize; monster[v2].leaderflag = 1; @@ -4416,7 +4396,7 @@ LABEL_18: v8 = monster[v2]._uniqtype; if ( v8 ) { - if ( UniqMonst[v8-1].mUnqAttr & 2 ) + if ( UniqMonst[v8 - 1].mUnqAttr & 2 ) { v9 = nummonsters; for ( j = 0; j < v9; ++j ) @@ -4522,7 +4502,7 @@ LABEL_11: //_LOBYTE(v17) = DirOK(v3, v2); if ( DirOK(v3, v2) ) { -LABEL_20: + LABEL_20: v18 = 1; M_WalkDir(v3, v2); return v18; @@ -4533,7 +4513,7 @@ LABEL_20: bool __fastcall M_PathWalk(int i) { int v1; // esi - BOOL (__fastcall *Check)(int, int, int); // ecx + BOOL(__fastcall *Check)(int, int, int); // ecx char path[25]; // [esp+4h] [ebp-1Ch] v1 = i; @@ -4543,13 +4523,13 @@ bool __fastcall M_PathWalk(int i) if ( !(monster[v1]._mFlags & 0x200) ) Check = PosOkMonst; if ( !FindPath( - Check, - v1, - monster[v1]._mx, - monster[v1]._my, - (unsigned char)monster[v1]._menemyx, - (unsigned char)monster[v1]._menemyy, - path) ) + Check, + v1, + monster[v1]._mx, + monster[v1]._my, + (unsigned char)monster[v1]._menemyx, + (unsigned char)monster[v1]._menemyy, + path) ) return 0; M_CallWalk(v1, (char)plr2monst[path[0]]); /* plr2monst is local */ return 1; @@ -4597,7 +4577,7 @@ bool __fastcall M_CallWalk2(int i, int md) //_LOBYTE(v11) = DirOK(v3, v2); if ( DirOK(v3, v2) ) { -LABEL_10: + LABEL_10: v12 = 1; M_WalkDir(v3, v2); return v12; @@ -4658,7 +4638,7 @@ bool __fastcall M_RoundWalk(int i, int md, int *dir) if ( DirOK(v4, left[*v11]) ) goto LABEL_11; v3 = dir; -LABEL_14: + LABEL_14: *v3 = *v3 == 0; return M_CallWalk(v4, opposite[v8]); } @@ -4741,7 +4721,7 @@ void __fastcall MAI_Zombie(int i) M_StartAttack(arglist); } if ( v3->_mmode == MM_STAND ) - v3->_mAFNum = v3->MType->Anims[0].Frames[v3->_mdir]; + v3->_mAFNum = (int)v3->MType->Anims[0].Frames[v3->_mdir]; } } } @@ -4811,9 +4791,9 @@ LABEL_10: } M_StartAttack(arglist); } -LABEL_16: + LABEL_16: if ( v2->_mmode == MM_STAND ) - v2->_mAFNum = v2->MType->Anims[0].Frames[v7]; + v2->_mAFNum = (int)v2->MType->Anims[0].Frames[v7]; } } @@ -4842,12 +4822,12 @@ bool __fastcall MAI_Path(int i) return 0; } v4 = LineClearF1( - PosOkMonst2, - v1, - v2->_mx, - v2->_my, - (unsigned char)v2->_menemyx, - (unsigned char)v2->_menemyy); + PosOkMonst2, + v1, + v2->_mx, + v2->_my, + (unsigned char)v2->_menemyx, + (unsigned char)v2->_menemyy); if ( !v4 || (v5 = v2->_pathcount, v5 >= 5u) && v5 < 8u ) { if ( v2->_mFlags & 0x200 ) @@ -4941,14 +4921,14 @@ void __fastcall MAI_Snake(int i) || (v15 = random(105, 100), v16 = (unsigned char)esi3->_mint + 20, v15 < v16) ) { M_StartAttack(arglist); -LABEL_49: + LABEL_49: if ( esi3->_mmode == MM_STAND ) - esi3->_mAFNum = esi3->MType->Anims[0].Frames[esi3->_mdir]; + esi3->_mAFNum = (int)esi3->MType->Anims[0].Frames[esi3->_mdir]; return; } v17 = 10 - (unsigned char)esi3->_mint + random(105, 10); v18 = arglist; -LABEL_11: + LABEL_11: M_StartDelay(v18, v17); goto LABEL_49; } @@ -5013,7 +4993,7 @@ LABEL_11: } if ( v33 <= 0 ) { -LABEL_47: + LABEL_47: if ( !M_DumbWalk(v24, esi3->_mgoalvar2) ) M_CallWalk2(v24, esi3->_mdir); goto LABEL_49; @@ -5043,7 +5023,7 @@ LABEL_47: if ( v32 + 1 < 0 ) { v35 = v32 + 9; -LABEL_46: + LABEL_46: esi3->_mgoalvar2 = v35; goto LABEL_47; } @@ -5120,16 +5100,16 @@ void __fastcall MAI_Bat(int i) v1 = (unsigned char)esi3->_menemyx; v2 = (unsigned char)esi3->_menemyy; if ( esi3->MType->mtype == MT_GLOOM - && (abs(v5) >= 5 || abs(v6) >= 5) - && v22 < 4 * (unsigned char)esi3->_mint + 33 - && (v11 = LineClearF1( - PosOkMonst, - arglist, - esi3->_mx, - esi3->_my, - v1, - v2), - v11) ) + && (abs(v5) >= 5 || abs(v6) >= 5) + && v22 < 4 * (unsigned char)esi3->_mint + 33 + && (v11 = LineClearF1( + PosOkMonst, + arglist, + esi3->_mx, + esi3->_my, + v1, + v2), + v11) ) { if ( AddMissile(esi3->_mx, esi3->_my, v1, v2, midir, 20, micaster, arglist, 0, 0) != -1 ) { @@ -5142,9 +5122,9 @@ void __fastcall MAI_Bat(int i) { v17 = esi3->_mVar2; if ( v17 > 20 && v22 < (unsigned char)esi3->_mint + 13 - || ((v18 = esi3->_mVar1, v18 == 1) || v18 == 2 || v18 == 3) - && !v17 - && v22 < (unsigned char)esi3->_mint + 63 ) + || ((v18 = esi3->_mVar1, v18 == 1) || v18 == 2 || v18 == 3) + && !v17 + && v22 < (unsigned char)esi3->_mint + 63 ) { M_CallWalk(arglist, midir); } @@ -5163,7 +5143,7 @@ void __fastcall MAI_Bat(int i) } } if ( esi3->_mmode == MM_STAND ) - esi3->_mAFNum = esi3->MType->Anims[0].Frames[midir]; + esi3->_mAFNum = (int)esi3->MType->Anims[0].Frames[midir]; } } } @@ -5213,9 +5193,9 @@ void __fastcall MAI_SkelBow(int i) if ( v10 < 4 ) { if ( (v9 = v2->_mVar2, v9 > 20) && v19 < 2 * (unsigned char)v2->_mint + 13 - || ((v12 = v2->_mVar1, v12 == 1) || v12 == 2 || v12 == 3) - && !v9 - && v19 < 2 * (unsigned char)v2->_mint + 63 ) + || ((v12 = v2->_mVar1, v12 == 1) || v12 == 2 || v12 == 3) + && !v9 + && v19 < 2 * (unsigned char)v2->_mint + 63 ) { //_LOBYTE(v13) = M_DumbWalk(arglist, opposite[v17]); v18 = M_DumbWalk(arglist, opposite[v17]); @@ -5234,7 +5214,7 @@ void __fastcall MAI_SkelBow(int i) } } if ( v2->_mmode == MM_STAND ) - v2->_mAFNum = v2->MType->Anims[0].Frames[v17]; + v2->_mAFNum = (int)v2->MType->Anims[0].Frames[v17]; } } @@ -5269,7 +5249,7 @@ void __fastcall MAI_Fat(int i) { v8 = v2->_mVar2; if ( v8 > 20 && v12 < 4 * (unsigned char)v2->_mint + 20 - || ((v9 = v2->_mVar1, v9 == 1) || v9 == 2 || v9 == 3) && !v8 && v12 < 4 * (unsigned char)v2->_mint + 70 ) + || ((v9 = v2->_mVar1, v9 == 1) || v9 == 2 || v9 == 3) && !v8 && v12 < 4 * (unsigned char)v2->_mint + 70 ) { M_CallWalk(arglist, md); } @@ -5288,7 +5268,7 @@ void __fastcall MAI_Fat(int i) } } if ( v2->_mmode == MM_STAND ) - v2->_mAFNum = v2->MType->Anims[0].Frames[md]; + v2->_mAFNum = (int)v2->MType->Anims[0].Frames[md]; } } @@ -5367,11 +5347,11 @@ void __fastcall MAI_Sneak(int i) if ( abs(v17) < v12 && abs(v4) < v12 || v2->_mFlags & 1 ) { if ( _LOBYTE(v2->_mgoal) == 2 - || (abs(v17) >= 2 || abs(v4) >= 2) - && ((v13 = v2->_mVar2, v13 > 20) && v15 < 4 * (unsigned char)v2->_mint + 14 - || ((v14 = v2->_mVar1, v14 == 1) || v14 == 2 || v14 == 3) - && !v13 - && v15 < 4 * (unsigned char)v2->_mint + 64) ) + || (abs(v17) >= 2 || abs(v4) >= 2) + && ((v13 = v2->_mVar2, v13 > 20) && v15 < 4 * (unsigned char)v2->_mint + 14 + || ((v14 = v2->_mVar1, v14 == 1) || v14 == 2 || v14 == 3) + && !v13 + && v15 < 4 * (unsigned char)v2->_mint + 64) ) { ++v2->_mgoalvar1; M_CallWalk(arglist, md); @@ -5385,7 +5365,7 @@ void __fastcall MAI_Sneak(int i) if ( v2->_mmode == MM_STAND ) { if ( abs(v17) >= 2 || abs(v4) >= 2 || v15 >= 4 * (unsigned char)v2->_mint + 10 ) - v2->_mAFNum = v2->MType->Anims[0].Frames[md]; + v2->_mAFNum = (int)v2->MType->Anims[0].Frames[md]; else M_StartAttack(arglist); } @@ -5436,21 +5416,28 @@ void __fastcall MAI_Fireman(int i) midir = v7; switch ( v9 ) { - case 1: - //_LOBYTE(v10) = LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2); - if ( !LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2) - || AddMissile(monster[esi3]._mx, monster[esi3]._my, v1, v2, midir, 50, micaster, arglist, 0, 0) == -1 ) - { - break; - } - monster[esi3]._mgoalvar1 = 0; - monster[esi3]._mmode = MM_CHARGE; - goto LABEL_18; - case 5: - if ( monster[esi3]._mgoalvar1 == 3 ) + case 1: + //_LOBYTE(v10) = LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2); + if ( !LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2) + || AddMissile(monster[esi3]._mx, monster[esi3]._my, v1, v2, midir, 50, micaster, arglist, 0, 0) == -1 ) + { + break; + } + monster[esi3]._mgoalvar1 = 0; + monster[esi3]._mmode = MM_CHARGE; + goto LABEL_18; + case 5: + if ( monster[esi3]._mgoalvar1 == 3 ) + { + _LOBYTE(monster[esi3]._mgoal) = 1; + M_StartFadeout(arglist, v7, 1u); + } + else + { + //_LOBYTE(v11) = LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2); + if ( LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2) ) { - _LOBYTE(monster[esi3]._mgoal) = 1; - M_StartFadeout(arglist, v7, 1u); + M_StartRAttack(arglist, 51, 4); } else { @@ -5466,12 +5453,14 @@ void __fastcall MAI_Fireman(int i) } ++monster[esi3]._mgoalvar1; } - break; - case 2: - M_StartFadein(arglist, v7, 0); -LABEL_18: - _LOBYTE(monster[esi3]._mgoal) = 5; - break; + ++monster[esi3]._mgoalvar1; + } + break; + case 2: + M_StartFadein(arglist, v7, 0); + LABEL_18: + _LOBYTE(monster[esi3]._mgoal) = 5; + break; } monster[esi3]._mdir = midir; random(112, 100); @@ -5499,7 +5488,7 @@ LABEL_18: if ( (_BYTE)v17 == 1 || (_BYTE)v17 == 2 ) { v15 = midir; -LABEL_29: + LABEL_29: M_StartFadein(arglist, v15, 0); _LOBYTE(monster[esi3]._mgoal) = 5; return; @@ -5646,7 +5635,7 @@ void __fastcall MAI_Cleaver(int i) else M_StartAttack(arglist); if ( v2->_mmode == MM_STAND ) - v2->_mAFNum = v2->MType->Anims[0].Frames[v7]; + v2->_mAFNum = (int)v2->MType->Anims[0].Frames[v7]; } } @@ -5746,16 +5735,16 @@ void __fastcall MAI_Round(int i, unsigned char special) } } _LOBYTE(v3->_mgoal) = 1; -LABEL_26: + LABEL_26: if ( _LOBYTE(v3->_mgoal) == 1 ) { if ( abs(v7) >= 2 || (v22 = abs(v32), v22 >= 2) ) /* v24 = v23, */ { v25 = v3->_mVar2; if ( v25 > 20 && v30 < 2 * (unsigned char)v3->_mint + 28 - || ((v26 = v3->_mVar1, v26 == 1) || v26 == 2 || v26 == 3) - && !v25 - && v30 < 2 * (unsigned char)v3->_mint + 78 ) + || ((v26 = v3->_mVar1, v26 == 1) || v26 == 2 || v26 == 3) + && !v25 + && v30 < 2 * (unsigned char)v3->_mint + 78 ) { M_CallWalk(arglist, md); } @@ -5770,7 +5759,7 @@ LABEL_26: } } if ( v3->_mmode == MM_STAND ) - v3->_mAFNum = v3->MType->Anims[0].Frames[md]; + v3->_mAFNum = (int)v3->MType->Anims[0].Frames[md]; } } @@ -5847,7 +5836,7 @@ void __fastcall MAI_Ranged(int i, int missile_type, unsigned char special) } else { - monster[v4]._mAFNum = monster[v4].MType->Anims[0].Frames[v20]; + monster[v4]._mAFNum = (int)monster[v4].MType->Anims[0].Frames[v20]; } } } @@ -5920,12 +5909,12 @@ void __fastcall MAI_Scav(int i) } if ( _LOBYTE(monster[v2]._mgoal) != 3 ) { -LABEL_52: + LABEL_52: if ( monster[v2]._mmode == MM_STAND ) MAI_SkelSd(arglist); return; } -LABEL_10: + LABEL_10: v4 = monster[v2]._mgoalvar3; if ( v4 ) { @@ -5965,13 +5954,13 @@ LABEL_10: v8 = monster[v2]._mx; v9 = monster[v2]._my; v20 = dDead[v8 + v6][v9 + v7] - && (v10 = LineClearF( - CheckNoSolid, - v8, - v9, - v8 + v6, - v9 + v7), - v10); + && (v10 = LineClearF( + CheckNoSolid, + v8, + v9, + v8 + v6, + v9 + v7), + v10); } ++v6; } @@ -5999,13 +5988,13 @@ LABEL_10: v14 = monster[v2]._mx; v15 = monster[v2]._my; v20 = dDead[v14 + v6][v15 + v13] - && (v16 = LineClearF( - CheckNoSolid, - v14, - v15, - v14 + v6, - v15 + v13), - v16); + && (v16 = LineClearF( + CheckNoSolid, + v14, + v15, + v14 + v6, + v15 + v13), + v16); } --v6; } @@ -6059,7 +6048,7 @@ void __fastcall MAI_Garg(int i) M_Enemy(v1); v6 = v2->_my - (unsigned char)v2->_menemyy; if ( abs(v2->_mx - (unsigned char)v2->_menemyx) < (unsigned char)v2->_mint + 2 - && abs(v6) < (unsigned char)v2->_mint + 2 ) + && abs(v6) < (unsigned char)v2->_mint + 2 ) { v2->_mFlags &= 0xFFFFFFFB; } @@ -6188,11 +6177,11 @@ void __fastcall MAI_RoundRanged(int i, int missile_type, unsigned char checkdoor v6->_mgoalvar1 = v21 + 1; if ( v21 >= 2 * v20 && (v22 = DirOK(arglist, md), v22) ) { -LABEL_50: + LABEL_50: _LOBYTE(v6->_mgoal) = 1; } else if ( checkdoorsa < 500 * ((unsigned char)v6->_mint + 1) >> lessmissiles - && (v23 = LineClear(v6->_mx, v6->_my, x2, y2), v23) ) + && (v23 = LineClear(v6->_mx, v6->_my, x2, y2), v23) ) { M_StartRSpAttack(arglist, missile_typea, dam); } @@ -6200,12 +6189,12 @@ LABEL_50: { M_RoundWalk(arglist, md, &v6->_mgoalvar2); } -LABEL_28: + LABEL_28: if ( _LOBYTE(v6->_mgoal) == 1 ) { if ( ((abs(v9) >= 3 || abs(v8) >= 3) && checkdoorsa < 500 * ((unsigned char)v6->_mint + 2) >> lessmissiles - || checkdoorsa < 500 * ((unsigned char)v6->_mint + 1) >> lessmissiles) - && (v24 = LineClear(v6->_mx, v6->_my, x2, y2), v24) ) + || checkdoorsa < 500 * ((unsigned char)v6->_mint + 1) >> lessmissiles) + && (v24 = LineClear(v6->_mx, v6->_my, x2, y2), v24) ) { M_StartRSpAttack(arglist, missile_typea, dam); } @@ -6218,7 +6207,7 @@ LABEL_28: v29 = random(124, 100); v30 = (unsigned char)v6->_mint; if ( v29 < 1000 * (v30 + 5) - || ((v13 = v6->_mVar1, v13 == 1) || v13 == 2 || v13 == 3) && !v6->_mVar2 && v29 < 1000 * (v30 + 8) ) + || ((v13 = v6->_mVar1, v13 == 1) || v13 == 2 || v13 == 3) && !v6->_mVar2 && v29 < 1000 * (v30 + 8) ) { M_CallWalk(arglist, md); } @@ -6366,13 +6355,13 @@ void __fastcall MAI_RR2(int i, int mistype, int dam) { if ( v38 < 5 * ((unsigned char)v4->_mint + 16) ) M_RoundWalk(arglist, md, &v4->_mgoalvar2); -LABEL_26: + LABEL_26: if ( _LOBYTE(v4->_mgoal) != 1 ) goto LABEL_48; if ( ((abs(v8) >= 3 || abs(v7) >= 3) && v38 < 5 * ((unsigned char)v4->_mint + 2) - || v38 < 5 * ((unsigned char)v4->_mint + 1) - || v4->_mgoalvar3 == 4) - && (v22 = LineClear(v4->_mx, v4->_my, x2, y2), v22) ) + || v38 < 5 * ((unsigned char)v4->_mint + 1) + || v4->_mgoalvar3 == 4) + && (v22 = LineClear(v4->_mx, v4->_my, x2, y2), v22) ) { v23 = arglist; } @@ -6385,9 +6374,9 @@ LABEL_26: v31 = random(124, 100); v12 = (unsigned char)v4->_mint; if ( v31 < 2 * (5 * v12 + 25) - || ((v32 = v4->_mVar1, v32 == 1) || v32 == 2 || v32 == 3) - && !v4->_mVar2 - && (v12 = 2 * (5 * v12 + 40), v31 < v12) ) + || ((v32 = v4->_mVar1, v32 == 1) || v32 == 2 || v32 == 3) + && !v4->_mVar2 + && (v12 = 2 * (5 * v12 + 40), v31 < v12) ) { M_CallWalk(arglist, md); } @@ -6397,9 +6386,9 @@ LABEL_26: v12 = 10 * ((unsigned char)v4->_mint + 4); if ( v29 >= v12 ) { -LABEL_47: + LABEL_47: v4->_mgoalvar3 = 1; -LABEL_48: + LABEL_48: if ( v4->_mmode == MM_STAND ) { v33 = random(125, 10); @@ -6652,12 +6641,12 @@ void __fastcall MAI_SkelKing(int i) } } _LOBYTE(v2->_mgoal) = 1; -LABEL_26: + LABEL_26: if ( _LOBYTE(v2->_mgoal) == 1 ) { if ( gbMaxPlayers == 1 - && ((abs(v5) >= 3 || abs(v4) >= 3) && v35 < 4 * (unsigned char)v2->_mint + 35 || v35 < 6) - && (v20 = LineClear(v2->_mx, v2->_my, x2, y2), v20) ) + && ((abs(v5) >= 3 || abs(v4) >= 3) && v35 < 4 * (unsigned char)v2->_mint + 35 || v35 < 6) + && (v20 = LineClear(v2->_mx, v2->_my, x2, y2), v20) ) { v21 = v2->_mx + offset_x[md]; v22 = v2->_my + offset_y[md]; @@ -6676,7 +6665,7 @@ LABEL_26: v28 = random(129, 100); v29 = (unsigned char)v2->_mint; if ( v28 >= v29 + 25 - && ((v30 = v2->_mVar1, v30 != 1) && v30 != 2 && v30 != 3 || v2->_mVar2 || (v29 += 75, v28 >= v29)) ) + && ((v30 = v2->_mVar1, v30 != 1) && v30 != 2 && v30 != 3 || v2->_mVar2 || (v29 += 75, v28 >= v29)) ) { v31 = random(130, 10); M_StartDelay(arglist, v31 + 10); @@ -6694,7 +6683,7 @@ LABEL_26: } } if ( v2->_mmode == MM_STAND ) - v2->_mAFNum = v2->MType->Anims[0].Frames[md]; + v2->_mAFNum = (int)v2->MType->Anims[0].Frames[md]; } } // 679660: using guessed type char gbMaxPlayers; @@ -6796,19 +6785,19 @@ void __fastcall MAI_Rhino(int i) } } _LOBYTE(esi3->_mgoal) = 1; -LABEL_23: + LABEL_23: if ( _LOBYTE(esi3->_mgoal) == 1 ) { if ( (abs(v5) >= 5 || abs(v4) >= 5) - && v30 < 2 * (unsigned char)esi3->_mint + 43 - && (v19 = LineClearF1( - PosOkMonst, - arglist, - esi3->_mx, - esi3->_my, - v1, - v2), - v19) ) + && v30 < 2 * (unsigned char)esi3->_mint + 43 + && (v19 = LineClearF1( + PosOkMonst, + arglist, + esi3->_mx, + esi3->_my, + v1, + v2), + v19) ) { if ( AddMissile(esi3->_mx, esi3->_my, v1, v2, midir, 20, esi3->_menemy, arglist, 0, 0) != -1 ) { @@ -6828,9 +6817,9 @@ LABEL_23: v26 = random(134, 100); v27 = 2 * (unsigned char)esi3->_mint; if ( v26 >= v27 + 33 - && ((v28 = esi3->_mVar1, v28 != 1) && v28 != 2 && v28 != 3 - || esi3->_mVar2 - || (v27 += 83, v26 >= v27)) ) + && ((v28 = esi3->_mVar1, v28 != 1) && v28 != 2 && v28 != 3 + || esi3->_mVar2 + || (v27 += 83, v26 >= v27)) ) { v29 = random(135, 10); M_StartDelay(arglist, v29 + 10); @@ -6848,7 +6837,7 @@ LABEL_23: } } if ( esi3->_mmode == MM_STAND ) - esi3->_mAFNum = esi3->MType->Anims[0].Frames[esi3->_mdir]; + esi3->_mAFNum = (int)esi3->MType->Anims[0].Frames[esi3->_mdir]; } } @@ -6934,13 +6923,13 @@ void __fastcall MAI_Counselor(int i) v17 = abs(v4); v18 = v17; if ( abs(v4) < 2 && abs(v6) < 2 - || monster[v2]._msquelch != -1 - || dung_map[monster[v2]._mx][monster[v2]._my] != dung_map[x2][y2] ) + || monster[v2]._msquelch != -1 + || dung_map[monster[v2]._mx][monster[v2]._my] != dung_map[x2][y2] ) { v1 = arglist; -LABEL_20: + LABEL_20: v15 = v1; -LABEL_21: + LABEL_21: _LOBYTE(monster[v2]._mgoal) = 1; M_StartFadein(v15, md, 1u); goto LABEL_39; @@ -6956,7 +6945,7 @@ LABEL_21: goto LABEL_20; } M_RoundWalk(arglist, md, &monster[v2]._mgoalvar2); -LABEL_39: + LABEL_39: if ( monster[v2]._mmode == MM_STAND ) { v34 = random(125, 10); @@ -7002,7 +6991,7 @@ LABEL_39: if ( v12 ^ v13 ) { _LOBYTE(monster[v2]._mgoal) = 2; -LABEL_29: + LABEL_29: monster[v2]._mgoalvar1 = 0; M_StartFadeout(v1, v27, 0); goto LABEL_39; @@ -7048,9 +7037,9 @@ void __fastcall MAI_Garbud(int i) v8 = M_GetDir(arglist); v5 = monster[v2].mtalkmsg; if ( v5 < (signed int)QUEST_GARBUD4 - && v5 > (signed int)QUEST_DOOM10 - && !(dFlags[v4][v3] & 2) - && _LOBYTE(monster[v2]._mgoal) == 7 ) + && v5 >(signed int)QUEST_DOOM10 + && !(dFlags[v4][v3] & 2) + && _LOBYTE(monster[v2]._mgoal) == 7 ) { _LOBYTE(monster[v2]._mgoal) = 6; monster[v2].mtalkmsg = v5 + 1; @@ -7073,7 +7062,7 @@ void __fastcall MAI_Garbud(int i) MAI_Round(arglist, 1u); monster[v2]._mdir = v8; if ( monster[v2]._mmode == MM_STAND ) - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v8]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v8]; } } @@ -7131,7 +7120,7 @@ void __fastcall MAI_Zhar(int i) MAI_Counselor(arglist); monster[v2]._mdir = v11; if ( monster[v2]._mmode == MM_STAND ) - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v11]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v11]; } } @@ -7190,7 +7179,7 @@ void __fastcall MAI_SnotSpil(int i) } monster[v2]._mdir = v5; if ( monster[v2]._mmode == MM_STAND ) - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v5]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v5]; } } // 5CF330: using guessed type int setpc_h; @@ -7246,7 +7235,7 @@ void __fastcall MAI_Lazurus(int i) } if ( gbMaxPlayers != 1 ) { -LABEL_29: + LABEL_29: if ( monster[v2].mtalkmsg == QUEST_VILE13 && _LOBYTE(monster[v2]._mgoal) == 6 && quests[15]._qvar1 <= 3u ) monster[v2]._mmode = MM_TALK; } @@ -7260,7 +7249,7 @@ LABEL_29: monster[v2]._mdir = v5; v8 = monster[v2]._mmode; if ( v8 == MM_STAND || v8 == MM_TALK ) - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v5]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v5]; } } // 679660: using guessed type char gbMaxPlayers; @@ -7297,12 +7286,12 @@ void __fastcall MAI_Lazhelp(int i) } _LOBYTE(monster[v2]._mgoal) = 1; } -LABEL_10: + LABEL_10: if ( _LOBYTE(monster[v2]._mgoal) == 1 ) MAI_Succ(ia); monster[v2]._mdir = v5; if ( monster[v2]._mmode == MM_STAND ) - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v5]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v5]; } } // 679660: using guessed type char gbMaxPlayers; @@ -7345,7 +7334,7 @@ void __fastcall MAI_Lachdanan(int i) } monster[v2]._mdir = v6; if ( monster[v2]._mmode == MM_STAND ) - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v6]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v6]; } } @@ -7387,7 +7376,7 @@ void __fastcall MAI_Warlord(int i) monster[v2]._mdir = v5; v7 = monster[v2]._mmode; if ( v7 == MM_STAND || v7 == MM_TALK ) - monster[v2]._mAFNum = monster[v2].MType->Anims[0].Frames[v5]; + monster[v2]._mAFNum = (int)monster[v2].MType->Anims[0].Frames[v5]; } } @@ -7536,72 +7525,72 @@ void __cdecl ProcessMonsters() v17 = v0; } AiProc[(unsigned char)monster[v1]._mAi](v17); -LABEL_30: + LABEL_30: switch ( monster[v1]._mmode ) { - case MM_STAND: - v19 = M_DoStand(v0); - goto LABEL_48; - case MM_WALK: - v19 = M_DoWalk(v0); - goto LABEL_48; - case MM_WALK2: - v19 = M_DoWalk2(v0); - goto LABEL_48; - case MM_WALK3: - v19 = M_DoWalk3(v0); - goto LABEL_48; - case MM_ATTACK: - v19 = M_DoAttack(v0); - goto LABEL_48; - case MM_GOTHIT: - v19 = M_DoGotHit(v0); - goto LABEL_48; - case MM_DEATH: - v19 = M_DoDeath(v0); - goto LABEL_48; - case MM_SATTACK: - v19 = M_DoSAttack(v0); - goto LABEL_48; - case MM_FADEIN: - v19 = M_DoFadein(v0); - goto LABEL_48; - case MM_FADEOUT: - v19 = M_DoFadeout(v0); - goto LABEL_48; - case MM_RATTACK: - v19 = M_DoRAttack(v0); - goto LABEL_48; - case MM_SPSTAND: - v19 = M_DoSpStand(v0); - goto LABEL_48; - case MM_RSPATTACK: - v19 = M_DoRSpAttack(v0); - goto LABEL_48; - case MM_DELAY: - v19 = M_DoDelay(v0); - goto LABEL_48; - case MM_CHARGE: - goto LABEL_51; - case MM_STONE: - v19 = M_DoStone(v0); - goto LABEL_48; - case MM_HEAL: - v19 = M_DoHeal(v0); - goto LABEL_48; - case MM_TALK: - v19 = M_DoTalk(v0); -LABEL_48: - v25 = v19; - break; - default: - break; + case MM_STAND: + v19 = M_DoStand(v0); + goto LABEL_48; + case MM_WALK: + v19 = M_DoWalk(v0); + goto LABEL_48; + case MM_WALK2: + v19 = M_DoWalk2(v0); + goto LABEL_48; + case MM_WALK3: + v19 = M_DoWalk3(v0); + goto LABEL_48; + case MM_ATTACK: + v19 = M_DoAttack(v0); + goto LABEL_48; + case MM_GOTHIT: + v19 = M_DoGotHit(v0); + goto LABEL_48; + case MM_DEATH: + v19 = M_DoDeath(v0); + goto LABEL_48; + case MM_SATTACK: + v19 = M_DoSAttack(v0); + goto LABEL_48; + case MM_FADEIN: + v19 = M_DoFadein(v0); + goto LABEL_48; + case MM_FADEOUT: + v19 = M_DoFadeout(v0); + goto LABEL_48; + case MM_RATTACK: + v19 = M_DoRAttack(v0); + goto LABEL_48; + case MM_SPSTAND: + v19 = M_DoSpStand(v0); + goto LABEL_48; + case MM_RSPATTACK: + v19 = M_DoRSpAttack(v0); + goto LABEL_48; + case MM_DELAY: + v19 = M_DoDelay(v0); + goto LABEL_48; + case MM_CHARGE: + goto LABEL_51; + case MM_STONE: + v19 = M_DoStone(v0); + goto LABEL_48; + case MM_HEAL: + v19 = M_DoHeal(v0); + goto LABEL_48; + case MM_TALK: + v19 = M_DoTalk(v0); + LABEL_48: + v25 = v19; + break; + default: + break; } if ( !v25 ) break; GroupUnity(v0); } -LABEL_51: + LABEL_51: if ( monster[v1]._mmode != MM_STONE ) { v20 = monster[v1]._mFlags; @@ -7749,14 +7738,14 @@ LABEL_24: { v11 = &monster[v4].leader; if ( abs(v6 - monster[(unsigned char)*v11]._mfutx) >= 4 - || abs(v7 - monster[(unsigned char)*v11]._mfuty) >= 4 ) + || abs(v7 - monster[(unsigned char)*v11]._mfuty) >= 4 ) { return 0; } return 1; } v12 = monster[v4]._uniqtype; - if ( !v12 || !(UniqMonst[v12-1].mUnqAttr & 2) ) + if ( !v12 || !(UniqMonst[v12 - 1].mUnqAttr & 2) ) return 1; v26 = 0; v13 = v6 - 3; @@ -7785,9 +7774,9 @@ LABEL_24: --v18; v20 = v18; if ( monster[v20].leaderflag == 1 - && (unsigned char)monster[v20].leader == a1 - && monster[v20]._mfutx == v13 - && monster[v20]._mfuty == j ) + && (unsigned char)monster[v20].leader == a1 + && monster[v20]._mfutx == v13 + && monster[v20]._mfuty == j ) { ++v26; } @@ -7819,7 +7808,7 @@ bool __fastcall CheckNoSolid(int x, int y) return nSolidTable[dPiece[0][y + 112 * x]] == 0; } -bool __fastcall LineClearF(bool (__fastcall *Clear)(int, int), int x1, int y1, int x2, int y2) +bool __fastcall LineClearF(bool(__fastcall *Clear)(int, int), int x1, int y1, int x2, int y2) { int v5; // esi int v6; // edi @@ -7942,7 +7931,7 @@ bool __fastcall LineClearF(bool (__fastcall *Clear)(int, int), int x1, int y1, i v15 = v29 + 1; } while ( ++v29 == v25 && v14 == v26 || Clear(v15, v14) ); -LABEL_29: + LABEL_29: if ( v29 != x2 ) return 0; } @@ -7956,7 +7945,7 @@ bool __fastcall LineClear(int x1, int y1, int x2, int y2) return LineClearF(PosOkMissile, x1, y1, x2, y2); } -BOOL __fastcall LineClearF1(BOOL (__fastcall *Clear)(int, int, int), int monst, int x1, int y1, int x2, int y2) +BOOL __fastcall LineClearF1(BOOL(__fastcall *Clear)(int, int, int), int monst, int x1, int y1, int x2, int y2) { int v6; // esi int v7; // edi @@ -8077,7 +8066,7 @@ BOOL __fastcall LineClearF1(BOOL (__fastcall *Clear)(int, int, int), int monst, } } while ( ++x1 == v26 && v15 == v27 || Clear(v25, x1, v15) ); /* check args */ -LABEL_29: + LABEL_29: if ( x1 != x2 ) return 0; } @@ -8113,7 +8102,7 @@ void __fastcall SyncMonsterAnim(int i) monster[v2].MType = v5; monster[v2].MData = v4; if ( v6 ) - v7 = UniqMonst[v6-1].mName; + v7 = UniqMonst[v6 - 1].mName; else v7 = v4->mName; v8 = monster[v2]._mmode; @@ -8121,48 +8110,48 @@ void __fastcall SyncMonsterAnim(int i) v9 = monster[v2]._mdir; switch ( v8 ) { - case MM_STAND: - case MM_DELAY: - case MM_TALK: - v10 = v5->Anims[0].Frames[v9]; - goto LABEL_13; - case MM_WALK: - case MM_WALK2: - case MM_WALK3: - v10 = v5->Anims[1].Frames[v9]; - goto LABEL_13; - case MM_ATTACK: - case MM_RATTACK: - v10 = v5->Anims[2].Frames[v9]; - goto LABEL_13; - case MM_GOTHIT: - v10 = v5->Anims[3].Frames[v9]; - goto LABEL_13; - case MM_DEATH: - v10 = v5->Anims[4].Frames[v9]; - goto LABEL_13; - case MM_SATTACK: - case MM_FADEIN: - case MM_FADEOUT: - case MM_SPSTAND: - case MM_RSPATTACK: - case MM_HEAL: - v10 = v5->Anims[5].Frames[v9]; -LABEL_13: - monster[v2]._mAFNum = v10; - return; - case MM_CHARGE: - v11 = v5->Anims[2].Frames[v9]; - monster[v2]._mAnimFrame = 1; - monster[v2]._mAFNum = v11; - v12 = v5->Anims[2].Rate; - break; - default: - v13 = v5->Anims[0].Frames[v9]; - monster[v2]._mAnimFrame = 1; - monster[v2]._mAFNum = v13; - v12 = v5->Anims[0].Rate; - break; + case MM_STAND: + case MM_DELAY: + case MM_TALK: + v10 = (int)v5->Anims[0].Frames[v9]; + goto LABEL_13; + case MM_WALK: + case MM_WALK2: + case MM_WALK3: + v10 = (int)v5->Anims[1].Frames[v9]; + goto LABEL_13; + case MM_ATTACK: + case MM_RATTACK: + v10 = (int)v5->Anims[2].Frames[v9]; + goto LABEL_13; + case MM_GOTHIT: + v10 = (int)v5->Anims[3].Frames[v9]; + goto LABEL_13; + case MM_DEATH: + v10 = (int)v5->Anims[4].Frames[v9]; + goto LABEL_13; + case MM_SATTACK: + case MM_FADEIN: + case MM_FADEOUT: + case MM_SPSTAND: + case MM_RSPATTACK: + case MM_HEAL: + v10 = (int)v5->Anims[5].Frames[v9]; + LABEL_13: + monster[v2]._mAFNum = v10; + return; + case MM_CHARGE: + v11 = (int)v5->Anims[2].Frames[v9]; + monster[v2]._mAnimFrame = 1; + monster[v2]._mAFNum = v11; + v12 = v5->Anims[2].Rate; + break; + default: + v13 = (int)v5->Anims[0].Frames[v9]; + monster[v2]._mAnimFrame = 1; + monster[v2]._mAFNum = v13; + v12 = v5->Anims[0].Rate; + break; } monster[v2]._mAnimLen = v12; } @@ -8228,14 +8217,14 @@ void __fastcall M_FallenFear(int x, int y) v11 = 3; } } -LABEL_15: + LABEL_15: v4 = v11; -LABEL_16: + LABEL_16: if ( monster[v5]._mAi == AI_FALLEN - && v4 - && abs(x1 - monster[v5]._mx) < 5 - && abs(y1 - monster[v5]._my) < 5 - && (signed int)(monster[v5]._mhitpoints & 0xFFFFFFC0) > 0 ) + && v4 + && abs(x1 - monster[v5]._mx) < 5 + && abs(y1 - monster[v5]._my) < 5 + && (signed int)(monster[v5]._mhitpoints & 0xFFFFFFC0) > 0 ) { _LOBYTE(monster[v5]._mgoal) = 2; monster[v5]._mgoalvar1 = v4; @@ -8549,7 +8538,7 @@ BOOL __fastcall PosOkMonst(int i, int x, int y) while ( v9 < nummissiles ); if ( v4 ) { -LABEL_24: + LABEL_24: if ( !(monster[v10].mMagicRes & 0x10) || monster[v10].MType->mtype == MT_DIABLO ) return 0; } @@ -8608,7 +8597,7 @@ BOOL __fastcall PosOkMonst2(int i, int x, int y) while ( v10 < nummissiles ); if ( v5 ) { -LABEL_23: + LABEL_23: if ( !(monster[v4].mMagicRes & 0x10) || monster[v4].MType->mtype == MT_DIABLO ) result = 0; } @@ -8650,11 +8639,11 @@ BOOL __fastcall PosOkMonst3(int i, int x, int y) v8 = object[v7]._otype; v4 = 1; if ( v8 != 1 - && v8 != OBJ_L1RDOOR - && v8 != OBJ_L2LDOOR - && v8 != OBJ_L2RDOOR - && v8 != OBJ_L3LDOOR - && v8 != OBJ_L3RDOOR ) + && v8 != OBJ_L1RDOOR + && v8 != OBJ_L2LDOOR + && v8 != OBJ_L2RDOOR + && v8 != OBJ_L3LDOOR + && v8 != OBJ_L3RDOOR ) { v4 = 0; } @@ -8686,7 +8675,7 @@ BOOL __fastcall PosOkMonst3(int i, int x, int y) while ( v11 < nummissiles ); if ( v12 ) { -LABEL_33: + LABEL_33: if ( !(monster[v13].mMagicRes & 0x10) || monster[v13].MType->mtype == MT_DIABLO ) return 0; } @@ -8887,7 +8876,7 @@ int __cdecl PreSpawnSkeleton() if ( nummtypes <= 0 ) return -1; - for(i = 0; i < nummtypes; i++) + for ( i = 0; i < nummtypes; i++ ) { if ( IsSkel(Monsters[i].mtype) ) ++skeltypes; diff --git a/Source/monster.h b/Source/monster.h index e650dd0c7..28bea8864 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -17,7 +17,7 @@ extern int uniquetrans; extern int nummtypes; void __cdecl monster_cpp_init(); -void __fastcall InitMonsterTRN(int monst, int special); +void __fastcall InitMonsterTRN(int monst, BOOL special); void __cdecl InitLevelMonsters(); int __fastcall AddMonsterType(int type, int placeflag); void __cdecl GetLevelMTypes(); diff --git a/structs.h b/structs.h index d5e010d5e..65810d6a0 100644 --- a/structs.h +++ b/structs.h @@ -481,7 +481,7 @@ struct MissileStruct struct AnimStruct { int CMem; // [unsigned] char * ?? - int Frames[8]; // unsigned char * + unsigned char *Frames[8]; // array of 8 pointers // TODO: to CelBuf struct? int Rate; int Delay; }; @@ -500,7 +500,7 @@ struct CMonster unsigned char mAFNum; char mdeadval; MonsterData *MData; - void *trans_file; + unsigned char *trans_file; // array, possibly 256 bytes }; struct MonsterStruct From f5675d7fec66e44cad723bf7f675cd77bcccac42 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sun, 5 Aug 2018 21:01:08 +0200 Subject: [PATCH 02/16] Fixed formatting in `InitMonsterTRN` --- Source/monster.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 291f89908..edabc1a73 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -361,7 +361,7 @@ void __fastcall InitMonsterTRN(int monst, BOOL special) { unsigned char *trans_file = Monsters[monst].trans_file; - for (int i = 0; i < 256; ++i ) + for ( int i = 0; i < 256; ++i ) { if ( *trans_file == 255 ) { @@ -371,11 +371,11 @@ void __fastcall InitMonsterTRN(int monst, BOOL special) ++trans_file; } - for (int anim_index = 0; anim_index < (special ? 6 : 5); ++anim_index ) + for ( int anim_index = 0; anim_index < (special ? 6 : 5); ++anim_index ) { if ( anim_index != 1 || Monsters[monst].mtype < MT_COUNSLR || Monsters[monst].mtype > MT_ADVOCATE ) { - for (int i = 0; i < 8; ++i ) + for ( int i = 0; i < 8; ++i ) { Cl2ApplyTrans( Monsters[monst].Anims[anim_index].Frames[i], From d78ffef5fa27801e39b9f1577bb44d436aea3696 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sun, 5 Aug 2018 21:08:18 +0200 Subject: [PATCH 03/16] Cleaned up `InitLevelMonsters` and `AddMonsterType` --- Source/monster.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index edabc1a73..ab08c33fb 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -388,7 +388,7 @@ void __fastcall InitMonsterTRN(int monst, BOOL special) void __cdecl InitLevelMonsters() { - int i; // eax + int i; nummtypes = 0; monstimgtot = 0; @@ -406,23 +406,16 @@ void __cdecl InitLevelMonsters() uniquetrans = 0; } -// 64CCE0: using guessed type int MissileFileFlag; -// 658550: using guessed type int totalmonsters; -// 6599D9: using guessed type int END_Monsters_17; -// 659AE8: using guessed type int monstimgtot; int __fastcall AddMonsterType(int type, int placeflag) { - bool done; // eax - int i; // esi + BOOL done; + int i; - done = 0; + done = FALSE; - for ( i = 0; i < nummtypes; i++ ) + for ( i = 0; i < nummtypes && !done; i++ ) { - if ( done ) - break; - done = type == Monsters[i].mtype; } @@ -439,7 +432,6 @@ int __fastcall AddMonsterType(int type, int placeflag) Monsters[i].mPlaceFlags |= placeflag; return i; } -// 659AE8: using guessed type int monstimgtot; void __cdecl GetLevelMTypes() /* note-decompile this function again and check */ { From 5d03a27248086e77f3e42d8b8c794b6e4e92894e Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sun, 5 Aug 2018 21:20:56 +0200 Subject: [PATCH 04/16] Cleaned up `GetLevelMTypes`. This had interesting compiler optimizations like local array merging, which threw off IDA a bit. By looking into older versions and the PSX symbols I'm pretty sure I found the correct sizes for both arrays. There are still minor differences, such as different parameter loading for function calls. In other places, this solved itself with time. (VC seems to generate different code base on a lot of things, even down to alignment). --- Source/monster.cpp | 197 ++++++++++++++++++++------------------------- Source/monster.h | 2 +- Source/quests.cpp | 6 +- Source/quests.h | 2 +- 4 files changed, 93 insertions(+), 114 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index ab08c33fb..214e7cd72 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -433,32 +433,24 @@ int __fastcall AddMonsterType(int type, int placeflag) return i; } -void __cdecl GetLevelMTypes() /* note-decompile this function again and check */ +void __cdecl GetLevelMTypes() { - //int v0; // eax - //int v1; // eax - //int v2; // eax - //int v3; // eax - //int v4; // eax - //int v5; // eax - char *v6; // esi - int v7; // edi - int v10; // eax - int v11; // esi - int v12; // edi - char *v13; // ecx - int i; // esi - int v15; // ecx - bool v16; // zf - int v17; // edx - int *v18; // eax - int v19; // esi - int *v20; // esi - int v21; // eax - //int v22; // [esp+8h] [ebp-328h] - int typelist[MAXMONSTERS]; // [esp+Ch] [ebp-324h] - int skeltypes[111]; // [esp+170h] [ebp-1C0h] - int max; // [esp+32Ch] [ebp-4h] + int i; + + // note: the array size is not 190 like in the PSX version + // (stack sizes compared with beta, 1.05, 1.09) + // this array is merged with skeltypes down below. + int typelist[200]; + + int minl; // min level + int maxl; // max level + char mamask = 3; // monster availability mask? + + int mt; // (current) monster type + int nt; // number of types? + + // TODO: local variable QuestMask: didn't find any obvious use for that. + // maybe a PSX only mask that was used instead of QuestStatus? AddMonsterType(MT_GOLEM, 2); if ( currlevel == 16 ) @@ -466,114 +458,101 @@ void __cdecl GetLevelMTypes() /* note-decompile this function again and check */ AddMonsterType(MT_ADVOCATE, 1); AddMonsterType(MT_RBLACK, 1); AddMonsterType(MT_DIABLO, 2); + return; } - else if ( setlevel ) + + if ( setlevel ) { if ( setlvlnum == SL_SKELKING ) AddMonsterType(MT_SKING, 4); + return; } - else + + + if ( QuestStatus(QTYPE_BUTCH) ) + AddMonsterType(MT_CLEAVER, 2); + if ( QuestStatus(QTYPE_GARB) ) + AddMonsterType(UniqMonst[0].mtype, 4); + if ( QuestStatus(QTYPE_ZHAR) ) + AddMonsterType(UniqMonst[2].mtype, 4); + if ( QuestStatus(QTYPE_BOL) ) + AddMonsterType(UniqMonst[3].mtype, 4); + if ( QuestStatus(QTYPE_VEIL) ) + AddMonsterType(UniqMonst[7].mtype, 4); + if ( QuestStatus(QTYPE_WARLRD) ) + AddMonsterType(UniqMonst[8].mtype, 4); + + if ( gbMaxPlayers != 1 && currlevel == quests[12]._qlevel ) { - if ( QuestStatus(6) ) - AddMonsterType(MT_CLEAVER, 2); - if ( QuestStatus(2) ) - AddMonsterType((char)UniqMonst[0].mtype, 4); - if ( QuestStatus(3) ) - AddMonsterType((char)UniqMonst[2].mtype, 4); - if ( QuestStatus(7) ) - AddMonsterType((char)UniqMonst[3].mtype, 4); - if ( QuestStatus(4) ) - AddMonsterType((char)UniqMonst[7].mtype, 4); - if ( QuestStatus(11) ) - AddMonsterType((char)UniqMonst[8].mtype, 4); - if ( gbMaxPlayers != 1 && currlevel == quests[12]._qlevel ) + AddMonsterType(MT_SKING, 4); + + int skeltypes[111]; + // TODO: `numskeltypes` doesn't want to merge with `nt` while compiling, + // so the stack is 4 bytes bigger + int numskeltypes = 0; + + for ( mt = 8; mt <= 27; mt++ ) { - AddMonsterType(MT_SKING, 4); - max = 0; - v6 = &monsterdata[8].mMaxDLvl; - v7 = 8; - do + if ( IsSkel(mt) ) { - if ( IsSkel(v7) ) + minl = 15 * monsterdata[mt].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[mt].mMaxDLvl / 30 + 1; + + if ( currlevel >= minl && currlevel <= maxl ) { - if ( currlevel >= 15 * (char)*(v6 - 1) / 30 + 1 - && currlevel <= 15 * (char)*v6 / 30 + 1 - && MonstAvailTbl[v7] & 3 ) - { - skeltypes[max++] = v7; - } + if ( MonstAvailTbl[mt] & mamask ) + skeltypes[numskeltypes++] = mt; } - v6 += 128; - ++v7; } - while ( (signed int)v6 <= (signed int)&monsterdata[27].mMaxDLvl ); - v10 = random(88, max); - AddMonsterType(skeltypes[v10], 1); - } - v11 = currlevel; - v12 = 0; - v13 = &monsterdata[0].mMaxDLvl; - max = 0; - do - { - if ( v11 >= 15 * (char)*(v13 - 1) / 30 + 1 && v11 <= 15 * (char)*v13 / 30 + 1 && MonstAvailTbl[max] & 3 ) - typelist[v12++] = max; - ++max; - v13 += 128; } - while ( (signed int)v13 < (signed int)&monsterdata[111].mMaxDLvl ); - if ( monstdebug ) + AddMonsterType(skeltypes[random(88, numskeltypes)], 1); + } + + nt = 0; + for ( mt = 0; mt < 111; mt++ ) + { + minl = 15 * monsterdata[mt].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[mt].mMaxDLvl / 30 + 1; + + if ( currlevel >= minl && currlevel <= maxl ) { - for ( i = 0; i < debugmonsttypes; i++ ) - AddMonsterType(DebugMonsters[i], 1); + if ( MonstAvailTbl[mt] & mamask ) + typelist[nt++] = mt; } - else + } + + if ( monstdebug ) + { + for ( i = 0; i < debugmonsttypes; i++ ) + AddMonsterType(DebugMonsters[i], 1); + } + else + { + + while ( nt > 0 && nummtypes < 16 && monstimgtot < 4000 ) { - while ( v12 > 0 ) + for ( mt = 0; mt < nt; ) { - if ( nummtypes >= 16 || monstimgtot >= 4000 ) - break; - v15 = 0; - v16 = v12 == 0; - if ( v12 > 0 ) + if ( monsterdata[typelist[mt]].mType <= 4000 - monstimgtot ) { - v17 = 4000 - monstimgtot; - do - { - v18 = &typelist[v15]; - if ( monsterdata[LOBYTE(*v18)].mType <= v17 ) - { - ++v15; - } - else - { - v19 = typelist[v12-- - 1]; //v19 = *(&v22 + v12--); /* fix and check */ - *v18 = v19; - } - } - while ( v15 < v12 ); - v16 = v12 == 0; + mt++; } - if ( !v16 ) + else { - v20 = &typelist[random(88, v12)]; - AddMonsterType(LOBYTE(*v20), 1); - v21 = typelist[v12-- - 1]; // v21 = *(&v22 + v12--); - *v20 = v21; + typelist[mt] = typelist[--nt]; } } + + if ( nt != 0 ) + { + mt = random(88, nt); + AddMonsterType(typelist[mt], 1); + typelist[mt] = typelist[--nt]; + } } } } -// 525730: using guessed type int monstdebug; -// 52573C: using guessed type int debugmonsttypes; -// 5CCB10: using guessed type char setlvlnum; -// 5CF31D: using guessed type char setlevel; -// 659AE8: using guessed type int monstimgtot; -// 679660: using guessed type char gbMaxPlayers; -// 43114F: using guessed type int var_1C0[111]; -// 43114F: using guessed type int var_324[89]; void __fastcall InitMonsterGFX(int monst) { @@ -8678,7 +8657,7 @@ BOOL __fastcall PosOkMonst3(int i, int x, int y) return result; } -bool __fastcall IsSkel(int mt) +BOOL __fastcall IsSkel(int mt) { return mt >= MT_WSKELAX && mt <= MT_XSKELAX || mt >= MT_WSKELBW && mt <= MT_XSKELBW diff --git a/Source/monster.h b/Source/monster.h index 28bea8864..d3bb0a759 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -150,7 +150,7 @@ void __fastcall MissToMonst(int i, int x, int y); BOOL __fastcall PosOkMonst(int i, int x, int y); BOOL __fastcall PosOkMonst2(int i, int x, int y); BOOL __fastcall PosOkMonst3(int i, int x, int y); -bool __fastcall IsSkel(int mt); +BOOL __fastcall IsSkel(int mt); bool __fastcall IsGoat(int mt); int __fastcall M_SpawnSkel(int x, int y, int dir); void __fastcall ActivateSpawn(int i, int x, int y, int dir); diff --git a/Source/quests.cpp b/Source/quests.cpp index 483b809ec..6d5884f2e 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -302,16 +302,16 @@ LABEL_10: } // 679660: using guessed type char gbMaxPlayers; -bool __fastcall QuestStatus(int i) +BOOL __fastcall QuestStatus(int i) { - bool result; // al + BOOL result; // al if ( setlevel || currlevel != quests[i]._qlevel || !quests[i]._qactive || (result = 1, gbMaxPlayers != 1) && !(questlist[i]._qflags & 1) ) { - result = 0; + result = FALSE; } return result; } diff --git a/Source/quests.h b/Source/quests.h index 0d29aa7e4..aca6a2e04 100644 --- a/Source/quests.h +++ b/Source/quests.h @@ -19,7 +19,7 @@ extern int ReturnLvl; // idb void __cdecl InitQuests(); void __cdecl CheckQuests(); bool __cdecl ForceQuests(); -bool __fastcall QuestStatus(int i); +BOOL __fastcall QuestStatus(int i); void __fastcall CheckQuestKill(int m, unsigned char sendmsg); void __cdecl DrawButcher(); void __fastcall DrawSkelKing(int q, int x, int y); From 4c4fe6834c9d3eec998f0fbea900590b6d682b02 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Mon, 6 Aug 2018 21:47:01 +0200 Subject: [PATCH 05/16] Fixed missing quest enum value. --- Source/monster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 214e7cd72..3fd1ffb55 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -482,7 +482,7 @@ void __cdecl GetLevelMTypes() if ( QuestStatus(QTYPE_WARLRD) ) AddMonsterType(UniqMonst[8].mtype, 4); - if ( gbMaxPlayers != 1 && currlevel == quests[12]._qlevel ) + if ( gbMaxPlayers != 1 && currlevel == quests[QTYPE_KING]._qlevel ) { AddMonsterType(MT_SKING, 4); From be231d11902a93f24a89980b49dbc67c0edc0365 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Mon, 6 Aug 2018 22:34:34 +0200 Subject: [PATCH 06/16] Added description for `trans_file`. --- structs.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/structs.h b/structs.h index 65810d6a0..ce347c540 100644 --- a/structs.h +++ b/structs.h @@ -500,7 +500,10 @@ struct CMonster unsigned char mAFNum; char mdeadval; MonsterData *MData; - unsigned char *trans_file; // array, possibly 256 bytes + + // A TRN file contains a sequence of colour transitions, represented + // as indexes into a palette. (a 256 byte array of palette indices) + unsigned char *trans_file; }; struct MonsterStruct From 66f522f34eda8f2e15c68984fcb34392a054d827 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Tue, 7 Aug 2018 23:19:47 +0200 Subject: [PATCH 07/16] Small corrections/cleanups (thanks @galaxyhaxz :)) - Removed the `mt` variable since it didn't exist in the earlier PSX version - Replaced raw constants with the proper defines - Reworked the likely use of `numskeltypes`. - Added `NUM_MTYPES` to `_monster_id` to represent the number of monster types --- Source/monster.cpp | 66 ++++++++++++++++++++++++---------------------- enums.h | 3 ++- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 3fd1ffb55..4fdf73459 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -394,14 +394,14 @@ void __cdecl InitLevelMonsters() monstimgtot = 0; MissileFileFlag = 0; - for ( i = 0; i < 16; i++ ) + for ( i = 0; i < MAX_LVLMTYPES; i++ ) Monsters[i].mPlaceFlags = 0; ClrAllMonsters(); nummonsters = 0; totalmonsters = MAXMONSTERS; - for ( i = 0; i < 200; i++ ) + for ( i = 0; i < MAXMONSTERS; i++ ) monstactive[i] = i; uniquetrans = 0; @@ -437,20 +437,19 @@ void __cdecl GetLevelMTypes() { int i; - // note: the array size is not 190 like in the PSX version - // (stack sizes compared with beta, 1.05, 1.09) // this array is merged with skeltypes down below. - int typelist[200]; + int typelist[MAXMONSTERS]; int minl; // min level int maxl; // max level char mamask = 3; // monster availability mask? - int mt; // (current) monster type int nt; // number of types? - // TODO: local variable QuestMask: didn't find any obvious use for that. - // maybe a PSX only mask that was used instead of QuestStatus? + // TODO: local variable QuestMask that was referenced in the psx symbols + // didn't find any obvious use for that. the casing/naming of it hints at + // a PSX only variable + // maybe it was used instead of QuestStatus() on the console AddMonsterType(MT_GOLEM, 2); if ( currlevel == 16 ) @@ -487,40 +486,43 @@ void __cdecl GetLevelMTypes() AddMonsterType(MT_SKING, 4); - int skeltypes[111]; - // TODO: `numskeltypes` doesn't want to merge with `nt` while compiling, - // so the stack is 4 bytes bigger - int numskeltypes = 0; + int skeltypes[NUM_MTYPES]; + const int numskeltypes = 19; - for ( mt = 8; mt <= 27; mt++ ) + nt = 0; + for ( i = MT_WSKELAX; i <= MT_WSKELAX + numskeltypes; i++ ) { - if ( IsSkel(mt) ) + if ( IsSkel(i) ) { - minl = 15 * monsterdata[mt].mMinDLvl / 30 + 1; - maxl = 15 * monsterdata[mt].mMaxDLvl / 30 + 1; + minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; if ( currlevel >= minl && currlevel <= maxl ) { - if ( MonstAvailTbl[mt] & mamask ) - skeltypes[numskeltypes++] = mt; + if ( MonstAvailTbl[i] & mamask ) + { + skeltypes[nt++] = i; } } } - AddMonsterType(skeltypes[random(88, numskeltypes)], 1); + } + AddMonsterType(skeltypes[random(88, nt)], 1); } nt = 0; - for ( mt = 0; mt < 111; mt++ ) + for ( i = 0; i < 111; i++ ) { - minl = 15 * monsterdata[mt].mMinDLvl / 30 + 1; - maxl = 15 * monsterdata[mt].mMaxDLvl / 30 + 1; + minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; if ( currlevel >= minl && currlevel <= maxl ) { - if ( MonstAvailTbl[mt] & mamask ) - typelist[nt++] = mt; + if ( MonstAvailTbl[i] & mamask ) + { + typelist[nt++] = i; } } + } if ( monstdebug ) { @@ -530,25 +532,25 @@ void __cdecl GetLevelMTypes() else { - while ( nt > 0 && nummtypes < 16 && monstimgtot < 4000 ) + while ( nt > 0 && nummtypes < MAX_LVLMTYPES && monstimgtot < 4000 ) { - for ( mt = 0; mt < nt; ) + for ( i = 0; i < nt; ) { - if ( monsterdata[typelist[mt]].mType <= 4000 - monstimgtot ) + if ( monsterdata[typelist[i]].mType <= 4000 - monstimgtot ) { - mt++; + i++; } else { - typelist[mt] = typelist[--nt]; + typelist[i] = typelist[--nt]; } } if ( nt != 0 ) { - mt = random(88, nt); - AddMonsterType(typelist[mt], 1); - typelist[mt] = typelist[--nt]; + i = random(88, nt); + AddMonsterType(typelist[i], 1); + typelist[i] = typelist[--nt]; } } } diff --git a/enums.h b/enums.h index ab88672d6..74a3b0563 100644 --- a/enums.h +++ b/enums.h @@ -1315,7 +1315,8 @@ enum _monster_id MT_ADVOCATE = 0x6C, MT_GOLEM = 0x6D, MT_DIABLO = 0x6E, - MT_DARKMAGE = 0x6F + MT_DARKMAGE = 0x6F, + NUM_MTYPES }; enum _speech_id From 0603e3e0429c871a29366605cc137973b3676ac0 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sat, 11 Aug 2018 20:48:40 +0200 Subject: [PATCH 08/16] Cleaned up InitMonsterGFX, InitMonster, MonstPlace --- Source/gendung.cpp | 1 + Source/missiles.cpp | 3 + Source/monster.cpp | 486 +++++++++++++++++++------------------------- Source/monster.h | 2 +- Source/player.cpp | 7 +- Source/player.h | 2 +- structs.h | 14 +- 7 files changed, 222 insertions(+), 293 deletions(-) diff --git a/Source/gendung.cpp b/Source/gendung.cpp index 50122dc90..dc26eb2f2 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -32,6 +32,7 @@ char nTrapTable[2049]; char leveltype; // weak unsigned char currlevel; // idb char TransList[256]; +// TODO: probably unsigned char char nSolidTable[2049]; int level_frame_count[2049]; ScrollStruct ScrollInfo; diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 6de49cbac..aac59578a 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2119,6 +2119,9 @@ void __fastcall SetMissDir(int mi, int dir) SetMissAnim(mi, _LOBYTE(missile[mi]._miAnimType)); } +// TODO: replace `int mi` parameter with `missile_graphic_id mi` +// to enable the compiler to optimize int to char properly +// check for example the calls in `InitMonsterGFX` void __fastcall LoadMissileGFX(int mi) { MisFileData *v1; // esi diff --git a/Source/monster.cpp b/Source/monster.cpp index 4fdf73459..a7f7a71f4 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -2,7 +2,9 @@ #include "../types.h" -int MissileFileFlag; // weak +// Tracks which missile files are already loaded +int MissileFileFlag; + int monster_cpp_init_value; // weak int monstkills[MAXMONSTERS]; int monstactive[MAXMONSTERS]; @@ -502,10 +504,10 @@ void __cdecl GetLevelMTypes() if ( MonstAvailTbl[i] & mamask ) { skeltypes[nt++] = i; + } } } } - } AddMonsterType(skeltypes[random(88, nt)], 1); } @@ -520,9 +522,9 @@ void __cdecl GetLevelMTypes() if ( MonstAvailTbl[i] & mamask ) { typelist[nt++] = i; + } } } - } if ( monstdebug ) { @@ -558,168 +560,123 @@ void __cdecl GetLevelMTypes() void __fastcall InitMonsterGFX(int monst) { - int v1; // esi - int v2; // ebx - int v3; // ebx - int *v4; // edi - int *v5; // eax - char v6; // cl - unsigned char *v7; // eax - char v8; // cl - int *v9; // ecx - int v10; // edx - int v11; // ecx - int v12; // ecx - bool v13; // zf - int v14; // ecx - void **v15; // esi - unsigned char *v16; // eax - int v17; // edx - int v18; // ecx - void *v19; // ecx - //int v20; // ecx - //int v21; // ecx - //int v22; // ecx - //int v23; // ecx - //int v24; // ecx - //int v25; // ecx - char strBuff[256]; // [esp+Ch] [ebp-114h] - int mon_id; // [esp+10Ch] [ebp-14h] - int *v28; // [esp+110h] [ebp-10h] - int v29; // [esp+114h] [ebp-Ch] - int *v30; // [esp+118h] [ebp-8h] - int v31; // [esp+11Ch] [ebp-4h] - - v29 = 0; - mon_id = monst; - v1 = monst; - v2 = (unsigned char)Monsters[monst].mtype; - v31 = v2; - v3 = v2 << 7; - v4 = (int *)Monsters[monst].Anims[0].Frames; - v5 = (int *)((char *)monsterdata[0].Frames + v3); - v30 = (int *)Monsters[monst].Anims[0].Frames; - v28 = (int *)((char *)monsterdata[0].Frames + v3); - do + int mtype = (unsigned char)Monsters[monst].mtype; + char strBuff[256]; + + MonsterData *pmonsterdata = &monsterdata[mtype]; + + for ( int anim = 0; anim < 6; anim++ ) { - v6 = animletter[v29]; - if ( (v6 != 's' || *(int *)((char *)&monsterdata[0].has_special + v3)) && *v5 > 0 ) + if ( (animletter[anim] != 's' || pmonsterdata->has_special) && pmonsterdata->Frames ) { - sprintf(strBuff, *(const char **)((char *)&monsterdata[0].GraphicType + v3), v6); - v7 = LoadFileInMem(strBuff, 0); - *(v4 - 1) = (int)v7; - if ( Monsters[v1].mtype != MT_GOLEM || (v8 = animletter[v29], v8 != 's') && v8 != 'd' ) + sprintf(strBuff, pmonsterdata->GraphicType, animletter[anim]); + + Monsters[monst].Anims[anim].CMem = LoadFileInMem(strBuff, NULL); + + if ( Monsters[monst].mtype != MT_GOLEM || (animletter[anim] != 's' && animletter[anim] != 'd') ) { - v30 = 0; - v9 = v4; - do + + for ( int i = 0; i < 8; i++ ) { - v10 = (int)&v7[*(_DWORD *)&v7[4 * (_DWORD)v30]]; - v30 = (int *)((char *)v30 + 1); - *v9 = v10; - ++v9; + // TODO: this can probably be cleaned up by defining the CMem structure + Monsters[monst].Anims[anim].Frames[i] = + (unsigned char*) + ((int)Monsters[monst].Anims[anim].CMem + ((int *)Monsters[monst].Anims[anim].CMem)[i]); } - while ( (signed int)v30 < 8 ); } else { - memset32(v4, (int)v7, 8u); - v4 = v30; - } - v5 = v28; - } - v11 = *v5; - ++v29; - v4[8] = v11; - v4[9] = v5[6]; - ++v5; - v4 += 11; - v28 = v5; - v30 = v4; - } - while ( v29 < 6 ); - Monsters[v1].MData = (MonsterData *)((char *)monsterdata + v3); - v12 = *(int *)((char *)&monsterdata[0].flags + v3); - Monsters[v1].flags_1 = v12; - Monsters[v1].flags_2 = (v12 - 64) >> 1; - Monsters[v1].mMinHP = *((_BYTE *)&monsterdata[0].mMinHP + v3); - v13 = *(int *)((char *)&monsterdata[0].has_trans + v3) == 0; - Monsters[v1].mMaxHP = *((_BYTE *)&monsterdata[0].mMaxHP + v3); - v14 = *(int *)((char *)&monsterdata[0].has_special + v3); - Monsters[v1].has_special = v14; - Monsters[v1].mAFNum = *(&monsterdata[0].mAFNum + v3); - if ( !v13 ) + for ( int i = 0; i < 8; i++ ) + { + Monsters[monst].Anims[anim].Frames[i] = Monsters[monst].Anims[anim].CMem; + } + } + } + + // TODO: either the AnimStruct members have wrong naming or the MonsterData ones it seems + Monsters[monst].Anims[anim].Rate = pmonsterdata->Frames[0]; + Monsters[monst].Anims[anim].Delay = pmonsterdata->Rate[0]; + } + + + Monsters[monst].MData = pmonsterdata; + Monsters[monst].flags_1 = pmonsterdata->flags; + Monsters[monst].flags_2 = (pmonsterdata->flags - 64) >> 1; + Monsters[monst].mMinHP = pmonsterdata->mMinHP; + Monsters[monst].mMaxHP = pmonsterdata->mMaxHP; + Monsters[monst].has_special = pmonsterdata->has_special; + Monsters[monst].mAFNum = pmonsterdata->mAFNum; + + if ( pmonsterdata->has_trans ) { - v15 = (void **)&Monsters[v1].trans_file; - v16 = LoadFileInMem(*(char **)((char *)&monsterdata[0].TransFile + v3), 0); - v17 = *(int *)((char *)&monsterdata[0].has_special + v3); - v18 = mon_id; - *v15 = v16; - InitMonsterTRN(v18, v17); - v19 = *v15; - *v15 = 0; - mem_free_dbg(v19); + Monsters[monst].trans_file = LoadFileInMem(pmonsterdata->TransFile, NULL); + InitMonsterTRN(monst, pmonsterdata->has_special); + + void *trans_file = Monsters[monst].trans_file; + Monsters[monst].trans_file = NULL; + + mem_free_dbg(trans_file); } - if ( v31 >= MT_NMAGMA && v31 <= MT_WMAGMA && !(MissileFileFlag & 1) ) + + if ( mtype >= MT_NMAGMA && mtype <= MT_WMAGMA && !(MissileFileFlag & 1) ) { - MissileFileFlag |= 1u; + MissileFileFlag |= 1; LoadMissileGFX(MFILE_MAGBALL); } - if ( v31 >= MT_STORM && v31 <= MT_MAEL && !(MissileFileFlag & 2) ) + if ( mtype >= MT_STORM && mtype <= MT_MAEL && !(MissileFileFlag & 2) ) { - MissileFileFlag |= 2u; + MissileFileFlag |= 2; LoadMissileGFX(MFILE_THINLGHT); } - if ( v31 == MT_SUCCUBUS ) + if ( mtype == MT_SUCCUBUS ) { - if ( MissileFileFlag & 4 ) - return; - MissileFileFlag |= 4u; + if ( MissileFileFlag & 4 ) return; + + MissileFileFlag |= 4; LoadMissileGFX(MFILE_FLARE); LoadMissileGFX(MFILE_FLAREEXP); } - if ( v31 == MT_SNOWWICH ) + if ( mtype == MT_SNOWWICH ) { - if ( MissileFileFlag & 0x20 ) - return; - MissileFileFlag |= 0x20u; + if ( MissileFileFlag & 0x20 ) return; + + MissileFileFlag |= 0x20; LoadMissileGFX(MFILE_SCUBMISB); LoadMissileGFX(MFILE_SCBSEXPB); } - if ( v31 == MT_HLSPWN ) + if ( mtype == MT_HLSPWN ) { - if ( MissileFileFlag & 0x40 ) - return; - MissileFileFlag |= 0x40u; + if ( MissileFileFlag & 0x40 ) return; + + MissileFileFlag |= 0x40; LoadMissileGFX(MFILE_SCUBMISD); LoadMissileGFX(MFILE_SCBSEXPD); } - if ( v31 == MT_SOLBRNR ) + if ( mtype == MT_SOLBRNR ) { - if ( (MissileFileFlag & 0x80u) != 0 ) - return; + if ( MissileFileFlag & 0x80 ) return; + MissileFileFlag |= 0x80; LoadMissileGFX(MFILE_SCUBMISC); LoadMissileGFX(MFILE_SCBSEXPC); } - if ( v31 >= MT_INCIN && v31 <= MT_HELLBURN && !(MissileFileFlag & 8) ) + if ( mtype >= MT_INCIN && mtype <= MT_HELLBURN && !(MissileFileFlag & 8) ) { - MissileFileFlag |= 8u; + MissileFileFlag |= 8; LoadMissileGFX(MFILE_KRULL); } - if ( v31 >= MT_NACID && v31 <= MT_XACID && !(MissileFileFlag & 0x10) ) + if ( mtype >= MT_NACID && mtype <= MT_XACID && !(MissileFileFlag & 0x10) ) { - MissileFileFlag |= 0x10u; + MissileFileFlag |= 0x10; LoadMissileGFX(MFILE_ACIDBF); LoadMissileGFX(MFILE_ACIDSPLA); LoadMissileGFX(MFILE_ACIDPUD); } - if ( v31 == MT_DIABLO ) + if ( mtype == MT_DIABLO ) { LoadMissileGFX(MFILE_FIREPLAR); } } -// 64CCE0: using guessed type int MissileFileFlag; void __fastcall ClearMVars(int i) { @@ -735,183 +692,150 @@ void __fastcall ClearMVars(int i) void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) { - int v5; // ebx - int v6; // esi - CMonster *monst; // edi - MonsterData *v8; // eax - char *v9; // ecx - int v10; // eax - int v11; // eax - //int v12; // ecx - int v13; // eax - int v16; // eax - MonsterData *v17; // eax - int v18; // eax - MonsterData *v19; // eax - short v20; // cx - int v21; // edx - int v22; // edx - int v24; // ecx - int v25; // ecx - char v26; // dl - int v27; // ecx - char v28; // dl + CMonster *monst = &Monsters[mtype]; + + monster[i]._mmode = MM_STAND; + monster[i]._mx = x; + monster[i]._mfutx = x; + monster[i]._moldx = x; + monster[i]._mdir = rd; + monster[i]._my = y; + monster[i]._mfuty = y; + monster[i]._moldy = y; + monster[i]._mMTidx = mtype; + monster[i].mName = monst->MData->mName; + monster[i].MType = monst; + monster[i].MData = monst->MData; + monster[i]._mAFNum = (int)monst->Anims[0].Frames[rd]; + monster[i]._mAnimDelay = monst->Anims[0].Delay; + monster[i]._mAnimCnt = random(88, monst->Anims[0].Delay - 1); + monster[i]._mAnimLen = monst->Anims[0].Rate; + monster[i]._mAnimFrame = random(88, monst->Anims[0].Rate - 1) + 1; - v5 = rd; - v6 = i; - monster[v6]._mmode = MM_STAND; - monst = &Monsters[mtype]; - monster[v6]._mx = x; - monster[v6]._mfutx = x; - monster[v6]._moldx = x; - v8 = monst->MData; - monster[v6]._mdir = rd; - monster[v6]._my = y; - monster[v6]._mfuty = y; - monster[v6]._moldy = y; - monster[v6]._mMTidx = mtype; - v9 = v8->mName; - monster[v6].mName = v9; - monster[v6].MType = monst; - monster[v6].MData = v8; - monster[v6]._mAFNum = (int)monst->Anims[0].Frames[rd]; - v10 = monst->Anims[0].Delay; - monster[v6]._mAnimDelay = v10; - monster[v6]._mAnimCnt = random(88, v10 - 1); - v11 = monst->Anims[0].Rate; - monster[v6]._mAnimLen = v11; - v13 = random(88, v11 - 1); - monster[v6]._mAnimFrame = v13 + 1; if ( monst->mtype == MT_DIABLO ) - v16 = random(88, 1) + 1666; + { + monster[i]._mmaxhp = (random(88, 1) + 1666) << 6; + } else - v16 = monst->mMinHP + random(88, monst->mMaxHP - monst->mMinHP + 1); - monster[v6]._mmaxhp = v16 << 6; - if ( gbMaxPlayers == 1 ) { - monster[v6]._mmaxhp >>= 1; - if ( monster[v6]._mmaxhp < 64 ) - monster[v6]._mmaxhp = 64; + monster[i]._mmaxhp = (monst->mMinHP + random(88, monst->mMaxHP - monst->mMinHP + 1)) << 6; } - monster[v6]._mhitpoints = monster[v6]._mmaxhp; - v17 = monst->MData; - monster[v6]._mAi = v17->mAi; - monster[v6]._mint = v17->mInt; - _LOBYTE(monster[v6]._pathcount) = 0; - monster[v6]._uniqtype = 0; - monster[v6]._msquelch = 0; - _LOBYTE(monster[v6]._mgoal) = 1; - monster[v6]._mgoalvar1 = 0; - monster[v6]._mgoalvar2 = 0; - monster[v6]._mgoalvar3 = 0; - monster[v6].field_18 = 0; - monster[v6]._mDelFlag = 0; - monster[v6]._mRndSeed = GetRndSeed(); - v18 = GetRndSeed(); - monster[v6].mWhoHit = 0; - monster[v6]._mAISeed = v18; - v19 = monst->MData; - _LOBYTE(monster[v6].mLevel) = v19->mLevel; - monster[v6].mExp = v19->mExp; - monster[v6].mHit = v19->mHit; - monster[v6].mMinDamage = v19->mMinDamage; - monster[v6].mMaxDamage = v19->mMaxDamage; - monster[v6].mHit2 = v19->mHit2; - monster[v6].mMinDamage2 = v19->mMinDamage2; - monster[v6].mMaxDamage2 = v19->mMaxDamage2; - monster[v6].mArmorClass = v19->mArmorClass; - v20 = v19->mMagicRes; - monster[v6].leader = 0; - monster[v6].leaderflag = 0; - _LOWORD(monster[v6].mMagicRes) = v20; - v21 = v19->mFlags; - monster[v6].mtalkmsg = 0; - monster[v6]._mFlags = v21; - if ( monster[v6]._mAi == AI_GARG ) - { - v22 = (int)monst->Anims[5].Frames[v5]; - monster[v6]._mFlags |= 4u; - monster[v6]._mAFNum = v22; - monster[v6]._mAnimFrame = 1; - monster[v6]._mmode = MM_SATTACK; + + if ( gbMaxPlayers == 1 ) + { + monster[i]._mmaxhp >>= 1; + if ( monster[i]._mmaxhp < 64 ) + { + monster[i]._mmaxhp = 64; + } + } + + monster[i]._mhitpoints = monster[i]._mmaxhp; + monster[i]._mAi = monst->MData->mAi; + monster[i]._mint = monst->MData->mInt; + monster[i]._pathcount = 0; + monster[i]._uniqtype = 0; + monster[i]._msquelch = 0; + monster[i]._mgoal = 1; + monster[i]._mgoalvar1 = 0; + monster[i]._mgoalvar2 = 0; + monster[i]._mgoalvar3 = 0; + monster[i].field_18 = 0; + monster[i]._mDelFlag = 0; + monster[i]._mRndSeed = GetRndSeed(); + monster[i].mWhoHit = 0; + monster[i]._mAISeed = GetRndSeed(); + monster[i].mLevel = monst->MData->mLevel; + monster[i].mExp = monst->MData->mExp; + monster[i].mHit = monst->MData->mHit; + monster[i].mMinDamage = monst->MData->mMinDamage; + monster[i].mMaxDamage = monst->MData->mMaxDamage; + monster[i].mHit2 = monst->MData->mHit2; + monster[i].mMinDamage2 = monst->MData->mMinDamage2; + monster[i].mMaxDamage2 = monst->MData->mMaxDamage2; + monster[i].mArmorClass = monst->MData->mArmorClass; + monster[i].leader = 0; + monster[i].leaderflag = 0; + monster[i].mMagicRes = monst->MData->mMagicRes; + monster[i].mtalkmsg = 0; + monster[i]._mFlags = monst->MData->mFlags; + + if ( monster[i]._mAi == AI_GARG ) + { + monster[i]._mFlags |= 4u; + monster[i]._mAFNum = (int)monst->Anims[5].Frames[rd]; + monster[i]._mAnimFrame = 1; + monster[i]._mmode = MM_SATTACK; } + if ( gnDifficulty == DIFF_NIGHTMARE ) { - v24 = monster[v6]._mmaxhp; - _LOBYTE(monster[v6].mLevel) += 15; - monster[v6].mHit += 85; - monster[v6].mHit2 += 85; - v25 = 3 * v24 + 64; - monster[v6]._mmaxhp = v25; - monster[v6]._mhitpoints = v25; - monster[v6].mExp = 2 * (monster[v6].mExp + 1000); - monster[v6].mMinDamage = 2 * (monster[v6].mMinDamage + 2); - monster[v6].mMaxDamage = 2 * (monster[v6].mMaxDamage + 2); - monster[v6].mMinDamage2 = 2 * (monster[v6].mMinDamage2 + 2); - _LOBYTE(v25) = 2 * (monster[v6].mMaxDamage2 + 2); - monster[v6].mArmorClass += 50; - monster[v6].mMaxDamage2 = v25; + monster[i].mLevel += 15; + monster[i].mHit += 85; + monster[i].mHit2 += 85; + monster[i]._mmaxhp = 3 * monster[i]._mmaxhp + 64; + monster[i]._mhitpoints = monster[i]._mmaxhp; + monster[i].mExp = 2 * (monster[i].mExp + 1000); + monster[i].mMinDamage = 2 * (monster[i].mMinDamage + 2); + monster[i].mMaxDamage = 2 * (monster[i].mMaxDamage + 2); + monster[i].mMinDamage2 = 2 * (monster[i].mMinDamage2 + 2); + monster[i].mArmorClass += 50; + monster[i].mMaxDamage2 = 2 * (monster[i].mMaxDamage2 + 2); } + if ( gnDifficulty == DIFF_HELL ) { - v26 = 4 * monster[v6].mMinDamage; - v27 = 4 * monster[v6]._mmaxhp + 192; - _LOBYTE(monster[v6].mLevel) += 30; - monster[v6]._mmaxhp = v27; - monster[v6]._mhitpoints = v27; - _LOWORD(v27) = monster[v6].mExp; - monster[v6].mHit += 120; - monster[v6].mHit2 += 120; - monster[v6].mExp = 4 * (v27 + 1000); - monster[v6].mMinDamage = v26 + 6; - monster[v6].mMaxDamage = 4 * monster[v6].mMaxDamage + 6; - monster[v6].mMinDamage2 = 4 * monster[v6].mMinDamage2 + 6; - v28 = 4 * monster[v6].mMaxDamage2 + 6; - monster[v6].mArmorClass += 80; - monster[v6].mMaxDamage2 = v28; - _LOWORD(monster[v6].mMagicRes) = v19->mMagicRes2; + monster[i].mLevel += 30; + monster[i]._mmaxhp = 4 * monster[i]._mmaxhp + 192; + monster[i]._mhitpoints = monster[i]._mmaxhp; + monster[i].mHit += 120; + monster[i].mHit2 += 120; + monster[i].mExp = 4 * (monster[i].mExp + 1000); + monster[i].mMinDamage = 4 * monster[i].mMinDamage + 6; + monster[i].mMaxDamage = 4 * monster[i].mMaxDamage + 6; + monster[i].mMinDamage2 = 4 * monster[i].mMinDamage2 + 6; + monster[i].mArmorClass += 80; + monster[i].mMaxDamage2 = 4 * monster[i].mMaxDamage2 + 6; + monster[i].mMagicRes = monst->MData->mMagicRes2; } } -// 679660: using guessed type char gbMaxPlayers; void __cdecl ClrAllMonsters() { - int i; // edi - int v6; // eax + MonsterStruct *Monst; - for ( i = 0; i < 200; i++ ) + for ( int i = 0; i < 200; i++ ) { + Monst = &monster[i]; ClearMVars(i); - monster[i].mName = "Invalid Monster"; - monster[i]._mgoal = 0; - monster[i]._mmode = 0; - monster[i]._mVar1 = 0; - monster[i]._mVar2 = 0; - monster[i]._mx = 0; - monster[i]._my = 0; - monster[i]._mfutx = 0; - monster[i]._mfuty = 0; - monster[i]._moldx = 0; - monster[i]._moldy = 0; - monster[i]._mdir = random(89, 8); - monster[i]._mxvel = 0; - monster[i]._myvel = 0; - monster[i]._mAFNum = 0; - monster[i]._mAnimDelay = 0; - monster[i]._mAnimCnt = 0; - monster[i]._mAnimLen = 0; - monster[i]._mAnimFrame = 0; - monster[i]._mFlags = 0; - monster[i]._mDelFlag = 0; - v6 = random(89, gbActivePlayers); - monster[i]._menemy = v6; - monster[i]._menemyx = plr[v6]._px; - monster[i]._menemyy = plr[v6]._py; - } -} -// 67862C: using guessed type char gbActivePlayers; - -bool __fastcall MonstPlace(int xp, int yp) + Monst->mName = "Invalid Monster"; + Monst->_mgoal = 0; + Monst->_mmode = 0; + Monst->_mVar1 = 0; + Monst->_mVar2 = 0; + Monst->_mx = 0; + Monst->_my = 0; + Monst->_mfutx = 0; + Monst->_mfuty = 0; + Monst->_moldx = 0; + Monst->_moldy = 0; + Monst->_mdir = random(89, 8); + Monst->_mxvel = 0; + Monst->_myvel = 0; + Monst->_mAFNum = 0; + Monst->_mAnimDelay = 0; + Monst->_mAnimCnt = 0; + Monst->_mAnimLen = 0; + Monst->_mAnimFrame = 0; + Monst->_mFlags = 0; + Monst->_mDelFlag = 0; + Monst->_menemy = random(89, gbActivePlayers); + Monst->_menemyx = plr[Monst->_menemy]._px; + Monst->_menemyy = plr[Monst->_menemy]._py; + } +} + +BOOL __fastcall MonstPlace(int xp, int yp) { if ( xp < 0 || xp >= 112 || yp < 0 || yp >= 112 @@ -920,11 +844,11 @@ bool __fastcall MonstPlace(int xp, int yp) || dFlags[xp][yp] & 2 || dFlags[xp][yp] & 8 ) { - return 0; + return FALSE; } else { - return SolidLoc(xp, yp) == 0; + return !SolidLoc(xp, yp); } } @@ -6410,7 +6334,7 @@ void __fastcall MAI_Golum(int i) signed int v12; // ecx int v13; // eax bool v14; // eax - int *v15; // esi + unsigned char *v15; // esi bool v16; // eax int v17; // esi int v18; // edi diff --git a/Source/monster.h b/Source/monster.h index d3bb0a759..73a3c05de 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -25,7 +25,7 @@ void __fastcall InitMonsterGFX(int monst); void __fastcall ClearMVars(int i); void __fastcall InitMonster(int i, int rd, int mtype, int x, int y); void __cdecl ClrAllMonsters(); -bool __fastcall MonstPlace(int xp, int yp); +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(); diff --git a/Source/player.cpp b/Source/player.cpp index dc90b5367..12d3cb1f4 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -1270,13 +1270,14 @@ void __fastcall InitPlayerLoc(int pnum, bool flag) } } -bool __fastcall SolidLoc(int x, int y) +BOOL __fastcall SolidLoc(int x, int y) { - bool result; // eax + BOOL result; // eax if ( x < 0 || y < 0 || x >= 112 || y >= 112 ) - result = 0; + result = FALSE; else + // TODO: remove cast when changing nSolidTable to unsigned char result = (unsigned char)nSolidTable[dPiece[0][y + 112 * x]]; return result; } diff --git a/Source/player.h b/Source/player.h index d9875981e..09820bbc3 100644 --- a/Source/player.h +++ b/Source/player.h @@ -38,7 +38,7 @@ void __fastcall AddPlrMonstExper(int lvl, int exp, char pmask); void __fastcall InitPlayer(int pnum, bool FirstTime); void __cdecl InitMultiView(); void __fastcall InitPlayerLoc(int pnum, bool flag); -bool __fastcall SolidLoc(int x, int y); +BOOL __fastcall SolidLoc(int x, int y); bool __fastcall PlrDirOK(int pnum, int dir); void __fastcall PlrClrTrans(int x, int y); void __fastcall PlrDoTrans(int x, int y); diff --git a/structs.h b/structs.h index ce347c540..9a39c7955 100644 --- a/structs.h +++ b/structs.h @@ -139,7 +139,7 @@ struct MonsterData int flags; // width? int mType; char *GraphicType; - int has_special; + BOOL has_special; char *sndfile; int snd_special; int has_trans; @@ -480,8 +480,8 @@ struct MissileStruct struct AnimStruct { - int CMem; // [unsigned] char * ?? - unsigned char *Frames[8]; // array of 8 pointers // TODO: to CelBuf struct? + unsigned char *CMem; + unsigned char *Frames[8]; // TODO: to CelBuf struct? int Rate; int Delay; }; @@ -510,12 +510,12 @@ struct MonsterStruct { int _mMTidx; int _mmode; - int _mgoal; + unsigned char _mgoal; int _mgoalvar1; int _mgoalvar2; int _mgoalvar3; int field_18; - int _pathcount; + unsigned char _pathcount; int _mx; int _my; int _mfutx; @@ -563,7 +563,7 @@ struct MonsterStruct unsigned char _uniqtrans; char _udeadval; char mWhoHit; - short mLevel; /* char */ + char mLevel; unsigned short mExp; unsigned char mHit; unsigned char mMinDamage; @@ -573,7 +573,7 @@ struct MonsterStruct unsigned char mMaxDamage2; char mArmorClass; char falign_CB; - int mMagicRes; /* ushort */ + unsigned short mMagicRes; int mtalkmsg; unsigned char leader; unsigned char leaderflag; From 375d0d469bcf0825d6cd8d808789e987fc25c53f Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sat, 11 Aug 2018 23:51:04 +0200 Subject: [PATCH 09/16] Fixed InitMonsterGFX, it now actually works! --- Source/monster.cpp | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index a7f7a71f4..133c653f2 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -563,54 +563,51 @@ void __fastcall InitMonsterGFX(int monst) int mtype = (unsigned char)Monsters[monst].mtype; char strBuff[256]; - MonsterData *pmonsterdata = &monsterdata[mtype]; - for ( int anim = 0; anim < 6; anim++ ) { - if ( (animletter[anim] != 's' || pmonsterdata->has_special) && pmonsterdata->Frames ) + if ( (animletter[anim] != 's' || monsterdata[mtype].has_special) && monsterdata[mtype].Frames[anim] > 0 ) { - sprintf(strBuff, pmonsterdata->GraphicType, animletter[anim]); + sprintf(strBuff, monsterdata[mtype].GraphicType, animletter[anim]); - Monsters[monst].Anims[anim].CMem = LoadFileInMem(strBuff, NULL); + unsigned char* celBuf = LoadFileInMem(strBuff, NULL); + Monsters[monst].Anims[anim].CMem = celBuf; if ( Monsters[monst].mtype != MT_GOLEM || (animletter[anim] != 's' && animletter[anim] != 'd') ) { for ( int i = 0; i < 8; i++ ) { - // TODO: this can probably be cleaned up by defining the CMem structure Monsters[monst].Anims[anim].Frames[i] = - (unsigned char*) - ((int)Monsters[monst].Anims[anim].CMem + ((int *)Monsters[monst].Anims[anim].CMem)[i]); + &celBuf[((int *)celBuf)[i]]; } } else { for ( int i = 0; i < 8; i++ ) { - Monsters[monst].Anims[anim].Frames[i] = Monsters[monst].Anims[anim].CMem; + Monsters[monst].Anims[anim].Frames[i] = celBuf; } } } // TODO: either the AnimStruct members have wrong naming or the MonsterData ones it seems - Monsters[monst].Anims[anim].Rate = pmonsterdata->Frames[0]; - Monsters[monst].Anims[anim].Delay = pmonsterdata->Rate[0]; + Monsters[monst].Anims[anim].Rate = monsterdata[mtype].Frames[anim]; + Monsters[monst].Anims[anim].Delay = monsterdata[mtype].Rate[anim]; } - Monsters[monst].MData = pmonsterdata; - Monsters[monst].flags_1 = pmonsterdata->flags; - Monsters[monst].flags_2 = (pmonsterdata->flags - 64) >> 1; - Monsters[monst].mMinHP = pmonsterdata->mMinHP; - Monsters[monst].mMaxHP = pmonsterdata->mMaxHP; - Monsters[monst].has_special = pmonsterdata->has_special; - Monsters[monst].mAFNum = pmonsterdata->mAFNum; + Monsters[monst].MData = &monsterdata[mtype]; + Monsters[monst].flags_1 = monsterdata[mtype].flags; + Monsters[monst].flags_2 = (monsterdata[mtype].flags - 64) >> 1; + Monsters[monst].mMinHP = monsterdata[mtype].mMinHP; + Monsters[monst].mMaxHP = monsterdata[mtype].mMaxHP; + Monsters[monst].has_special = monsterdata[mtype].has_special; + Monsters[monst].mAFNum = monsterdata[mtype].mAFNum; - if ( pmonsterdata->has_trans ) + if ( monsterdata[mtype].has_trans ) { - Monsters[monst].trans_file = LoadFileInMem(pmonsterdata->TransFile, NULL); - InitMonsterTRN(monst, pmonsterdata->has_special); + Monsters[monst].trans_file = LoadFileInMem(monsterdata[mtype].TransFile, NULL); + InitMonsterTRN(monst, monsterdata[mtype].has_special); void *trans_file = Monsters[monst].trans_file; Monsters[monst].trans_file = NULL; From 2e3a2f754437f54a6007386d0d6bd64b26ee3b10 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sun, 12 Aug 2018 17:49:19 +0200 Subject: [PATCH 10/16] Cleaned up `PlaceUniqueMonst` --- Source/monster.cpp | 447 +++++++++++++++++++-------------------------- 1 file changed, 183 insertions(+), 264 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 133c653f2..4880a0f58 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -857,324 +857,243 @@ void __fastcall PlaceMonster(int i, int mtype, int x, int y) void __fastcall PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize) { - MonsterStruct *v3; // esi - CMonster *v4; // ecx - int v5; // edx - int v6; // eax - int v8; // edi - int v9; // eax - int v10; // ebx - int v11; // eax - int i; // edx - int v13; // edx - BOOL v14; // edx - int(*v15)[112]; // ecx - int(*v16)[112]; // eax - int v17; // edi - char v18; // al - char *v19; // eax - int v20; // eax - bool v21; // zf - signed int v22; // eax - char v23; // cl - char v24; // al - int v25; // edx - int v26; // eax - int v27; // ecx - char v28; // al - char v29; // al - int v30; // ecx - int v31; // eax - int v32; // eax - int v33; // eax - int v34; // eax - char v35; // al - short v36; // cx - char v37; // al - int v38; // ecx - int v39; // eax - int v40; // edx - int v41; // eax - char filestr[64]; // [esp+4h] [ebp-60h] - int v43; // [esp+44h] [ebp-20h] - CMonster *v44; // [esp+48h] [ebp-1Ch] - int v45; // [esp+4Ch] [ebp-18h] - int *v46; // [esp+50h] [ebp-14h] - int v47; // [esp+54h] [ebp-10h] - int v48; // [esp+58h] [ebp-Ch] - int mtype; // [esp+5Ch] [ebp-8h] - int xp; // [esp+60h] [ebp-4h] - - v46 = 0; - v48 = uniqindex; - v3 = &monster[nummonsters]; - v4 = (CMonster *)&UniqMonst[uniqindex]; - v43 = miniontype; - v44 = v4; - if ( (uniquetrans + 19) << 8 < LIGHTSIZE ) + MonsterStruct *Monst = &monster[nummonsters]; + UniqMonstStruct *Uniq = &UniqMonst[uniqindex]; + int x; + int y; + char filestr[64]; + int mtype; + + if ( (uniquetrans + 19) << 8 < 6912 ) { mtype = 0; if ( nummtypes > 0 ) { - v5 = v4->mtype; - v4 = Monsters; - do + for ( int i = 0; i < nummtypes; i++ ) { - if ( (unsigned char)v4->mtype == v5 ) + if ( Monsters[i].mtype == Uniq->mtype ) + { break; - ++mtype; - ++v4; + } + + mtype++; } - while ( mtype < nummtypes ); } + do { - do + for ( int i = 0; i < 1000; i++ ) { - v6 = random(91, 80); - v8 = v6 + 16; - v9 = random(91, 80); - v47 = 0; - v4 = (CMonster *)(v8 - 3); - v10 = v9 + 16; - xp = v8 - 3; - if ( __OFSUB__(v8 - 3, v8 + 3) ^ 1 ) + int count = 0; + x = random(91, 80) + 16; + y = random(91, 80) + 16; + + for ( int xp = x - 3; xp < x + 3; xp++ ) { - v11 = v9 + 19; - do + for ( int yp = y - 3; yp < y + 3; yp++ ) { - for ( i = v10 - 3; ; i = v45 + 1 ) + if ( yp >= 0 && yp < 112 && xp >= 0 && xp < 112 && MonstPlace(xp, yp) ) { - v45 = i; - if ( i >= v11 ) - break; - if ( i >= 0 && i < 112 && xp >= 0 && xp < 112 && MonstPlace(xp, i) ) - ++v47; - v11 = v10 + 3; + ++count; } - ++xp; - v4 = (CMonster *)(v8 + 3); } - while ( xp < v8 + 3 ); - if ( v47 >= 9 ) - break; } - v46 = (int *)((char *)v46 + 1); + + if ( count >= 9 ) + break; } - while ( (signed int)v46 < 1000 ); } - while ( !MonstPlace(v8, v10) ); - v13 = v48; - if ( v48 == 3 ) + while ( !MonstPlace(x, y) ); + + if ( uniqindex == 3 ) { - v8 = 2 * setpc_x + 24; - v10 = 2 * setpc_y + 28; + x = 2 * setpc_x + 24; + y = 2 * setpc_y + 28; } - if ( v48 == 8 ) + if ( uniqindex == 8 ) { - v8 = 2 * setpc_x + 22; - v10 = 2 * setpc_y + 23; + x = 2 * setpc_x + 22; + y = 2 * setpc_y + 23; } - if ( v48 == 2 ) + if ( uniqindex == 2 ) { - xp = 0; - v45 = 1; - if ( themeCount > 0 ) + int count2 = 1; + for ( int i = 0; i < themeCount; i++ ) { - v46 = &themeLoc[0].y; - do + if ( i == zharlib && count2 == 1 ) { - if ( xp == zharlib && v45 == 1 ) - { - v45 = 0; - v8 = 2 * *(v46 - 1) + 20; - v10 = 2 * *v46 + 20; - } - ++xp; - v46 += 5; + count2 = 0; + x = 2 * themeLoc[i].x + 20; + y = 2 * themeLoc[i].y + 20; } - while ( xp < themeCount ); } - v13 = v48; } if ( gbMaxPlayers == 1 ) { - if ( v13 == 4 ) + if ( uniqindex == 4 ) { - v8 = 32; - v10 = 46; + x = 32; + y = 46; } - if ( v13 == 5 ) + if ( uniqindex == 5 ) { - v8 = 40; - v10 = 45; + x = 40; + y = 45; } - if ( v13 == 6 ) + if ( uniqindex == 6 ) { - v8 = 38; - v10 = 49; + x = 38; + y = 49; } - if ( v13 == 1 ) + if ( uniqindex == 1 ) { - v8 = 35; - v10 = 47; + x = 35; + y = 47; } } else { - if ( v13 == 4 ) + if ( uniqindex == 4 ) { - v8 = 2 * setpc_x + 19; - v10 = 2 * setpc_y + 22; + x = 2 * setpc_x + 19; + y = 2 * setpc_y + 22; } - if ( v13 == 5 ) + if ( uniqindex == 5 ) { - v8 = 2 * setpc_x + 21; - v10 = 2 * setpc_y + 19; + x = 2 * setpc_x + 21; + y = 2 * setpc_y + 19; } - if ( v13 == 6 ) + if ( uniqindex == 6 ) { - v8 = 2 * setpc_x + 21; - v10 = 2 * setpc_y + 25; + x = 2 * setpc_x + 21; + y = 2 * setpc_y + 25; } } - if ( v13 == 9 ) + if ( uniqindex == 9 ) { - v14 = 0; - v10 = 0; - v15 = dPiece; - do + BOOL done = FALSE; + + for ( x = 0; x < 112 && !done; x++ ) { - if ( v14 ) - break; - v8 = 0; - v16 = v15; - do + for ( y = 0; y < 112 && !done; y++ ) { - if ( v14 ) - break; - v14 = (*v16)[0] == 367; - ++v8; - ++v16; + done = dPiece[x][y] == 367; } - while ( v8 < 112 ); - v15 = (int(*)[112])((char *)v15 + 4); - ++v10; - } - while ( (signed int)v15 < (signed int)dPiece[1] ); - } - PlaceMonster(nummonsters, mtype, v8, v10); - v17 = (int)v44; - v3->_uniqtype = v48 + 1; - v18 = *(_BYTE *)(v17 + 12); - if ( v18 ) - _LOBYTE(v3->mLevel) = 2 * v18; + } + } + + PlaceMonster(nummonsters, mtype, x, y); + Monst->_uniqtype = uniqindex + 1; + + if ( Uniq->mlevel ) + Monst->mLevel = 2 * Uniq->mlevel; else - _LOBYTE(v3->mLevel) += 5; - v19 = *(char **)(v17 + 4); - v3->mExp *= 2; - v3->mName = v19; - v20 = *(unsigned short *)(v17 + 14) << 6; - v21 = gbMaxPlayers == 1; - v3->_mmaxhp = v20; - if ( v21 ) - { - v22 = v20 >> 1; - v3->_mmaxhp = v22; - if ( v22 < 64 ) - v3->_mmaxhp = 64; - } - v23 = *(_BYTE *)(v17 + 19); - v3->_mhitpoints = v3->_mmaxhp; - v3->_mAi = *(_BYTE *)(v17 + 16); - v3->_mint = *(_BYTE *)(v17 + 17); - v24 = *(_BYTE *)(v17 + 18); - v25 = v3->_my; - v3->mMinDamage = v24; - v3->mMinDamage2 = v24; - _LOWORD(v3->mMagicRes) = *(_WORD *)(v17 + 20); - v26 = *(_DWORD *)(v17 + 28); - v3->mMaxDamage = v23; - v3->mMaxDamage2 = v23; - v27 = v3->_mx; - v3->mtalkmsg = v26; - v28 = AddLight(v27, v25, 3); - v21 = gbMaxPlayers == 1; - v3->mlid = v28; - if ( v21 ) - goto LABEL_83; - v29 = v3->_mAi; - if ( v29 == AI_LAZHELP ) - v3->mtalkmsg = 0; - if ( v29 != AI_LAZURUS || quests[15]._qvar1 <= 3u ) - { - LABEL_83: - if ( v3->mtalkmsg ) - _LOBYTE(v3->_mgoal) = 6; + Monst->mLevel += 5; + + Monst->mExp *= 2; + Monst->mName = Uniq->mName; + Monst->_mmaxhp = Uniq->mmaxhp << 6; + + if ( gbMaxPlayers == 1 ) + { + Monst->_mmaxhp = Monst->_mmaxhp >> 1; + if ( 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); + + if ( gbMaxPlayers == 1 ) + { + if ( Monst->mtalkmsg ) + { + Monst->_mgoal = 6; + } } else { - _LOBYTE(v3->_mgoal) = 1; + 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; + } } - v30 = gnDifficulty; + if ( gnDifficulty == DIFF_NIGHTMARE ) { - v31 = v3->_mmaxhp; - _LOBYTE(v3->mLevel) += 15; - v32 = 3 * v31 + 64; - v3->_mmaxhp = v32; - v3->_mhitpoints = v32; - v3->mExp = 2 * (v3->mExp + 1000); - v3->mMinDamage = 2 * (v3->mMinDamage + 2); - v3->mMaxDamage = 2 * (v3->mMaxDamage + 2); - v3->mMinDamage2 = 2 * (v3->mMinDamage2 + 2); - v3->mMaxDamage2 = 2 * (v3->mMaxDamage2 + 2); - } - if ( v30 == DIFF_HELL ) - { - v33 = v3->_mmaxhp; - _LOBYTE(v3->mLevel) += 30; - v34 = 4 * v33 + 192; - v3->_mmaxhp = v34; - v3->_mhitpoints = v34; - v3->mExp = 4 * (v3->mExp + 1000); - v3->mMinDamage = 4 * v3->mMinDamage + 6; - v3->mMaxDamage = 4 * v3->mMaxDamage + 6; - v3->mMinDamage2 = 4 * v3->mMinDamage2 + 6; - v3->mMaxDamage2 = 4 * v3->mMaxDamage2 + 6; - } - sprintf(filestr, "Monsters\\Monsters\\%s.TRN", *(_DWORD *)(v17 + 8)); + 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_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; + } + + sprintf(filestr, "Monsters\\Monsters\\%s.TRN", Uniq->mName); LoadFileWithMem(filestr, &pLightTbl[256 * (uniquetrans + 19)]); - v35 = uniquetrans; - v36 = *(_WORD *)(v17 + 22); - ++uniquetrans; - v3->_uniqtrans = v35; - if ( v36 & 4 ) - { - v37 = *(_BYTE *)(v17 + 24); - v3->mHit = v37; - v3->mHit2 = v37; - } - if ( v36 & 8 ) - v3->mArmorClass = *(_BYTE *)(v17 + 24); - ++nummonsters; - if ( v36 & 1 ) - PlaceGroup(v43, unpackfilesize, v36, nummonsters - 1); - if ( v3->_mAi != AI_GARG ) - { - v38 = (int)v3->MType; - v39 = *(_DWORD *)(v38 + 4 * v3->_mdir + 8); - v40 = v3->_mAnimLen - 1; - v3->_mAFNum = v39; - v41 = random(88, v40); - v3->_mFlags &= 0xFFFFFFFB; - v3->_mmode = 0; - v3->_mAnimFrame = v41 + 1; + + Monst->_uniqtrans = uniquetrans++; + + if ( Uniq->mUnqAttr & 4 ) + { + Monst->mHit = Uniq->mUnqVar1; + Monst->mHit2 = Uniq->mUnqVar1; + } + if ( Uniq->mUnqAttr & 8 ) + { + Monst->mArmorClass = Uniq->mUnqVar1; + } + + nummonsters++; + + if ( Uniq->mUnqAttr & 1 ) + { + PlaceGroup(miniontype, unpackfilesize, Uniq->mUnqAttr, nummonsters - 1); + } + + if ( Monst->_mAi != AI_GARG ) + { + Monst->_mAFNum = (int)Monst->MType->Anims[0].Frames[Monst->_mdir]; + Monst->_mFlags &= 0xFFFFFFFB; + Monst->_mmode = 0; + Monst->_mAnimFrame = random(88, Monst->_mAnimLen - 1) + 1; } } } -// 679660: using guessed type char gbMaxPlayers; -// 6AAA64: using guessed type int zharlib; void __cdecl PlaceQuestMonsters() { @@ -1531,12 +1450,12 @@ void __cdecl InitMonsters() if ( currlevel == 2 ) { v17 = random(95, 2) + 1; -LABEL_40: + LABEL_40: v18 = v17 + 1; goto LABEL_41; } v18 = random(95, 3) + 3; -LABEL_41: + LABEL_41: PlaceGroup(v15, v18, 0, 0); if ( nummonsters >= totalmonsters ) goto LABEL_42; @@ -4678,7 +4597,7 @@ void __fastcall MAI_SkelSd(int i) if ( v13 >= v14 ) { v15 = random(105, 10) + 2 * (5 - (unsigned char)v2->_mint); -LABEL_10: + LABEL_10: M_StartDelay(arglist, v15); goto LABEL_16; } @@ -4811,8 +4730,8 @@ void __fastcall MAI_Snake(int i) { v14 = esi3->_mVar1; if ( v14 == 13 - || v14 == 14 - || (v15 = random(105, 100), v16 = (unsigned char)esi3->_mint + 20, v15 < v16) ) + || v14 == 14 + || (v15 = random(105, 100), v16 = (unsigned char)esi3->_mint + 20, v15 < v16) ) { M_StartAttack(arglist); LABEL_49: @@ -6859,8 +6778,8 @@ void __fastcall MAI_Counselor(int i) if ( LineClear(monster[v2]._mx, monster[v2]._my, x2, y2) ) { v32 = random( - 77, - (unsigned char)monster[v2].mMaxDamage - (unsigned char)monster[v2].mMinDamage + 1); + 77, + (unsigned char)monster[v2].mMaxDamage - (unsigned char)monster[v2].mMinDamage + 1); M_StartRAttack( v1, (unsigned char)counsmiss[(unsigned char)monster[v2]._mint], /* counsmiss is local */ @@ -6891,9 +6810,9 @@ void __fastcall MAI_Counselor(int i) goto LABEL_39; } if ( monster[v2]._mVar1 == 13 - || (v29 = random(105, 100), - v30 = 2 * (unsigned char)monster[v2]._mint + 20, - v29 < v30) ) + || (v29 = random(105, 100), + v30 = 2 * (unsigned char)monster[v2]._mint + 20, + v29 < v30) ) { M_StartRAttack(v1, -1, 0); AddMissile(monster[v2]._mx, monster[v2]._my, 0, 0, monster[v2]._mdir, 11, 1, v1, 4, 0); From 834db70385b9124214ebc5ee05386d32f2b60b8d Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sun, 19 Aug 2018 23:12:07 +0200 Subject: [PATCH 11/16] Cleaned up `PlaceGroup` --- Source/drlg_l1.cpp | 2 +- Source/drlg_l2.cpp | 4 +- Source/drlg_l3.cpp | 4 +- Source/monster.cpp | 227 +++++++++++++++++++-------------------------- Source/monster.h | 2 +- 5 files changed, 103 insertions(+), 136 deletions(-) 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(); From 22fcf9a074d70c7bd7be71c1528b6c857902b5f8 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Sun, 19 Aug 2018 23:24:55 +0200 Subject: [PATCH 12/16] Fixed stuff after rebase --- Source/drlg_l1.cpp | 2 +- Source/drlg_l2.cpp | 4 ++-- Source/drlg_l3.cpp | 4 ++-- Source/monster.cpp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/drlg_l1.cpp b/Source/drlg_l1.cpp index 11dff1cd3..65ccb88ca 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((char *)v4, 0, 0); + SetMapObjects(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 249351215..ca529dc6b 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(ptr, 0, 0); + SetMapMonsters((unsigned char *)ptr, 0, 0); + SetMapObjects((unsigned char *)ptr, 0, 0); mem_free_dbg(ptr); } diff --git a/Source/drlg_l3.cpp b/Source/drlg_l3.cpp index 728a2c9cb..0216e1da0 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(v5, 0, 0); + SetMapMonsters((unsigned char *)v5, 0, 0); + SetMapObjects((unsigned char *)v5, 0, 0); v19 = dPiece; do { diff --git a/Source/monster.cpp b/Source/monster.cpp index 7f2c086e9..59692e4b6 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1554,7 +1554,7 @@ void __fastcall SetMapMonsters(unsigned char *pMap, int startx, int starty) int startya; // [esp+20h] [ebp+8h] v12 = startx; - v3 = (char *)pMap; + v3 = pMap; AddMonsterType(MT_GOLEM, 2); AddMonster(1, 0, 0, 0, 0); AddMonster(1, 0, 0, 0, 0); From 302d1c65070cc8f9245dd08030bcef8201680e23 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Mon, 20 Aug 2018 00:19:07 +0200 Subject: [PATCH 13/16] Flipped branches of PlaceQuestMonster to make it near byte-perfect. --- Source/monster.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 59692e4b6..3f57ed6f9 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1100,14 +1100,7 @@ void __cdecl PlaceQuestMonsters() int skeltype; unsigned char *setp; - if ( setlevel ) - { - if ( setlvlnum == SL_SKELKING ) - { - PlaceUniqueMonst(1, 0, 0); - } - } - else + if ( !setlevel ) { if ( QuestStatus(QTYPE_BUTCH) ) { @@ -1181,6 +1174,13 @@ void __cdecl PlaceQuestMonsters() mem_free_dbg(setp); } } + else + { + if ( setlvlnum == SL_SKELKING ) + { + PlaceUniqueMonst(1, 0, 0); + } + } } void __fastcall PlaceGroup(int mtype, int num, int leaderf, int leader) From 4391b247a8c1dd3237186b5cab18188a6d788a94 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Mon, 20 Aug 2018 00:54:36 +0200 Subject: [PATCH 14/16] Moved `monst->MData` to temporary variable to get the code very close to the original --- Source/monster.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 3f57ed6f9..2974918e2 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -690,6 +690,8 @@ void __fastcall ClearMVars(int i) void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) { CMonster *monst = &Monsters[mtype]; + MonsterData *mdata = monst->MData; + monster[i]._mmode = MM_STAND; monster[i]._mx = x; @@ -700,9 +702,9 @@ void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) monster[i]._mfuty = y; monster[i]._moldy = y; monster[i]._mMTidx = mtype; - monster[i].mName = monst->MData->mName; + monster[i].mName = mdata->mName; monster[i].MType = monst; - monster[i].MData = monst->MData; + monster[i].MData = mdata; monster[i]._mAFNum = (int)monst->Anims[0].Frames[rd]; monster[i]._mAnimDelay = monst->Anims[0].Delay; monster[i]._mAnimCnt = random(88, monst->Anims[0].Delay - 1); @@ -728,8 +730,8 @@ void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) } monster[i]._mhitpoints = monster[i]._mmaxhp; - monster[i]._mAi = monst->MData->mAi; - monster[i]._mint = monst->MData->mInt; + monster[i]._mAi = mdata->mAi; + monster[i]._mint = mdata->mInt; monster[i]._pathcount = 0; monster[i]._uniqtype = 0; monster[i]._msquelch = 0; @@ -742,20 +744,20 @@ void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) monster[i]._mRndSeed = GetRndSeed(); monster[i].mWhoHit = 0; monster[i]._mAISeed = GetRndSeed(); - monster[i].mLevel = monst->MData->mLevel; - monster[i].mExp = monst->MData->mExp; - monster[i].mHit = monst->MData->mHit; - monster[i].mMinDamage = monst->MData->mMinDamage; - monster[i].mMaxDamage = monst->MData->mMaxDamage; - monster[i].mHit2 = monst->MData->mHit2; - monster[i].mMinDamage2 = monst->MData->mMinDamage2; - monster[i].mMaxDamage2 = monst->MData->mMaxDamage2; - monster[i].mArmorClass = monst->MData->mArmorClass; + monster[i].mLevel = mdata->mLevel; + monster[i].mExp = mdata->mExp; + monster[i].mHit = mdata->mHit; + monster[i].mMinDamage = mdata->mMinDamage; + monster[i].mMaxDamage = mdata->mMaxDamage; + monster[i].mHit2 = mdata->mHit2; + monster[i].mMinDamage2 = mdata->mMinDamage2; + monster[i].mMaxDamage2 = mdata->mMaxDamage2; + monster[i].mArmorClass = mdata->mArmorClass; monster[i].leader = 0; monster[i].leaderflag = 0; - monster[i].mMagicRes = monst->MData->mMagicRes; + monster[i].mMagicRes = mdata->mMagicRes; monster[i].mtalkmsg = 0; - monster[i]._mFlags = monst->MData->mFlags; + monster[i]._mFlags = mdata->mFlags; if ( monster[i]._mAi == AI_GARG ) { @@ -793,7 +795,7 @@ void __fastcall InitMonster(int i, int rd, int mtype, int x, int y) monster[i].mMinDamage2 = 4 * monster[i].mMinDamage2 + 6; monster[i].mArmorClass += 80; monster[i].mMaxDamage2 = 4 * monster[i].mMaxDamage2 + 6; - monster[i].mMagicRes = monst->MData->mMagicRes2; + monster[i].mMagicRes = mdata->mMagicRes2; } } From 50cbbded0ca22aa853aaf1d38045ef694c36778a Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Mon, 20 Aug 2018 01:40:54 +0200 Subject: [PATCH 15/16] Flipped setlevel check for better matching with the original binary --- Source/monster.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index 2974918e2..dc03d87ac 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -441,6 +441,7 @@ void __cdecl GetLevelMTypes() // this array is merged with skeltypes down below. int typelist[MAXMONSTERS]; + int skeltypes[NUM_MTYPES]; int minl; // min level int maxl; // max level @@ -462,14 +463,8 @@ void __cdecl GetLevelMTypes() return; } - if ( setlevel ) + if ( !setlevel ) { - if ( setlvlnum == SL_SKELKING ) - AddMonsterType(MT_SKING, 4); - return; - } - - if ( QuestStatus(QTYPE_BUTCH) ) AddMonsterType(MT_CLEAVER, 2); if ( QuestStatus(QTYPE_GARB) ) @@ -487,8 +482,6 @@ void __cdecl GetLevelMTypes() { AddMonsterType(MT_SKING, 4); - - int skeltypes[NUM_MTYPES]; const int numskeltypes = 19; nt = 0; @@ -556,6 +549,15 @@ void __cdecl GetLevelMTypes() } } } + + } + else + { + if ( setlvlnum == SL_SKELKING ) + AddMonsterType(MT_SKING, 4); + return; + } + } void __fastcall InitMonsterGFX(int monst) From 9d31a6e29ca9764b857a50a06b284700f07740d3 Mon Sep 17 00:00:00 2001 From: Dennis Duda Date: Mon, 20 Aug 2018 01:41:34 +0200 Subject: [PATCH 16/16] Flip check in `AddMonsterType` to make it near binary perfect --- Source/monster.cpp | 124 ++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 63 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index dc03d87ac..c4053458b 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -411,14 +411,12 @@ void __cdecl InitLevelMonsters() int __fastcall AddMonsterType(int type, int placeflag) { - BOOL done; + BOOL done = FALSE; int i; - done = FALSE; - for ( i = 0; i < nummtypes && !done; i++ ) { - done = type == Monsters[i].mtype; + done = Monsters[i].mtype == type; } i--; @@ -465,90 +463,90 @@ void __cdecl GetLevelMTypes() if ( !setlevel ) { - if ( QuestStatus(QTYPE_BUTCH) ) - AddMonsterType(MT_CLEAVER, 2); - if ( QuestStatus(QTYPE_GARB) ) - AddMonsterType(UniqMonst[0].mtype, 4); - if ( QuestStatus(QTYPE_ZHAR) ) - AddMonsterType(UniqMonst[2].mtype, 4); - if ( QuestStatus(QTYPE_BOL) ) - AddMonsterType(UniqMonst[3].mtype, 4); - if ( QuestStatus(QTYPE_VEIL) ) - AddMonsterType(UniqMonst[7].mtype, 4); - if ( QuestStatus(QTYPE_WARLRD) ) - AddMonsterType(UniqMonst[8].mtype, 4); + if ( QuestStatus(QTYPE_BUTCH) ) + AddMonsterType(MT_CLEAVER, 2); + if ( QuestStatus(QTYPE_GARB) ) + AddMonsterType(UniqMonst[0].mtype, 4); + if ( QuestStatus(QTYPE_ZHAR) ) + AddMonsterType(UniqMonst[2].mtype, 4); + if ( QuestStatus(QTYPE_BOL) ) + AddMonsterType(UniqMonst[3].mtype, 4); + if ( QuestStatus(QTYPE_VEIL) ) + AddMonsterType(UniqMonst[7].mtype, 4); + if ( QuestStatus(QTYPE_WARLRD) ) + AddMonsterType(UniqMonst[8].mtype, 4); - if ( gbMaxPlayers != 1 && currlevel == quests[QTYPE_KING]._qlevel ) - { + if ( gbMaxPlayers != 1 && currlevel == quests[QTYPE_KING]._qlevel ) + { - AddMonsterType(MT_SKING, 4); - const int numskeltypes = 19; + AddMonsterType(MT_SKING, 4); + const int numskeltypes = 19; - nt = 0; - for ( i = MT_WSKELAX; i <= MT_WSKELAX + numskeltypes; i++ ) - { - if ( IsSkel(i) ) + nt = 0; + for ( i = MT_WSKELAX; i <= MT_WSKELAX + numskeltypes; i++ ) { - minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; - maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; - - if ( currlevel >= minl && currlevel <= maxl ) + if ( IsSkel(i) ) { - if ( MonstAvailTbl[i] & mamask ) + minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; + + if ( currlevel >= minl && currlevel <= maxl ) { - skeltypes[nt++] = i; + if ( MonstAvailTbl[i] & mamask ) + { + skeltypes[nt++] = i; + } } } } + AddMonsterType(skeltypes[random(88, nt)], 1); } - AddMonsterType(skeltypes[random(88, nt)], 1); - } - - nt = 0; - for ( i = 0; i < 111; i++ ) - { - minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; - maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; - if ( currlevel >= minl && currlevel <= maxl ) + nt = 0; + for ( i = 0; i < 111; i++ ) { - if ( MonstAvailTbl[i] & mamask ) + minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; + + if ( currlevel >= minl && currlevel <= maxl ) { - typelist[nt++] = i; + if ( MonstAvailTbl[i] & mamask ) + { + typelist[nt++] = i; + } } } - } - - if ( monstdebug ) - { - for ( i = 0; i < debugmonsttypes; i++ ) - AddMonsterType(DebugMonsters[i], 1); - } - else - { - while ( nt > 0 && nummtypes < MAX_LVLMTYPES && monstimgtot < 4000 ) + if ( monstdebug ) { - for ( i = 0; i < nt; ) + for ( i = 0; i < debugmonsttypes; i++ ) + AddMonsterType(DebugMonsters[i], 1); + } + else + { + + while ( nt > 0 && nummtypes < MAX_LVLMTYPES && monstimgtot < 4000 ) { - if ( monsterdata[typelist[i]].mType <= 4000 - monstimgtot ) + for ( i = 0; i < nt; ) { - i++; + if ( monsterdata[typelist[i]].mType <= 4000 - monstimgtot ) + { + i++; + } + else + { + typelist[i] = typelist[--nt]; + } } - else + + if ( nt != 0 ) { + i = random(88, nt); + AddMonsterType(typelist[i], 1); typelist[i] = typelist[--nt]; } } - - if ( nt != 0 ) - { - i = random(88, nt); - AddMonsterType(typelist[i], 1); - typelist[i] = typelist[--nt]; - } } - } } else