Mercurial > mm7
diff Actor.cpp @ 1893:7293e7e8810b
Actor::_SelectTarget final cleanup
author | Grumpy7 |
---|---|
date | Sun, 20 Oct 2013 00:38:38 -0700 |
parents | 9995cbcc62e0 |
children | fe7182c30aad |
line wrap: on
line diff
--- a/Actor.cpp Sun Oct 20 00:21:16 2013 -0700 +++ b/Actor.cpp Sun Oct 20 00:38:38 2013 -0700 @@ -2361,56 +2361,33 @@ v6->UpdateAnimation(); } -//----- (00SelectTarget) -------------------------------------------------------- +//----- (00401221) -------------------------------------------------------- void Actor::_SelectTarget(unsigned int uActorID, int *a2, bool can_target_party) { - //Actor *v3; // esi@1 - //unsigned int v4; // ebx@1 int v5; // ecx@1 - //unsigned int v6; // eax@1 - //Actor *v7; // edi@2 - //__int16 v8; // ax@3 - int v9; // eax@10 signed int v10; // eax@13 int v11; // ebx@16 int v12; // eax@16 - //int v13; // eax@25 signed int v14; // eax@31 int v15; // edi@43 int v16; // ebx@45 int v17; // eax@45 - //int v18; // eax@51 - //int *v20; // [sp+10h] [bp-20h]@1 - signed int v21; // [sp+14h] [bp-1Ch]@1 - //unsigned int v22; // [sp+18h] [bp-18h]@1 + signed int closestId; // [sp+14h] [bp-1Ch]@1 int v23; // [sp+1Ch] [bp-14h]@16 - //unsigned int v24; // [sp+20h] [bp-10h]@1 - unsigned int v25; // [sp+24h] [bp-Ch]@1 - //signed int v26; // [sp+28h] [bp-8h]@1 + unsigned int lowestRadius; // [sp+24h] [bp-Ch]@1 int v27; // [sp+2Ch] [bp-4h]@16 int v28; // [sp+2Ch] [bp-4h]@45 - v25 = UINT_MAX; - //v22 = uActorID; - //v3 = &pActors[uActorID]; - //v4 = 0; + lowestRadius = UINT_MAX; v5 = 0; - //v6 = v3->uLastCharacterIDToHit; *a2 = 0; - //v20 = a2; - v21 = 0; - //v24 = v3->uLastCharacterIDToHit; - //v26 = 0; + closestId = 0; assert(uActorID < uNumActors); Actor* thisActor = &pActors[uActorID]; for (uint i = 0; i < uNumActors; ++i) { - auto actor = &pActors[i]; - //v7 = pActors; - //do - //{ - //v8 = v7->uAIState; + Actor* actor = &pActors[i]; if (actor->uAIState == Dead || actor->uAIState == Dying || actor->uAIState == Removed || actor->uAIState == Summoned || actor->uAIState == Disabled || uActorID == i ) continue; @@ -2430,7 +2407,6 @@ } else { - //v18 = actor->uGroup; if ( (actor->uGroup != 0 || thisActor->uGroup != 0) && actor->uGroup == thisActor->uGroup ) continue; v10 = 4; @@ -2445,51 +2421,42 @@ && v27 <= v11 && v12 <= v11 && sub_4070EF_prolly_detect_player(PID(OBJECT_Actor, i), PID(OBJECT_Actor, uActorID)) - && v23 * v23 + v27 * v27 + v12 * v12 < v25 ) + && v23 * v23 + v27 * v27 + v12 * v12 < lowestRadius ) { - v25 = v23 * v23 + v27 * v27 + v12 * v12; - v21 = i; + lowestRadius = v23 * v23 + v27 * v27 + v12 * v12; + closestId = i; } - //v4 = 0; - //++v7; - //v5 = v26++ + 1; - //} - //while ( v26 < (signed int)uNumActors ); - } - if ( v25 != -1 ) - { - //v13 = 8 * v21; - //LOBYTE(v13) = PID(OBJECT_Actor,v21); - *a2 = PID(OBJECT_Actor, v21); - } + + if ( lowestRadius != UINT_MAX ) + { + *a2 = PID(OBJECT_Actor, closestId); + } if (pParty->Invisible()) can_target_party = false; if (can_target_party) { - v14 = thisActor->GetActorsRelation(0); - if ( BYTE2(thisActor->uAttributes) & 8 - && SHIDWORD(thisActor->pActorBuffs[12].uExpireTime) <= (signed int)0 - && (SHIDWORD(thisActor->pActorBuffs[12].uExpireTime) < (signed int)0 || LODWORD(thisActor->pActorBuffs[12].uExpireTime) <= 0) - && SHIDWORD(thisActor->pActorBuffs[1].uExpireTime) <= (signed int)0 - && (SHIDWORD(thisActor->pActorBuffs[1].uExpireTime) < (signed int)0 || LODWORD(thisActor->pActorBuffs[1].uExpireTime) <= 0) - && SHIDWORD(thisActor->pActorBuffs[2].uExpireTime) <= (signed int)0 - && (SHIDWORD(thisActor->pActorBuffs[2].uExpireTime) < (signed int)0 || LODWORD(thisActor->pActorBuffs[2].uExpireTime) <= 0) ) + if ( thisActor->uAttributes & 0x80000 + && thisActor->pActorBuffs[12].uExpireTime <= 0 + && thisActor->pActorBuffs[1].uExpireTime <= 0 + && thisActor->pActorBuffs[2].uExpireTime <= 0 ) v14 = 4; + else + v14 = thisActor->GetActorsRelation(0); if ( v14 != 0 ) { - v15 = dword_4DF380[4]; if ( !thisActor->pMonsterInfo.uHostilityType ) v15 = dword_4DF380[v14]; + else + v15 = dword_4DF380[4]; v16 = abs(thisActor->vPosition.x - pParty->vPosition.x); v28 = abs(thisActor->vPosition.y - pParty->vPosition.y); v17 = abs(thisActor->vPosition.z - pParty->vPosition.z); - if ( v16 <= v15 && v28 <= v15 && v17 <= v15 ) + if ( v16 <= v15 && v28 <= v15 && v17 <= v15 && (v16 * v16 + v28 * v28 + v17 * v17 < lowestRadius)) { - if ( v16 * v16 + v28 * v28 + v17 * v17 < v25 ) - *a2 = OBJECT_Player; + *a2 = OBJECT_Player; } } }