# HG changeset patch # User Nomad # Date 1361628021 -7200 # Node ID 747933903b1c674bc62f60322426599d988b545d # Parent ff964014159fb8b35e6061913b4113ea8e9cd396 00401A91 sub_401A91_AI(): actors drop when dead diff -r ff964014159f -r 747933903b1c Actor.h --- a/Actor.h Sat Feb 23 14:42:28 2013 +0200 +++ b/Actor.h Sat Feb 23 16:00:21 2013 +0200 @@ -40,6 +40,8 @@ /* 361 */ enum ACTOR_BUFF_INDEX { + ACTOR_BUFF_CHARM = 1, // an assumption + ACTOR_BUFF_SHRINK = 3, // an assumption ACTOR_BUFF_STONED = 5, ACTOR_BUFF_PARALYZED = 6, }; diff -r ff964014159f -r 747933903b1c AudioPlayer.cpp --- a/AudioPlayer.cpp Sat Feb 23 14:42:28 2013 +0200 +++ b/AudioPlayer.cpp Sat Feb 23 16:00:21 2013 +0200 @@ -1642,6 +1642,7 @@ { case 0: case OBJECT_Player: + case OBJECT_BModel: continue; case OBJECT_BLVDoor: diff -r ff964014159f -r 747933903b1c mm7_3.cpp --- a/mm7_3.cpp Sat Feb 23 14:42:28 2013 +0200 +++ b/mm7_3.cpp Sat Feb 23 16:00:21 2013 +0200 @@ -17671,7 +17671,7 @@ //----- (00401A91) -------------------------------------------------------- void __cdecl sub_401A91_AI() { - unsigned int v0; // esi@4 + //unsigned int v0; // esi@4 int v1; // eax@7 int v2; // ecx@7 int v3; // eax@7 @@ -17681,16 +17681,16 @@ __int16 v7; // cx@14 Player **v8; // esi@20 Player *pPlayer; // ecx@21 - Actor *pActor; // esi@34 - __int16 v11; // ax@34 - unsigned int v12; // eax@47 - signed int v13; // edi@47 - SpellBuff *v14; // ebx@47 - unsigned int v15; // edi@67 - char *v16; // eax@67 - unsigned int v17; // edx@67 - unsigned int v18; // ecx@67 - unsigned __int16 v19; // ax@72 + //Actor *pActor; // esi@34 + //__int16 v11; // ax@34 + //unsigned int v12; // eax@47 + //signed int v13; // edi@47 + //SpellBuff *v14; // ebx@47 + //unsigned int v15; // edi@67 + //char *v16; // eax@67 + //unsigned int v17; // edx@67 + //unsigned int v18; // ecx@67 + //unsigned __int16 v19; // ax@72 int *v20; // esi@80 Actor *v21; // ebx@80 unsigned __int16 v22; // ax@86 @@ -17763,7 +17763,7 @@ else MakeActorAIList_BLV(); - v0 = 0; + //v0 = 0; if ( uCurrentlyLoadedLevelType != LEVEL_Indoor && pParty->armageddon_timer > 0 ) { if ( pParty->armageddon_timer > 417 ) @@ -17824,9 +17824,9 @@ ++v8; } while ( (signed int)v8 <= (signed int)&pPlayers[4] ); - v0 = 0; - } - if ( pTurnEngine->field_1C != v0 ) + //v0 = 0; + } + if (pTurnEngine->field_1C) --pTurnEngine->field_1C; } } @@ -17838,26 +17838,34 @@ } - uActorID = v0; - if ( (signed int)uNumActors > (signed int)v0 ) - { - LODWORD(v80) = (int)(char *)pActors + 176; - do - { - pActor = (Actor *)(LODWORD(v80) - 176); - v11 = *(unsigned int *)LODWORD(v80); - v49 = *(unsigned int *)LODWORD(v80) == 5; - dword_4F6E08[uActorID] = 4; - if ( v49 || v11 == 11 || v11 == 19 || *(char *)(LODWORD(v80) - 139) & 4 ) - goto LABEL_78; - if ( !*(short *)(LODWORD(v80) - 136) && v11 != 4 ) - Actor::Die(uActorID); - v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1; - v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1; - v12 = 0; - v13 = 0; - v14 = (SpellBuff *)(LODWORD(v80) + 36); - do + //uActorID = v0; + for (uint i = 0; i < uNumActors; ++i) + { + auto actor = pActors + i; + //LODWORD(v80) = (int)(char *)pActors + 176; // uAIState + //do + //{ + //pActor = (Actor *)(LODWORD(v80) - 176); + //v11 = *(unsigned int *)LODWORD(v80); + //v49 = *(unsigned int *)LODWORD(v80) == 5; + dword_4F6E08[i] = 4; + if (actor->uAIState == Dead || actor->uAIState == Removed || actor->uAIState == Disabled || actor->uAttributes & 0x0400) + continue; + + if (!actor->sCurrentHP && actor->uAIState != Dying) + Actor::Die(i); + + //v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1; + //v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1; + //v12 = 0; + //v13 = 0; + //v14 = (SpellBuff *)(LODWORD(v80) + 36); + for (uint j = 0; j < 22; ++j) + { + if (j != 10) + actor->pActorBuffs[j]._4585CA(pParty->uTimePlayed); + } + /*do { if ( v13 != 10 ) { @@ -17867,61 +17875,56 @@ ++v13; ++v14; } - while ( v13 < 22 ); - if ( v84 != v12 - && SHIDWORD(pActor->pActorBuffs[3].uExpireTime) <= (signed int)v12 - && (SHIDWORD(pActor->pActorBuffs[3].uExpireTime) < (signed int)v12 - || LODWORD(pActor->pActorBuffs[3].uExpireTime) <= v12) ) - pActor->uActorHeight = pMonsterList->pMonsters[pActor->pMonsterInfo.uID - 1].uMonsterHeight; - if ( v82 != v12 ) - { - pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; - if ( SHIDWORD(pActor->pActorBuffs[1].uExpireTime) <= (signed int)v12 ) - { - if ( SHIDWORD(pActor->pActorBuffs[1].uExpireTime) < (signed int)v12 - || LODWORD(pActor->pActorBuffs[1].uExpireTime) <= v12 ) - pActor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uHostilityType; - } - } - if ( SHIDWORD(pActor->pActorBuffs[5].uExpireTime) > (signed int)v12 - || SHIDWORD(pActor->pActorBuffs[5].uExpireTime) >= (signed int)v12 - && LODWORD(pActor->pActorBuffs[5].uExpireTime) - || SHIDWORD(pActor->pActorBuffs[6].uExpireTime) > 0 - || SHIDWORD(pActor->pActorBuffs[6].uExpireTime) >= 0 && LODWORD(pActor->pActorBuffs[6].uExpireTime) ) - goto LABEL_78; - v15 = pMiscTimer->uTimeElapsed; - v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime; - pActor->uCurrentActionTime += pMiscTimer->uTimeElapsed; - v17 = pActor->uCurrentActionTime; - v18 = pActor->pMonsterInfo.uRecoveryTime; - if ( (signed int)v18 > 0 ) - *(int *)v16 = v18 - v15; - if ( *(int *)v16 < 0 ) - *(int *)v16 = 0; - if ( (signed int)v17 < pActor->uCurrentActionLength ) - goto LABEL_78; - v19 = pActor->uAIState; - if ( v19 == Dying ) - { - pActor->uAIState = Dead; - } - else - { - if ( v19 != 17 ) - { - Actor::_403F58(uActorID, Dying, 256, 0); - goto LABEL_78; - } - pActor->uAIState = Standing; - } - pActor->uCurrentActionTime = 0; - pActor->uCurrentActionLength = 0; - pActor->UpdateAnimation(); -LABEL_78: - ++uActorID; - LODWORD(v80) += 836; - } - while ( (signed int)uActorID < (signed int)uNumActors ); + while ( v13 < 22 );*/ + if (!actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime) + //&& SHIDWORD(pActor->pActorBuffs[3].uExpireTime) <= (signed int)v12 && (SHIDWORD(pActor->pActorBuffs[3].uExpireTime) < (signed int)v12 + // || LODWORD(pActor->pActorBuffs[3].uExpireTime) <= v12) ) + actor->uActorHeight = pMonsterList->pMonsters[actor->pMonsterInfo.uID - 1].uMonsterHeight; + if (actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime) + actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + else + actor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[actor->pMonsterInfo.uID].uHostilityType; + + if (actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime || + actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime) + continue; + + //v15 = pMiscTimer->uTimeElapsed; + //v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime; + //v17 = pActor->uCurrentActionTime; + //v18 = pActor->pMonsterInfo.uRecoveryTime; + if (actor->pMonsterInfo.uRecoveryTime) + { + if (actor->pMonsterInfo.uRecoveryTime < pMiscTimer->uTimeElapsed) + actor->pMonsterInfo.uRecoveryTime = 0; + else actor->pMonsterInfo.uRecoveryTime -= pMiscTimer->uTimeElapsed; + } + + actor->uCurrentActionTime += pMiscTimer->uTimeElapsed; + if (actor->uCurrentActionTime < actor->uCurrentActionLength) + continue; + + //v19 = actor->uAIState; + if (actor->uAIState == Dying) + actor->uAIState = Dead; + else + { + if (actor->uAIState != Summoned) + { + Actor::_403F58(i, Dying, 256, 0); + continue; + } + actor->uAIState = Standing; + } + + actor->uCurrentActionTime = 0; + actor->uCurrentActionLength = 0; + actor->UpdateAnimation(); +//LABEL_78: + //++uActorID; + //LODWORD(v80) += 836; + //} + //while ( (signed int)uActorID < (signed int)uNumActors ); }