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/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 6e61ea863..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 @@ -3454,7 +3457,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 +3497,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 +6514,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 +7482,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..c4053458b 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]; @@ -311,7 +313,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,93 +359,64 @@ 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 ); } } void __cdecl InitLevelMonsters() { - int i; // eax + int i; nummtypes = 0; 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 < MAXMONSTERS; i++) + for ( i = 0; i < MAXMONSTERS; i++ ) monstactive[i] = i; 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 - - done = 0; + BOOL done = FALSE; + int i; - for(i = 0; i < nummtypes; i++) + for ( i = 0; i < nummtypes && !done; i++ ) { - if ( done ) - break; - - done = type == Monsters[i].mtype; + done = Monsters[i].mtype == type; } i--; @@ -459,34 +432,25 @@ 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 */ +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; + + // this array is merged with skeltypes down below. + int typelist[MAXMONSTERS]; + int skeltypes[NUM_MTYPES]; + + int minl; // min level + int maxl; // max level + char mamask = 3; // monster availability mask? + + int nt; // number of types? + + // 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 ) @@ -494,279 +458,222 @@ 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 ( setlvlnum == SL_SKELKING ) - AddMonsterType(MT_SKING, 4); - } - else + + if ( !setlevel ) { - if ( QuestStatus(6) ) + if ( QuestStatus(QTYPE_BUTCH) ) 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 ) + 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 ) { + AddMonsterType(MT_SKING, 4); - max = 0; - v6 = &monsterdata[8].mMaxDLvl; - v7 = 8; - do + const int numskeltypes = 19; + + nt = 0; + for ( i = MT_WSKELAX; i <= MT_WSKELAX + numskeltypes; i++ ) { - if ( IsSkel(v7) ) + if ( IsSkel(i) ) { - if ( currlevel >= 15 * (char)*(v6 - 1) / 30 + 1 - && currlevel <= 15 * (char)*v6 / 30 + 1 - && MonstAvailTbl[v7] & 3 ) + minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; + + if ( currlevel >= minl && currlevel <= maxl ) { - skeltypes[max++] = v7; + if ( MonstAvailTbl[i] & mamask ) + { + skeltypes[nt++] = i; + } } } - v6 += 128; - ++v7; } - while ( (signed int)v6 <= (signed int)&monsterdata[27].mMaxDLvl ); - v10 = random(88, max); - AddMonsterType(skeltypes[v10], 1); + AddMonsterType(skeltypes[random(88, nt)], 1); } - v11 = currlevel; - v12 = 0; - v13 = &monsterdata[0].mMaxDLvl; - max = 0; - do + + nt = 0; + for ( i = 0; i < 111; i++ ) { - if ( v11 >= 15 * (char)*(v13 - 1) / 30 + 1 && v11 <= 15 * (char)*v13 / 30 + 1 && MonstAvailTbl[max] & 3 ) - typelist[v12++] = max; - ++max; - v13 += 128; + minl = 15 * monsterdata[i].mMinDLvl / 30 + 1; + maxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1; + + if ( currlevel >= minl && currlevel <= maxl ) + { + if ( MonstAvailTbl[i] & mamask ) + { + typelist[nt++] = i; + } + } } - 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 { - while ( v12 > 0 ) + + while ( nt > 0 && nummtypes < MAX_LVLMTYPES && monstimgtot < 4000 ) { - if ( nummtypes >= 16 || monstimgtot >= 4000 ) - break; - v15 = 0; - v16 = v12 == 0; - if ( v12 > 0 ) + for ( i = 0; i < nt; ) { - v17 = 4000 - monstimgtot; - do + if ( monsterdata[typelist[i]].mType <= 4000 - monstimgtot ) { - v18 = &typelist[v15]; - if ( monsterdata[LOBYTE(*v18)].mType <= v17 ) - { - ++v15; - } - else - { - v19 = typelist[v12-- - 1]; //v19 = *(&v22 + v12--); /* fix and check */ - *v18 = v19; - } + i++; + } + else + { + typelist[i] = typelist[--nt]; } - while ( v15 < v12 ); - v16 = v12 == 0; } - if ( !v16 ) + + if ( nt != 0 ) { - v20 = &typelist[random(88, v12)]; - AddMonsterType(LOBYTE(*v20), 1); - v21 = typelist[v12-- - 1]; // v21 = *(&v22 + v12--); - *v20 = v21; + i = random(88, nt); + AddMonsterType(typelist[i], 1); + typelist[i] = typelist[--nt]; } } } + + } + else + { + if ( setlvlnum == SL_SKELKING ) + AddMonsterType(MT_SKING, 4); + return; } + } -// 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) { - 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 = Monsters[monst].Anims[0].Frames; - v5 = (int *)((char *)monsterdata[0].Frames + v3); - v30 = Monsters[monst].Anims[0].Frames; - v28 = (int *)((char *)monsterdata[0].Frames + v3); - do + int mtype = (unsigned char)Monsters[monst].mtype; + char strBuff[256]; + + 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' || monsterdata[mtype].has_special) && monsterdata[mtype].Frames[anim] > 0 ) { - 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, monsterdata[mtype].GraphicType, animletter[anim]); + + unsigned char* celBuf = LoadFileInMem(strBuff, NULL); + Monsters[monst].Anims[anim].CMem = celBuf; + + 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; + Monsters[monst].Anims[anim].Frames[i] = + &celBuf[((int *)celBuf)[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] = celBuf; + } + } + } + + // TODO: either the AnimStruct members have wrong naming or the MonsterData ones it seems + Monsters[monst].Anims[anim].Rate = monsterdata[mtype].Frames[anim]; + Monsters[monst].Anims[anim].Delay = monsterdata[mtype].Rate[anim]; + } + + + 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 ( monsterdata[mtype].has_trans ) { - v15 = &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(monsterdata[mtype].TransFile, NULL); + InitMonsterTRN(monst, monsterdata[mtype].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) { @@ -782,196 +689,165 @@ 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]; + MonsterData *mdata = monst->MData; + + + 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 = mdata->mName; + monster[i].MType = monst; + 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); + 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 = 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 = 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 = mdata->mAi; + monster[i]._mint = 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 = 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 = mdata->mMagicRes; + monster[i].mtalkmsg = 0; + monster[i]._mFlags = 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 = mdata->mMagicRes2; } } -// 679660: using guessed type char gbMaxPlayers; void __cdecl ClrAllMonsters() { - int i; // edi - int v6; // eax + MonsterStruct *Monst; - for(i = 0; i < MAXMONSTERS; 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 - || 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; + return FALSE; } else { - return SolidLoc(xp, yp) == 0; + return !SolidLoc(xp, yp); } } @@ -983,396 +859,315 @@ 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() { - 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 ( !setlevel ) { - 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(4) ) - AddMonsterType((char)UniqMonst[7].mtype, 1); - if ( QuestStatus(3) && zharlib == -1 ) + if ( QuestStatus(QTYPE_VEIL) ) + { + AddMonsterType(UniqMonst[7].mtype, 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); @@ -1381,139 +1176,106 @@ void __cdecl PlaceQuestMonsters() mem_free_dbg(setp); } } + else + { + if ( setlvlnum == SL_SKELKING ) + { + PlaceUniqueMonst(1, 0, 0); + } + } } -// 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 = 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; + } + + 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; } - ++nummonsters; - ++v30; - ++v26; + } - 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; @@ -1657,12 +1419,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; @@ -1717,7 +1479,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 +1522,7 @@ LABEL_25: } if ( v0 != 7 ) { -LABEL_20: + LABEL_20: if ( v0 == 8 && !quests[11]._qactive ) v3 = 0; goto LABEL_23; @@ -1770,7 +1532,7 @@ LABEL_20: v3 = 0; goto LABEL_20; } -LABEL_23: + LABEL_23: if ( v3 ) PlaceUniqueMonst(v0, v7, 8); goto LABEL_25; @@ -1825,7 +1587,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 +1637,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 +1733,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 +1744,7 @@ LABEL_17: v23 = v7; v25 = v19; } -LABEL_18: + LABEL_18: ++v21; v2 += 5430; } @@ -2001,8 +1763,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 +1788,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 +1817,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 +1842,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 +2762,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 +2831,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 +3034,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 +3058,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 +3147,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 +3157,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 +3168,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 +3507,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 +3531,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 +3624,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 +3987,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 +4049,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 +4127,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 +4178,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 +4284,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 +4295,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 +4305,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 +4359,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 +4420,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 +4503,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]; } } } @@ -4804,16 +4566,16 @@ 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; } } 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 +4604,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 ) @@ -4937,18 +4699,18 @@ 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: + 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 +4775,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 +4805,7 @@ LABEL_47: if ( v32 + 1 < 0 ) { v35 = v32 + 9; -LABEL_46: + LABEL_46: esi3->_mgoalvar2 = v35; goto LABEL_47; } @@ -5120,16 +4882,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 +4904,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 +4925,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 +4975,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 +4996,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 +5031,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 +5050,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 +5129,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 +5147,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 +5198,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 +5235,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 +5270,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 +5417,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 +5517,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 +5541,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 +5618,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 +5691,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 +5736,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 +5770,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 +5830,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 +5959,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 +5971,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 +5989,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 +6137,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 +6156,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 +6168,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); @@ -6448,7 +6219,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 @@ -6652,12 +6423,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 +6447,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 +6465,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 +6567,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 +6599,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 +6619,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 +6705,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 +6727,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); @@ -6976,8 +6747,8 @@ LABEL_39: 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 */ @@ -7002,15 +6773,15 @@ 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; } 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); @@ -7048,9 +6819,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 +6844,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 +6902,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 +6961,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 +7017,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 +7031,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 +7068,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 +7116,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 +7158,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 +7307,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 +7520,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 +7556,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 +7590,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 +7713,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 +7727,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 +7848,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 +7884,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 +7892,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 +7999,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 +8320,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 +8379,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 +8421,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 +8457,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; } @@ -8697,7 +8468,7 @@ LABEL_33: 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 @@ -8887,7 +8658,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..bc987b373 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(); @@ -25,11 +25,11 @@ 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(); -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(); @@ -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/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/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); 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 diff --git a/structs.h b/structs.h index d5e010d5e..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 * ?? - int Frames[8]; // unsigned char * + unsigned char *CMem; + unsigned char *Frames[8]; // TODO: to CelBuf struct? int Rate; int Delay; }; @@ -500,19 +500,22 @@ struct CMonster unsigned char mAFNum; char mdeadval; MonsterData *MData; - void *trans_file; + + // 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 { 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; @@ -560,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; @@ -570,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;