Mercurial > mm7
diff mm7_3.cpp @ 1335:ee2672b14d75
Слияние
author | Ritor1 |
---|---|
date | Wed, 03 Jul 2013 09:37:49 +0600 |
parents | 82431a85b28e |
children | f0be1fecd642 |
line wrap: on
line diff
--- a/mm7_3.cpp Wed Jul 03 09:37:43 2013 +0600 +++ b/mm7_3.cpp Wed Jul 03 09:37:49 2013 +0600 @@ -12569,216 +12569,178 @@ //----- (004059DB) -------------------------------------------------------- signed int stru262_TurnBased::Start() -{ - //stru262_TurnBased *v1; // ebx@1 - unsigned int v2; // edi@1 - int v3; // esi@1 - int v4; // eax@5 - unsigned int v5; // esi@7 - Actor *pActor; // edi@7 - unsigned int v7; // eax@9 - unsigned int v8; // edx@10 - //unsigned __int8 v9; // zf@14 - //unsigned __int8 v10; // sf@14 - //unsigned __int8 v11; // of@14 - //char *v12; // esi@15 - //int v13; // ecx@16 - //unsigned __int16 v14; // ax@17 - int v15; // ecx@18 - signed __int64 v16; // qax@19 - //int v17; // edx@22 - unsigned int v18; // esi@27 - char *v19; // esi@32 - int v20; // edx@33 - char *v21; // eax@33 - int v22; // ecx@33 - int v23; // eax@34 - char *v24; // eax@34 - char *v25; // ecx@34 - int v26; // edx@34 - int v27; // eax@38 - int v28; // ecx@38 - AIDirection v30; // [sp+Ch] [bp-68h]@10 - AIDirection v31; // [sp+28h] [bp-4Ch]@10 - AIDirection a3; // [sp+44h] [bp-30h]@10 - //int v33; // [sp+60h] [bp-14h]@10 - int *v34; // [sp+64h] [bp-10h]@6 - int v35; // [sp+68h] [bp-Ch]@5 - Player *pPlayer; // [sp+6Ch] [bp-8h]@1 - int v40b; - unsigned int v37; // [sp+70h] [bp-4h]@7 - - pTurnEngine->field_18 &= 0xFFFFFFFDu; - //v1 = this; - pEventTimer->TrackGameTime(); - pAudioPlayer->StopChannels(-1, -1); - v2 = 0; - pAudioPlayer->PlaySound((SoundID)(SOUND_GoldReceived|SOUND_EnteringAHouse|0x1), 0, 0, -1, 0, 0, 0, 0); - pPlayer = pParty->pPlayers; - dword_50C998_turnbased_icon_1A = 8 * pIconsFrameTable->pIcons[uIconID_TurnStart].uAnimLength; - dword_50C994 = 0; - this->field_10 = 100; - this->field_0 = 0; - this->field_8 = 64; - this->field_4 = 1; - this->uActorQueueSize = 0; - for ( v3 = 0; pPlayer <= &pParty->pPlayers[3]; ++v3 ) - { - if ( pPlayer->CanAct() ) - { - this->pQueue[this->uActorQueueSize].uPackedID = PID(OBJECT_Player,v3); - this->pQueue[this->uActorQueueSize].field_C = 2; - this->pQueue[this->uActorQueueSize].uActionLength = 0; - pParty->pTurnBasedPlayerRecoveryTimes[this->uActorQueueSize++] = 0; - } - ++pPlayer; - } - v35 = this->uActorQueueSize; - v4 = this->uActorQueueSize; - v40b = this->uActorQueueSize; - if ( v40b < v40b + ai_arrays_size ) - { - v34 = (int *)ai_near_actors_ids.data(); - do - { - v37 = *v34; - v5 = v37; - pActor = &pActors[v37]; - if ( v37 != 10 ) - { - if ( pActors[v37].CanAct() ) - { - v7 = pActor->uAttributes; - if ( pActor->uAttributes & 0x8000 ) - { - v8 = ai_near_actors_targets_pid[v5]; - LOBYTE(v7) = v7 | 0x80; - pActor->uAttributes = v7; - //v33 = PID(OBJECT_Actor,v5); - memcpy(&v31, Actor::GetDirectionInfo(PID(OBJECT_Actor,v5), v8, &a3, 0), sizeof(v31)); - memcpy(&v30, &v31, sizeof(v30)); - Actor::AI_StandOrBored(v37, 4, 32, &v30); - this->pQueue[this->uActorQueueSize].uPackedID = PID(OBJECT_Actor,v5); + { + //stru262_TurnBased *v1; // ebx@1 + int v3; // esi@1 + int v4; // eax@5 + unsigned int actor_id; // esi@7 + Actor *pActor; // edi@7 + unsigned int v7; // eax@9 + unsigned int v8; // edx@10 + //unsigned __int8 v9; // zf@14 + //unsigned __int8 v10; // sf@14 + //unsigned __int8 v11; // of@14 + //char *v12; // esi@15 + //int v13; // ecx@16 + //unsigned __int16 v14; // ax@17 + int v15; // ecx@18 + signed __int64 v16; // qax@19 + int v17; // edx@22 + unsigned int v18; // esi@27 + char *v19; // esi@32 + int v20; // edx@33 + char *v21; // eax@33 + int v22; // ecx@33 + int v23; // eax@34 + char *v24; // eax@34 + char *v25; // ecx@34 + int v26; // edx@34 + int v27; // eax@38 + int v28; // ecx@38 + AIDirection v30; // [sp+Ch] [bp-68h]@10 + AIDirection v31; // [sp+28h] [bp-4Ch]@10 + AIDirection a3; // [sp+44h] [bp-30h]@10 + //int v33; // [sp+60h] [bp-14h]@10 + int *v34; // [sp+64h] [bp-10h]@6 + int v35; // [sp+68h] [bp-Ch]@5 + Player *pPlayer; // [sp+6Ch] [bp-8h]@1 + int v40b; + unsigned int v37; // [sp+70h] [bp-4h]@7 + int activ_players[4]; + int players_recovery_time[4]; + int a_players_count; + int i; + + + pTurnEngine->field_18 &= 0xFFFFFFFDu; + //v1 = this; + pEventTimer->TrackGameTime(); + pAudioPlayer->StopChannels(-1, -1); + pAudioPlayer->PlaySound(SOUND_207, 0, 0, -1, 0, 0, 0, 0); + pPlayer = pParty->pPlayers; + dword_50C998_turnbased_icon_1A = 8 * pIconsFrameTable->pIcons[uIconID_TurnStart].uAnimLength; + dword_50C994 = 0; + + this->field_10 = 100; + this->field_0 = 0; + this->field_8 = 64; + this->field_4 = 1; + this->uActorQueueSize = 0; + + for ( v3 = 0; v3 < 4 ; ++v3 ) + { + if ( pParty->pPlayers[v3].CanAct() ) + { + this->pQueue[this->uActorQueueSize].uPackedID = PID(OBJECT_Player,v3); this->pQueue[this->uActorQueueSize].field_C = 2; - this->pQueue[this->uActorQueueSize++].uActionLength = 0; - } - } - v4 = v35; - } - ++v40b; - ++v34; - } - while ( v40b < v4 + ai_arrays_size ); - v2 = 0; - } - //v11 = __OFSUB__(this->uActorQueueSize, v2); - //v9 = this->uActorQueueSize == v2; - //v10 = ((this->uActorQueueSize - v2) & 0x80000000u) != 0; - v37 = v2; - //if ( !((unsigned __int8)(v10 ^ v11) | v9) ) - if ( this->uActorQueueSize > v2 ) - { - //v12 = (char *)&this->pQueue[0].field_4; - - //while ( 1 ) - for ( v40b = v2; v40b < this->uActorQueueSize; ++v40b ) - { - //v13 = PID_TYPE(this->pQueue[0].uPackedID); - if ( PID_TYPE(this->pQueue[0].uPackedID) != OBJECT_Player ) - break; - //v14 = pPlayers[(this->pQueue[0].uPackedID >> 3) + 1]->uTimeToRecovery; - if ( pPlayers[(this->pQueue[0].uPackedID >> 3) + 1]->uTimeToRecovery != (short)v2 ) - { - //v33 = pPlayers[(this->pQueue[0].uPackedID >> 3) + 1]->uTimeToRecovery; - v16 = (signed __int64)((double)pPlayers[(this->pQueue[0].uPackedID >> 3) + 1]->uTimeToRecovery * 0.46875); - *(int *)this->pQueue[0].field_4 = v16; - this->pQueue[0].field_4 += 16; - continue; - } - v15 = v37++; - *(&a3.uDistance + v15) = v40b; - - if ( PID_TYPE(this->pQueue[0].uPackedID) != 3 ) - { - this->pQueue[0].field_4 = 666; - this->pQueue[0].field_4 += 16; - continue; - } - //v17 = rand() % 99; - if ( rand() % 99 < 33 ) - { - *(int *)this->pQueue[0].field_4 = 1; - this->pQueue[0].field_4 += 16; - continue; - } - //LODWORD(v16) = SHIDWORD(v16) < 66; - LOBYTE(v16) = SHIDWORD(v16) >= 66; - LODWORD(v16) = 2 * v16 + 3; - *(int *)this->pQueue[0].field_4 = v16; - this->pQueue[0].field_4 += 16; - } - } - -LABEL_27: - v18 = 0; - if ( (signed int)v37 > (signed int)v2 ) - { - do - { - //__debugbreak(); - *(&v31.uDistance + v18) = pParty->pPlayers[this->pQueue[*(&a3.uDistance + v18)].uPackedID >> 3].GetAttackRecoveryTime(v2);//result crash - ++v18; - } - while ( (signed int)v18 < (signed int)v37 ); - if ( (signed int)v37 > (signed int)v2 ) - { - v35 = v2; - v34 = (int *)1; - do - { - v40b = (int)v34; - if ( (signed int)v34 < (signed int)v37 ) - { - v19 = (char *)&v31.uDistance + v35; - do - { - v20 = *(int *)v19; - //v33 = 4 * v40b; - v21 = (char *)(&v31.uDistance + v40b); - v22 = *(int *)v21; - if ( *(int *)v21 < v20 ) + this->pQueue[this->uActorQueueSize].uActionLength = 0; + pParty->pTurnBasedPlayerRecoveryTimes[this->uActorQueueSize] = 0; + ++this->uActorQueueSize; + } + } + + for ( v3 = 0; v3 < ai_arrays_size ; ++v3 ) + { + actor_id = ai_near_actors_ids[v3]; + if (actor_id == 10) + continue; + if ( pActors[actor_id].CanAct() ) + { + if ( pActors[actor_id].uAttributes & 0x8000 ) + { + v8 = ai_near_actors_targets_pid[actor_id]; + pActors[actor_id].uAttributes |= 0x80; + memcpy(&v31, Actor::GetDirectionInfo(PID(OBJECT_Actor,actor_id), v8, &a3, 0), sizeof(AIDirection)); + memcpy(&v30, &v31, sizeof(AIDirection)); + Actor::AI_StandOrBored(actor_id, 4, 32, &v30); + this->pQueue[this->uActorQueueSize].uPackedID = PID(OBJECT_Actor,actor_id); + this->pQueue[this->uActorQueueSize].field_C = 2; + this->pQueue[this->uActorQueueSize].uActionLength = 0; + ++this->uActorQueueSize; + } + } + } + + a_players_count=0; + for ( v40b = 0; v40b < this->uActorQueueSize; ++v40b ) + { + //v13 = PID_TYPE(this->pQueue[0].uPackedID); + if ( PID_TYPE(this->pQueue[v40b].uPackedID) == OBJECT_Player ) + { + if ( pPlayers[PID_ID(this->pQueue[v40b].uPackedID) + 1]->uTimeToRecovery != 0 ) + { + //v33 = pPlayers[(this->pQueue[0].uPackedID >> 3) + 1]->uTimeToRecovery; + v16 = (signed int)((double)pPlayers[PID_ID(this->pQueue[v40b].uPackedID) + 1]->uTimeToRecovery * 0.46875); + this->pQueue[v40b].field_4 = v16; + } + else + { + activ_players[a_players_count] = v40b; + ++a_players_count; + } + } + else if ( PID_TYPE(this->pQueue[v40b].uPackedID) == OBJECT_Actor ) + { + v17 = rand() % 99; + if ( v17 < 33 ) + this->pQueue[v40b].field_4 = 1; + else + this->pQueue[v40b].field_4= (v17 >= 66)? 5 : 3; + } + else { - *(int *)v21 = v20; - v23 = 4 * v40b; - *(int *)v19 = v22; - v24 = (char *)&a3.uDistance + v23; - v25 = (char *)&a3.uDistance + v35; - v26 = *(int *)v24; - *(int *)v24 = *(unsigned int *)((char *)&a3.uDistance + v35); - *(int *)v25 = v26; - v2 = 0; + this->pQueue[v40b].field_4 = 666; } - ++v40b; - } - while ( v40b < (signed int)v37 ); - } - v34 = (int *)((char *)v34 + 1); - v35 += 4; - } - while ( (signed int)((char *)v34 - 1) < (signed int)v37 ); - if ( (signed int)v37 > (signed int)v2 ) - { - do - { - v27 = v2 + 2; - v28 = *(&a3.uDistance + v2++); - //v11 = __OFSUB__(v2, v37); - //v10 = ((v2 - v37) & 0x80000000u) != 0; - this->pQueue[v28].field_4 = v27; - } - while ( v37 > v2 ); - } - } - } - return this->_404544(); -} + this->pQueue[v40b].field_4 += 16; + } + + + if ( a_players_count > 0 ) + { + for (i=0; i<a_players_count; ++i) + players_recovery_time[i] = pParty->pPlayers[PID_ID(this->pQueue[activ_players[i]].uPackedID)].GetAttackRecoveryTime(0); + //sort players by recovery time + for (i=0; i<a_players_count; ++i) + { //to fix + //v35 = v2; + //v34 = (int *)1; + //do + // { + // v40b = (int)v34; + // if ( (signed int)v34 < (signed int)v37 ) + // { + // v19 = (char *)&v31.uDistance + v35; + // do + // { + // v20 = *(int *)v19; + // //v33 = 4 * v40b; + // v21 = (char *)(&v31.uDistance + v40b); + // v22 = *(int *)v21; + // if ( *(int *)v21 < v20 ) + // { + // *(int *)v21 = v20; + // v23 = 4 * v40b; + // *(int *)v19 = v22; + // v24 = (char *)&a3.uDistance + v23; + // v25 = (char *)&a3.uDistance + v35; + // v26 = *(int *)v24; + // *(int *)v24 = *(unsigned int *)((char *)&a3.uDistance + v35); + // *(int *)v25 = v26; + // v2 = 0; + // } + // ++v40b; + // } + // while ( v40b < (signed int)v37 ); + // } + // v34 = (int *)((char *)v34 + 1); + // v35 += 4; + // } + // while ( (signed int)((char *)v34 - 1) < (signed int)v37 ); + } + for (i=0; i<a_players_count; ++i) + { + this->pQueue[activ_players[i]].field_4 = i+2; + } + } + return this->_404544(); + }