Mercurial > mm7
changeset 872:2db21a810d48
Merge
author | Nomad |
---|---|
date | Mon, 01 Apr 2013 13:39:39 +0200 |
parents | 710cf848ad24 (current diff) a0ae8d36c2d6 (diff) |
children | b7246c149957 84c8119c366a |
files | Game.cpp GameUIs.cpp Indoor.cpp Outdoor.cpp Render.cpp UiGame.cpp mm7_1.cpp mm7_2.cpp mm7_3.cpp mm7_4.cpp mm7_5.cpp mm7_6.cpp |
diffstat | 32 files changed, 1631 insertions(+), 1842 deletions(-) [+] |
line wrap: on
line diff
--- a/Actor.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Actor.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -377,7 +377,7 @@ } //----- (00404AC7) -------------------------------------------------------- -void __fastcall Actor::_404AC7(unsigned int uActorID, AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel) +void __fastcall Actor::SpellAttack(unsigned int uActorID, AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel) { Actor *v5; // esi@1 unsigned int v6; // edi@1 @@ -781,7 +781,7 @@ v24 = (double)v118; v118 = v23; v112 = v24; - v116 = 8 * LODWORD(v120) | 3; + v116 = PID(OBJECT_Actor,LODWORD(v120)); do { v26 = rand(); @@ -915,7 +915,7 @@ v102 = 0; v40 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v40) = 8 * LOBYTE(v120) | 3; + LOBYTE(v40) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v40; v98 = (SoundID)10040; @@ -968,7 +968,7 @@ v102 = 0; v43 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v43) = 8 * LOBYTE(v120) | 3; + LOBYTE(v43) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v43; v98 = (SoundID)14010; @@ -1007,7 +1007,7 @@ v102 = 0; v46 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v46) = 8 * LOBYTE(v120) | 3; + LOBYTE(v46) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v46; v98 = (SoundID)13040; @@ -1050,7 +1050,7 @@ v50 = 8 * LODWORD(v120); v102 = v47; v101 = -1; - LOBYTE(v50) = 8 * LOBYTE(v120) | 3; + LOBYTE(v50) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = v47; v99 = v50; v98 = (SoundID)14020; @@ -1102,7 +1102,7 @@ v65 = 8 * LODWORD(v120); v102 = 0; v101 = -1; - LOBYTE(v65) = 8 * LOBYTE(v120) | 3; + LOBYTE(v65) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v65; v22 = (SoundID)word_4EE088_sound_ids[80]; @@ -1131,7 +1131,7 @@ v102 = 0; v52 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v52) = 8 * LOBYTE(v120) | 3; + LOBYTE(v52) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v52; v98 = (SoundID)16060; @@ -1185,7 +1185,7 @@ v102 = 0; v55 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v55) = 8 * LOBYTE(v120) | 3; + LOBYTE(v55) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v55; v98 = (SoundID)14060; @@ -1228,7 +1228,7 @@ v102 = 0; v97 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v97) = 8 * LOBYTE(v120) | 3; + LOBYTE(v97) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v97; v98 = (SoundID)17070; @@ -1272,7 +1272,7 @@ v102 = 0; v95 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v95) = 8 * LOBYTE(v120) | 3; + LOBYTE(v95) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v95; v98 = (SoundID)17080; @@ -1319,7 +1319,7 @@ v102 = 0; v69 = 8 * LODWORD(v120); v101 = -1; - LOBYTE(v69) = 8 * LOBYTE(v120) | 3; + LOBYTE(v69) = PID(OBJECT_Actor,LOBYTE(v120)); v100 = 0; v99 = v69; v98 = (SoundID)18060; @@ -1482,7 +1482,7 @@ } //----- (00404874) -------------------------------------------------------- -char __fastcall Actor::_404874(unsigned int uActorID, AIDirection *a2, int a3, char a4) +char __fastcall Actor::RangedAttack(unsigned int uActorID, AIDirection *a2, int a3, char a4) { AIDirection *v4; // edi@1 Actor *v5; // esi@1 @@ -1757,174 +1757,189 @@ int outx; // [sp+48h] [bp-4h]@6 float a4a; // [sp+58h] [bp+Ch]@45 - v4 = (signed int)uObj1ID >> 3; - v5 = (uObj1ID & 7) - 2; + v4 = PID_ID(uObj1ID); + v5 = PID_TYPE(uObj1ID); v6 = uObj2ID; - if ( !v5 ) - { - v19 = v4; - outx = pSpriteObjects[v19].vPosition.x; - v13 = pSpriteObjects[v19].vPosition.y; - v14 = pSpriteObjects[v19].vPosition.z; - goto LABEL_26; - } - v7 = v5 - 1; - if ( !v7 ) - { - outx = pActors[v4].vPosition.x; - outy = pActors[v4].vPosition.y; - LODWORD(v42) = pActors[v4].uActorHeight; - v11 = pActors[v4].vPosition.z - (unsigned int)(signed __int64)((double)SLODWORD(v42) * -0.75); - goto LABEL_24; - } - v8 = v7 - 1; - if ( !v8 ) + switch(v5) { - if ( !v4 ) - { - outx = pParty->vPosition.x; - outy = pParty->vPosition.y; - v14 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; -LABEL_27: - outz = v14; - goto LABEL_28; - } - v15 = v4 - 1; - if ( v15 ) - { - v16 = v15 - 1; - if ( v16 ) - { - v17 = v16 - 1; - if ( v17 ) - { - if ( v17 != 1 ) - goto LABEL_28; - v40 = &outz; - v39 = &outy; - v38 = &outx; - v18 = pParty->sRotationY - stru_5C6E00->uIntegerHalfPi; - v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; - goto LABEL_20; - } - v40 = &outz; - v39 = &outy; - v38 = &outx; - v18 = pParty->sRotationY - stru_5C6E00->uIntegerHalfPi; - v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; - } - else - { - v40 = &outz; - v39 = &outy; - v38 = &outx; - v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; - v18 = stru_5C6E00->uIntegerHalfPi + pParty->sRotationY; - } - *(_QWORD *)&v37.x = *(_QWORD *)&pParty->vPosition.x; - v36 = 0; - v35 = 8; -LABEL_21: - Vec3_int_::Rotate(v35, v18, v36, v37, v38, v39, v40); - goto LABEL_28; - } - v40 = &outz; - v39 = &outy; - v38 = &outx; - v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; - v18 = stru_5C6E00->uIntegerHalfPi + pParty->sRotationY; -LABEL_20: - *(_QWORD *)&v37 = *(_QWORD *)&pParty->vPosition.x; - v36 = 0; - v35 = 24; - goto LABEL_21; + case OBJECT_Item: + { + v19 = v4; + outx = pSpriteObjects[v19].vPosition.x; + v13 = pSpriteObjects[v19].vPosition.y; + v14 = pSpriteObjects[v19].vPosition.z; + outy = v13; + outz = v14; + break; + } + case OBJECT_Actor: + { + outx = pActors[v4].vPosition.x; + outy = pActors[v4].vPosition.y; + LODWORD(v42) = pActors[v4].uActorHeight; + v11 = pActors[v4].vPosition.z - (unsigned int)(signed __int64)((double)SLODWORD(v42) * -0.75); + outz = v11; + break; + } + case OBJECT_Player: + { + if ( !v4 ) + { + outx = pParty->vPosition.x; + outy = pParty->vPosition.y; + v14 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; + outz = v14; + break;; + } + if ( v4 == 4 ) + { + v40 = &outz; + v39 = &outy; + v38 = &outx; + v18 = pParty->sRotationY - stru_5C6E00->uIntegerHalfPi; + v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; + *(_QWORD *)&v37 = *(_QWORD *)&pParty->vPosition.x; + v36 = 0; + v35 = 24; + Vec3_int_::Rotate(v35, v18, v36, v37, v38, v39, v40); + break; + } + if ( v4 == 3 ) + { + v40 = &outz; + v39 = &outy; + v38 = &outx; + v18 = pParty->sRotationY - stru_5C6E00->uIntegerHalfPi; + v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; + *(_QWORD *)&v37.x = *(_QWORD *)&pParty->vPosition.x; + v36 = 0; + v35 = 8; + Vec3_int_::Rotate(v35, v18, v36, v37, v38, v39, v40); + break; + } + if ( v4 == 2 ) + { + v40 = &outz; + v39 = &outy; + v38 = &outx; + v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; + v18 = stru_5C6E00->uIntegerHalfPi + pParty->sRotationY; + *(_QWORD *)&v37.x = *(_QWORD *)&pParty->vPosition.x; + v36 = 0; + v35 = 8; + Vec3_int_::Rotate(v35, v18, v36, v37, v38, v39, v40); + break; + } + if ( v4 == 1 ) + { + v40 = &outz; + v39 = &outy; + v38 = &outx; + v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3; + v18 = stru_5C6E00->uIntegerHalfPi + pParty->sRotationY; + *(_QWORD *)&v37 = *(_QWORD *)&pParty->vPosition.x; + v36 = 0; + v35 = 24; + Vec3_int_::Rotate(v35, v18, v36, v37, v38, v39, v40); + break; + } + } + case OBJECT_Decoration: + { + v12 = v4; + outx = pLevelDecorations[v12].vPosition.x; + v13 = pLevelDecorations[v12].vPosition.y; + v14 = pLevelDecorations[v12].vPosition.z; + outy = v13; + outz = v14; + break; + } + default: + { + outz = 0; + outy = 0; + outx = 0; + break; + } + case OBJECT_BModel: + { + if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) + { + v10 = &pIndoor->pFaces[v4]; + outx = (v10->pBounding.x1 + v10->pBounding.x2) >> 1; + outy = (v10->pBounding.y1 + v10->pBounding.y2) >> 1; + v11 = (v10->pBounding.z1 + v10->pBounding.z2) >> 1; + outz = v11; + } + break; + } } - v9 = v8 - 1; - if ( !v9 ) - { - v12 = v4; - outx = pLevelDecorations[v12].vPosition.x; - v13 = pLevelDecorations[v12].vPosition.y; - v14 = pLevelDecorations[v12].vPosition.z; -LABEL_26: - outy = v13; - goto LABEL_27; - } - if ( v9 != 1 ) - { - outz = 0; - outy = 0; - outx = 0; - goto LABEL_28; - } - if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) - { - v10 = &pIndoor->pFaces[v4]; - outx = (v10->pBounding.x1 + v10->pBounding.x2) >> 1; - outy = (v10->pBounding.y1 + v10->pBounding.y2) >> 1; - v11 = (v10->pBounding.z1 + v10->pBounding.z2) >> 1; -LABEL_24: - outz = v11; - } -LABEL_28: v20 = v6; - v21 = v6 & 7; - v22 = v20 >> 3; - if ( v21 == 2 ) - { - v30 = v22; - LODWORD(v45) = pSpriteObjects[v30].vPosition.x; - v27 = pSpriteObjects[v30].vPosition.y; - v28 = pSpriteObjects[v30].vPosition.z; - goto LABEL_43; - } - if ( v21 == 3 ) + v21 = PID_TYPE(v6); + v22 = PID_ID(v20); + switch(v6) { - LODWORD(v45) = pActors[v22].vPosition.x; - LODWORD(v44) = pActors[v22].vPosition.y; - v25 = pActors[v22].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v22].uActorHeight * -0.75); - goto LABEL_41; - } - if ( v21 == 4 ) - { - LODWORD(v45) = pParty->vPosition.x; - LODWORD(v44) = pParty->vPosition.y; - v29 = a4; - if ( !a4 ) - v29 = pParty->sEyelevel; - v28 = pParty->vPosition.z + v29; - goto LABEL_44; + case OBJECT_Item: + { + v30 = v22; + LODWORD(v45) = pSpriteObjects[v30].vPosition.x; + v27 = pSpriteObjects[v30].vPosition.y; + v28 = pSpriteObjects[v30].vPosition.z; + LODWORD(v44) = v27; + a4 = v28; + break; + } + case OBJECT_Actor: + { + LODWORD(v45) = pActors[v22].vPosition.x; + LODWORD(v44) = pActors[v22].vPosition.y; + v25 = pActors[v22].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v22].uActorHeight * -0.75); + a4 = v25; + break; + } + case OBJECT_Player: + { + LODWORD(v45) = pParty->vPosition.x; + LODWORD(v44) = pParty->vPosition.y; + v29 = a4; + if ( !a4 ) + v29 = pParty->sEyelevel; + v28 = pParty->vPosition.z + v29; + a4 = v28; + break; + } + case OBJECT_Decoration: + { + v26 = v22; + LODWORD(v45) = pLevelDecorations[v26].vPosition.x; + v27 = pLevelDecorations[v26].vPosition.y; + v28 = pLevelDecorations[v26].vPosition.z; + LODWORD(v44) = v27; + a4 = v28; + break; + } + default: + { + a4 = 0; + v44 = 0.0; + v45 = 0.0; + break; + } + case OBJECT_BModel: + { + if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) + { + v23 = &pIndoor->pFaces[v22]; + v24 = v23->pBounding.y1; + LODWORD(v45) = (v23->pBounding.x1 + v23->pBounding.x2) >> 1; + LODWORD(v44) = (v24 + v23->pBounding.y2) >> 1; + v25 = (v23->pBounding.z1 + v23->pBounding.z2) >> 1; + a4 = v25; + } + break; + } } - if ( v21 == 5 ) - { - v26 = v22; - LODWORD(v45) = pLevelDecorations[v26].vPosition.x; - v27 = pLevelDecorations[v26].vPosition.y; - v28 = pLevelDecorations[v26].vPosition.z; -LABEL_43: - LODWORD(v44) = v27; -LABEL_44: - a4 = v28; - goto LABEL_45; - } - if ( v21 != 6 ) - { - a4 = 0; - v44 = 0.0; - v45 = 0.0; - goto LABEL_45; - } - if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) - { - v23 = &pIndoor->pFaces[v22]; - v24 = v23->pBounding.y1; - LODWORD(v45) = (v23->pBounding.x1 + v23->pBounding.x2) >> 1; - LODWORD(v44) = (v24 + v23->pBounding.y2) >> 1; - v25 = (v23->pBounding.z1 + v23->pBounding.z2) >> 1; -LABEL_41: - a4 = v25; - } -LABEL_45: + v31 = (double)SLODWORD(v45) - (double)outx; v42 = v31; v32 = (double)SLODWORD(v44) - (double)outy; @@ -2050,7 +2065,7 @@ } //----- (00403C6C) -------------------------------------------------------- -void Actor::_403C6C(unsigned int uActorID, signed int edx0, struct AIDirection *arg0) +void Actor::MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0) { Actor *v3; // ebx@1 char v4; // zf@1 @@ -2071,85 +2086,82 @@ AIDirection a3; // [sp+Ch] [bp-48h]@12 AIDirection v20; // [sp+28h] [bp-2Ch]@12 unsigned int v21; // [sp+44h] [bp-10h]@9 - signed int a2; // [sp+48h] [bp-Ch]@1 + //signed int a2; // [sp+48h] [bp-Ch]@1 int v23; // [sp+4Ch] [bp-8h]@6 unsigned int v24; // [sp+50h] [bp-4h]@1 unsigned int v25; // [sp+5Ch] [bp+8h]@13 v3 = &pActors[uActorID]; - a2 = edx0; + //a2 = edx0; v4 = v3->pMonsterInfo.uMovementType == 5; v24 = uActorID; if ( v4 && v3->pMonsterInfo.uAIType == 1 ) { - Actor::AI_Stand(uActorID, edx0, 0, arg0); + Actor::AI_Stand(uActorID, sTargetPid, 0, arg0); return; } - if ( (edx0 & 7) == OBJECT_Actor) - { - v8 = edx0 >> 3; - v6 = (AIDirection *)pActors[v8].vPosition.x; - v7 = (AIDirection *)pActors[v8].vPosition.y; - v23 = (signed __int64)((double)pActors[v8].uActorHeight * 0.75 + (double)pActors[v8].vPosition.z); - } - else + if ( PID_TYPE(sTargetPid) == OBJECT_Actor) + { + v8 = PID_ID(sTargetPid); + v6 = (AIDirection *)pActors[v8].vPosition.x; + v7 = (AIDirection *)pActors[v8].vPosition.y; + v23 = (signed __int64)((double)pActors[v8].uActorHeight * 0.75 + (double)pActors[v8].vPosition.z); + } + else if ( PID_TYPE(sTargetPid) == OBJECT_Player) + { + v6 = (AIDirection *)pParty->vPosition.x; + v7 = (AIDirection *)pParty->vPosition.y; + v23 = pParty->vPosition.z + pParty->sEyelevel; + } + else + { + v6 = arg0; + v7 = arg0; + } + v21 = v3->uActorHeight; + v9 = (double)(signed int)v21 * 0.75; + v21 = v3->vPosition.z; + v10.z = (signed __int64)(v9 + (double)(signed int)v21); + v10.y = v3->vPosition.y; + v10.x = v3->vPosition.x; + if ( sub_407A1C((int)v6, (int)v7, v23, v10) ) + { + v12 = arg0; + v13 = 0; + if ( !arg0 ) { - if ( (edx0 & 7) == OBJECT_Player) - { - v6 = (AIDirection *)pParty->vPosition.x; - v7 = (AIDirection *)pParty->vPosition.y; - v23 = pParty->vPosition.z + pParty->sEyelevel; - } - else - { - v6 = arg0; - v7 = arg0; - } - } - v21 = v3->uActorHeight; - v9 = (double)(signed int)v21 * 0.75; - v21 = v3->vPosition.z; - v10.z = (signed __int64)(v9 + (double)(signed int)v21); - v10.y = v3->vPosition.y; - v10.x = v3->vPosition.x; - if ( sub_407A1C((int)v6, (int)v7, v23, v10) ) - { - v12 = arg0; - v13 = 0; - if ( !arg0 ) - { - v14 = Actor::GetDirectionInfo(PID(OBJECT_Actor, v24), a2, &a3, 0); + v14 = Actor::GetDirectionInfo(PID(OBJECT_Actor, v24), sTargetPid, &a3, 0); v12 = &v20; memcpy(&v20, v14, sizeof(v20)); v13 = 0; - } - v15 = pSpriteFrameTable->pSpriteSFrames; - v3->uYawAngle = LOWORD(v12->uYawAngle); - v16 = v15[v3->pSpriteIDs[ANIM_AtkMelee]].uAnimLength; - v17 = v24; - v3->uCurrentActionLength = 8 * v16; - v3->uCurrentActionTime = v13; - v3->uAIState = AttackingMelee; - Actor::PlaySound(v17, 0); - LODWORD(v18) = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime; - v25 = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime; - if ( SHIDWORD(v3->pActorBuffs[7].uExpireTime) >= (signed int)v13 - && (SHIDWORD(v3->pActorBuffs[7].uExpireTime) > (signed int)v13 || LODWORD(v3->pActorBuffs[7].uExpireTime) > v13) ) - { - LODWORD(v18) = 2 * v18; + } + v15 = pSpriteFrameTable->pSpriteSFrames; + v3->uYawAngle = LOWORD(v12->uYawAngle); + v16 = v15[v3->pSpriteIDs[ANIM_AtkMelee]].uAnimLength; + v17 = v24; + v3->uCurrentActionLength = 8 * v16; + v3->uCurrentActionTime = v13; + v3->uAIState = AttackingMelee; + Actor::PlaySound(v17, 0); + LODWORD(v18) = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime; + v25 = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime; + if ( SHIDWORD(v3->pActorBuffs[7].uExpireTime) >= (signed int)v13 + && (SHIDWORD(v3->pActorBuffs[7].uExpireTime) > (signed int)v13 || LODWORD(v3->pActorBuffs[7].uExpireTime) > v13) ) + { + LODWORD(v18) = 2 * v18; v25 = v18; - } - if ( pParty->bTurnBasedModeOn != 1 ) + } + if ( pParty->bTurnBasedModeOn != 1 ) v18 = (signed __int64)(flt_6BE3A8_debug_recmod2 * (double)(signed int)v25 * 2.133333333333333); - v3->pMonsterInfo.uRecoveryTime = v18; - v3->vVelocity.z = v13; - v3->vVelocity.y = v13; - v3->vVelocity.x = v13; - v3->UpdateAnimation(); - } - else - Actor::_402AD7(v24, a2, rand() % 2, 64, arg0); + v3->pMonsterInfo.uRecoveryTime = v18; + v3->vVelocity.z = v13; + v3->vVelocity.y = v13; + v3->vVelocity.x = v13; + v3->UpdateAnimation(); + } + else + Actor::Pursue1(v24, sTargetPid, rand() % 2, 64, arg0); } //----- (00438CF3) -------------------------------------------------------- @@ -2231,7 +2243,7 @@ __int16 v9; // [sp-4h] [bp-8h]@3 result = a2 - 1; - v4 = 8 * uActorID | 3; + v4 = PID(OBJECT_Actor,uActorID); switch ( a2 ) { case 1: @@ -2282,42 +2294,42 @@ v9 = 4; v8 = 65536; v7 = 0; - v6 = 8 * uActorID | 3; + v6 = PID(OBJECT_Actor,uActorID); v5 = 901; goto LABEL_16; case 6: v9 = 4; v8 = 65536; v7 = 0; - v6 = 8 * uActorID | 3; + v6 = PID(OBJECT_Actor,uActorID); v5 = 902; goto LABEL_16; case 7: v9 = 4; v8 = 65536; v7 = 0; - v6 = 8 * uActorID | 3; + v6 = PID(OBJECT_Actor,uActorID); v5 = 903; goto LABEL_16; case 8: v9 = 4; v8 = 65536; v7 = 0; - v6 = 8 * uActorID | 3; + v6 = PID(OBJECT_Actor,uActorID); v5 = 900; goto LABEL_16; case 9: v9 = 4; v8 = 65536; v7 = 0; - v6 = 8 * uActorID | 3; + v6 = PID(OBJECT_Actor,uActorID); v5 = 909; goto LABEL_16; case 10: v9 = 4; v8 = 65536; v7 = 0; - v6 = 8 * uActorID | 3; + v6 = PID(OBJECT_Actor,uActorID); v5 = 908; LABEL_16: result = pOtherOverlayList->_4418B6(v5, v6, v7, v8, v9); @@ -2455,7 +2467,7 @@ } //----- (00403A60) -------------------------------------------------------- -void Actor::_403A60(unsigned int uActorID, signed int edx0, AIDirection *pDir) +void Actor::SpellAttack2(unsigned int uActorID, signed int edx0, AIDirection *pDir) { Actor *v3; // ebx@1 AIDirection *v4; // esi@3 @@ -2482,16 +2494,16 @@ v22 = uActorID; v3 = &pActors[uActorID]; a2 = edx0; - if ( (edx0 & 7) == OBJECT_Actor) + if ( PID_TYPE(edx0) == OBJECT_Actor) { - v6 = edx0 >> 3; + v6 = PID_ID(edx0); v4 = (AIDirection *)pActors[v6].vPosition.x; v5 = (AIDirection *)pActors[v6].vPosition.y; v21 = (signed __int64)((double)pActors[v6].uActorHeight * 0.75 + (double)pActors[v6].vPosition.z); } else { - if ( (edx0 & 7) == OBJECT_Player) + if ( PID_TYPE(edx0) == OBJECT_Player) { v4 = (AIDirection *)pParty->vPosition.x; v5 = (AIDirection *)pParty->vPosition.y; @@ -2513,7 +2525,7 @@ v10 = 0; if ( !pDir ) { - v11 = Actor::GetDirectionInfo(8 * v22 | OBJECT_Actor, a2, &a3, 0); + v11 = Actor::GetDirectionInfo(PID(OBJECT_Actor,v22), a2, &a3, 0); v9 = &v18; memcpy(&v18, v11, sizeof(v18)); v10 = 0; @@ -2557,11 +2569,11 @@ v3->UpdateAnimation(); } else - Actor::_402AD7(v22, a2, v22, 64, pDir); + Actor::Pursue1(v22, a2, v22, 64, pDir); } //----- (00403854) -------------------------------------------------------- -void Actor::_403854(unsigned int uActorID, signed int edx0, AIDirection *pDir) +void Actor::SpellAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) { Actor *v3; // ebx@1 AIDirection *v4; // esi@3 @@ -2580,24 +2592,24 @@ AIDirection a3; // [sp+Ch] [bp-48h]@9 AIDirection v18; // [sp+28h] [bp-2Ch]@9 int v19; // [sp+44h] [bp-10h]@6 - signed int a2; // [sp+48h] [bp-Ch]@1 + //signed int a2; // [sp+48h] [bp-Ch]@1 int v21; // [sp+4Ch] [bp-8h]@3 unsigned int v22; // [sp+50h] [bp-4h]@1 unsigned int pDira; // [sp+5Ch] [bp+8h]@10 v22 = uActorID; v3 = &pActors[uActorID]; - a2 = edx0; - if ( (edx0 & 7) == OBJECT_Actor) + //a2 = edx0; + if ( PID_TYPE(sTargetPid) == OBJECT_Actor) { - v6 = edx0 >> 3; + v6 = PID_ID(sTargetPid); v4 = (AIDirection *)pActors[v6].vPosition.x; v5 = (AIDirection *)pActors[v6].vPosition.y; v21 = (signed __int64)((double)pActors[v6].uActorHeight * 0.75 + (double)pActors[v6].vPosition.z); } else { - if ( (edx0 & 7) == OBJECT_Player) + if ( PID_TYPE(sTargetPid) == OBJECT_Player) { v4 = (AIDirection *)pParty->vPosition.x; v5 = (AIDirection *)pParty->vPosition.y; @@ -2619,7 +2631,7 @@ v10 = 0; if ( !pDir ) { - v11 = Actor::GetDirectionInfo(8 * v22 | OBJECT_Actor, a2, &a3, 0); + v11 = Actor::GetDirectionInfo(PID(OBJECT_Actor,v22), sTargetPid, &a3, 0); v9 = &v18; memcpy(&v18, v11, sizeof(v18)); v10 = 0; @@ -2663,11 +2675,11 @@ v3->UpdateAnimation(); } else - Actor::_402AD7(v22, a2, v22, 64, pDir); + Actor::Pursue1(v22, sTargetPid, v22, 64, pDir); } //----- (0040368B) -------------------------------------------------------- -void Actor::_40368B(unsigned int uActorID, signed int edx0, AIDirection *pDir) +void Actor::MissileAttack2(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) { Actor *v3; // ebx@1 AIDirection *v4; // esi@3 @@ -2685,24 +2697,24 @@ AIDirection a3; // [sp+Ch] [bp-48h]@9 AIDirection v17; // [sp+28h] [bp-2Ch]@9 int v18; // [sp+44h] [bp-10h]@6 - signed int a2; // [sp+48h] [bp-Ch]@1 + //signed int a2; // [sp+48h] [bp-Ch]@1 int v20; // [sp+4Ch] [bp-8h]@3 unsigned int v21; // [sp+50h] [bp-4h]@1 unsigned int pDira; // [sp+5Ch] [bp+8h]@10 v21 = uActorID; v3 = &pActors[uActorID]; - a2 = edx0; - if ( (edx0 & 7) == OBJECT_Actor) + //a2 = edx0; + if ( PID_TYPE(sTargetPid) == OBJECT_Actor) { - v6 = edx0 >> 3; + v6 = PID_ID(sTargetPid); v4 = (AIDirection *)pActors[v6].vPosition.x; v5 = (AIDirection *)pActors[v6].vPosition.y; v20 = (signed __int64)((double)pActors[v6].uActorHeight * 0.75 + (double)pActors[v6].vPosition.z); } else { - if ( (edx0 & 7) == OBJECT_Player) + if ( PID_TYPE(sTargetPid) == OBJECT_Player) { v4 = (AIDirection *)pParty->vPosition.x; v5 = (AIDirection *)pParty->vPosition.y; @@ -2724,7 +2736,7 @@ v10 = 0; if ( !pDir ) { - v11 = Actor::GetDirectionInfo(8 * v21 | OBJECT_Actor, a2, &a3, 0); + v11 = Actor::GetDirectionInfo(PID(OBJECT_Actor,v21), sTargetPid, &a3, 0); v9 = &v17; memcpy(&v17, v11, sizeof(v17)); v10 = 0; @@ -2754,11 +2766,11 @@ v3->UpdateAnimation(); } else - Actor::_402AD7(v21, a2, v21, 64, pDir); + Actor::Pursue1(v21, sTargetPid, v21, 64, pDir); } //----- (00403476) -------------------------------------------------------- -void Actor::_403476(unsigned int uActorID, signed int edx0, AIDirection *pDir) +void Actor::MissileAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir) { Actor *v3; // ebx@1 int v4; // esi@3 @@ -2777,24 +2789,24 @@ AIDirection a3; // [sp+Ch] [bp-48h]@10 AIDirection v18; // [sp+28h] [bp-2Ch]@10 int v19; // [sp+44h] [bp-10h]@6 - signed int a2; // [sp+48h] [bp-Ch]@1 + //signed int a2; // [sp+48h] [bp-Ch]@1 unsigned int v21; // [sp+4Ch] [bp-8h]@1 int v22; // [sp+50h] [bp-4h]@3 unsigned int pDira; // [sp+5Ch] [bp+8h]@11 v21 = uActorID; v3 = &pActors[uActorID]; - a2 = edx0; - if ( (edx0 & 7) == OBJECT_Actor) + //a2 = edx0; + if ( PID_TYPE(sTargetPid) == OBJECT_Actor) { - v6 = edx0 >> 3; + v6 = PID_ID(sTargetPid); v4 = pActors[v6].vPosition.x; v5 = pActors[v6].vPosition.y; v22 = (signed __int64)((double)pActors[v6].uActorHeight * 0.75 + (double)pActors[v6].vPosition.z); } else { - if ( (edx0 & 7) == OBJECT_Player) + if ( PID_TYPE(sTargetPid) == OBJECT_Player) { v4 = pParty->vPosition.x; v5 = pParty->vPosition.y; @@ -2824,7 +2836,7 @@ v11 = 0; if ( !pDir ) { - v12 = Actor::GetDirectionInfo(8 * v21 | OBJECT_Actor, a2, &a3, 0); + v12 = Actor::GetDirectionInfo(PID(OBJECT_Actor,v21), sTargetPid, &a3, 0); v10 = &v18; memcpy(&v18, v12, sizeof(v18)); v11 = 0; @@ -2858,7 +2870,7 @@ v3->UpdateAnimation(); } else - Actor::_402AD7(v21, a2, v21, 64, pDir); + Actor::Pursue1(v21, sTargetPid, v21, 64, pDir); } //----- (004032B2) -------------------------------------------------------- @@ -2998,7 +3010,7 @@ } //----- (004030AD) -------------------------------------------------------- -void Actor::_4030AD(unsigned int uActorID, signed int edx0, int arg0) +void Actor::Stun(unsigned int uActorID, signed int edx0, int arg0) { unsigned int v3; // edi@1 Actor *v4; // ebx@1 @@ -3034,7 +3046,7 @@ && v4->uAIState != 18 && v4->uAIState != 2)) { - memcpy(&v10, Actor::GetDirectionInfo(8 * v3 | 3, a2, &a3, 0), sizeof(v10)); + memcpy(&v10, Actor::GetDirectionInfo(PID(OBJECT_Actor,v3), a2, &a3, 0), sizeof(v10)); v6 = pSpriteFrameTable->pSpriteSFrames; v4->uYawAngle = LOWORD(v10.uYawAngle); v7 = v6[v4->pSpriteIDs[ANIM_GotHit]].uAnimLength; @@ -3058,7 +3070,7 @@ AIDirection a3; // [sp+Ch] [bp-5Ch]@2 if (!a4) - a4 = Actor::GetDirectionInfo(8 * uActorID | OBJECT_Actor, uObjID, &a3, 0); + a4 = Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), uObjID, &a3, 0); actor->uCurrentActionLength = 8 * pSpriteFrameTable->pSpriteSFrames[actor->pSpriteIDs[ANIM_Bored]].uAnimLength; @@ -3223,7 +3235,7 @@ } //----- (00402AD7) -------------------------------------------------------- -void Actor::_402AD7(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, AIDirection *pDir) +void Actor::Pursue1(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, AIDirection *pDir) { unsigned int v5; // edi@1 int v6; // eax@1 @@ -3244,7 +3256,7 @@ v6 = 0; v7 = &pActors[uActorID]; v18 = a2; - v8 = 8 * uActorID | 3; + v8 = PID(OBJECT_Actor,uActorID); v9 = v7->pMonsterInfo.uFlying == 0; v17 = v5; if ( !v9 && !pParty->bFlying ) @@ -3304,7 +3316,7 @@ } //----- (00402968) -------------------------------------------------------- -void Actor::_402968(unsigned int uActorID, signed int edx0, int uActionLength, AIDirection *a4) +void Actor::Flee(unsigned int uActorID, signed int sTargetPid, int uActionLength, AIDirection *a4) { unsigned int v4; // esi@1 Actor *v5; // ebx@1 @@ -3318,27 +3330,27 @@ AIDirection v13; // [sp+5Ch] [bp-28h]@4 signed int a1; // [sp+78h] [bp-Ch]@2 unsigned int v15; // [sp+7Ch] [bp-8h]@1 - signed int a2; // [sp+80h] [bp-4h]@1 + //signed int a2; // [sp+80h] [bp-4h]@1 v4 = uActorID; - a2 = edx0; + //a2 = edx0; v15 = uActorID; v5 = &pActors[uActorID]; //result = pActors[uActorID].CanAct(); if ( pActors[uActorID].CanAct() ) { - v7 = 8 * v4 | 3; - a1 = 8 * v4 | 3; + v7 = PID(OBJECT_Actor,v4); + a1 = PID(OBJECT_Actor,v4); if ( !a4 ) { a4 = &v12; - memcpy(&v12, Actor::GetDirectionInfo(v7, a2, &a3, v5->pMonsterInfo.uFlying), sizeof(v12)); + memcpy(&v12, Actor::GetDirectionInfo(v7, sTargetPid, &a3, v5->pMonsterInfo.uFlying), sizeof(v12)); v7 = a1; } memcpy(&a3, Actor::GetDirectionInfo(v7, 4u, &v10, 0), sizeof(a3)); memcpy(&v13, &a3, sizeof(v13)); if ( MonsterStats::BelongsToSupertype(v5->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) - || (a2 & 7) == OBJECT_Actor && (double)(signed int)v13.uDistance < 307.2 ) + || PID_TYPE(sTargetPid) == OBJECT_Actor && (double)(signed int)v13.uDistance < 307.2 ) { if ( !uActionLength ) uActionLength = 256; @@ -3365,7 +3377,7 @@ } //----- (0040281C) -------------------------------------------------------- -void Actor::_40281C(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *pDir, int a5) +void Actor::Pursue2(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *pDir, int a5) { unsigned int v5; // edi@1 int v6; // eax@1 @@ -3387,7 +3399,7 @@ v6 = 0; v7 = &pActors[uActorID]; v19 = a2; - v8 = 8 * uActorID | 3; + v8 = PID(OBJECT_Actor,uActorID); v9 = v7->pMonsterInfo.uFlying == 0; v20 = v5; if ( !v9 && !pParty->bFlying ) @@ -3448,14 +3460,14 @@ } //----- (00402686) -------------------------------------------------------- -void Actor::_402686(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *a4) +void Actor::Pursue3(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *a4) { - unsigned int v4; // edi@1 + //unsigned int v4; // edi@1 int v5; // eax@1 Actor *v6; // ebx@1 int v7; // ecx@1 char v8; // zf@1 - AIDirection *v9; // esi@7 + //AIDirection *v9; // esi@7 signed int v10; // edx@12 signed __int16 v12; // cx@19 int v13; // edx@25 @@ -3463,19 +3475,17 @@ unsigned __int16 v15; // ax@26 unsigned __int16 v16; // ax@28 int v17; // [sp-8h] [bp-54h]@12 - AIDirection *v18; // [sp-4h] [bp-50h]@12 + //AIDirection *v18; // [sp-4h] [bp-50h]@12 AIDirection a3; // [sp+Ch] [bp-40h]@8 AIDirection v20; // [sp+28h] [bp-24h]@8 int v21; // [sp+44h] [bp-8h]@1 - unsigned int v22; // [sp+48h] [bp-4h]@1 + //unsigned int v22; // [sp+48h] [bp-4h]@1 - v4 = uActorID; v5 = 0; v6 = &pActors[uActorID]; v21 = a2; - v7 = 8 * uActorID | 3; + v7 = PID(OBJECT_Actor,uActorID); v8 = v6->pMonsterInfo.uFlying == 0; - v22 = v4; if ( !v8 && !pParty->bFlying ) { if ( v6->pMonsterInfo.uMissleAttack1Type && uCurrentlyLoadedLevelType == LEVEL_Outdoor ) @@ -3483,31 +3493,21 @@ else v5 = pParty->uPartyHeight; } - v9 = a4; if ( !a4 ) { memcpy(&v20, Actor::GetDirectionInfo(v7, a2, &a3, v5), sizeof(v20)); - memcpy(0, &v20, 0x1Cu); - v9 = 0; - v4 = v22; } if ( MonsterStats::BelongsToSupertype(v6->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) ) { if ( !uActionLength ) uActionLength = 256; - v18 = v9; - v17 = uActionLength; - v10 = 4; - return Actor::AI_StandOrBored(v4, v10, v17, v18); + return Actor::AI_StandOrBored(uActorID, 4, uActionLength, a4); } - if ( (double)(signed int)v9->uDistance < 307.2 ) + if ( (double)(signed int)a4->uDistance < 307.2 ) { if ( !uActionLength ) uActionLength = 256; - v10 = v21; - v18 = v9; - v17 = uActionLength; - return Actor::AI_StandOrBored(v4, v10, v17, v18); + return Actor::AI_StandOrBored(uActorID, v21, uActionLength, a4); } if ( uActionLength ) { @@ -3517,25 +3517,25 @@ { v12 = v6->uMovementSpeed; if ( v12 ) - v6->uCurrentActionLength = (signed int)(v9->uDistanceXZ << 7) / v12; + v6->uCurrentActionLength = (signed int)(a4->uDistanceXZ << 7) / v12; else v6->uCurrentActionLength = 0; if ( v6->uCurrentActionLength > 128 ) v6->uCurrentActionLength = 128; } v13 = rand() % 2; - v14 = LOWORD(v9->uYawAngle); + v14 = LOWORD(a4->uYawAngle); if ( v13 ) v15 = v14 + 256; else v15 = v14 - 256; v6->uYawAngle = v15; - v16 = LOWORD(v9->uPitchAngle); + v16 = LOWORD(a4->uPitchAngle); v6->uCurrentActionTime = 0; v6->uPitchAngle = v16; v6->uAIState = Pursuing; if ( rand() % 100 < 2 ) - Actor::PlaySound(v4, 2u); + Actor::PlaySound(uActorID, 2u); v6->UpdateAnimation(); } @@ -3594,7 +3594,7 @@ actor->uAIState == Removed || actor->uAIState == Summoned || actor->uAIState == Disabled || uActorID == i ) continue; - if (_this->uLastCharacterIDToHit == 0 || (v9 = 8 * v5, LOBYTE(v9) = 8 * v5 | 3, _this->uLastCharacterIDToHit != v9) ) + if (_this->uLastCharacterIDToHit == 0 || (v9 = 8 * v5, LOBYTE(v9) = PID(OBJECT_Actor,v5), _this->uLastCharacterIDToHit != v9) ) { v10 = _this->GetActorsRelation(actor); if ( v10 == 0 ) @@ -3640,7 +3640,7 @@ if ( v25 != -1 ) { //v13 = 8 * v21; - //LOBYTE(v13) = 8 * v21 | OBJECT_Actor; + //LOBYTE(v13) = PID(OBJECT_Actor,v21); *a2 = PID(OBJECT_Actor, v21); } @@ -3660,7 +3660,7 @@ v14 = 4; if ( v14 != 0 ) { - v15 = dword_4DF390; + v15 = dword_4DF380[4]; if ( !_this->pMonsterInfo.uHostilityType ) v15 = dword_4DF380[v14]; v16 = abs(_this->vPosition.x - pParty->vPosition.x); @@ -4079,7 +4079,7 @@ if ( v23->uAttributes & 0x80000 ) v8->uAttributes |= 0x80000u; result = 8 * v24; - LOBYTE(result) = 8 * v24 | 3; + LOBYTE(result) = PID(OBJECT_Actor,v24); v8->uSummonerID = result; } return result;
--- a/Actor.h Mon Apr 01 13:39:19 2013 +0200 +++ b/Actor.h Mon Apr 01 13:39:39 2013 +0200 @@ -43,7 +43,7 @@ ACTOR_BUFF_CHARM = 1, // an assumption ACTOR_BUFF_SHRINK = 3, // an assumption ACTOR_BUFF_STONED = 5, - ACTOR_BUFF_PARALYZED = 6, + ACTOR_BUFF_PARALYZED = 6 }; @@ -193,30 +193,30 @@ static void _SelectTarget(unsigned int uActorID, int *a2, bool can_target_party); - static void _402686(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *a4); - static void _40281C(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *pDir, int a5); - static void _402968(unsigned int uActorID, signed int edx0, int uActionLength, struct AIDirection *a4); - static void _402AD7(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, struct AIDirection *pDir); + static void Pursue3(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *a4); + static void Pursue2(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *pDir, int a5); + static void Flee(unsigned int uActorID, signed int edx0, int uActionLength, struct AIDirection *a4); + static void Pursue1(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, struct AIDirection *pDir); static void PlaySound(unsigned int uActorID, unsigned int uSoundID); static void Die(unsigned int uActorID); static void Resurrect(unsigned int uActorID); static void AI_Bored(unsigned int uActorID, unsigned int uObjID, struct AIDirection *a4); - static void _4030AD(unsigned int uActorID, signed int edx0, int arg0); + static void Stun(unsigned int uActorID, signed int edx0, int arg0); static char __fastcall _4031C1_update_job(unsigned int uActorID, signed int a2, int a3); static void _4032B2(unsigned int a1, unsigned int a2, int a3, int uActionLength); - static void _403476(unsigned int uActorID, signed int edx0, struct AIDirection *pDir); - static void _40368B(unsigned int uActorID, signed int edx0, struct AIDirection *pDir); - static void _403854(unsigned int uActorID, signed int edx0, struct AIDirection *pDir); - static void _403A60(unsigned int uActorID, signed int edx0, struct AIDirection *pDir); - static void _403C6C(unsigned int uActorID, signed int edx0, struct AIDirection *arg0); + static void MissileAttack1(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void MissileAttack2(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void SpellAttack1(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void SpellAttack2(unsigned int uActorID, signed int sTargetPid, struct AIDirection *pDir); + static void MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0); static void __fastcall StandAwhile(unsigned int uActorID); static void AI_Stand(unsigned int uActorID, unsigned int object_to_face_pid, unsigned int uActionLength, struct AIDirection *a4); static void AI_StandOrBored(unsigned int uActorID, signed int uObjID, int uActionLength, struct AIDirection *a4); static void FaceObject(unsigned int uActorID, unsigned int uObjID, int _48, struct AIDirection *a4); static struct AIDirection *__fastcall GetDirectionInfo(unsigned int uObj1ID, unsigned int uObj2ID, struct AIDirection *pOut, int a4); static signed int __fastcall Explode(unsigned int uActorID); - static char __fastcall _404874(unsigned int uActorID, struct AIDirection *a2, int a3, char a4); - static void __fastcall _404AC7(unsigned int uActorID, struct AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel); + static char __fastcall RangedAttack(unsigned int uActorID, struct AIDirection *a2, int type, char a4); + static void __fastcall SpellAttack(unsigned int uActorID, struct AIDirection *pDir, int spellnum, int a4, unsigned int uSkillLevel); static void AggroSurroundingPeasants(unsigned int uActorID, int a2); static bool ArePeasantsOfSameFaction(Actor *a1, Actor *a2); static bool StealFrom(unsigned int uActorID);
--- a/Arcomage.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Arcomage.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -1542,7 +1542,7 @@ ArcomageGame::PlaySound(0x14u); memset(byte_5054E8, 0, sizeof(byte_5054E8)); memset(v9, 0, sizeof(v9)); - v0 = stru_505708[0].arr_44; + v0 = stru_505708[0].arr_44;//variable incorrect do { v1 = v0;
--- a/AudioPlayer.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/AudioPlayer.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -21,7 +21,7 @@ #include "Bink_Smacker.h" #include "mm7_data.h" - +#include "MM7.h" PCMWAVEFORMAT pcmWaveFormat; @@ -773,8 +773,8 @@ } else { - int object_type = a3 & 7, - object_id = a3 >> 7; + int object_type = PID_TYPE(a3), + object_id = PID_ID(a3); switch (object_type) { case OBJECT_BLVDoor: @@ -971,8 +971,8 @@ sample_volume = uVolume; AIL_set_sample_volume(channel->hSample, sample_volume); - int object_type = a3 & 7, - object_id = a3 >> 7; + int object_type = PID_TYPE(a3), + object_id = PID_ID(a3); if (PartyX != -1) { if (!PartyX) PartyX = pParty->vPosition.x; @@ -1065,7 +1065,7 @@ v21 = (double)pParty->sEyelevel + (double)pParty->vPosition.z; goto LABEL_47; } - if ( (a3 & 7) == 2 ) + if ( PID_TYPE(a3) == 2 ) { v22 = pAudioPlayer->uNum3DSamples; if ( v22 < 16 ) @@ -1078,11 +1078,11 @@ v96 = 7; v12 = 5; } - pLayingItem = &pSpriteObjects[a3 >> 3]; + pLayingItem = &pSpriteObjects[PID_ID(a3)]; } else { - if ( (a3 & 7) == 3 ) + if ( PID_TYPE(a3) == 3 ) { v18 = pAudioPlayer->uNum3DSamples; v12 = 0; @@ -1090,7 +1090,7 @@ v96 = 3 * v18 / 16; else v96 = 3; - pActor1 = &pActors[a3 >> 3]; + pActor1 = &pActors[PID_ID(a3)]; v20 = pActor1->vPosition.y; pRenderVertexSoft.vWorldPosition.x = (double)pActor1->vPosition.x; v100 = pActor1->vPosition.z; @@ -1098,10 +1098,10 @@ v21 = (double)v100; goto LABEL_47; } - if ( (a3 & 7) != 5 ) + if ( PID_TYPE(a3) != 5 ) { v13 = pAudioPlayer->uNum3DSamples; - if ( (a3 & 7) == 6 ) + if ( PID_TYPE(a3) == 6 ) { if ( v13 >= 16 ) { @@ -1151,7 +1151,7 @@ v12 = 4; v96 = 4; } - pLayingItem = (SpriteObject *)&pLevelDecorations[a3 >> 3]; + pLayingItem = (SpriteObject *)&pLevelDecorations[PID_ID(a3)]; } pRenderVertexSoft.vWorldPosition.x = (double)pLayingItem->vPosition.x; pRenderVertexSoft.vWorldPosition.y = (double)pLayingItem->vPosition.y; @@ -1273,12 +1273,12 @@ AIL_set_3D_sample_loop_count(*(int *)v42, v86); if ( PartyX == -1 ) { - if ( (a3 & 7) == 1 ) + if ( PID_TYPE(a3) == 1 ) { if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) { //goto LABEL_103; - pBLVDoor = &pIndoor->pDoors[a3 >> 3]; + pBLVDoor = &pIndoor->pDoors[PID_ID(a3)]; if ( !pBLVDoor->uDoorID ) return; pRenderVertexSoft.vWorldPosition.x = (double)*pBLVDoor->pXOffsets; @@ -1323,15 +1323,15 @@ } return; } - if ( (a3 & 7) == 2 ) + if ( PID_TYPE(a3) == 2 ) { - pLayingItem2 = &pSpriteObjects[a3 >> 3]; + pLayingItem2 = &pSpriteObjects[PID_ID(a3)]; } else { - if ( (a3 & 7) == 3 ) + if ( PID_TYPE(a3) == 3 ) { - pActor = &pActors[a3 >> 3]; + pActor = &pActors[PID_ID(a3)]; v46 = pActor->vPosition.y; pRenderVertexSoft.vWorldPosition.x = (double)pActor->vPosition.x; uNumRepeatsb = pActor->vPosition.z; @@ -1339,7 +1339,7 @@ v47 = (double)uNumRepeatsb; goto LABEL_101; } - if ( (a3 & 7) != 5 ) + if ( PID_TYPE(a3) != 5 ) { pRenderVertexSoft.vWorldPosition.x = (double)pParty->vPosition.x; v43 = (double)pParty->vPosition.y; @@ -1348,7 +1348,7 @@ v47 = (double)pParty->sEyelevel + (double)pParty->vPosition.z; goto LABEL_101; } - pLayingItem2 = (SpriteObject *)&pLevelDecorations[a3 >> 3]; + pLayingItem2 = (SpriteObject *)&pLevelDecorations[PID_ID(a3)]; } pRenderVertexSoft.vWorldPosition.x = (double)pLayingItem2->vPosition.x; pRenderVertexSoft.vWorldPosition.y = (double)pLayingItem2->vPosition.y; @@ -1462,7 +1462,7 @@ v6 = this->p3DSamples; while ( 1 ) { - v7 = v6->field_4 & 7; + v7 = PID_TYPE(v6->field_4); if ( AIL_3D_sample_status(v6->hSample) == 2 ) { AIL_end_3D_sample(v6->hSample); @@ -1475,7 +1475,7 @@ break; if ( uCurrentlyLoadedLevelType != LEVEL_Indoor ) goto LABEL_31; - v15 = &pIndoor->pDoors[v6->field_4 >> 3]; + v15 = &pIndoor->pDoors[PID_ID(v6->field_4)]; if ( v15->uDoorID ) { uNumRepeats = *v15->pXOffsets; @@ -1502,7 +1502,7 @@ v10 = v9 - 1; if ( !v10 ) { - v13 = &pActors[v6->field_4 >> 3]; + v13 = &pActors[PID_ID(v6->field_4)]; uNumRepeats = v13->vPosition.x; v14 = v13->vPosition.y; a1.vWorldPosition.x = (double)uNumRepeats; @@ -1518,11 +1518,11 @@ v11 = (double)pParty->sEyelevel + (double)pParty->vPosition.z; goto LABEL_21; } - v12 = (SpriteObject *)&pLevelDecorations[v6->field_4 >> 3]; + v12 = (SpriteObject *)&pLevelDecorations[PID_ID(v6->field_4)]; } else { - v12 = &pSpriteObjects[v6->field_4 >> 3]; + v12 = &pSpriteObjects[PID_ID(v6->field_4)]; } a1.vWorldPosition.x = (double)v12->vPosition.x; a1.vWorldPosition.y = (double)v12->vPosition.y; @@ -1623,8 +1623,8 @@ if (channel->source_pid <= 0) continue; - int source_type = channel->source_pid & 7, - source_id = channel->source_pid >> 3; + int source_type = PID_TYPE(channel->source_pid), + source_id = PID_ID(channel->source_pid); int source_x, source_y, source_z;
--- a/Chest.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Chest.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -20,7 +20,7 @@ #include "Overlays.h" #include "mm7_data.h" - +#include "MM7.h" @@ -109,9 +109,9 @@ v31 = 813; v32 = 814; v5 = rand() % 4; - v6 = EvtTargetObj >> 3; + v6 = PID_ID(EvtTargetObj); v35 = v5; - if ( (EvtTargetObj & 7) == OBJECT_Decoration) + if ( PID_TYPE(EvtTargetObj) == OBJECT_Decoration) { v16 = v6; v14 = pLevelDecorations[v6].vPosition.x; @@ -121,7 +121,7 @@ } else { - if ( (EvtTargetObj & 7) != OBJECT_BModel) + if ( PID_TYPE(EvtTargetObj) != OBJECT_BModel) goto LABEL_12; if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) {
--- a/GUIWindow.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/GUIWindow.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -1018,76 +1018,97 @@ //----- (004B3157) -------------------------------------------------------- void GUIWindow::HouseDialogManager() { - unsigned __int16 v1; // di@2 - const char *v2; // edx@4 + unsigned __int16 pWhiteColor; // di@2 + const char *pHouseName; // edx@4 signed int v3; // edx@5 char *v4; // edi@9 - int v5; // eax@45 + int pTextHeight; // eax@45 int v6; // edi@45 char *v7; // eax@45 int v8; // edi@46 int v9; // eax@50 unsigned int v10; // [sp-10h] [bp-C8h]@53 - unsigned __int16 v11; // [sp-Ch] [bp-C4h]@53 + //unsigned __int16 v11; // [sp-Ch] [bp-C4h]@53 //unsigned int v12; // [sp-Ch] [bp-C4h]@60 char *v13; // [sp-8h] [bp-C0h]@50 //unsigned int v14; // [sp-8h] [bp-C0h]@60 unsigned int v15; // [sp-4h] [bp-BCh]@50 //Texture *v16; // [sp-4h] [bp-BCh]@60 - GUIWindow w; // [sp+Ch] [bp-ACh]@4 - GUIWindow v18; // [sp+60h] [bp-58h]@2 - int v19; // [sp+B4h] [bp-4h]@2 + GUIWindow pDialogWindow; // [sp+Ch] [bp-ACh]@4 + GUIWindow pWindow; // [sp+60h] [bp-58h]@2 + int pColor2; // [sp+B4h] [bp-4h]@2 if ( !window_SpeakInHouse ) return; - memcpy(&v18, this, sizeof(v18)); - v18.uFrameWidth -= 18; - v18.uFrameZ -= 18; - v1 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); - v19 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x15u, 0x99u, 0xE9u); + memcpy(&pWindow, this, sizeof(pWindow)); + pWindow.uFrameWidth -= 18; + pWindow.uFrameZ -= 18; + pWhiteColor = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + pColor2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x15u, 0x99u, 0xE9u); pRenderer->DrawTextureIndexed(0x1DDu, 0, pTexture_Dialogue_Background); pRenderer->DrawTextureTransparent(0x1D4u, 0, &pIcons_LOD->pTextures[uTextureID_507B04]); if ( pDialogueNPCCount != uNumDialogueNPCPortraits || !uHouse_ExitPic ) { - w.uFrameWidth = 130; - w.uFrameHeight = 2 * LOBYTE(pFontCreate->uFontHeight); + pDialogWindow.uFrameWidth = 130; + pDialogWindow.uFrameHeight = 2 * LOBYTE(pFontCreate->uFontHeight); //v2 = (const char *)p2DEvents_minus1_::04[13 * (unsigned int)ptr_507BC0->ptr_1C]; - v2 = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].pName; + pHouseName = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].pName; - if ( v2 ) + if ( pHouseName ) { - v3 = 2 * LOBYTE(pFontCreate->uFontHeight) - 6 - pFontCreate->CalcTextHeight(v2, &w, 0, 0); + v3 = 2 * LOBYTE(pFontCreate->uFontHeight) - 6 - pFontCreate->CalcTextHeight(pHouseName, &pDialogWindow, 0, 0); if ( v3 < 0 ) v3 = 0; - v18.DrawTitleText(pFontCreate, 0x1EAu, v3 / 2 + 4, v1, + pWindow.DrawTitleText(pFontCreate, 0x1EAu, v3 / 2 + 4, pWhiteColor, //(const char *)p2DEvents_minus1_::04[13 * (unsigned int)ptr_507BC0->ptr_1C], p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].pName, 3); } } - v18.uFrameWidth += 8; - v18.uFrameZ += 8; + pWindow.uFrameWidth += 8; + pWindow.uFrameZ += 8; if ( !pDialogueNPCCount ) { if ( in_current_building_type == BildingType_Jail ) { JailDialog(); - goto LABEL_58; + if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic ) + { + pRenderer->DrawTextureIndexed(556, 451, &pIcons_LOD->pTextures[uTextureID_x_x_u]); + pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]); + } + else + { + pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]); + } + return; } if ( current_npc_text ) { - w.uFrameWidth = 458; - w.uFrameZ = 457; - v5 = pFontArrus->CalcTextHeight(current_npc_text, &w, 13, 0); - v6 = v5 + 7; - pRenderer->_4A6A68(8, 352 - (v5 + 7), &pIcons_LOD->pTextures[uTextureID_Leather], pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight - (v5 + 7)); - pRenderer->DrawTextureIndexed(8u, 347 - v6, pTexture_591428); - v7 = FitTextInAWindow(current_npc_text, pFontArrus, &w, 0xDu, 0); + pDialogWindow.uFrameWidth = 458; + pDialogWindow.uFrameZ = 457; + pTextHeight = pFontArrus->CalcTextHeight(current_npc_text, &pDialogWindow, 13, 0); + v6 = pTextHeight + 7; + pRenderer->_4A6A68(8, 352 - (pTextHeight + 7), &pIcons_LOD->pTextures[uTextureID_Leather], + pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight - (pTextHeight + 7)); + pRenderer->DrawTextureIndexed(8, 347 - v6, pTexture_591428); + v7 = FitTextInAWindow(current_npc_text, pFontArrus, &pDialogWindow, 0xDu, 0); window_SpeakInHouse->DrawText(pFontArrus, 13, 354 - v6, 0, v7, 0, 0, 0); } + if ( uNumDialogueNPCPortraits <= 0 ) + { + if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic ) + { + pRenderer->DrawTextureIndexed(556, 451, &pIcons_LOD->pTextures[uTextureID_x_x_u]); + pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]); + } + else + { + pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]); + } + return; + } v8 = 0; - if ( uNumDialogueNPCPortraits <= 0 ) - goto LABEL_58; while ( 1 ) { //pRenderer->DrawTextureIndexed(*(&pNPCPortraits_x + v8 + 6 * uNumDialogueNPCPortraits - 6) - 4, @@ -1103,7 +1124,18 @@ LABEL_57: ++v8; if ( v8 >= uNumDialogueNPCPortraits ) - goto LABEL_58; + { + if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic ) + { + pRenderer->DrawTextureIndexed(556, 451, &pIcons_LOD->pTextures[uTextureID_x_x_u]); + pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]); + } + else + { + pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]); + } + return; + } } if ( v8 + 1 == uNumDialogueNPCPortraits && uHouse_ExitPic ) { @@ -1118,16 +1150,16 @@ v15 = 3; //v13 = (char *)p2DEvents_minus1__10[13 * (unsigned int)ptr_507BC0->ptr_1C]; v13 = (char *)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].pProprieterTitle; - v18.DrawTitleText(pFontCreate, 0x1E3u, 113, v19, v13, 3); + pWindow.DrawTitleText(pFontCreate, 0x1E3u, 113, pColor2, v13, 3); goto LABEL_57; } v15 = 3; v13 = HouseNPCData[v8 - (dword_591080 != 0)]->pName; v9 = pNPCPortraits_x[6 + (uNumDialogueNPCPortraits - 1)][v8] + pDialogueNPCPortraits[v8]->uTextureHeight + 2; } - v11 = v19; + //v11 = pColor2; v10 = v9; - v18.DrawTitleText(pFontCreate, 0x1E3u, v10, v11, v13, v15); + pWindow.DrawTitleText(pFontCreate, 0x1E3u, v10, pColor2, v13, v15); goto LABEL_57; } v4 = (char *)pDialogueNPCCount - 1; @@ -1136,7 +1168,16 @@ if ( pCurrentScreen == SCREEN_E ) { CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); - goto LABEL_58; + if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic ) + { + pRenderer->DrawTextureIndexed(556, 451, &pIcons_LOD->pTextures[uTextureID_x_x_u]); + pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]); + } + else + { + pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uExitCancelTextureId]); + } + return; } if ( v4 || !dword_591080 ) { @@ -1147,7 +1188,7 @@ sprintfex( pTmpBuf, pGlobalTXT_LocalizationStrings[429], p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].pProprieterName, p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].pProprieterTitle); - v18.DrawTitleText(pFontCreate, 0x1E3u, 0x71u, v19, pTmpBuf, 3u); + pWindow.DrawTitleText(pFontCreate, 0x1E3u, 0x71u, pColor2, pTmpBuf, 3); switch ( in_current_building_type ) { case BildingType_WeaponShop: @@ -1203,7 +1244,6 @@ break; } } -LABEL_58: if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic ) { pRenderer->DrawTextureIndexed(556, 451, &pIcons_LOD->pTextures[uTextureID_x_x_u]); @@ -1928,7 +1968,7 @@ else { if ( v26 || !dword_591080 ) - v27 = HouseNPCData[v26 - (dword_591080 != 0)]->pName; + v27 = HouseNPCData[v26 - (dword_591080 != 0)]->pName;//problem in Harmondale tavern(v26 == 0) else //v27 = (char *)p2DEvents_minus1_::08[13 * a4]; v27 = (char *)p2DEvents[pButton - 1].pProprieterName;
--- a/Game.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Game.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -84,12 +84,13 @@ if ( pParty->vPosition.x != pParty->vPrevPosition.x | pParty->sRotationY != pParty->sPrevRotationY | pParty->vPosition.y != pParty->vPrevPosition.y | pParty->sRotationX != pParty->sPrevRotationX | pParty->vPosition.z != pParty->vPrevPosition.z | pParty->sEyelevel != pParty->sPrevEyelevel ) pParty->uFlags |= 2u; - pParty->vPrevPosition = pParty->vPosition; + pParty->vPrevPosition.x = pParty->vPosition.x; pParty->vPrevPosition.y = pParty->vPosition.y; + pParty->vPrevPosition.z = pParty->vPosition.z; //v0 = &pRenderer; pParty->sPrevRotationY = pParty->sRotationY; - pParty->vPrevPosition.z = pParty->vPosition.z; pParty->sPrevRotationX = pParty->sRotationX; + pParty->sPrevEyelevel = pParty->sEyelevel; pRenderer->BeginSceneD3D();
--- a/GameUIs.cpp Mon Apr 01 13:39:19 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,240 +0,0 @@ -#include <direct.h> -#include <io.h> -#include <assert.h> - -#include "GUIWindow.h" -#include "GUIFont.h" -#include "LOD.h" -#include "SaveLoad.h" -#include "Render.h" -#include "texts.h" - -#include "mm7_data.h" - - -//----- (0045E361) -------------------------------------------------------- -void __fastcall GameUI_DrawLoadMenu(unsigned int uDialogueType) -{ - unsigned int v1; // ebp@5 - unsigned int v2; // eax@5 - //signed int v3; // ebp@11 - FILE *v4; // eax@14 - FILE *v5; // eax@18 - unsigned int v6; // eax@25 - GUIButton *v7; // eax@27 - const char *v8; // [sp-8h] [bp-26Ch]@25 - //char *v9; // [sp-4h] [bp-268h]@19 - enum TEXTURE_TYPE v10; // [sp-4h] [bp-268h]@25 - unsigned int uDialogueType_; // [sp+10h] [bp-254h]@1 - //RGBTexture *pTex; // [sp+10h] [bp-254h]@12 - //SavegameHeader *Dest; // [sp+14h] [bp-250h]@12 - //const char *Str1; // [sp+18h] [bp-24Ch]@12 - LODWriteableFile pLODFile; // [sp+1Ch] [bp-248h]@1 - int v16; // [sp+260h] [bp-4h]@1 - - uDialogueType_ = uDialogueType; - dword_6BE138 = -1; - pIcons_LOD->_inlined_sub2(); - - memset(pSavegameUsedSlots, 0, sizeof(pSavegameUsedSlots)); - memset(pSavegameThumbnails, 0, 45 * sizeof(RGBTexture)); - uTextureID_loadsave = pIcons_LOD->LoadTexture("loadsave", TEXTURE_16BIT_PALETTE); - uTextureID_load_up = pIcons_LOD->LoadTexture("load_up", TEXTURE_16BIT_PALETTE); - uTextureID_save_up = pIcons_LOD->LoadTexture("save_up", TEXTURE_16BIT_PALETTE); - uTextureID_LS_loadU = pIcons_LOD->LoadTexture("LS_loadU", TEXTURE_16BIT_PALETTE); - uTextureID_LS_saveU = pIcons_LOD->LoadTexture("LS_saveU", TEXTURE_16BIT_PALETTE); - uTextureID_x_u = pIcons_LOD->LoadTexture("x_u", TEXTURE_16BIT_PALETTE); - if ( uDialogueType_ ) - { - pRenderer->DrawTextureIndexed(8, 8, (Texture *)(uTextureID_loadsave != -1 ? &pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); - if ( pCurrentScreen == SCREEN_SAVEGAME ) - { - v1 = uTextureID_save_up; - v2 = uTextureID_LS_saveU; - } - else - { - v1 = uTextureID_load_up; - v2 = uTextureID_LS_loadU; - } - pRenderer->DrawTextureIndexed(241, 302, (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0)); - pRenderer->DrawTextureIndexed(18, 141, (Texture *)(v1 != -1 ? (int)&pIcons_LOD->pTextures[v1] : 0)); - pRenderer->DrawTextureIndexed(351, 302, (Texture *)(uTextureID_x_u != -1 ? &pIcons_LOD->pTextures[uTextureID_x_u] : 0)); - } - else - { - pRenderer->DrawTextureRGB(0, 0, &pTexture_PCX); - } - pGUIWindow_CurrentMenu = GUIWindow::Create(saveload_dlg_xs[uDialogueType_], saveload_dlg_ys[uDialogueType_], saveload_dlg_zs[uDialogueType_], - saveload_dlg_ws[uDialogueType_], WINDOW_MainMenu_Load, 0, 0); - pGUIWindow_CurrentMenu->DrawText(pFontSmallnum, 25, 199, 0, pGlobalTXT_LocalizationStrings[505], 0, 0, 0);// "Reading..." - pRenderer->Present(); - pSavegameList->Initialize(0); - if ( pSaveListPosition > (signed int)uNumSavegameFiles ) - { - pSaveListPosition = 0; - uLoadGameUI_SelectedSlot = 0; - } - pLODFile.AllocSubIndicesAndIO(0x12C, 0); - assert(sizeof(SavegameHeader) == 0x64); - //v3 = 0; - for (uint i = 0; i < uNumSavegameFiles; ++i) - { - - sprintf(pTmpBuf, "saves\\%s", pSavegameList->pFileList[i].pSaveFileName); - if (_access(pTmpBuf, 6)) - { - pSavegameUsedSlots[i] = 0; - strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[72]); // "Empty" - continue; - } - pLODFile.LoadFile(pTmpBuf, 1); - v4 = pLODFile.FindContainer("header.bin", true); - if ( v4 ) - fread(&pSavegameHeader[i], 0x64, 1, v4); - if ( !_strcmpi(pSavegameList->pFileList[i].pSaveFileName, pGlobalTXT_LocalizationStrings[613]) )// "AutoSave.MM7" - strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[16]);// "Autosave" - v5 = pLODFile.FindContainer("image.pcx", true); - if ( !v5 ) - { - pSavegameUsedSlots[i] = 0; - strcpy(pSavegameList->pFileList[i].pSaveFileName, ""); - } - else - { - pSavegameThumbnails[i].LoadFromFILE(v5, 0, true); - pLODFile.CloseWriteFile(); - pSavegameUsedSlots[i] = 1; - } - } - -//LABEL_24: - pLODFile.FreeSubIndexAndIO(); - if ( pCurrentScreen == SCREEN_SAVEGAME ) - { - uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); - uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_saveD",TEXTURE_16BIT_PALETTE); - } - else - { - uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); - uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_loadD",TEXTURE_16BIT_PALETTE); - } - uTextureID_AR_UP_DN = pIcons_LOD->LoadTexture("AR_UP_DN", TEXTURE_16BIT_PALETTE); - uTextureID_AR_DN_DN = pIcons_LOD->LoadTexture("AR_DN_DN", TEXTURE_16BIT_PALETTE); - pGUIWindow_CurrentMenu->CreateButton(21, 198, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 0, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21, 219, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 1, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21, 240, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 2, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21, 261, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 3, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21, 282, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 4, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21, 303, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 5, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21, 324, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 6, 0, "", 0); - pBtnLoadSlot = pGUIWindow_CurrentMenu->CreateButton(241, 302, 105, 40, 1, 0, UIMSG_LoadSlot, 0, 0, "", - pIcons_LOD->GetTexture(uTextureID_LS_), 0); - pBtnCancel = pGUIWindow_CurrentMenu->CreateButton(350, 302, 105, 40, 1, 0, UIMSG_Cancel, 0, 0, "", - pIcons_LOD->GetTexture(uTextureID_x_d), 0); - pBtnArrowUp = pGUIWindow_CurrentMenu->CreateButton(215, 199, 17, 17, 1, 0, UIMSG_ArrowUp, 0, 0, "", - pIcons_LOD->GetTexture(uTextureID_AR_UP_DN), 0); - pBtnDownArrow = pGUIWindow_CurrentMenu->CreateButton(215, 0x143, 0x11, 0x11, 1, 0, UIMSG_DownArrow, uNumSavegameFiles, 0, "", - pIcons_LOD->GetTexture(uTextureID_AR_DN_DN), 0); - -} - -//----- (0045E93E) -------------------------------------------------------- -void GameUI_DrawSaveMenu() -{ - unsigned int v0; // ebp@4 - unsigned int v1; // eax@4 - char *v3; // eax@7 - FILE *v4; // eax@11 - FILE *v5; // eax@11 - LODWriteableFile v11; // [sp+1Ch] [bp-248h]@1 - - ++pIcons_LOD->uTexturePacksCount; - if ( !pIcons_LOD->uNumPrevLoadedFiles ) - pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; - memset(pSavegameUsedSlots, 0, 0xB4u); - memset(&pSavegameThumbnails, 0, 0x708u); - uTextureID_loadsave = pIcons_LOD->LoadTexture("loadsave", TEXTURE_16BIT_PALETTE); - uTextureID_load_up = pIcons_LOD->LoadTexture("load_up", TEXTURE_16BIT_PALETTE); - uTextureID_save_up = pIcons_LOD->LoadTexture("save_up", TEXTURE_16BIT_PALETTE); - uTextureID_LS_loadU = pIcons_LOD->LoadTexture("LS_loadU", TEXTURE_16BIT_PALETTE); - uTextureID_LS_saveU = pIcons_LOD->LoadTexture("LS_saveU", TEXTURE_16BIT_PALETTE); - uTextureID_x_u = pIcons_LOD->LoadTexture("x_u", TEXTURE_16BIT_PALETTE); - pRenderer->DrawTextureIndexed( 8u, 8u, - (Texture *)(uTextureID_loadsave != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); - if ( pCurrentScreen == SCREEN_SAVEGAME ) - { - v0 = uTextureID_save_up; - v1 = uTextureID_LS_saveU; - } - else - { - v0 = uTextureID_load_up; - v1 = uTextureID_LS_loadU; - } - pRenderer->DrawTextureIndexed(0xF1u, 0x12Eu, (Texture *)(v1 != -1 ? (int)&pIcons_LOD->pTextures[v1] : 0)); - pRenderer->DrawTextureIndexed(0x15Fu, 0x12Eu, - (Texture *)(uTextureID_x_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_u] : 0)); - pRenderer->DrawTextureIndexed(0x12u, 0x8Du, (Texture *)(v0 != -1 ? (int)&pIcons_LOD->pTextures[v0] : 0)); - pGUIWindow_CurrentMenu->DrawText(pFontSmallnum, 25, 199, 0, pGlobalTXT_LocalizationStrings[505], 0, 0, 0); - pRenderer->Present(); - pSavegameList->Initialize(1u); - v11.AllocSubIndicesAndIO(0x12Cu, 0); - //v2 = pSavegameUsedSlots; - // Dest = pSavegameHeader; - // this_ = pSavegameThumbnails; - // v8 = (char *)pSavegameList->pSavesNames; - for (uint i = 0; i < 40; ++i) - { - v3 = pSavegameList->pFileList[i].pSaveFileName; - if ( !*pSavegameList->pFileList[i].pSaveFileName ) - v3 = "1.mm7"; - sprintf(pTmpBuf, "saves\\%s", v3); - if ( _access(pTmpBuf, 0) || _access(pTmpBuf, 6) ) - { - pSavegameUsedSlots[i] = 0; - strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[LOCSTR_EMPTY]); - } - else - { - v11.LoadFile(pTmpBuf, 1); - v4 = v11.FindContainer("header.bin", 1); - fread(&pSavegameHeader[i], 100, 1u, v4); - v5 = v11.FindContainer("image.pcx", 1); - if ( v5 ) - { - pSavegameThumbnails[i].LoadFromFILE(v5, 0, 1u); - v11.CloseWriteFile(); - pSavegameUsedSlots[i] = 1; - } - else - { - pSavegameUsedSlots[i] = 0; - } - } - - } - - v11.FreeSubIndexAndIO(); - uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); - uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_saveD", TEXTURE_16BIT_PALETTE); - uTextureID_AR_UP_DN = pIcons_LOD->LoadTexture("AR_UP_DN", TEXTURE_16BIT_PALETTE); - uTextureID_AR_DN_DN = pIcons_LOD->LoadTexture("AR_DN_DN", TEXTURE_16BIT_PALETTE); - pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_17, 0, 0); - pGUIWindow_CurrentMenu->CreateButton(21u, 198u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 0, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21u, 218u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 1u, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21u, 238u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 2u, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21u, 258u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 3u, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21u, 278u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 4u, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21u, 298u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 5u, 0, "", 0); - pGUIWindow_CurrentMenu->CreateButton(21u, 318u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 6u, 0, "", 0); - pBtnLoadSlot = pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0x69u, 0x28u, 1, 0, UIMSG_LoadSlot, 0, 0, "", - (Texture *)(uTextureID_LS_ != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_LS_] : 0), 0); - pBtnCancel = pGUIWindow_CurrentMenu->CreateButton(0x15Eu, 0x12Eu, 0x69u, 0x28u, 1, 0, UIMSG_Cancel, 0, 0, "", - (Texture *)(uTextureID_x_d != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_d] : 0), 0); - pBtnArrowUp = pGUIWindow_CurrentMenu->CreateButton( 0xD7u, 0xC7u, 0x11u, 0x11u, 1, 0, UIMSG_ArrowUp, 0, 0, "", - (Texture *)(uTextureID_AR_UP_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_UP_DN] : 0), 0); - pBtnDownArrow = pGUIWindow_CurrentMenu->CreateButton( 0xD7u, 0x143u, 0x11u, 0x11u, 1, 0, UIMSG_DownArrow, 0x22u, 0, "", - (Texture *)(uTextureID_AR_DN_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_DN_DN] : 0), 0); -} \ No newline at end of file
--- a/Indoor.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Indoor.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -3478,15 +3478,15 @@ //v66 = 0; //v65 = 0; //v64 = 0; - //v7 = 8 * i | OBJECT_BLVDoor; + //v7 = PID(OBJECT_BLVDoor,i); //v63 = 0; //v62 = -1; - //LOBYTE(v7) = 8 * i | OBJECT_BLVDoor; + //LOBYTE(v7) = PID(OBJECT_BLVDoor,i); //v61 = 0; - //v60 = 8 * i | OBJECT_BLVDoor; + //v60 = PID(OBJECT_BLVDoor,i); //v59 = (SoundID)((int)eDoorSoundID + 1); //LABEL_17: - pAudioPlayer->PlaySound((SoundID)((int)eDoorSoundID + 1), 8 * i | OBJECT_BLVDoor, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound((SoundID)((int)eDoorSoundID + 1), PID(OBJECT_BLVDoor,i), 0, -1, 0, 0, 0, 0); //goto LABEL_18; } goto LABEL_18; @@ -3509,14 +3509,14 @@ //v66 = 0; //v65 = 0; //v64 = 0; - //v8 = 8 * i | OBJECT_BLVDoor; + //v8 = PID(OBJECT_BLVDoor,i); //v63 = 0; //v62 = -1; //LOBYTE(v8) = 8 * v1 | 1; //v61 = 1; - //v60 = 8 * i | OBJECT_BLVDoor; + //v60 = PID(OBJECT_BLVDoor,i); //v59 = eDoorSoundID; - pAudioPlayer->PlaySound(eDoorSoundID, 8 * i | OBJECT_BLVDoor, 1, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(eDoorSoundID, PID(OBJECT_BLVDoor,i), 1, -1, 0, 0, 0, 0); //goto LABEL_18; } LABEL_18: @@ -3999,7 +3999,7 @@ { v58 = v22; v24 = 8 * v63; - LOBYTE(v24) = 8 * v63 | 3; + LOBYTE(v24) = PID(OBJECT_Actor,v63); v61 = v22; _this = v24; do @@ -4082,12 +4082,12 @@ v0->vPosition.z += (unsigned int)(stru_721530.field_7C * stru_721530.field_58.z) >> 16; v0->uSectorID = LOWORD(stru_721530.uSectorID); stru_721530.field_70 += stru_721530.field_7C; - v37 = v36 >> 3; - if ( (v36 & 7) != OBJECT_Actor) + v37 = PID_ID(v36); + if ( PID_TYPE(v36) != OBJECT_Actor) { - if ( (v36 & 7) != OBJECT_Player) + if ( PID_TYPE(v36) != OBJECT_Player) { - if ( (v36 & 7) == OBJECT_Decoration) + if ( PID_TYPE(v36) == OBJECT_Decoration) { _this = integer_sqrt(v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y); v45 = stru_5C6E00->Atan2( @@ -4104,7 +4104,7 @@ v0->vVelocity.y = WORD1(v48); goto LABEL_119; } - if ( (v36 & 7) == OBJECT_BModel) + if ( PID_TYPE(v36) == OBJECT_BModel) { stru_721530.field_84 = v36 >> 3; v38 = &pIndoor->pFaces[v37]; @@ -4207,7 +4207,7 @@ if ( !pActors[v37].pMonsterInfo.uHostilityType ) goto LABEL_118; LABEL_114: - Actor::_402968(v63, v36, v22, (AIDirection *)v22); + Actor::Flee(v63, v36, v22, (AIDirection *)v22); goto LABEL_119; } }
--- a/MM7.h Mon Apr 01 13:39:19 2013 +0200 +++ b/MM7.h Mon Apr 01 13:39:39 2013 +0200 @@ -66,33 +66,6 @@ - - - - -/* 154 */ -#pragma pack(push, 1) -struct stru161 -{ - Vec3_int_ pos; - __int16 rot_y; - __int16 rot_x; - unsigned __int16 uMapInfoID; - __int16 field_12; -}; -#pragma pack(pop) -extern stru161 stru_4ECBB8[6]; // weak - - - - - - - - - - - /* 285 */ #pragma pack(push, 1) struct stru289
--- a/Outdoor.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Outdoor.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -2797,7 +2797,7 @@ pActors[i].vVelocity.y = 0; pActors[i].vVelocity.z = 0; pActors[i].UpdateAnimation(); - pActors[i].pMonsterInfo.uHostilityType = (MonsterInfo::HostilityRadius)0; + pActors[i].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; pActors[i].PrepareSprites(0); } else @@ -2825,7 +2825,7 @@ pActors[i].vVelocity.y = 0; pActors[i].vVelocity.z = 0; pActors[i].UpdateAnimation(); - pActors[i].pMonsterInfo.uHostilityType = (MonsterInfo::HostilityRadius)0; + pActors[i].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; pActors[i].PrepareSprites(0); } else
--- a/Party.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Party.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -142,7 +142,7 @@ { if ( pTurnEngine->field_4 != 2 || PID_TYPE(pTurnEngine->pQueue[0].uPackedID) != OBJECT_Player) return 0; - v2 = pTurnEngine->pQueue[0].uPackedID >> 3; + v2 = PID_ID(pTurnEngine->pQueue[0].uPackedID); return v2 + 1; } v4 = 0; @@ -835,7 +835,7 @@ v2 = abs(v0->vPosition.y - pParty->vPosition.y); v3 = abs(v0->vPosition.z - pParty->vPosition.z); if (int_get_vector_length(v1, v2, v3) < 512) - Actor::_402968(v4, 4, 0, 0); + Actor::Flee(v4, 4, 0, 0); } ++v4; ++v0;
--- a/Player.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Player.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -5426,7 +5426,7 @@ } } } - if ( a3 || !v6->HasItemEquipped(EQUIP_OFF_HAND) || (v28 = v27->GetEquippedItemEquipType(EQUIP_OFF_HAND), v28 < 0) || v28 > 2 ) + if ( a3 || !v6->HasItemEquipped(EQUIP_OFF_HAND) || (v28 = v6->GetEquippedItemEquipType(EQUIP_OFF_HAND), v28 < 0) || v28 > 2 ) return v5 + v62 + v61; v15 = pItemsTable->pItems[v29].uDamageMod; v14 = pItemsTable->pItems[v29].uDamageDice * pItemsTable->pItems[v29].uDamageRoll; @@ -5459,7 +5459,7 @@ v5 = pItemsTable->pItems[*(int *)&v6->pInventoryItems[v6->pEquipment.uMainHand-1]].uDamageMod; } } - if ( a3 || !v6->HasItemEquipped(EQUIP_OFF_HAND) || (v19 = v18->GetEquippedItemEquipType(EQUIP_OFF_HAND), v19 < 0) || v19 > 2 ) + if ( a3 || !v6->HasItemEquipped(EQUIP_OFF_HAND) || (v19 = v6->GetEquippedItemEquipType(EQUIP_OFF_HAND), v19 < 0) || v19 > 2 ) return v5 + v62 + v61; v20 = *(int *)&v6->pInventoryItems[v6->pEquipment.uOffHand-1]; goto LABEL_365; @@ -5487,7 +5487,7 @@ } } } - if ( a3 || !v6->HasItemEquipped(EQUIP_OFF_HAND) || (v12 = v11->GetEquippedItemEquipType(EQUIP_OFF_HAND), v12 < 0) || v12 > 2 ) + if ( a3 || !v6->HasItemEquipped(EQUIP_OFF_HAND) || (v12 = v6->GetEquippedItemEquipType(EQUIP_OFF_HAND), v12 < 0) || v12 > 2 ) return v5 + v62 + v61; v14 = pItemsTable->pItems[this->pInventoryItems[this->pEquipment.uOffHand].uItemID].uDamageMod; v15 = pItemsTable->pItems[this->pInventoryItems[this->pEquipment.uOffHand].uItemID].uDamageDice; @@ -7488,7 +7488,7 @@ } pGame->pStru6Instance->SetPlayerBuffAnim(0x97u, a2 - 1); v5 = 8 * a2 + 392; - LOBYTE(v5) = (8 * a2 - 120) | 4; + LOBYTE(v5) = PID(OBJECT_Player,a2 - 120); pAudioPlayer->PlaySound(SOUND_20001, v5, 0, -1, 0, 0, 0, 0); v3->AddVariable(VAR_NumSkillPoints, 2); } @@ -8309,7 +8309,7 @@ } LABEL_172: v25 = 8 * currPlayerId + 400; - LOBYTE(v25) = (8 * currPlayerId - 112) | 4; + LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112); pAudioPlayer->PlaySound(SOUND_20001, v25, v5, -1, v5, v5, v5, v5); return; } @@ -8459,7 +8459,7 @@ if ( v31 != 1 ) return; v25 = 8 * currPlayerId + 400; - LOBYTE(v25) = (8 * currPlayerId - 112) | 4; + LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112); pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0); return; case VAR_PlayerItemInHands: @@ -8733,7 +8733,7 @@ return; v5 = 0; v25 = 8 * currPlayerId + 400; - LOBYTE(v25) = (8 * currPlayerId - 112) | 4; + LOBYTE(v25) = PID(OBJECT_Player,currPlayerId - 112); pAudioPlayer->PlaySound(SOUND_20001, v25, 0, -1, 0, 0, 0, 0); return; } @@ -8742,7 +8742,6 @@ } - //----- (0044AFFB) -------------------------------------------------------- void Player::AddVariable(enum VariableType var_type, signed int val) { @@ -9256,7 +9255,7 @@ bFlashHistoryBook = 1; _play_sound: v28 = 8 * uPlayerIdx + 400; - LOBYTE(v28) = (8 * uPlayerIdx - 112) | 4; + LOBYTE(v28) = PID(OBJECT_Player,uPlayerIdx - 112); pAudioPlayer->PlaySound(SOUND_20001, v28, 0, -1, 0, 0, 0, 0); return; } @@ -9466,14 +9465,14 @@ GameUI_DrawFoodAndGold(); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_CurrentHP: ReceiveDamage((signed int)pValue, 4); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_CurrentSP: @@ -9484,28 +9483,28 @@ *(int *)v9 = 0; pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_ACModifier: this->sACModifier -= (unsigned __int8)pValue; pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BaseLevel: this->uLevel -= (unsigned __int8)pValue; pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_LevelModifier: this->sLevelModifier -= (unsigned __int8)pValue; pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_Age: @@ -9522,7 +9521,7 @@ *((int *)v12 + 1) -= v14 + HIDWORD(v13); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_QBits_QuestsDone: @@ -9543,7 +9542,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_IntellectBonus: @@ -9552,7 +9551,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_PersonalityBonus: @@ -9561,7 +9560,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_EnduranceBonus: @@ -9570,7 +9569,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_SpeedBonus: @@ -9579,7 +9578,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_AccuracyBonus: @@ -9588,7 +9587,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_LuckBonus: @@ -9597,7 +9596,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BaseMight: @@ -9605,7 +9604,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BaseIntellect: @@ -9613,7 +9612,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BasePersonality: @@ -9621,7 +9620,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BaseEndurance: @@ -9629,7 +9628,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BaseSpeed: @@ -9637,7 +9636,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BaseAccuracy: @@ -9645,7 +9644,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BaseLuck: @@ -9653,7 +9652,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_FireResistance: @@ -9661,7 +9660,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_AirResistance: @@ -9669,7 +9668,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_WaterResistance: @@ -9677,7 +9676,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_EarthResistance: @@ -9685,7 +9684,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_SpiritResistance: @@ -9693,7 +9692,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_MindResistance: @@ -9701,7 +9700,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BodyResistance: @@ -9709,7 +9708,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_LightResistance: @@ -9717,7 +9716,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_DarkResistance: @@ -9725,7 +9724,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_MagicResistance: @@ -9733,7 +9732,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_FireResistanceBonus: @@ -9741,7 +9740,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_AirResistanceBonus: @@ -9749,7 +9748,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)92, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_WaterResistanceBonus: @@ -9757,7 +9756,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_EarthResistanceBonus: @@ -9765,7 +9764,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_SpiritResistanceBonus: @@ -9773,7 +9772,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_MindResistanceBonus: @@ -9781,7 +9780,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_BodyResistanceBonus: @@ -9789,7 +9788,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_LightResistanceBonus: @@ -9797,7 +9796,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_DarkResistanceBonus: @@ -9805,7 +9804,7 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)SPEECH_91, 0); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_MagicResistanceBonus: @@ -9815,14 +9814,14 @@ pPlayers[v4 + 1]->PlaySound((PlayerSpeech)v23, v25); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_FixedFood: Party::TakeFood((unsigned int)pValue); pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_StaffSkill: @@ -9858,7 +9857,7 @@ *((short *)&this->pConditions[16] + VarNum) -= (unsigned __int8)pValue; pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; case VAR_Cursed: @@ -9882,7 +9881,7 @@ *((int *)this + 2 * result - 209) = 0; pGame->pStru6Instance->SetPlayerBuffAnim(0x98u, v4); v8 = 8 * v4 + 400; - LOBYTE(v8) = (8 * v4 - 112) | 4; + LOBYTE(v8) = PID(OBJECT_Player,v4 - 112); pAudioPlayer->PlaySound(SOUND_20001, v8, 0, -1, 0, 0, 0, 0); return result; default:
--- a/Render.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Render.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -23,6 +23,7 @@ #include "TileFrameTable.h" #include "texts.h" #include "mm7_data.h" +#include "MM7.h" #pragma comment(lib, "lib\\legacy_dx\\lib\\ddraw.lib") #pragma comment(lib, "lib\\legacy_dx\\lib\\dxguid.lib") @@ -3182,7 +3183,7 @@ HIWORD(v26) = HIWORD(v42); LOWORD(v26) = 0; v27 = (object->uAttributes & 0x20) == 0; - v3->sZValue = v26 + (8 * i | OBJECT_Item); + v3->sZValue = v26 + (PID(OBJECT_Item,i)); v3->dimming_level = 0; v3->uTintColor = 0; if ( !v27 ) @@ -3682,7 +3683,7 @@ v27->world_z = decor->vPosition.z; v27->uScreenSpaceY = v40; HIWORD(v30) = HIWORD(v39); - v31 = 8 * i | OBJECT_Decoration; + v31 = PID(OBJECT_Decoration,i); LOWORD(v30) = 0; v27->uIndoorSectorID = 0; v27->sZValue = v30 + v31; @@ -7599,59 +7600,12 @@ // 4D864C: using guessed type char byte_4D864C; //----- (004A2DA3) -------------------------------------------------------- -void Render::DrawStrip(unsigned int uNumVertices, struct stru148 *a3, IDirect3DTexture2 *pTexture) -{ - int v4; // ebx@1 - int v7; // eax@7 - float v12; // ST3C_4@8 - int i; - - v4 = (int)this; - if (!this->uNumD3DSceneBegins) - return; - - if (uNumVertices >= 3) - { - this->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, D3DTADDRESS_WRAP); - if (this->bUsingSpecular) - { - this->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE); - this->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); - this->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO); - } - - for (i = 0; i < uNumVertices; ++i) - { - pVertices[i].pos.x = array_50AC10[i].vWorldViewProjX; - pVertices[i].pos.y = array_50AC10[i].vWorldViewProjY; - pVertices[i].pos.z = 0.99989998; - pVertices[i].rhw = array_50AC10[i]._rhw; - - pVertices[i].diffuse = ::GetActorTintColor(31, 0, array_50AC10[i].vWorldViewPosition.x, true, false); - v7 = 0; - if (this->bUsingSpecular) - { - v12 = array_50AC10[i].vWorldViewPosition.x; - v7 = sub_47C3D7_get_fog_related_stuff(0, 1, v12); - } - pVertices[i].specular = v7; - pVertices[i].texcoord.x = array_50AC10[i].u; - pVertices[i].texcoord.y = array_50AC10[i].v; - } - pRenderer->pRenderD3D->pDevice->SetTexture(0, pTexture); - pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, pVertices, uNumVertices, D3DDP_DONOTUPDATEEXTENTS | D3DDP_DONOTLIGHT); - } -} - -//----- (004A2DA3) -------------------------------------------------------- -void Render::DrawFan(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *pTexture) -{ - int v4; // ebx@1 +void Render::DrawSkyPolygon(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *pTexture) +{ int v7; // eax@7 float v13; // ST3C_4@8 int i; - v4 = (int)this; if ( !this->uNumD3DSceneBegins ) return; if ( uNumVertices >= 3 ) @@ -7663,14 +7617,14 @@ this->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE); this->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO); } - for (i = 0; i < uNumVertices; ++i) + for ( i = 0; i < uNumVertices; ++i ) { pVertices[i].pos.x = array_50AC10[i].vWorldViewProjX; pVertices[i].pos.y = array_50AC10[i].vWorldViewProjY; pVertices[i].pos.z = 0.99989998; pVertices[i].rhw = array_50AC10[i]._rhw; - pVertices[i].diffuse = GetActorTintColor(31, 0, array_50AC10[i].vWorldViewPosition.x, 1, 0); + pVertices[i].diffuse = ::GetActorTintColor(31, 0, array_50AC10[i].vWorldViewPosition.x, 1, 0); v7 = 0; if (this->bUsingSpecular) { @@ -7683,7 +7637,7 @@ } pRenderer->pRenderD3D->pDevice->SetTexture(0, pTexture); pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, - pVertices, uNumVertices, D3DDP_DONOTUPDATEEXTENTS | D3DDP_DONOTLIGHT); + pVertices, uNumVertices, D3DDP_DONOTUPDATEEXTENTS | D3DDP_DONOTLIGHT); } }
--- a/Render.h Mon Apr 01 13:39:19 2013 +0200 +++ b/Render.h Mon Apr 01 13:39:39 2013 +0200 @@ -322,8 +322,7 @@ unsigned int GetActorTintColor(float a2, int tint, int a4, int a5, RenderBillboard *a6); void DrawPolygon(unsigned int uNumVertices, stru148 *a3, ODMFace *a4, IDirect3DTexture2 *pTexture); void DrawTerrainPolygon(unsigned int uNumVertices, stru148 *a4, IDirect3DTexture2 *a5, bool transparent, bool clampAtTextureBorders); - void DrawStrip(unsigned int uNumVertices, struct stru148 *a3, IDirect3DTexture2 *pTexture); - void DrawFan(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *a4); + void DrawSkyPolygon(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *pTexture); void _4A2ED5(signed int a2, stru148 *a3, IDirect3DTexture2 *pHwTex); void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8); void MakeParticleBillboardAndPush_BLV(RenderBillboardTransform_local0 *a2, IDirect3DTexture2 *a3, unsigned int uDiffuse, int angle);
--- a/SaveLoad.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/SaveLoad.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -230,77 +230,31 @@ //----- (0045F469) -------------------------------------------------------- void SaveGame( bool IsAutoSAve, bool NotSaveWorld ) { - int result; // eax@1 unsigned short *pScreenshot; // edi@5 int text_pos; // eax@6 - int v5; // eax@6 - int v6; // eax@6 - const char *v7; // edi@8 - FILE *v8; // edi@24 + FILE *pLLoidFile; // edi@24 char* compressed_buf; // edi@30 - void *v10; // esi@31 - void *v11; // esi@31 - void *v12; // esi@37 - void *v13; // esi@37 - void *v14; // esi@37 - void *v15; // esi@37 - void *v16; // esi@37 - int v17; // esi@37 - unsigned int v18; // ecx@38 - unsigned int v19; // esi@39 - BSPModel *v20; // edx@39 char *data_write_pos; // esi@41 - void *v22; // esi@41 - BSPModel *v23; // eax@42 - signed int v24; // edi@42 - unsigned __int8 v25; // zf@43 - unsigned __int8 v26; // sf@43 - signed int v27; // edi@47 - void *v28; // esi@50 - void *v29; // esi@50 - void *v30; // esi@50 - void *v31; // esi@50 - int v32; // esi@51 - int v33; // eax@51 - DWORD v34; // eax@59 - //std::string v35; // [sp-18h] [bp-288h]@8 - const char *v36; // [sp-10h] [bp-280h]@6 - const char *v37; // [sp-Ch] [bp-27Ch]@6 - unsigned int *v38; // [sp-8h] [bp-278h]@8 - CHAR Buffer; // [sp+Ch] [bp-264h]@59 + CHAR Buffer[128]; // [sp+Ch] [bp-264h]@59 char Dir[255]; // [sp+8Ch] [bp-1E4h]@51 char Drive[255]; // [sp+ACh] [bp-1C4h]@51 SavegameHeader save_header; // [sp+CCh] [bp-1A4h]@10 - //int v43; // [sp+CCh] [bp-1A4h]@10 - //char Dest[20]; // [sp+E0h] [bp-190h]@10 - //unsigned __int64 pTimePlayed; // [sp+F4h] [bp-17Ch]@10 char Filename[255]; // [sp+130h] [bp-140h]@51 char Ext[255]; // [sp+150h] [bp-120h]@51 - char v48; // [sp+151h] [bp-11Fh]@51 char Source[32]; // [sp+170h] [bp-100h]@51 - char Str[120]; // [sp+190h] [bp-E0h]@8 - int v51; // [sp+208h] [bp-68h]@2 + char work_string[120]; // [sp+190h] [bp-E0h]@8 + int pPositionY; // [sp+208h] [bp-68h]@2 int pPositionX; // [sp+20Ch] [bp-64h]@2 - int v53; // [sp+210h] [bp-60h]@2 - int v54; // [sp+214h] [bp-5Ch]@2 + int sPRotationY; // [sp+210h] [bp-60h]@2 + int sPRotationX; // [sp+214h] [bp-5Ch]@2 ODMHeader odm_data; // [sp+218h] [bp-58h]@30 - char v56; // [sp+21Ch] [bp-54h]@30 - char v57; // [sp+21Dh] [bp-53h]@30 - char v58; // [sp+21Eh] [bp-52h]@30 - char v59; // [sp+21Fh] [bp-51h]@30 - int v60; // [sp+220h] [bp-50h]@30 - int v61; // [sp+224h] [bp-4Ch]@30 - int v62; // [sp+228h] [bp-48h]@2 + int res; // [sp+224h] [bp-4Ch]@30 + int pPositionZ; // [sp+228h] [bp-48h]@2 LOD::Directory pLodDirectory; // [sp+22Ch] [bp-44h]@2 size_t Size; // [sp+250h] [bp-20h]@26 - __int16 *v66; // [sp+254h] [bp-1Ch]@1 char *uncompressed_buff; // [sp+258h] [bp-18h]@2 - __int16 *v68; // [sp+25Ch] [bp-14h]@32 unsigned int compressed_block_size; // [sp+260h] [bp-10h]@23 - int v70; // [sp+264h] [bp-Ch]@22 - std::string *v71; // [sp+268h] [bp-8h]@8 - int a3; // [sp+26Fh] [bp-1h]@8 - + //v66 = a2; strcpy(byte_6BE3B0, pCurrentMapName); if (!_strcmpi(pCurrentMapName, "d05.blv")) // arena @@ -309,14 +263,16 @@ uncompressed_buff = (char*)malloc(1000000); pLodDirectory.Reset(); pPositionX = pParty->vPosition.x; - v51 = pParty->vPosition.y; - v62 = pParty->vPosition.z; - v53 = pParty->sRotationY; - v54 = pParty->sRotationX; + pPositionY = pParty->vPosition.y; + pPositionZ = pParty->vPosition.z; + sPRotationY = pParty->sRotationY; + sPRotationX = pParty->sRotationX; pParty->vPosition.x = pParty->vPrevPosition.x; - pParty->vPosition.y = pParty->vPrevPosition.z; - pParty->vPosition.z = pParty->vPrevPosition.y; - pParty->uFallStartY = pParty->vPrevPosition.y; + pParty->vPosition.z = pParty->vPrevPosition.z; + pParty->vPosition.y = pParty->vPrevPosition.y; + + pParty->uFallStartY = pParty->vPrevPosition.z; + pParty->sRotationY = pParty->sPrevRotationY; pParty->sRotationX = pParty->sPrevRotationX; if (uCurrentlyLoadedLevelType == LEVEL_Indoor) @@ -342,8 +298,8 @@ if (pNew_LOD->Write(&pLodDirectory, uncompressed_buff, 0)) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 200); //Ñîõðàíåííàÿ èãðà ïîâðåæäåíà! Code=%d - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:773", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 200); //Ñîõðàíåííàÿ èãðà ïîâðåæäåíà! Code=%d + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:773", 0); } assert(sizeof(SavegameHeader) == 100); @@ -356,66 +312,66 @@ pLodDirectory.uDataSize = sizeof(SavegameHeader); if (pNew_LOD->Write(&pLodDirectory, &save_header, 0)) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 201); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:784", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 201); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:784", 0); } strcpy(pLodDirectory.pFilename, "party.bin"); pLodDirectory.uDataSize = sizeof(Party); //90680; if ( pNew_LOD->Write(&pLodDirectory, pParty, 0) ) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 202); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:793", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 202); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:793", 0); } strcpy(pLodDirectory.pFilename, "clock.bin"); pLodDirectory.uDataSize =sizeof(Timer);// 40; if ( pNew_LOD->Write(&pLodDirectory, pEventTimer, 0) ) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 203); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:802", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 203); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:802", 0); } strcpy(pLodDirectory.pFilename, "overlay.bin"); pLodDirectory.uDataSize =sizeof(OtherOverlayList);// 1008; if ( pNew_LOD->Write(&pLodDirectory, pOtherOverlayList, 0) ) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 204); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:811", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 204); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:811", 0); } strcpy(pLodDirectory.pFilename, "npcdata.bin"); pLodDirectory.uDataSize = 501 * sizeof(NPCData); assert(pLodDirectory.uDataSize == 38076); if ( pNew_LOD->Write(&pLodDirectory, pNPCStats->pNewNPCData, 0) ) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 205); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:820", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 205); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:820", 0); } strcpy(pLodDirectory.pFilename, "npcgroup.bin"); pLodDirectory.uDataSize = 102; if ( pNew_LOD->Write(&pLodDirectory, pNPCStats->pGroups_copy, 0) ) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 206); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:829", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 206); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:829", 0); } for (int i = 1; i <= 4; ++i) // 4 - players { for (int j = 1; j <= 5; ++j) // 5 - images { - sprintf(Str, "data\\lloyd%d%d.pcx", i, j); - v8 = fopen(Str, "rb"); - if ( v8 ) + sprintf(work_string, "data\\lloyd%d%d.pcx", i, j); + pLLoidFile = fopen(work_string, "rb"); + if ( pLLoidFile ) { __debugbreak(); - sprintf(Str, "lloyd%d%d.pcx", i, j); - fseek(v8, 0, 2); - pLodDirectory.uDataSize = ftell(v8); - rewind(v8); - fread(uncompressed_buff, pLodDirectory.uDataSize, 1, v8); - strcpy((char *)&pLodDirectory, Str); - fclose(v8); - remove(Str); + sprintf(work_string, "lloyd%d%d.pcx", i, j); + fseek(pLLoidFile, 0, SEEK_END); + pLodDirectory.uDataSize = ftell(pLLoidFile); + rewind(pLLoidFile); + fread(uncompressed_buff, pLodDirectory.uDataSize, 1, pLLoidFile); + strcpy(pLodDirectory.pFilename, work_string); + fclose(pLLoidFile); + remove(work_string); if ( pNew_LOD->Write(&pLodDirectory, uncompressed_buff, 0) ) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 207); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:857", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 207); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:857", 0); Size = 5080748; } } @@ -467,8 +423,8 @@ data_write_pos += 112 * uNumSpriteObjects; memcpy(data_write_pos, &uNumChests, 4); data_write_pos += 4; - memcpy(data_write_pos, pChests, 5324 * uNumChests); - data_write_pos += 5324 * uNumChests; + memcpy(data_write_pos, pChests, sizeof(Chest)*uNumChests);//5324 * + data_write_pos += sizeof(Chest)* uNumChests; memcpy(data_write_pos, pIndoor->pDoors, 0x3E80); data_write_pos += 16000; memcpy(data_write_pos, pIndoor->ptr_0002B4_doors_ddata, pIndoor->blv.uDoors_ddata_Size); @@ -516,8 +472,8 @@ data_write_pos += 112 * uNumSpriteObjects; memcpy(data_write_pos, &uNumChests, 4); data_write_pos += 4; - memcpy(data_write_pos, pChests, 5324 * uNumChests); - data_write_pos += 5324 * uNumChests; + memcpy(data_write_pos, pChests, sizeof(Chest)* uNumChests); + data_write_pos += sizeof(Chest)* uNumChests; memcpy(data_write_pos, &stru_5E4C90, 0xC8); data_write_pos += 200; memcpy(data_write_pos, &pOutdoor->loc_time, 0x38); @@ -525,11 +481,11 @@ } strcpy(Source, pCurrentMapName); _splitpath(Source, Drive, Dir, Filename, Ext); - v48 = 100; + Size = (int)data_write_pos - (int)uncompressed_buff; compressed_block_size = 999984; - LOBYTE(v33) = zlib::MemZip((char *)compressed_buf + 16, (unsigned int *)&compressed_block_size, uncompressed_buff,Size); - if ( v33 || (signed int)compressed_block_size > (signed int)Size ) + res = zlib::MemZip((char *)compressed_buf + 16, (unsigned int *)&compressed_block_size, uncompressed_buff,Size); + if (res || (signed int)compressed_block_size > (signed int)Size ) { memcpy((void *)(compressed_buf + 16), uncompressed_buff, Size); compressed_block_size = Size; @@ -538,12 +494,12 @@ memcpy(&((ODMHeader *)compressed_buf)->uCompressedSize, &compressed_block_size, 4); memcpy(&((ODMHeader *)compressed_buf)->uDecompressedSize, &Size, 4); sprintf(Source, "%s%s", &Filename, &Ext); - strcpy((char *)&pLodDirectory, Source); + strcpy(pLodDirectory.pFilename, Source); pLodDirectory.uDataSize = compressed_block_size; if ( pNew_LOD->Write(&pLodDirectory, (const void *)compressed_buf, 0) ) { - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 208); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:1071", 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 208); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:1071", 0); } free((void *)compressed_buf); } @@ -552,18 +508,17 @@ { if ( !CopyFileA("data\\new.lod", "saves\\autosave.mm7", 0) ) { - v34 = GetLastError(); - FormatMessageA(0x1000, 0, v34, 0x400, &Buffer, 0x80, 0); - sprintf(Str, pGlobalTXT_LocalizationStrings[612], 300); - MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:1097", 0); + FormatMessageA(0x1000, 0, GetLastError(), 0x400, Buffer, 0x80, 0); + sprintf(work_string, pGlobalTXT_LocalizationStrings[612], 300); + MessageBoxA(nullptr, work_string, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:1097", 0); } } pParty->vPosition.x = pPositionX; - pParty->vPosition.y = v51; - pParty->vPosition.z = v62; - pParty->uFallStartY = v62; - pParty->sRotationY = v53; - pParty->sRotationX = v54; + pParty->vPosition.y = pPositionY; + pParty->vPosition.z = pPositionZ; + pParty->uFallStartY = pPositionZ; + pParty->sRotationY = sPRotationY; + pParty->sRotationX = sPRotationX; }
--- a/Spells.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Spells.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -12,6 +12,15 @@ +TownPortalData TownPortalList[6] = //4ECBB8 +{ + {Vec3_int_(-5121, 2107, 1), 1536, 0, 21, 0}, + {Vec3_int_(-15148, -10240, 1473), 0, 0, 4, 0}, + {Vec3_int_(-10519, 5375, 753), 512, 0, 3, 0}, + {Vec3_int_(3114, -11055, 513), 0, 0, 10, 0}, + {Vec3_int_(-158, 7624, 1), 512, 0, 7, 0}, + {Vec3_int_(-1837, -4247, 65), 65, 0, 8, 0} +} ; struct SpellStats *pSpellStats;
--- a/Spells.h Mon Apr 01 13:39:19 2013 +0200 +++ b/Spells.h Mon Apr 01 13:39:39 2013 +0200 @@ -1,6 +1,6 @@ #pragma once - +#include "VectorTypes.h" /* 360 */ enum SPELL_TYPE @@ -256,6 +256,19 @@ #pragma pack(pop) +/* 154 */ +#pragma pack(push, 1) +struct TownPortalData +{ + Vec3_int_ pos; + __int16 rot_y; + __int16 rot_x; + unsigned __int16 uMapInfoID; + __int16 field_12; +}; +#pragma pack(pop) +extern TownPortalData TownPortalList[6]; //4ECBB8 + extern struct SpellStats *pSpellStats;
--- a/UIHouses.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/UIHouses.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -2451,25 +2451,27 @@ unsigned int v71; // [sp-4h] [bp-278h]@75 const char *v72; // [sp-4h] [bp-278h]@93 unsigned int v73; // [sp-4h] [bp-278h]@99 - char Dest[100]; // [sp+Ch] [bp-268h]@55 - char v75[100]; // [sp+70h] [bp-204h]@59 - char a1[100]; // [sp+D4h] [bp-1A0h]@57 - char v77[100]; // [sp+138h] [bp-13Ch]@59 + char pTopic1[100]; // [sp+Ch] [bp-268h]@55 + char pTopic4[100]; // [sp+70h] [bp-204h]@59 + char pTopic2[100]; // [sp+D4h] [bp-1A0h]@57 + char pTopic3[100]; // [sp+138h] [bp-13Ch]@59 //GUIWindow v78; // [sp+19Ch] [bp-D8h]@99 GUIWindow dialog_window; // [sp+1F0h] [bp-84h]@1 char *Str[2]; // [sp+244h] [bp-30h]@30 unsigned int pColorWhite; // [sp+24Ch] [bp-28h]@1 - unsigned __int8 v82; // [sp+253h] [bp-21h]@59 + unsigned __int8 pTopic3Height; // [sp+253h] [bp-21h]@59 int v83; // [sp+254h] [bp-20h]@1 int pColorYellow; // [sp+258h] [bp-1Ch]@1 Player *pPlayer; // [sp+25Ch] [bp-18h]@1 int all_text_height; // [sp+260h] [bp-14h]@18 unsigned __int8 v87; // [sp+266h] [bp-Eh]@59 - unsigned __int8 v88; // [sp+267h] [bp-Dh]@57 + unsigned __int8 pTopic2Height; // [sp+267h] [bp-Dh]@57 int v89; // [sp+268h] [bp-Ch]@1 - unsigned int pTextHeight; // [sp+26Fh] [bp-5h]@55 + unsigned int pTopic1Height; // [sp+26Fh] [bp-5h]@55 int v91; // [sp+270h] [bp-4h]@3 GUIFont *pOutString; + unsigned __int8 pTopic4Height; + int pTextHeight; pPlayer = pPlayers[uActiveCharacter]; memcpy(&dialog_window, window_SpeakInHouse, sizeof(dialog_window)); @@ -2507,93 +2509,86 @@ if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() ) return; - sprintf(Dest, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 2 ? pColorYellow : pColorWhite); + sprintf(pTopic1, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 2 ? pColorYellow : pColorWhite); sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[178], pOutString); // Rent room for %d gold - strcat(Dest, pTmpBuf2); - pTextHeight = pFontArrus->CalcTextHeight(Dest, &dialog_window, 0, 0); - strcat(Dest, "\n \n"); + strcat(pTopic1, pTmpBuf2); + pTopic1Height = pFontArrus->CalcTextHeight(pTopic1, &dialog_window, 0, 0); + strcat(pTopic1, "\n \n"); - sprintf(a1, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 3 ? pColorYellow : pColorWhite); + sprintf(pTopic2, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 3 ? pColorYellow : pColorWhite); sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[86], // Buy food for %d days for %d gold - (unsigned int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier, - v83); - strcat(a1, pTmpBuf2); - v88 = pFontArrus->CalcTextHeight(a1, &dialog_window, 0, 0); - strcat(a1, "\n \n"); + (unsigned int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].fPriceMultiplier, v83); + strcat(pTopic2, pTmpBuf2); + pTopic2Height = pFontArrus->CalcTextHeight(pTopic2, &dialog_window, 0, 0); + strcat(pTopic2, "\n \n"); - sprintf(v77, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 4 ? pColorYellow : pColorWhite); - strcat(v77, pGlobalTXT_LocalizationStrings[160]); // Learn Skills - v82 = pFontArrus->CalcTextHeight(v77, &dialog_window, 0, 0); - strcat(v77, "\n \n"); - v75[0] = 0; - pTextHeight = 0; + sprintf(pTopic3, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 4 ? pColorYellow : pColorWhite); + strcat(pTopic3, pGlobalTXT_LocalizationStrings[160]); // Learn Skills + pTopic3Height = pFontArrus->CalcTextHeight(pTopic3, &dialog_window, 0, 0); + strcat(pTopic3, "\n \n"); + pTopic4[0] = 0; if ( (signed int)window_SpeakInHouse->par1C >= 108 && (signed int)window_SpeakInHouse->par1C <= 120 ) { - sprintf(v75, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 5 ? pColorYellow : pColorWhite); - strcat(v75, pGlobalTXT_LocalizationStrings[611]); // Play Arcomage - pTextHeight = pFontArrus->CalcTextHeight(v75, &dialog_window, 0, 0); + sprintf(pTopic4, "\f%05d", pDialogueWindow->pCurrentPosActiveItem == 5 ? pColorYellow : pColorWhite); + strcat(pTopic4, pGlobalTXT_LocalizationStrings[611]); // Play Arcomage + pTopic4Height = pFontArrus->CalcTextHeight(pTopic4, &dialog_window, 0, 0); } pNumActiveItem = pDialogueWindow->pStartingPosActiveItem; v36 = LOBYTE(pFontArrus->uFontHeight) - 3; v37 = -pDialogueWindow->pNumPresenceButton < 0; if ( !(v37 ^ pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton) ) { - sprintf(pTmpBuf, "%s%s%s%s", Dest, a1, v77, v75); - dialog_window.DrawTitleText(pFontArrus, 0, 146, 0, pTmpBuf, 3); - return; - } - while ( 1 ) - { - pButton = pDialogueWindow->GetControl(pNumActiveItem); - if ( pButton->msg_param == 15 ) + do { - v46 = pTextHeight; - pButton->uHeight = pTextHeight; - pButton->uY = 146; - v41 = v46 + 145; - pButton->uW = v41; - } - else if ( pButton->msg_param == 16 ) - { - v44 = v88; - v45 = pTextHeight + v36 + 146; - pButton->uHeight = v88; - pButton->uY = v45; - v41 = v45 + v44 - 1; - pButton->uW = v41; + pButton = pDialogueWindow->GetControl(pNumActiveItem); + if ( pButton->msg_param == 15 ) + { + v46 = pTopic1Height; + pButton->uHeight = pTopic1Height; + pButton->uY = 146; + v41 = v46 + 145; + pButton->uW = v41; + } + else if ( pButton->msg_param == 16 ) + { + v44 = pTopic2Height; + v45 = pTopic1Height + v36 + 146; + pButton->uHeight = pTopic2Height; + pButton->uY = v45; + v41 = v45 + v44 - 1; + pButton->uW = v41; + } + else if ( pButton->msg_param == 96 ) + { + v42 = pTopic1Height + pTopic2Height + 2 * v36 + 146; + v43 = pTopic3Height; + pButton->uY = v42; + pButton->uHeight = v43; + v41 = v43 + v42 - 1; + pButton->uW = v41; + } + else if ( pButton->msg_param == 101 ) + { + v39 = pTopic1Height + 3 * v36 + pTopic4Height + pTopic2Height + 146; + v40 = pTopic4Height; + pButton->uHeight = pTopic4Height; + pButton->uY = v39; + v41 = v39 + v40 - 1; + pButton->uW = v41; + } + pNumActiveItem++; + if ( pNumActiveItem >= pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem ) + { + sprintfex(pTmpBuf, "%s%s%s%s", &pTopic1, &pTopic2, &pTopic3, &pTopic4); + dialog_window.DrawTitleText(pFontArrus, 0, 146, 0, pTmpBuf, 3); + } } - else if ( pButton->msg_param == 96 ) - { - v42 = pTextHeight + v88 + 2 * v36 + 146; - v43 = v82; - pButton->uY = v42; - pButton->uHeight = v43; - v41 = v43 + v42 - 1; - pButton->uW = v41; - } - else if ( pButton->msg_param == 101 ) - { - v39 = pTextHeight + 3 * v36 + pTextHeight + v88 + 146; - v40 = v87; - pButton->uHeight = pTextHeight; - pButton->uY = v39; - v41 = v39 + v40 - 1; - pButton->uW = v41; - } - pNumActiveItem++; - if ( pNumActiveItem >= pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem ) - { - sprintf(pTmpBuf, "%s%s%s%s", &Dest, &a1, &v77, &v75); - dialog_window.DrawTitleText(pFontArrus, 0, 146, 0, pTmpBuf, 3); - return; - } + while ( pNumActiveItem < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton ); } break; } - - case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_102: + case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES: { - __debugbreak(); pOutString = pFontArrus; strcpy(pTmpBuf, pNPCTopics[354].pText); dialog_window.uFrameWidth = game_viewport_width; @@ -2611,9 +2606,8 @@ window_SpeakInHouse->DrawText(pOutString, 12, 354 - pTextHeight, 0, v63, 0, 0, 0); break; } - case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_103: + case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS: { - __debugbreak(); strcpy(pTmpBuf, pNPCTopics[(uint)window_SpeakInHouse->ptr_1C + 247].pText); dialog_window.uFrameWidth = game_viewport_width; dialog_window.uFrameZ = 452; @@ -2794,7 +2788,7 @@ pNumActiveItem = pDialogueWindow->pStartingPosActiveItem; v54 = (174 - v48 * (174 - all_text_height) / v48 - all_text_height) / 2 - (174 - all_text_height) / v48 / 2 + 138; v37 = -pDialogueWindow->pNumPresenceButton < 0; - if ( v37 ^ pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton ) + if ( pNumActiveItem < pNumActiveItem + pDialogueWindow->pNumPresenceButton ) { pItemNum = 2; pNumString = 0; @@ -2809,8 +2803,9 @@ pColorText = pColorYellow; if ( pDialogueWindow->pCurrentPosActiveItem != pItemNum ) pColorText = pColorWhite; - dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, *(const char **)&pOutString->cFirstChar, 3); + dialog_window.DrawTitleText(pFontArrus, 0, pButton->uY, pColorText, (const char *)pShopOptions[pNumString], 3); pItemNum++; + ++pNumString; pNumActiveItem = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; } while ( pItemNum < pNumActiveItem );
--- a/UIHouses.h Mon Apr 01 13:39:19 2013 +0200 +++ b/UIHouses.h Mon Apr 01 13:39:39 2013 +0200 @@ -33,8 +33,8 @@ HOUSE_DIALOGUE_TOWNHALL_99 = 99, HOUSE_DIALOGUE_TOWNHALL_100 = 100, HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN = 101, - HOUSE_DIALOGUE_TAVERN_ARCOMAGE_102 = 102, - HOUSE_DIALOGUE_TAVERN_ARCOMAGE_103 = 103, + HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES = 102, + HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS = 103, HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT = 104, HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_1 = 105, HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_2 = 106,
--- a/UIPopup.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/UIPopup.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -2131,20 +2131,20 @@ if ( pRenderer->uNumSceneBegins ) { pWindow.DrawMessageBox(1); - MonsterPopup_Draw(v6 >> 3, &pWindow); + MonsterPopup_Draw(PID_ID(v6), &pWindow); } else { pRenderer->BeginScene(); pWindow.DrawMessageBox(1); - MonsterPopup_Draw(v6 >> 3, &pWindow); + MonsterPopup_Draw(PID_ID(v6), &pWindow); pRenderer->EndScene(); } } } else { - v7 = v6 >> 3; + v7 = PID_ID(v6); if ( ! (pObjectList->pObjects[pSpriteObjects[v7].uObjectDescID].uFlags & 0x10 ) ) { v8 = &pSpriteObjects[v7].stru_24;
--- a/UISaveLoad.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/UISaveLoad.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -1,5 +1,5 @@ #include <assert.h> - +#include <io.h> #include "MM7.h" #include "MapInfo.h" @@ -134,7 +134,7 @@ pMapID = pMapStats->GetMapInfo(pSavegameHeader[v6].pLocationName); pWindow.DrawTitleText(pFontSmallnum, 0, 0, 0, pMapStats->pInfos[pMapID].pName, 3); v8 = (signed __int64)(pSavegameHeader[uLoadGameUI_SelectedSlot].uWordTime * 0.234375) / 60; - pMinutes = (int)((signed __int64)(pSavegameHeader[uLoadGameUI_SelectedSlot].uWordTime * 0.234375) / 60) >> 32; + pMinutes = (int)(((signed __int64)(pSavegameHeader[uLoadGameUI_SelectedSlot].uWordTime * 0.234375) / 60) >> 32); v9 = v8; v8 /= 60i64; pAMPM2 = v8; @@ -156,7 +156,7 @@ pWindow.uFrameY = pGUIWindow_CurrentMenu->uFrameY + 261; HIDWORD(pAMPM2) = v14 == 0 && ((signed int)v14 > 0 || (unsigned int)pOurHour >= 12) && (signed int)v14 <= 0 && (v14 != 0 || (unsigned int)pOurHour < 24); - if ( v14 != 0 || (signed int)v14 <= 0 && (unsigned int)pOurHour <= 12 ) + if ( v14 != 0 || ((signed int)v14 <= 0) && (unsigned int)pOurHour <= 12 ) { if ( !(v14 | (unsigned int)pOurHour) ) { @@ -264,3 +264,230 @@ //pAllocator->FreeChunk(pSavegameThumbnails[i].pPixels); pSavegameThumbnails[i].Release(); } + +//----- (0045E361) -------------------------------------------------------- +void __fastcall GameUI_DrawLoadMenu(unsigned int uDialogueType) + { + unsigned int v1; // ebp@5 + unsigned int v2; // eax@5 + //signed int v3; // ebp@11 + FILE *v4; // eax@14 + FILE *v5; // eax@18 + unsigned int v6; // eax@25 + GUIButton *v7; // eax@27 + const char *v8; // [sp-8h] [bp-26Ch]@25 + //char *v9; // [sp-4h] [bp-268h]@19 + enum TEXTURE_TYPE v10; // [sp-4h] [bp-268h]@25 + unsigned int uDialogueType_; // [sp+10h] [bp-254h]@1 + //RGBTexture *pTex; // [sp+10h] [bp-254h]@12 + //SavegameHeader *Dest; // [sp+14h] [bp-250h]@12 + //const char *Str1; // [sp+18h] [bp-24Ch]@12 + LODWriteableFile pLODFile; // [sp+1Ch] [bp-248h]@1 + int v16; // [sp+260h] [bp-4h]@1 + + uDialogueType_ = uDialogueType; + dword_6BE138 = -1; + pIcons_LOD->_inlined_sub2(); + + memset(pSavegameUsedSlots, 0, sizeof(pSavegameUsedSlots)); + memset(pSavegameThumbnails, 0, 45 * sizeof(RGBTexture)); + uTextureID_loadsave = pIcons_LOD->LoadTexture("loadsave", TEXTURE_16BIT_PALETTE); + uTextureID_load_up = pIcons_LOD->LoadTexture("load_up", TEXTURE_16BIT_PALETTE); + uTextureID_save_up = pIcons_LOD->LoadTexture("save_up", TEXTURE_16BIT_PALETTE); + uTextureID_LS_loadU = pIcons_LOD->LoadTexture("LS_loadU", TEXTURE_16BIT_PALETTE); + uTextureID_LS_saveU = pIcons_LOD->LoadTexture("LS_saveU", TEXTURE_16BIT_PALETTE); + uTextureID_x_u = pIcons_LOD->LoadTexture("x_u", TEXTURE_16BIT_PALETTE); + if ( uDialogueType_ ) + { + pRenderer->DrawTextureIndexed(8, 8, (Texture *)(uTextureID_loadsave != -1 ? &pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); + if ( pCurrentScreen == SCREEN_SAVEGAME ) + { + v1 = uTextureID_save_up; + v2 = uTextureID_LS_saveU; + } + else + { + v1 = uTextureID_load_up; + v2 = uTextureID_LS_loadU; + } + pRenderer->DrawTextureIndexed(241, 302, (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0)); + pRenderer->DrawTextureIndexed(18, 141, (Texture *)(v1 != -1 ? (int)&pIcons_LOD->pTextures[v1] : 0)); + pRenderer->DrawTextureIndexed(351, 302, (Texture *)(uTextureID_x_u != -1 ? &pIcons_LOD->pTextures[uTextureID_x_u] : 0)); + } + else + { + pRenderer->DrawTextureRGB(0, 0, &pTexture_PCX); + } + pGUIWindow_CurrentMenu = GUIWindow::Create(saveload_dlg_xs[uDialogueType_], saveload_dlg_ys[uDialogueType_], saveload_dlg_zs[uDialogueType_], + saveload_dlg_ws[uDialogueType_], WINDOW_MainMenu_Load, 0, 0); + pGUIWindow_CurrentMenu->DrawText(pFontSmallnum, 25, 199, 0, pGlobalTXT_LocalizationStrings[505], 0, 0, 0);// "Reading..." + pRenderer->Present(); + pSavegameList->Initialize(0); + if ( pSaveListPosition > (signed int)uNumSavegameFiles ) + { + pSaveListPosition = 0; + uLoadGameUI_SelectedSlot = 0; + } + pLODFile.AllocSubIndicesAndIO(0x12C, 0); + assert(sizeof(SavegameHeader) == 0x64); + //v3 = 0; + for (uint i = 0; i < uNumSavegameFiles; ++i) + { + + sprintf(pTmpBuf, "saves\\%s", pSavegameList->pFileList[i].pSaveFileName); + if (_access(pTmpBuf, 6)) + { + pSavegameUsedSlots[i] = 0; + strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[72]); // "Empty" + continue; + } + pLODFile.LoadFile(pTmpBuf, 1); + v4 = pLODFile.FindContainer("header.bin", true); + if ( v4 ) + fread(&pSavegameHeader[i], 0x64, 1, v4); + if ( !_strcmpi(pSavegameList->pFileList[i].pSaveFileName, pGlobalTXT_LocalizationStrings[613]) )// "AutoSave.MM7" + strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[16]);// "Autosave" + v5 = pLODFile.FindContainer("image.pcx", true); + if ( !v5 ) + { + pSavegameUsedSlots[i] = 0; + strcpy(pSavegameList->pFileList[i].pSaveFileName, ""); + } + else + { + pSavegameThumbnails[i].LoadFromFILE(v5, 0, true); + pLODFile.CloseWriteFile(); + pSavegameUsedSlots[i] = 1; + } + } + + //LABEL_24: + pLODFile.FreeSubIndexAndIO(); + if ( pCurrentScreen == SCREEN_SAVEGAME ) + { + uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); + uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_saveD",TEXTURE_16BIT_PALETTE); + } + else + { + uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); + uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_loadD",TEXTURE_16BIT_PALETTE); + } + uTextureID_AR_UP_DN = pIcons_LOD->LoadTexture("AR_UP_DN", TEXTURE_16BIT_PALETTE); + uTextureID_AR_DN_DN = pIcons_LOD->LoadTexture("AR_DN_DN", TEXTURE_16BIT_PALETTE); + pGUIWindow_CurrentMenu->CreateButton(21, 198, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21, 219, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 1, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21, 240, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 2, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21, 261, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 3, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21, 282, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 4, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21, 303, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 5, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21, 324, 191, 18, 1, 0, UIMSG_SelectLoadSlot, 6, 0, "", 0); + pBtnLoadSlot = pGUIWindow_CurrentMenu->CreateButton(241, 302, 105, 40, 1, 0, UIMSG_LoadSlot, 0, 0, "", + pIcons_LOD->GetTexture(uTextureID_LS_), 0); + pBtnCancel = pGUIWindow_CurrentMenu->CreateButton(350, 302, 105, 40, 1, 0, UIMSG_Cancel, 0, 0, "", + pIcons_LOD->GetTexture(uTextureID_x_d), 0); + pBtnArrowUp = pGUIWindow_CurrentMenu->CreateButton(215, 199, 17, 17, 1, 0, UIMSG_ArrowUp, 0, 0, "", + pIcons_LOD->GetTexture(uTextureID_AR_UP_DN), 0); + pBtnDownArrow = pGUIWindow_CurrentMenu->CreateButton(215, 0x143, 0x11, 0x11, 1, 0, UIMSG_DownArrow, uNumSavegameFiles, 0, "", + pIcons_LOD->GetTexture(uTextureID_AR_DN_DN), 0); + + } + +//----- (0045E93E) -------------------------------------------------------- +void GameUI_DrawSaveMenu() + { + unsigned int v0; // ebp@4 + unsigned int v1; // eax@4 + char *v3; // eax@7 + FILE *v4; // eax@11 + FILE *v5; // eax@11 + LODWriteableFile v11; // [sp+1Ch] [bp-248h]@1 + + ++pIcons_LOD->uTexturePacksCount; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + memset(pSavegameUsedSlots, 0, 0xB4u); + memset(&pSavegameThumbnails, 0, 0x708u); + uTextureID_loadsave = pIcons_LOD->LoadTexture("loadsave", TEXTURE_16BIT_PALETTE); + uTextureID_load_up = pIcons_LOD->LoadTexture("load_up", TEXTURE_16BIT_PALETTE); + uTextureID_save_up = pIcons_LOD->LoadTexture("save_up", TEXTURE_16BIT_PALETTE); + uTextureID_LS_loadU = pIcons_LOD->LoadTexture("LS_loadU", TEXTURE_16BIT_PALETTE); + uTextureID_LS_saveU = pIcons_LOD->LoadTexture("LS_saveU", TEXTURE_16BIT_PALETTE); + uTextureID_x_u = pIcons_LOD->LoadTexture("x_u", TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed( 8u, 8u, + (Texture *)(uTextureID_loadsave != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); + if ( pCurrentScreen == SCREEN_SAVEGAME ) + { + v0 = uTextureID_save_up; + v1 = uTextureID_LS_saveU; + } + else + { + v0 = uTextureID_load_up; + v1 = uTextureID_LS_loadU; + } + pRenderer->DrawTextureIndexed(0xF1u, 0x12Eu, (Texture *)(v1 != -1 ? (int)&pIcons_LOD->pTextures[v1] : 0)); + pRenderer->DrawTextureIndexed(0x15Fu, 0x12Eu, + (Texture *)(uTextureID_x_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_u] : 0)); + pRenderer->DrawTextureIndexed(0x12u, 0x8Du, (Texture *)(v0 != -1 ? (int)&pIcons_LOD->pTextures[v0] : 0)); + pGUIWindow_CurrentMenu->DrawText(pFontSmallnum, 25, 199, 0, pGlobalTXT_LocalizationStrings[505], 0, 0, 0); + pRenderer->Present(); + pSavegameList->Initialize(1u); + v11.AllocSubIndicesAndIO(0x12Cu, 0); + //v2 = pSavegameUsedSlots; + // Dest = pSavegameHeader; + // this_ = pSavegameThumbnails; + // v8 = (char *)pSavegameList->pSavesNames; + for (uint i = 0; i < 40; ++i) + { + v3 = pSavegameList->pFileList[i].pSaveFileName; + if ( !*pSavegameList->pFileList[i].pSaveFileName ) + v3 = "1.mm7"; + sprintf(pTmpBuf, "saves\\%s", v3); + if ( _access(pTmpBuf, 0) || _access(pTmpBuf, 6) ) + { + pSavegameUsedSlots[i] = 0; + strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[LOCSTR_EMPTY]); + } + else + { + v11.LoadFile(pTmpBuf, 1); + v4 = v11.FindContainer("header.bin", 1); + fread(&pSavegameHeader[i], 100, 1u, v4); + v5 = v11.FindContainer("image.pcx", 1); + if ( v5 ) + { + pSavegameThumbnails[i].LoadFromFILE(v5, 0, 1u); + v11.CloseWriteFile(); + pSavegameUsedSlots[i] = 1; + } + else + { + pSavegameUsedSlots[i] = 0; + } + } + + } + + v11.FreeSubIndexAndIO(); + uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); + uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_saveD", TEXTURE_16BIT_PALETTE); + uTextureID_AR_UP_DN = pIcons_LOD->LoadTexture("AR_UP_DN", TEXTURE_16BIT_PALETTE); + uTextureID_AR_DN_DN = pIcons_LOD->LoadTexture("AR_DN_DN", TEXTURE_16BIT_PALETTE); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_17, 0, 0); + pGUIWindow_CurrentMenu->CreateButton(21u, 198u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21u, 218u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 1u, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21u, 238u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 2u, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21u, 258u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 3u, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21u, 278u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 4u, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21u, 298u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 5u, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(21u, 318u, 0xBFu, 0x12u, 1, 0, UIMSG_SelectLoadSlot, 6u, 0, "", 0); + pBtnLoadSlot = pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0x69u, 0x28u, 1, 0, UIMSG_LoadSlot, 0, 0, "", + (Texture *)(uTextureID_LS_ != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_LS_] : 0), 0); + pBtnCancel = pGUIWindow_CurrentMenu->CreateButton(0x15Eu, 0x12Eu, 0x69u, 0x28u, 1, 0, UIMSG_Cancel, 0, 0, "", + (Texture *)(uTextureID_x_d != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_d] : 0), 0); + pBtnArrowUp = pGUIWindow_CurrentMenu->CreateButton( 0xD7u, 0xC7u, 0x11u, 0x11u, 1, 0, UIMSG_ArrowUp, 0, 0, "", + (Texture *)(uTextureID_AR_UP_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_UP_DN] : 0), 0); + pBtnDownArrow = pGUIWindow_CurrentMenu->CreateButton( 0xD7u, 0x143u, 0x11u, 0x11u, 1, 0, UIMSG_DownArrow, 0x22u, 0, "", + (Texture *)(uTextureID_AR_DN_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_DN_DN] : 0), 0); + }
--- a/UiGame.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/UiGame.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -516,6 +516,7 @@ int v16; // ecx@46 const char *v17; // eax@49 signed int v18; // eax@55 + signed int v18b; signed int v19; // ecx@63 BLVFace *pFace; // eax@69 __int16 v21; // ax@70 @@ -690,7 +691,8 @@ { if ( uCurrentlyLoadedLevelType != LEVEL_Indoor) { - v21 = pOutdoor->pBModels[(signed int)(unsigned __int16)v18 >> 9].pFaces[v19 & 0x3F].sCogTriggeredID; + v18b = (signed int)(unsigned __int16)v18 >> 9; + v21 = pOutdoor->pBModels[v18b].pFaces[v19 & 0x3F].sCogTriggeredID; //goto LABEL_71; if ( !v21 || (v22 = GetEventHintString(v21)) == 0 ) //goto LABEL_73; @@ -1420,7 +1422,7 @@ if ( pParty->uFlags & 0x20 ) v16 = dword_5079C8; } - pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[pElem->uPackedID >> 3] - 4, + pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[PID_ID(pElem->uPackedID)] - 4, 0x181u, (Texture *)(v16 != -1 ? &pIcons_LOD->pTextures[v16] : 0)); } }
--- a/Vis.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/Vis.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -329,7 +329,7 @@ pGame->pIndoorCameraD3D->ViewTransform(&a1, 1); v9 = _48B561_mess_with_scaling_along_z(/*v8, */a1.vWorldViewPosition.x); LOWORD(v9) = 0; - v15 = (void *)((8 * pFaceID | 6) + v9); + v15 = (void *)((PID(OBJECT_BModel,pFaceID)) + v9); pNumPointers = &list->uNumPointers; //v16 = 2; //v11 = list->uNumPointers; @@ -537,7 +537,7 @@ if (!default_list.uNumPointers) return -1; - return get_object_zbuf_val(default_list.object_pointers[0]); + return get_object_zbuf_val(default_list.object_pointers[0]);//Click to the Rat in dragon cave result crash. Maybe object_pointers incorrect } //----- (004C1C0C) -------------------------------------------------------- @@ -1559,8 +1559,8 @@ case VisObjectType_Sprite: { v5 = filter->field_10; - int object_idx = (pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].uParentBillboardID].object_pid & 0xFFFF) >> 3; - int object_type = pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].uParentBillboardID].object_pid & 7; + int object_idx = PID_ID(pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].uParentBillboardID].object_pid); + int object_type = PID_TYPE(pBillboardRenderList[pRenderer->pBillboardRenderListD3D[(int)uD3DBillboardIdx_or_pBLVFace_or_pODMFace].uParentBillboardID].object_pid); if ( v5 & 2 ) { if (object_type == filter->object_id)
--- a/mm7_1.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/mm7_1.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -1081,7 +1081,7 @@ v1 = pMouse->GetCursorPos(&a2); v0 = pRenderer->pActiveZBuffer[v1->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v25)->y]]; } - if ( (v0 & 7) == OBJECT_Item) + if ( PID_TYPE(v0) == OBJECT_Item) { a2.y = (signed int)(unsigned __int16)v0 >> 3; v21 = (signed int)(unsigned __int16)v0 >> 3; @@ -1116,9 +1116,9 @@ return; goto LABEL_14; } - if ( (v0 & 7) != OBJECT_Actor) + if ( PID_TYPE(v0) != OBJECT_Actor) { - if ( (v0 & 7) == OBJECT_Decoration) + if ( PID_TYPE(v0) == OBJECT_Decoration) { v13 = &pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3]; if ( (signed int)(((unsigned int)v0 >> 16) - pDecorationList->pDecorations[v13->uDecorationDescID].uRadius) >= 512 ) @@ -1144,7 +1144,7 @@ } else { - if ( (v0 & 7) != OBJECT_BModel || (signed)v0 >= 0x2000000 ) + if ( PID_TYPE(v0) != OBJECT_BModel || (signed)v0 >= 0x2000000 ) { v4 = pParty->pPickedItem.uItemID; if ( !pParty->pPickedItem.uItemID )
--- a/mm7_2.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/mm7_2.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -382,7 +382,7 @@ do { v2 = v1->uAIState; - if ( v1->uAIState == Dead || v2 == Removed || v2 == Disabled || (v3 = v1->uSummonerID) != 0 && (v3 & 7) == OBJECT_Player) + if ( v1->uAIState == Dead || v2 == Removed || v2 == Disabled || (v3 = v1->uSummonerID) != 0 && PID_TYPE(v3) == OBJECT_Player) ++v0; ++v1; --v7; @@ -4124,7 +4124,7 @@ { if ( v20 == uNumActors ) ++uNumActors; - v6->uSummonerID = 8 * v17 | 4; + v6->uSummonerID = PID(OBJECT_Player,v17); result = v6->pActorBuffs[2].Apply( pParty->uTimePlayed + (signed __int64)((double)(a3 << 7) * 0.033333335), v16, @@ -4982,7 +4982,7 @@ LOWORD(v7) = v5 & 0xE0; v12 = v7 + v11; LOWORD(v7) = v8 & 0xE0; - return ((v8 & 7) + (v5 & 7) + (a3a & 7) + (v6 & 7)) | (v7 + v12) | ((v8 & 0x1C00) + return (PID_TYPE(v8) + PID_TYPE(v5) + PID_TYPE(a3a) + PID_TYPE(v6)) | (v7 + v12) | ((v8 & 0x1C00) + (v5 & 0x1C00) + v9 + (__PAIR__(v10, (unsigned __int16)a4 >> 2) & 0x1C00)); @@ -10180,7 +10180,7 @@ DoInteractionWithTopmostZObject((unsigned __int16)v1, (signed int)(unsigned __int16)v1 >> 3); } v22 = 0; - v1 = (int *)((signed int)(viewparams->uScreen_BttmR_X + viewparams->uScreen_topL_X) >> 1); + v1 = (int *)((signed int)(viewparams->uScreen_BttmR_X + viewparams->uScreen_topL_X) >> 1);//wrong pointer if ( (signed int)viewparams->uScreen_topL_Y < (signed int)viewparams->uScreen_BttmR_Y ) { v2 = (char *)v1 - 50; @@ -10213,11 +10213,11 @@ } while ( v6 < v22 ); } - if ( (v7 & 7) == OBJECT_Decoration) + if ( PID_TYPE(v7) == OBJECT_Decoration) { - v16 = (unsigned int)v7 >> 3; + v16 = (unsigned int)PID_ID(v7); if ( (signed int)(((unsigned int)*v21 >> 16) - - pDecorationList->pDecorations[pLevelDecorations[(unsigned int)v7 >> 3].uDecorationDescID].uRadius) <= 512 ) + - pDecorationList->pDecorations[pLevelDecorations[(unsigned int)PID_ID(v7)].uDecorationDescID].uRadius) <= 512 ) if ( v19 == v22 && v4 < 100 ) { ++v22; @@ -10311,12 +10311,12 @@ v26 = a2; v2 = a1; - switch ( a1 & 7 ) + switch ( PID_TYPE(a1) ) { case OBJECT_Item: // take the item - v17 = a1 >> 3; - v26 = a1 >> 3; - v18 = a1 >> 3; + v17 = PID_ID(a1); + v26 = PID_ID(a1); + v18 = PID_ID(a1); if ( pObjectList->pObjects[pSpriteObjects[v18].uObjectDescID].uFlags & 0x10 || v17 >= 1000 || !pSpriteObjects[v18].uObjectDescID ) @@ -10348,14 +10348,14 @@ break; case OBJECT_Actor: - v12 = a1 >> 3; - v13 = &pActors[a1 >> 3]; + v12 = PID_ID(a1); + v13 = &pActors[PID_ID(a1)]; v14 = v13->uAIState; if ( v14 == 4 || v14 == 17 ) return 1; if ( v14 == 5 ) { - stru_50C198.LootActor(&pActors[a1 >> 3]); + stru_50C198.LootActor(&pActors[PID_ID(a1)]); } else { @@ -10392,7 +10392,7 @@ break; case OBJECT_Decoration: - v8 = &pLevelDecorations[a1 >> 3]; + v8 = &pLevelDecorations[PID_ID(a1)]; v9 = v8->field_16_event_id; if ( v9 ) { @@ -10401,7 +10401,7 @@ } else { - if ( !pLevelDecorations[a1 >> 3].IsInteractive() ) + if ( !pLevelDecorations[PID_ID(a1)].IsInteractive() ) return 1; v10 = v8->_idx_in_stru123; v24 = 1; @@ -10413,7 +10413,7 @@ break; default: - if ( (a1 & 7) != OBJECT_BModel) + if ( PID_TYPE(a1) != OBJECT_BModel) { MessageBoxW(nullptr, L"Warning: Invalid ID reached!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Mouse.cpp:2020", 0); return 1; @@ -10421,13 +10421,13 @@ if ( uCurrentlyLoadedLevelType != LEVEL_Indoor ) { if ( a1 >> 9 >= pOutdoor->uNumBModels - || (v7 = &pOutdoor->pBModels[a1 >> 9].pFaces[(a1 >> 3) & 0x3F], BYTE2(v7->uAttributes) & 0x10) + || (v7 = &pOutdoor->pBModels[a1 >> 9].pFaces[(PID_ID(a1)) & 0x3F], BYTE2(v7->uAttributes) & 0x10) || (v6 = v7->sCogTriggeredID) == 0 ) return 1; EventProcessor((signed __int16)v6, v2, 1); return 0; } - v4 = &pIndoor->pFaces[a1 >> 3]; + v4 = &pIndoor->pFaces[PID_ID(a1)]; v5 = v4->uAttributes; if ( !(v5 & 0x2000000) ) { @@ -10488,11 +10488,11 @@ v6 = ((v12 - v4 - 1) >> 1) + 1; do { - if ( (*(char *)v5 & 7) == OBJECT_Actor) + if ( PID_TYPE(*(char *)v5) == OBJECT_Actor) { if ( *v5 <= a3 << 16 ) { - v7 = (signed int)(unsigned __int16)*v5 >> 3; + v7 = PID_ID((signed int)(unsigned __int16)*v5); v8 = pActors[v7].uAIState; if ( v8 != 5 ) { @@ -10559,11 +10559,11 @@ v3 = pRenderer->GetParentBillboardID(a1a); v4 = pBillboardRenderList[v3].sZValue; v5 = (unsigned __int16)pBillboardRenderList[v3].object_pid; - if ( (v5 & 7) == OBJECT_Actor) + if ( PID_TYPE(v5) == OBJECT_Actor) { if ( v4 <= (unsigned int)(a3 << 16) ) { - v6 = v5 >> 3; + v6 = PID_ID(v5); v7 = v6; v8 = pActors[v6].uAIState; if ( v8 != 5 ) @@ -10817,8 +10817,8 @@ while ( 1 ) { v19 = dword_720020_zvalues[v18] & 0xFFFF; - v20 = (dword_720020_zvalues[v18] & 0xFFFFu) >> 3; - if ( (dword_720020_zvalues[v18] & 7) == OBJECT_Item) + v20 = PID_ID(dword_720020_zvalues[v18]); + if ( PID_TYPE(dword_720020_zvalues[v18]) == OBJECT_Item) { if ( v20 >= 0x3E8 ) return 0; @@ -10831,16 +10831,16 @@ } goto LABEL_41; } - if ( (dword_720020_zvalues[v18] & 7) == OBJECT_Actor) + if ( PID_TYPE(dword_720020_zvalues[v18]) == OBJECT_Actor) { if ( v20 >= 0xBB8 ) return 0; v24 = (const char *)&pActors[v20]; goto LABEL_51; } - if ( (dword_720020_zvalues[v18] & 7) == OBJECT_Decoration) + if ( PID_TYPE(dword_720020_zvalues[v18]) == OBJECT_Decoration) break; - if ( (dword_720020_zvalues[v18] & 7) == OBJECT_BModel) + if ( PID_TYPE(dword_720020_zvalues[v18]) == OBJECT_BModel) { if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) { @@ -10853,7 +10853,7 @@ { if ( (dword_720020_zvalues[v18] & 0xFFFFu) >> 9 >= pOutdoor->uNumBModels ) goto LABEL_41; - v22 = pOutdoor->pBModels[(dword_720020_zvalues[v18] & 0xFFFFu) >> 9].pFaces[((dword_720020_zvalues[v18] & 0xFFFFu) >> 3) & 0x3F].sCogTriggeredID; + v22 = pOutdoor->pBModels[(dword_720020_zvalues[v18] & 0xFFFFu) >> 9].pFaces[v20 & 0x3F].sCogTriggeredID; } if ( v22 ) { @@ -11160,15 +11160,15 @@ v2 = &pSpriteObjects[uLayingItemID]; v3 = &pObjectList->pObjects[v2->uObjectDescID]; v145 = a2; - v151 = a2 & 7; - if ( (a2 & 7) == OBJECT_Actor) - { - if ( (v2->spell_caster_pid & 7) == OBJECT_Actor && !pActors[v2->spell_caster_pid >> 3].GetActorsRelation(&pActors[a2 >> 3]) ) + v151 = PID_TYPE(a2); + if ( PID_TYPE(a2) == OBJECT_Actor) + { + if ( PID_TYPE(v2->spell_caster_pid) == OBJECT_Actor && !pActors[PID_ID(v2->spell_caster_pid)].GetActorsRelation(&pActors[PID_ID(a2)]) ) return 1; } else { - if ( (a2 & 7) == OBJECT_Player && (v2->spell_caster_pid & 7) == OBJECT_Player) + if ( PID_TYPE(a2) == OBJECT_Player && PID_TYPE(v2->spell_caster_pid) == OBJECT_Player) return 1; } if ( pParty->bTurnBasedModeOn == 1 ) @@ -11180,8 +11180,8 @@ v2->uAttributes = v5 & 0xFFFB; } } - if ( v151 == OBJECT_BModel && (v2->spell_caster_pid & 7) != OBJECT_Player) - BYTE2(pActors[v2->spell_caster_pid >> 3].uAttributes) |= 4u; + if ( v151 == OBJECT_BModel && PID_TYPE(v2->spell_caster_pid) != OBJECT_Player) + BYTE2(pActors[PID_ID(v2->spell_caster_pid)].uAttributes) |= 4u; v6 = v2->uType; v7 = v2->uType; if ( v7 > 3060 ) @@ -11283,7 +11283,7 @@ v115 = 8 * v153; v129 = 0; v128 = -1; - LOBYTE(v115) = 8 * v153 | 2; + LOBYTE(v115) = PID(OBJECT_Item,v153); v127 = 0; v126 = v115; v116 = v143; @@ -11295,7 +11295,7 @@ } v106 = v145; v150 = 0; - v139 = v106 >> 3; + v139 = PID_ID(v106); v137 = v2->spell_level; v152 = v2->spell_skill; v136 = v2->spell_id; @@ -11368,7 +11368,7 @@ if ( v7 == 8010 ) { if ( v151 == 3 - && MonsterStats::BelongsToSupertype(pActors[v145 >> 3].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) ) + && MonsterStats::BelongsToSupertype(pActors[PID_ID(v145)].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) ) sub_43A97E(v153, v145); v93 = pObjectList->uNumObjects; ++v2->uType; @@ -11553,7 +11553,7 @@ LABEL_132: v73 = v2->vPosition.z; v74 = v2->vPosition.y; - v75 = 8 * v72 | 2; + v75 = PID(OBJECT_Item,v72); v2->vVelocity.z = v66; v2->vVelocity.y = v66; v76 = v2->vPosition.x; @@ -11872,7 +11872,7 @@ v2->vVelocity.z = 0; v38 = 8 * v153; v39 = v2->vPosition.y; - LOBYTE(v38) = 8 * v153 | 2; + LOBYTE(v38) = PID(OBJECT_Item,v153); v2->vVelocity.y = 0; v2->vVelocity.x = 0; v40 = v2->vPosition.x; @@ -11930,7 +11930,7 @@ v2->uSpriteFrameID = v32; v102 = 8 * v153; v103 = v2->vPosition.y; - LOBYTE(v102) = 8 * v153 | 2; + LOBYTE(v102) = PID(OBJECT_Item,v153); v2->vVelocity.x = v32; v2->vVelocity.y = v32; v104 = v2->vPosition.x; @@ -12024,7 +12024,7 @@ v13 = 8 * v153; v129 = v9; v128 = -1; - LOBYTE(v13) = 8 * v153 | 2; + LOBYTE(v13) = PID(OBJECT_Item,v153); v127 = v9; v126 = v13; LABEL_28:
--- a/mm7_3.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/mm7_3.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -862,15 +862,15 @@ void __cdecl UpdateActors_ODM() { Actor *v0; // esi@2 - unsigned __int16 v1; // ax@2 - unsigned int v2; // ecx@6 + AIState uAIState; // ax@2 + //unsigned int v2; // ecx@6 int v3; // ebx@6 - int v4; // eax@8 + //int v4; // eax@8 int v5; // eax@10 int v6; // ecx@10 - signed int v7; // ebx@10 + //signed int v7; // ebx@10 signed int v8; // ebx@17 - unsigned __int8 v9; // zf@17 + //unsigned __int8 v9; // zf@17 unsigned __int8 v10; // sf@17 unsigned __int16 v11; // ax@21 int v12; // eax@29 @@ -878,7 +878,7 @@ int v14; // eax@30 unsigned __int64 v15; // qax@30 int v16; // eax@33 - int v17; // edi@34 + //int v17; // edi@34 int v18; // edx@42 int v19; // ecx@42 __int16 v20; // ax@42 @@ -895,12 +895,12 @@ int v31; // edi@57 signed int i; // ebx@57 unsigned int v33; // ecx@58 - int v34; // ebx@64 + //int v34; // ebx@64 int v35; // edi@64 int v36; // eax@64 - unsigned __int16 v37; // cx@66 + //unsigned __int16 v37; // cx@66 signed int v38; // edx@71 - signed int v39; // edi@71 + unsigned int v39; // edi@71 BSPModel *v40; // eax@75 ODMFace *v41; // edi@75 int v42; // ebx@76 @@ -913,9 +913,9 @@ int v49; // edi@85 int v50; // eax@85 unsigned __int64 v51; // qax@85 - unsigned __int8 v52; // zf@87 - unsigned __int8 v53; // sf@87 - unsigned __int8 v54; // of@104 + //unsigned __int8 v52; // zf@87 + //unsigned __int8 v53; // sf@87 + // unsigned __int8 v54; // of@104 int v55; // eax@107 unsigned int v56; // edi@107 int v57; // ST10_4@107 @@ -929,71 +929,64 @@ int v65; // [sp+20h] [bp-30h]@2 int v66; // [sp+24h] [bp-2Ch]@2 bool v67; // [sp+28h] [bp-28h]@10 - unsigned int v68; // [sp+2Ch] [bp-24h]@10 + //unsigned int v68; // [sp+2Ch] [bp-24h]@10 unsigned int v69; // [sp+30h] [bp-20h]@6 unsigned int v70; // [sp+34h] [bp-1Ch]@10 int v71; // [sp+38h] [bp-18h]@62 - int v72; // [sp+3Ch] [bp-14h]@10 + int uIsAboveFloor; // [sp+3Ch] [bp-14h]@10 + int v72b; int v73; // [sp+40h] [bp-10h]@17 - int v74; // [sp+44h] [bp-Ch]@8 + int uIsFlying; // [sp+44h] [bp-Ch]@8 unsigned int v75; // [sp+48h] [bp-8h]@1 - int v76; // [sp+4Ch] [bp-4h]@10 - - v75 = 0; - if ( (signed int)uNumActors <= 0 ) - return; - do + int uIsOnWater; // [sp+4Ch] [bp-4h]@10 + + for(v75=0;(signed int)v75 < (signed int)uNumActors;++v75) { v0 = &pActors[v75]; v66 = v0->vPosition.x; v65 = v0->vPosition.y; - v1 = v0->uAIState; - if ( v1 == 11 || v1 == 19 || v1 == 17 || !v0->uMovementSpeed ) - goto LABEL_121; - v2 = v0->pMonsterInfo.uID; + uAIState = v0->uAIState; + if ( uAIState == Removed || uAIState == Disabled || uAIState == Summoned || !v0->uMovementSpeed ) + { + continue; + } v3 = 0; v69 = 0; - if ( MonsterStats::BelongsToSupertype(v2, MONSTER_SUPERTYPE_WATER_ELEMENTAL) ) + if ( MonsterStats::BelongsToSupertype(v0->pMonsterInfo.uID, MONSTER_SUPERTYPE_WATER_ELEMENTAL) ) v3 = 1; - v4 = v0->pMonsterInfo.uFlying; v0->uSectorID = 0; - v74 = v4; + uIsFlying = v0->pMonsterInfo.uFlying; if ( !v0->CanAct() ) - v74 = 0; + uIsFlying = 0; v70 = IsTerrainSlopeTooHigh(v0->vPosition.x, v0->vPosition.y); v5 = ODM_GetFloorLevel( v0->vPosition.x, v0->vPosition.y, v0->vPosition.z, v0->uActorHeight, - &v76, + &uIsOnWater, (int *)&v69, v3); v6 = v0->vPosition.z; - v7 = v5; - v68 = v5; - v72 = 0; + uIsAboveFloor = 0; v67 = v69 == 0; if ( v6 > v5 + 1 ) - v72 = 1; - if ( v0->uAIState == 5 && v76 && !v72 ) + uIsAboveFloor = 1; + if ( uAIState == Dead && uIsOnWater && !uIsAboveFloor ) { v0->uAIState = Removed; - goto LABEL_121; + continue; } if ( v0->uCurrentActionAnimation == ANIM_Walking ) { v8 = v0->uMovementSpeed; - v9 = HIDWORD(v0->pActorBuffs[7].uExpireTime) == 0; - v10 = SHIDWORD(v0->pActorBuffs[7].uExpireTime) < 0; v73 = v0->uMovementSpeed; - if ( !v10 && (!(v10 | v9) || LODWORD(v0->pActorBuffs[7].uExpireTime) > 0) ) + if ( (signed __int64)v0->pActorBuffs[7].uExpireTime > 0 ) { v8 = (signed __int64)((double)v73 * 0.5); v73 = (signed __int64)((double)v73 * 0.5); } - v11 = v0->uAIState; - if ( v11 == 7 || v11 == 6 ) + if ( uAIState == Fleeing || uAIState == Pursuing ) { v8 *= 2; v73 = v8; @@ -1003,15 +996,13 @@ if ( v8 > 1000 ) v8 = 1000; v12 = stru_5C6E00->Cos(v0->uYawAngle); - v69 = v12; v13 = v12 * (signed __int64)v8; v73 = v13 >> 16; v0->vVelocity.x = WORD1(v13); v69 = stru_5C6E00->Sin(v0->uYawAngle); v73 = (unsigned __int64)((signed int)v69 * (signed __int64)v8) >> 16; - v9 = v74 == 0; v0->vVelocity.y = v69 * v8 >> 16; - if ( !v9 ) + if ( uIsFlying ) { v14 = stru_5C6E00->Sin(v0->uPitchAngle); v69 = v14; @@ -1019,7 +1010,7 @@ v73 = v15 >> 16; v0->vVelocity.z = WORD1(v15); } - v7 = v68; + //v7 = v68; } else { @@ -1029,9 +1020,8 @@ v0->vVelocity.x = v73; v73 = v0->vVelocity.y; v73 = (unsigned __int64)((signed int)v69 * (signed __int64)v73) >> 16; - v9 = v74 == 0; v0->vVelocity.y = v73; - if ( !v9 ) + if ( uIsFlying ) { v69 = 55000; v73 = v0->vVelocity.z; @@ -1039,20 +1029,20 @@ v0->vVelocity.z = v73; } } - if ( v0->vPosition.z < v7 ) - { - v16 = v74; - v0->vPosition.z = v7; + if ( v0->vPosition.z < v5 ) + { + v16 = uIsFlying; + v0->vPosition.z = v5; v0->vVelocity.z = v16 != 0 ? 0x14 : 0; } - v17 = 0; - if ( !v72 || v74 ) - { - if ( v70 && !v72 && v67 ) + //v17 = 0; + if ( !uIsAboveFloor || uIsFlying ) + { + if ( v70 && !uIsAboveFloor && v67 ) { v18 = v0->vPosition.y; v19 = v0->vPosition.x; - v0->vPosition.z = v7; + v0->vPosition.z = v5; ODM_GetTerrainNormalAt(v19, v18, &v62); v20 = GetGravityStrength(); v21 = v62.y; @@ -1060,22 +1050,22 @@ v23 = v62.y * v0->vVelocity.y; v0->vVelocity.z += -8 * LOWORD(pEventTimer->uTimeElapsed) * v20; v73 = abs(v62.x * v0->vVelocity.x + v22 * v0->vVelocity.z + v23) >> 16; - v72 = v21; + v72b = v21; v0->vVelocity.x += (unsigned int)(v73 * v62.x) >> 16; - v72 = (unsigned __int64)(v73 * (signed __int64)v72) >> 16; - v24 = v72; - v72 = v22; + v72b = (unsigned __int64)(v73 * (signed __int64)v72b) >> 16; + v24 = v72b; + v72b = v22; v0->vVelocity.y += v24; - v72 = (unsigned __int64)(v73 * (signed __int64)v72) >> 16; - v0->vVelocity.z += v72; - v17 = 0; + v72b = (unsigned __int64)(v73 * (signed __int64)v72b) >> 16; + v0->vVelocity.z += v72b; + //v17 = 0; } } else { v0->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength(); } - if ( pParty->armageddon_timer != v17 && v0->CanAct() ) + if ( pParty->armageddon_timer != 0 && v0->CanAct() ) { v0->vVelocity.x += rand() % 100 - 50; v0->vVelocity.y += rand() % 100 - 50; @@ -1085,14 +1075,13 @@ v0->uYawAngle += v25 % 32 - 16; v0->UpdateAnimation(); } - if ( v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y < 400 && v70 == v17 ) - { - v0->vVelocity.y = v17; - v0->vVelocity.x = v17; - } - v9 = v0->pMonsterInfo.uFlying == 0; + if ( v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y < 400 && v70 == 0 ) + { + v0->vVelocity.y = 0; + v0->vVelocity.x = 0; + } stru_721530.field_0 = 1; - if ( v9 ) + if ( !uIsFlying ) v26 = 40; else v26 = v0->uActorRadius; @@ -1101,8 +1090,8 @@ stru_721530.field_8 = v26; stru_721530.prolly_normal_d = v26; stru_721530.field_C = v27; - stru_721530.field_70 = v17; - v69 = v17; + stru_721530.field_70 = 0; + v69 = 0; while ( 1 ) { stru_721530.field_34.x = v0->vPosition.x; @@ -1125,7 +1114,7 @@ v30 = WorldPosToGridCellX(v0->vPosition.x); _46E26D_collide_against_sprites(v30, v29); _46EF01_collision_chech_player(0); - _46ED8A_collide_against_sprite_objects(8 * v75 | OBJECT_Actor); + _46ED8A_collide_against_sprite_objects(PID(OBJECT_Actor,v75)); v31 = 0; for ( i = 0; v31 < ai_arrays_size; ++v31 ) { @@ -1136,7 +1125,7 @@ v71 = i > 1; if ( stru_721530.field_7C < stru_721530.field_6C ) v70 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16; - v34 = 0; + //v34 = 0; v35 = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1; v36 = ODM_GetFloorLevel( stru_721530.normal2.x, @@ -1146,17 +1135,16 @@ (int *)&v63, &v64, 0); - if ( v76 ) + if ( uIsOnWater ) { if ( v35 < v36 + 60 ) { - v37 = v0->uAIState; - if ( v37 == 5 || v37 == 4 || v37 == 11 || v37 == 19 ) + if ( uAIState == Dead || uAIState == Dying || uAIState == Removed || uAIState == Disabled ) { if ( v64 ) v61 = v36 + 30; else - v61 = v68 + 60; + v61 = v5 + 60; sub_42F960_create_object(v0->vPosition.x, v0->vPosition.y, v61); v0->uAIState = Removed; return; @@ -1170,60 +1158,64 @@ v0->vPosition.z = LOWORD(stru_721530.normal2.z) - LOWORD(stru_721530.prolly_normal_d) - 1; break; } - v72 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16; + v72b = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16; v0->vPosition.x += (unsigned int)(stru_721530.field_7C * stru_721530.field_58.x) >> 16; - v72 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16; + v72b = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16; v0->vPosition.y += (unsigned int)(stru_721530.field_7C * stru_721530.field_58.y) >> 16; - v72 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16; + v72b = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16; v38 = stru_721530.uFaceID; v0->vPosition.z += (unsigned int)(stru_721530.field_7C * stru_721530.field_58.z) >> 16; stru_721530.field_70 += stru_721530.field_7C; - v39 = v38 >> 3; - switch ( v38 & 7 ) - { - case 3: - if ( pParty->bTurnBasedModeOn != 1 ) - goto LABEL_97; - if ( pTurnEngine->field_4 != 2 && pTurnEngine->field_4 != 3 ) - { - v34 = 0; -LABEL_97: + v39 = PID_ID(v38); + switch ( PID_TYPE(v38) ) + { + case OBJECT_Actor: + if ( pTurnEngine->field_4 != 2 && pTurnEngine->field_4 != 3 || pParty->bTurnBasedModeOn != 1 ) + { + //if(pParty->bTurnBasedModeOn == 1) + //v34 = 0; if ( v0->pMonsterInfo.uHostilityType ) { - if ( v71 == v34 ) - goto LABEL_99; -LABEL_101: - Actor::AI_StandOrBored(v75, 4, v34, (AIDirection *)v34); - break; + if ( v71 == 0 ) + { + Actor::Flee(v75, v38, 0, (AIDirection *)0); + } + else + { + Actor::AI_StandOrBored(v75, 4, 0, (AIDirection *)0); + } } - if ( v71 != v34 ) - goto LABEL_101; - if ( pActors[v39].pMonsterInfo.uHostilityType ) + else if ( v71 != 0 ) + { + Actor::AI_StandOrBored(v75, 4, 0, (AIDirection *)0); + } + else if ( pActors[v39].pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly ) { -LABEL_99: - Actor::_402968(v75, v38, v34, (AIDirection *)v34); - break; + Actor::Flee(v75, v38, 0, (AIDirection *)0); } -LABEL_103: - Actor::FaceObject(v75, v38, v34, (AIDirection *)v34); - break; + else + { + Actor::FaceObject(v75, v38, 0, (AIDirection *)0); + } } break; - case 4: + case OBJECT_Player: if ( !v0->GetActorsRelation(0) ) { v38 = stru_721530.uFaceID; - goto LABEL_103; - } - v52 = HIDWORD(pParty->pPartyBuffs[11].uExpireTime) == 0; - v53 = SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) < 0; + Actor::FaceObject(v75, v38, 0, (AIDirection *)0); + break; + } + //v52 = HIDWORD(pParty->pPartyBuffs[11].uExpireTime) == 0; + //v53 = SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) < 0; v0->vVelocity.y = 0; v0->vVelocity.x = 0; - if ( !v53 && (!(v53 | v52) || LODWORD(pParty->pPartyBuffs[11].uExpireTime) > 0) ) + //if ( !v53 && (!(v53 | v52) || LODWORD(pParty->pPartyBuffs[11].uExpireTime) > 0) ) + if ( (signed __int64)pParty->pPartyBuffs[11].uExpireTime < 0) pParty->pPartyBuffs[11].Reset(); viewparams->bRedrawGameUI = 1; break; - case 5: + case OBJECT_Decoration: v47 = integer_sqrt(v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y); v48 = stru_5C6E00->Atan2( v0->vPosition.x - pLevelDecorations[v39].vPosition.x, @@ -1238,7 +1230,7 @@ v70 = v51 >> 16; v0->vVelocity.y = WORD1(v51); break; - case 6: + case OBJECT_BModel: v40 = &pOutdoor->pBModels[v38 >> 9]; v41 = &v40->pFaces[v39 & 0x3F]; if ( !(BYTE3(v41->uAttributes) & 0x20) ) @@ -1258,16 +1250,16 @@ } else { - v72 = abs(v41->pFacePlane.vNormal.y * v0->vVelocity.y + v41->pFacePlane.vNormal.z * v0->vVelocity.z + v72b = abs(v41->pFacePlane.vNormal.y * v0->vVelocity.y + v41->pFacePlane.vNormal.z * v0->vVelocity.z + v41->pFacePlane.vNormal.x * v0->vVelocity.x) >> 16; - if ( stru_721530.field_64 >> 3 > v72 ) - v72 = stru_721530.field_64 >> 3; + if ( stru_721530.field_64 >> 3 > v72b ) + v72b = stru_721530.field_64 >> 3; v73 = v41->pFacePlane.vNormal.x; - v73 = (unsigned __int64)(v72 * (signed __int64)v73) >> 16; + v73 = (unsigned __int64)(v72b * (signed __int64)v73) >> 16; v71 = v41->pFacePlane.vNormal.y; - v71 = (unsigned __int64)(v72 * (signed __int64)v71) >> 16; + v71 = (unsigned __int64)(v72b * (signed __int64)v71) >> 16; v70 = v41->pFacePlane.vNormal.z; - v70 = (unsigned __int64)(v72 * (signed __int64)(signed int)v70) >> 16; + v70 = (unsigned __int64)(v72b * (signed __int64)(signed int)v70) >> 16; v0->vVelocity.x += v73; v0->vVelocity.y += v71; v0->vVelocity.z += v70; @@ -1302,35 +1294,26 @@ v70 = v0->vVelocity.z; v70 = (unsigned __int64)(v71 * (signed __int64)(signed int)v70) >> 16; ++v69; - v54 = v69 < 100; - v10 = (v69 - 100) < 0; + //v54 = v69 < 100; + //v10 = (v69 - 100) < 0; v0->vVelocity.z = v70; - if ( !(v10 ^ v54) ) + if ( v69 >= 100 ) break; v26 = stru_721530.prolly_normal_d; } - v69 = WorldPosToGridCellX(v66); - v55 = WorldPosToGridCellZ(v65); - v56 = v55 - 1; - v57 = v0->vPosition.x; - v71 = v55 - 1; - v68 = WorldPosToGridCellX(v57); - v70 = WorldPosToGridCellZ(v0->vPosition.y) - 1; - v58 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(v69, v56) >> 1) & 1; - v59 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(v68, v70) >> 1) & 1; - v60 = 0; - if ( v69 == v68 && v71 == v70 && v58 ) - v60 = 1; - if ( !v67 ) - v60 = 1; - if ( !v60 ) + v58 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(WorldPosToGridCellX(v66), WorldPosToGridCellZ(v65) - 1) >> 1) & 1; + v59 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(WorldPosToGridCellX(v0->vPosition.x), WorldPosToGridCellZ(v0->vPosition.y) - 1) >> 1) & 1; + if ( WorldPosToGridCellX(v66) == WorldPosToGridCellX(v0->vPosition.x) + && WorldPosToGridCellZ(v65) == WorldPosToGridCellZ(v0->vPosition.y) + && v58 + || v67 != 0 ) { if ( MonsterStats::BelongsToSupertype(v0->pMonsterInfo.uID, MONSTER_SUPERTYPE_WATER_ELEMENTAL) ) { v58 = v58 == 0; v59 = v59 == 0; } - if ( !v74 && v58 && !v59 ) + if ( !uIsFlying && v58 && !v59 ) { v0->vPosition.x = v66; v0->vPosition.y = v65; @@ -1343,10 +1326,7 @@ } } } -LABEL_121: - ++v75; - } - while ( (signed int)v75 < (signed int)uNumActors ); + } } //----- (0047253E) -------------------------------------------------------- @@ -1391,7 +1371,7 @@ v4 = &pObjectList->pObjects[item->uObjectDescID]; if (item->AttachedToActor()) { - v5 = item->spell_target_pid >> 3; + v5 = PID_ID(item->spell_target_pid); *(int *)(v2 - 26) = pActors[v5].vPosition.x; *(int *)(v2 - 22) = pActors[v5].vPosition.y; *(int *)(v2 - 18) = pActors[v5].vPosition.z + pActors[v5].uActorHeight; @@ -1467,7 +1447,7 @@ v10 = i; if ( !(v9 & 0x40) ) goto LABEL_35; - _46BFFA_check_object_intercept(i, 8 * i | OBJECT_Item); + _46BFFA_check_object_intercept(i, PID(OBJECT_Item,i)); } } LABEL_36: @@ -1934,7 +1914,7 @@ uSectorID = stru_721530.uSectorID; stru_721530.field_70 += stru_721530.field_7C; auto v87 = ((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16) + new_party_z; - if ( (stru_721530.uFaceID & 7) == OBJECT_Actor) + if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Actor) { if ( SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) >= 0 && (SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) > 0 || LODWORD(pParty->pPartyBuffs[11].uExpireTime)) ) @@ -1942,7 +1922,7 @@ viewparams->bRedrawGameUI = 1; goto LABEL_152; } - if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration) + if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Decoration) { v53 = integer_sqrt(v2 * v2 + v1 * v1); v80 = v53; @@ -1954,7 +1934,7 @@ } else { - if ( (stru_721530.uFaceID & 7) == OBJECT_BModel) + if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_BModel) { v44 = &pIndoor->pFaces[(signed int)stru_721530.uFaceID >> 3]; v45 = v44->uPolygonType; @@ -2363,7 +2343,7 @@ v6 = v108 & 0x3F; /*if ( *(char *)(v7->pFacePlane.vNormal.x + 308 * v6 + 31) & 4 ) { - pParty->field_6F4_packedid = 8 * v108 | OBJECT_BModel; + pParty->field_6F4_packedid = PID(OBJECT_BModel,v108); v103 = *(short *)(v7->pFacePlane.vNormal.x + 308 * v6 + 292); }*/ if ( BYTE3(v7[v6].uAttributes) & 4 ) @@ -2858,7 +2838,7 @@ pY = _angle_y; v45 = stru_721530.uFaceID; pZ = v40; - if ( (stru_721530.uFaceID & 7) == OBJECT_Actor) + if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Actor) { if (pParty->Invisible()) pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset(); @@ -2866,7 +2846,7 @@ viewparams->bRedrawGameUI = 1; goto LABEL_234; } - if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration) + if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Decoration) { v56 = integer_sqrt(v2 * v2 + v128 * v128); v118 = v56; @@ -2887,7 +2867,7 @@ } else { - if ( (stru_721530.uFaceID & 7) == OBJECT_BModel) + if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_BModel) { pParty->bFlying = 0; v46 = &pOutdoor->pBModels[(signed int)stru_721530.uFaceID >> 9]; @@ -4788,7 +4768,7 @@ if ( stru_F8AD28.uNumLightsApplied > 0 || pDecalBuilder->uNumDecals > 0 ) { v31 = (LightmapBuilder *)(v50 ? 3 : v49 != 0 ? 5 : 0); - static_RenderBuildingsD3D_stru_73C834.GetFacePlaneAndClassify(pFace, (BSPVertexBuffer *)v56 - 1); + static_RenderBuildingsD3D_stru_73C834.GetFacePlaneAndClassify(pFace, &v56->pVertices); if ( pDecalBuilder->uNumDecals > 0 ) { v40 = -1; @@ -6035,12 +6015,12 @@ array_50AC10[1].vWorldViewProjY = v38; array_50AC10[2].vWorldViewProjX = pViewport->uViewportBR_X; - array_50AC10[2].vWorldViewProjY = pViewport->uViewportTL_Y; + array_50AC10[2].vWorldViewProjY = v38; array_50AC10[3].vWorldViewProjX = pViewport->uViewportBR_X; - array_50AC10[3].vWorldViewProjY = v38; - - /*v36 = (double)(pViewport->uViewportZ - pViewport->uViewportX) * 0.5; + array_50AC10[3].vWorldViewProjY = pViewport->uViewportTL_Y; + + v36 = (double)(pViewport->uViewportBR_X - pViewport->uViewportTL_X) * 0.5; v33 = 65536 / (signed int)(v36 / tan(0.6457717418670654) + 0.5); for (int i = 0; i < _this.uNumVertices; ++i) @@ -6060,10 +6040,10 @@ v10 = 0; v39 = 0; } - v11 = (signed __int64)array_50AC10[i].vWorldViewProjX; + //v11 = (signed __int64)array_50AC10[i].vWorldViewProjX; v38 = v10; v12 = array_50AC10[i].vWorldViewProjY - 1.0; - v13 = v33 * (pViewport->uScreenCenterX - v11); + v13 = v33 * (pViewport->uScreenCenterX - (signed __int64)array_50AC10[i].vWorldViewProjX); v34 = -_this.field_24; v32 = (signed __int64)v12; v14 = v33 * (v30 - v32); @@ -6083,7 +6063,7 @@ } v37 = abs(v34 >> 14); v15 = abs(v10); - if ( v37 <= v15 || v32 <= pViewport->uViewportY ) + if ( v37 <= v15 || v32 <= pViewport->uViewportTL_Y ) { if ( v39 <= 0 ) break; @@ -6106,40 +6086,31 @@ v37 += ((unsigned __int64)(_this.ptr_38->field_10 * v13) >> 16); v36 += ((unsigned __int64)(_this.ptr_38->field_1C * v13) >> 16); - v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + (signed int)((unsigned __int64)(v37 * v18) >> 16) / 8; - v36 = 224 * pMiscTimer->uTotalGameTimeElapsed + (signed int)((unsigned __int64)(v36 * v18) >> 16) / 8; - */ + v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + fixpoint_mul(v37, v18) / 8; + v36 = 224 * pMiscTimer->uTotalGameTimeElapsed + fixpoint_mul(v37, v18) / 8; + //array_50AC10[i].vWorldViewPosition.x = pOutdoorCamera->shading_dist_mist; - //array_50AC10[i]._rhw = 1; - //array_50AC10[i].u = (double)v35 / (65536.0 * pBitmaps_LOD->pTextures[pOutdoor->uSky_TextureID].uTextureWidth); - //array_50AC10[i].v = (double)v36 / (65536.0 * pBitmaps_LOD->pTextures[pOutdoor->uSky_TextureID].uTextureWidth); - //} - if ( _this.uNumVertices > 0) - { - float t = (GetTickCount() % 96000) / 96000.0f; - - array_50AC10[0].vWorldViewPosition.x = pOutdoorCamera->shading_dist_mist; - array_50AC10[0]._rhw = 1; - array_50AC10[0].u = 0; - array_50AC10[0].v = 0 + t; - - array_50AC10[1].vWorldViewPosition.x = pOutdoorCamera->shading_dist_mist; - array_50AC10[1]._rhw = 1; - array_50AC10[1].u = 0; - array_50AC10[1].v = 1 + t; - - array_50AC10[2].vWorldViewPosition.x = pOutdoorCamera->shading_dist_mist; - array_50AC10[2]._rhw = 1; - array_50AC10[2].u = 1; - array_50AC10[2].v = 0 + t; - - array_50AC10[3].vWorldViewPosition.x = pOutdoorCamera->shading_dist_mist; - array_50AC10[3]._rhw = 1; - array_50AC10[3].u = 1; - array_50AC10[3].v = 1 + t; - pRenderer->DrawStrip(_this.uNumVertices, &_this, pBitmaps_LOD->pHardwareTextures[_this.uTileBitmapID]); + //array_50AC10[i].vWorldPosition.x = v36 / (_this.pTexture->uTextureHeight * 65536.0); + //array_50AC10[i].vWorldPosition.y = 1.0 / (pOutdoorCamera->shading_dist_mist >> 16); + //array_50AC10[i].vWorldPosition.z = v35 / (_this.pTexture->uTextureWidth * 65536.0); + array_50AC10[i]._rhw = 1.0;// / (pOutdoorCamera->shading_dist_mist >> 16); + //array_50AC10[i].u = (double)v35 / (65536.0 * _this.pTexture->uTextureWidth); + //array_50AC10[i].v = (double)v36 / (65536.0 * _this.pTexture->uTextureHeight); + float t = (GetTickCount() % 96000) / 96000.0f; + array_50AC10[i].u += t; + array_50AC10[i].v += t; + if ( i == _this.uNumVertices - 1 ) + { + pRenderer->DrawSkyPolygon(_this.uNumVertices, &_this, pBitmaps_LOD->pHardwareTextures[_this.uTileBitmapID]); + + array_50AC10[0].vWorldViewProjY = v38; + array_50AC10[1].vWorldViewProjY = array_50AC10[1].vWorldViewProjY + 30.0; + array_50AC10[2].vWorldViewProjY = array_50AC10[2].vWorldViewProjY + 30.0; + array_50AC10[3].vWorldViewProjY = v38; + + pRenderer->DrawSkyPolygon(_this.uNumVertices, &_this, pBitmaps_LOD->pHardwareTextures[_this.uTileBitmapID]); return; - //} + } } } @@ -6254,7 +6225,7 @@ uFaceID = v65; } v56 = 8 * uFaceID; - LOBYTE(v56) = 8 * uFaceID | 6; + LOBYTE(v56) = PID(OBJECT_BModel,uFaceID); v57 = v56; v58 = pFace->GetTexture(); pRenderer->DrawIndoorPolygon(v3, pFace, pBitmaps_LOD->pHardwareTextures[pFace->uBitmapID], v58, v57, -1, 0); @@ -11181,11 +11152,11 @@ v15->uScreenSpaceX = a5; v15->uScreenSpaceY = a6; //v23 = 8 * uDecorationID; - //LOBYTE(v23) = 8 * uDecorationID | OBJECT_Decoration; + //LOBYTE(v23) = PID(OBJECT_Decoration,uDecorationID); //v15->sZValue = v22 + v23; v15->actual_z = HIWORD(x); - v15->object_pid = 8 * uDecorationID | OBJECT_Decoration; + v15->object_pid = PID(OBJECT_Decoration,uDecorationID); v15->uTintColor = 0; v15->pSpriteFrame = v12; @@ -11338,12 +11309,12 @@ v3->uTintColor = 0; v3->uScreenSpaceY = v22; //v23 = 8 * i; - //LOBYTE(v23) = 8 * i | OBJECT_Item; + //LOBYTE(v23) = PID(OBJECT_Item,i); v3->pSpriteFrame = v24; //v12 = (p->uAttributes & 0x20) == 0; //v3->sZValue = v21 + v23; v3->actual_z = HIWORD(x); - v3->object_pid = 8 * i | OBJECT_Item; + v3->object_pid = PID(OBJECT_Item,i); if (p->uAttributes & 0x20) { if ( !pRenderer->pRenderD3D ) @@ -12817,7 +12788,7 @@ ++num_dead_actors; else { - int sumonner_type = pActors[i].uSummonerID & 7;; + int sumonner_type = PID_TYPE(pActors[i].uSummonerID); if (sumonner_type == OBJECT_Player) ++num_dead_actors; } @@ -15000,7 +14971,7 @@ { v20 = &pActors[ai_near_actors_ids[v18]]; if ( v20->uAttributes & 0x8000 - || (v21 = sub_4070EF_prolly_collide_objects(8 * ai_near_actors_ids[v18] | 3, 4u), v18 = i, v21) ) + || (v21 = sub_4070EF_prolly_collide_objects(PID(OBJECT_Actor,ai_near_actors_ids[v18]), 4u), v18 = i, v21) ) { v22 = ai_near_actors_ids[v18]; v20->uAttributes |= 0x8000u; @@ -15121,72 +15092,74 @@ unsigned __int16 v22; // ax@86 //signed int v23; // eax@94 //unsigned int v24; // eax@102 - signed int v25; // edi@102 - SpellBuff *v26; // esi@102 + //signed int v25; // edi@102 + //SpellBuff *v26; // esi@102 unsigned int v27; // ecx@123 unsigned int v28; // eax@123 - unsigned int v29; // eax@127 + //unsigned int v29; // eax@127 AIDirection *v30; // eax@129 unsigned __int16 v31; // ax@132 - unsigned int v32; // esi@142 + //unsigned int v32; // esi@142 int v33; // eax@144 int v34; // eax@147 char v35; // al@150 unsigned int v36; // edi@152 signed int v37; // eax@154 - unsigned __int8 v38; // sf@158 - unsigned __int8 v39; // of@158 - signed int v40; // edx@166 - unsigned int v41; // ecx@166 + //unsigned __int8 v38; // sf@158 + //unsigned __int8 v39; // of@158 + //signed int v40; // edx@166 + //unsigned int v41; // ecx@166 double v42; // st7@176 double v43; // st6@176 - bool v44; // eax@189 + //bool v44; // eax@189 bool v45; // eax@192 unsigned __int8 v46; // cl@197 double v47; // st7@206 double v48; // st7@207 - char v49; // zf@208 - char v50; // zf@214 - signed int v51; // edx@219 - unsigned int v52; // ecx@219 + //char v49; // zf@208 + //char v50; // zf@214 + //signed int v51; // edx@219 + //unsigned int v52; // ecx@219 __int16 v53; // fps@224 - unsigned __int8 v54; // c0@224 - unsigned __int8 v55; // c3@224 + //unsigned __int8 v54; // c0@224 + //unsigned __int8 v55; // c3@224 double v56; // st7@226 AIDirection *v57; // eax@246 double v58; // st7@246 - signed int v59; // [sp-18h] [bp-C8h]@213 - int v60; // [sp-14h] [bp-C4h]@144 - int v61; // [sp-14h] [bp-C4h]@168 - AIDirection *v62; // [sp-14h] [bp-C4h]@213 - signed int v63; // [sp-14h] [bp-C4h]@216 + //signed int v59; // [sp-18h] [bp-C8h]@213 + //int v60; // [sp-14h] [bp-C4h]@144 + //int v61; // [sp-14h] [bp-C4h]@168 + //AIDirection *v62; // [sp-14h] [bp-C4h]@213 + //signed int v63; // [sp-14h] [bp-C4h]@216 unsigned int v64; // [sp-14h] [bp-C4h]@219 unsigned int v65; // [sp-10h] [bp-C0h]@144 char v66; // [sp-10h] [bp-C0h]@147 - AIDirection *v67; // [sp-10h] [bp-C0h]@167 - int v68; // [sp-10h] [bp-C0h]@168 - AIDirection *v69; // [sp-10h] [bp-C0h]@206 + //AIDirection *v67; // [sp-10h] [bp-C0h]@167 + //int v68; // [sp-10h] [bp-C0h]@168 + //AIDirection *v69; // [sp-10h] [bp-C0h]@206 int v70; // [sp-10h] [bp-C0h]@213 - AIDirection *v71; // [sp-10h] [bp-C0h]@216 + //AIDirection *v71; // [sp-10h] [bp-C0h]@216 AIDirection v72; // [sp+0h] [bp-B0h]@246 AIDirection a3; // [sp+1Ch] [bp-94h]@129 AIDirection v74; // [sp+38h] [bp-78h]@246 AIDirection v75; // [sp+54h] [bp-5Ch]@129 - int v76; // [sp+70h] [bp-40h]@83 + int target_pid_type; // [sp+70h] [bp-40h]@83 signed int a1; // [sp+74h] [bp-3Ch]@129 int v78; // [sp+78h] [bp-38h]@79 AIDirection pDir; // [sp+7Ch] [bp-34h]@129 float v80; // [sp+98h] [bp-18h]@33 int v81; // [sp+9Ch] [bp-14h]@100 - int v82; // [sp+A0h] [bp-10h]@45 + //int v82; // [sp+A0h] [bp-10h]@45 //unsigned int uActorID; // [sp+A4h] [bp-Ch]@32 unsigned int v84; // [sp+A8h] [bp-8h]@11 - signed int a2; // [sp+ACh] [bp-4h]@83 + signed int target_pid; // [sp+ACh] [bp-4h]@83 + AIState uAIState; + int v38; if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) - MakeActorAIList_ODM(); + MakeActorAIList_ODM(); else - MakeActorAIList_BLV(); + MakeActorAIList_BLV(); //v0 = 0; if ( uCurrentlyLoadedLevelType != LEVEL_Indoor && pParty->armageddon_timer > 0 ) @@ -15203,7 +15176,7 @@ v3 = pParty->sRotationX + v1 % 16 - 8; pParty->sRotationX = v3; if ( v3 > 128 || (v2 = -128, v3 < -128) ) - pParty->sRotationX = v2; + pParty->sRotationX = v2; pParty->uFlags |= 2u; pParty->armageddon_timer -= pMiscTimer->uTimeElapsed; v4 = pParty->field_16140 + 50; @@ -15225,13 +15198,13 @@ { if ( v7 >= 0 ) { - Actor::_4030AD(v84, 4, 0); + Actor::Stun(v84, 4, 0); } else { Actor::Die(v84); if ( v5->pMonsterInfo.uExp ) - GivePartyExp(pMonsterStats->pInfos[v5->pMonsterInfo.uID].uExp); + GivePartyExp(pMonsterStats->pInfos[v5->pMonsterInfo.uID].uExp); } } } @@ -15245,14 +15218,14 @@ { pPlayer = *v8; if ( !(*v8)->pConditions[14] && !pPlayer->pConditions[15] && !pPlayer->pConditions[16] ) - pPlayer->ReceiveDamage(v4, 5); + pPlayer->ReceiveDamage(v4, 5); ++v8; } while ( (signed int)v8 <= (signed int)&pPlayers[4] ); //v0 = 0; } if (pTurnEngine->field_1C) - --pTurnEngine->field_1C; + --pTurnEngine->field_1C; } } @@ -15275,10 +15248,10 @@ //v49 = *(unsigned int *)LODWORD(v80) == 5; ai_near_actors_targets_pid[i] = OBJECT_Player; if (actor->uAIState == Dead || actor->uAIState == Removed || actor->uAIState == Disabled || actor->uAttributes & 0x0400) - continue; + continue; if (!actor->sCurrentHP && actor->uAIState != Dying) - Actor::Die(i); + Actor::Die(i); //v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1; //v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1; @@ -15301,18 +15274,19 @@ ++v14; } while ( v13 < 22 );*/ - if (!actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime) + if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 ) //&& 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; + actor->uActorHeight = pMonsterList->pMonsters[actor->pMonsterInfo.uID - 1].uMonsterHeight; + if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 ) + actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + // not sure + else if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 ) + actor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[actor->pMonsterInfo.uID].uHostilityType; - if (actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime || - actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime) - continue; + if ((signed __int64)actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime > 0 + || (signed __int64)actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0) + continue; //v15 = pMiscTimer->uTimeElapsed; //v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime; @@ -15321,17 +15295,18 @@ if (actor->pMonsterInfo.uRecoveryTime) { if (actor->pMonsterInfo.uRecoveryTime < pMiscTimer->uTimeElapsed) - actor->pMonsterInfo.uRecoveryTime = 0; - else 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; + continue; //v19 = actor->uAIState; if (actor->uAIState == Dying) - actor->uAIState = Dead; + actor->uAIState = Dead; else { if (actor->uAIState != Summoned) @@ -15367,559 +15342,445 @@ v21 = &pActors[actor_id]; Actor::_SelectTarget(actor_id, &ai_near_actors_targets_pid[actor_id], true); if (v21->pMonsterInfo.uHostilityType && !ai_near_actors_targets_pid[actor_id]) - v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; - a2 = ai_near_actors_targets_pid[actor_id]; - v76 = a2 & 7; - if ( (a2 & 7) == OBJECT_Actor) - v80 = 0.5; + v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + target_pid = ai_near_actors_targets_pid[actor_id]; + target_pid_type = PID_TYPE(target_pid); + if ( target_pid_type == OBJECT_Actor) + v80 = 0.5; else - v80 = 1.0; + v80 = 1.0; v22 = v21->uAIState; if ( v22 == Dying || v22 == Dead || v22 == Removed || v22 == Disabled || v22 == Summoned) { continue; } - else - { - if ( !v21->sCurrentHP ) + if ( !v21->sCurrentHP ) Actor::Die(actor_id); - v25 = 0; - v26 = v21->pActorBuffs; - do + for(int i=0;i<22;i++) + { + if ( i != 10 ) { - if ( v25 != 10 ) - { - v26->_4585CA(pParty->uTimePlayed); - //v24 = 0; - } - ++v25; - ++v26; + v21->pActorBuffs[i]._4585CA(pParty->uTimePlayed); } - while ( v25 < 22 ); - if ( (signed __int64)v21->pActorBuffs[3].uExpireTime > 0 - && SHIDWORD(v21->pActorBuffs[3].uExpireTime) <= 0 - && (SHIDWORD(v21->pActorBuffs[3].uExpireTime) < 0 - || LODWORD(v21->pActorBuffs[3].uExpireTime) <= 0) ) + } + if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 ) v21->uActorHeight = pMonsterList->pMonsters[v21->pMonsterInfo.uID - 1].uMonsterHeight; - if ( (signed __int64)v21->pActorBuffs[1].uExpireTime > 0 ) - { - v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; - if ( SHIDWORD(v21->pActorBuffs[1].uExpireTime) <= 0 ) - { - if ( SHIDWORD(v21->pActorBuffs[1].uExpireTime) < 0 - || LODWORD(v21->pActorBuffs[1].uExpireTime) <= 0 ) - v21->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[v21->pMonsterInfo.uID].uHostilityType; - } - } - if ( (signed __int64)v21->pActorBuffs[2].uExpireTime > 0 - && SHIDWORD(v21->pActorBuffs[2].uExpireTime) <= 0 - && (SHIDWORD(v21->pActorBuffs[2].uExpireTime) < 0 - || LODWORD(v21->pActorBuffs[2].uExpireTime) <= 0) ) - { - v21->uAIState = Removed; - continue; - } - else if ( v21->pActorBuffs[5].uExpireTime || v21->pActorBuffs[6].uExpireTime ) + if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 ) + v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + // not sure + else if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 ) + v21->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[v21->pMonsterInfo.uID].uHostilityType; + if ( (signed __int64)v21->pActorBuffs[2].uExpireTime < 0 ) + { + v21->uAIState = Removed; + continue; + } + if ( (signed __int64)v21->pActorBuffs[5].uExpireTime > 0 + || (signed __int64)v21->pActorBuffs[6].uExpireTime > 0) + { + continue; + } + v27 = pMiscTimer->uTimeElapsed; + v28 = v21->pMonsterInfo.uRecoveryTime; + v21->uCurrentActionTime += pMiscTimer->uTimeElapsed; + if ( (signed int)v28 > 0 ) + v21->pMonsterInfo.uRecoveryTime = v28 - v27; + if ( v21->pMonsterInfo.uRecoveryTime < 0 ) + v21->pMonsterInfo.uRecoveryTime = 0; + if ( !(v21->uAttributes & 0x8000) ) + v21->uAttributes |= 0x8000; + a1 = PID(OBJECT_Actor,actor_id); + v30 = Actor::GetDirectionInfo(PID(OBJECT_Actor,actor_id), target_pid, &a3, 0); + memcpy(&v75, v30, sizeof(v75)); + memcpy(&pDir, &v75, sizeof(pDir)); + uAIState = v21->uAIState; + /*if ( v21->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Friendly + && (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 + && v80 * 307.2 >= (double)(signed int)v75.uDistance + && (uAIState == Pursuing || uAIState == Standing || uAIState == Tethered || uAIState == Fidgeting) + || ( v21->pMonsterInfo.uMissleAttack1Type && uAIState == Stunned ) ) + { + v32 = actor_id; + } + else + */ + if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly + || (signed int)v21->pMonsterInfo.uRecoveryTime > 0 + || v80 * 307.2 < (double)(signed int)v75.uDistance + || uAIState != Pursuing && uAIState != Standing && uAIState != Tethered && uAIState != Fidgeting + && !v21->pMonsterInfo.uMissleAttack1Type || uAIState != Stunned ) + { + if ( (signed int)v21->uCurrentActionTime < v21->uCurrentActionLength ) { continue; } - else + else if ( v21->uAIState == AttackingMelee ) + { + v35 = stru_50C198.special_ability_use_check(v21, actor_id); + stru_50FE08.Add( + a1, + 5120, + v21->vPosition.x, + v21->vPosition.y, + v21->vPosition.z + ((signed int)v21->uActorHeight >> 1), + v35, + 1 + ); + } + else if ( v21->uAIState == AttackingRanged1 ) { - v27 = pMiscTimer->uTimeElapsed; - v28 = v21->pMonsterInfo.uRecoveryTime; - v21->uCurrentActionTime += pMiscTimer->uTimeElapsed; - if ( (signed int)v28 > 0 ) - v21->pMonsterInfo.uRecoveryTime = v28 - v27; - if ( v21->pMonsterInfo.uRecoveryTime< 0 ) - v21->pMonsterInfo.uRecoveryTime = 0; - v29 = v21->uAttributes; - if ( !(v29 & 0x8000) ) - v21->uAttributes = v29 | 0x8000; - a1 = 8 * actor_id | OBJECT_Actor; - v30 = Actor::GetDirectionInfo(8 * actor_id | OBJECT_Actor, a2, &a3, 0); - v49 = v21->pMonsterInfo.uHostilityType == 0; - memcpy(&v75, v30, sizeof(v75)); - memcpy(&pDir, &v75, sizeof(pDir)); - if ( !v49 - && (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 - && v80 * 307.2 >= (double)(signed int)v75.uDistance - && ((v31 = v21->uAIState, v31 == 6) || !v31 || v31 == 1 || v31 == 9) - || v21->pMonsterInfo.uMissleAttack1Type && v21->uAIState == 8 ) - { - v32 = actor_id; - } - else - { - if ( (signed int)v21->uCurrentActionTime < v21->uCurrentActionLength ) - { - continue; - } - else if ( v21->uAIState == 2 ) - { - v32 = actor_id; - v35 = stru_50C198.special_ability_use_check(v21, actor_id); - stru_50FE08.Add( - a1, - 5120, - v21->vPosition.x, - v21->vPosition.y, - v21->vPosition.z + ((signed int)v21->uActorHeight >> 1), - v35, - 1 - ); - } - else if ( v21->uAIState == 3 ) - { - v34 = v21->pMonsterInfo.uMissleAttack1Type; - v66 = 0; - v32 = actor_id; - Actor::_404874(actor_id, &pDir, v34, v66); - } - else if ( v21->uAIState == 12 ) - { - v34 = v21->pMonsterInfo.uMissleAttack2Type; - v66 = 1; - v32 = actor_id; - Actor::_404874(actor_id, &pDir, v34, v66); - } - else - { - v32 = actor_id; - if ( v21->uAIState == 13 ) - { - v65 = v21->pMonsterInfo.uSpellSkillAndMastery1; - v60 = 2; - v33 = v21->pMonsterInfo.uSpell1ID; - Actor::_404AC7(actor_id, &pDir, v33, v60, v65); - } - else if ( v21->uAIState == 18 ) - { - v65 = v21->pMonsterInfo.uSpellSkillAndMastery2; - v60 = 3; - v33 = v21->pMonsterInfo.uSpell2ID; - Actor::_404AC7(actor_id, &pDir, v33, v60, v65); - } - } - } + v34 = v21->pMonsterInfo.uMissleAttack1Type; + Actor::RangedAttack(actor_id, &pDir, v34, 0); + } + else if ( v21->uAIState == AttackingRanged2 ) + { + v34 = v21->pMonsterInfo.uMissleAttack2Type; + Actor::RangedAttack(actor_id, &pDir, v34, 1); + } + else if ( v21->uAIState == AttackingRanged3 ) + { + v65 = v21->pMonsterInfo.uSpellSkillAndMastery1; + v33 = v21->pMonsterInfo.uSpell1ID; + Actor::SpellAttack(actor_id, &pDir, v33, 2, v65); + } + else if ( v21->uAIState == AttackingRanged4 ) + { + v65 = v21->pMonsterInfo.uSpellSkillAndMastery2; + v33 = v21->pMonsterInfo.uSpell2ID; + Actor::SpellAttack(actor_id, &pDir, v33, 3, v65); } } + v36 = v75.uDistance; - if ( !v21->pMonsterInfo.uHostilityType ) + if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly) { - if ( v76 == 3 ) + if ( target_pid_type == OBJECT_Actor ) { v36 = v75.uDistance; v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (v21->pMonsterInfo.uID - 1) / 3] - + (pActors[a2 >> 3].pMonsterInfo.uID - 1) / 3); + + (pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3); } else { v37 = 4; } + v38=0; if ( v37 == 2 ) { - v39 = __OFSUB__(v36, 1024); - v38 = ((v36 - 1024) & 0x80000000u) != 0; + //v39 = __OFSUB__(v36, 1024); + //v38 = ((v36 - 1024) & 0x80000000u) != 0; + v38 = 1024; } else if ( v37 == 3 ) { - v39 = __OFSUB__(v36, 2560); - v38 = ((v36 - 2560) & 0x80000000u) != 0; + //v39 = __OFSUB__(v36, 2560); + //v38 = ((v36 - 2560) & 0x80000000u) != 0; + v38 = 2560; } else if ( v37 == 4 ) { - v39 = __OFSUB__(v36, 5120); - v38 = ((v36 - 5120) & 0x80000000u) != 0; + //v39 = __OFSUB__(v36, 5120); + //v38 = ((v36 - 5120) & 0x80000000u) != 0; + v38 = 5120; } - if ( v37 >= 1 && v37 <= 4 && v38 ^ v39 || v37 == 1 ) - v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; + if ( v37 >= 1 && v37 <= 4 && v36 < v38 || v37 == 1 ) + v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; } + if ( (signed __int64)v21->pActorBuffs[4].uExpireTime > 0 ) { - v40 = a2; - v41 = v32; if ( (signed int)v36 >= 10240 ) { - v68 = 0; - v61 = 1024; - Actor::_4032B2(v41, v40, v61, v68); - continue; + Actor::_4032B2(actor_id, target_pid, 1024, 0); } - v67 = &pDir; - Actor::_402968(v41, v40, 0, v67); + else + { + //peasents after attacked + //guard after attacked + Actor::Flee(actor_id, target_pid, 0, &pDir); + } continue; } - if ( v21->pMonsterInfo.uHostilityType == 4 && a2 ) + + if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Long && target_pid ) { - if ( !(v21->uAttributes & 0x020000) || v21->pMonsterInfo.uAIType == 1 ) + + if ( v21->pMonsterInfo.uAIType == 1 ) { - if ( v21->pMonsterInfo.uAIType == 1 ) + if ( v21->pMonsterInfo.uMovementType == 5 ) { - v67 = &pDir; - if ( v21->pMonsterInfo.uMovementType != 5 ) - { - v40 = a2; - v41 = v32; - Actor::_402968(v41, v40, 0, v67); - continue; - } - Actor::AI_Stand( - v32, - a2, - (signed __int64)((double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333), - &pDir); + Actor::AI_Stand(actor_id, target_pid, (signed __int64)((double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333), &pDir); } else { + Actor::Flee(actor_id, target_pid, 0, &pDir); + continue; + } + + } + if ( !(v21->uAttributes & 0x020000) ) + { + if ( v21->pMonsterInfo.uAIType == 2 || v21->pMonsterInfo.uAIType == 3) + { if ( v21->pMonsterInfo.uAIType == 2 ) - { - v84 = v21->sCurrentHP; - v42 = (double)(signed int)v84; v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.2; - } - else - { - v84 = v21->sCurrentHP; - v42 = (double)(signed int)v84; + if ( v21->pMonsterInfo.uAIType == 3 ) v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.1; - } - if ( v21->pMonsterInfo.uAIType == 2 || v21->pMonsterInfo.uAIType == 3 ) + v84 = v21->sCurrentHP; + v42 = (double)(signed int)v84; if ( v43 > v42 && (signed int)v36 < 10240 ) { - v67 = &pDir; - v40 = a2; - v41 = v32; - Actor::_402968(v41, v40, 0, v67); + Actor::Flee(actor_id, target_pid, 0, &pDir); continue; } } } + v81 = v36 - v21->uActorRadius; - if ( v76 == 3 ) - v81 -= pActors[a2 >> 3].uActorRadius; + if ( target_pid_type == OBJECT_Actor ) + v81 -= pActors[PID_ID(target_pid)].uActorRadius; if ( v81 < 0 ) - v81 = 0; + v81 = 0; rand(); - v44 = (signed int)v21->pMonsterInfo.uRecoveryTime <= 0; v21->uAttributes &= 0xFBFFFF; - v82 = 0; - v49 = v21->pMonsterInfo.uMovementType == 5; - v84 = v44; - if ( v49 ) - v82 = 1; if ( v81 < 5120 ) { - v45 = stru_50C198.special_ability_use_check(v21, v32); - if ( !v45 ) + v45 = stru_50C198.special_ability_use_check(v21, actor_id); + if ( v45 == 0 ) { if ( v21->pMonsterInfo.uMissleAttack1Type ) { - if ( v84 ) + if ( (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 ) { - Actor::_403476(v32, a2, &pDir); - continue; - + Actor::MissileAttack1(actor_id, target_pid, &pDir); } - if ( v82 ) + else if ( v21->pMonsterInfo.uMovementType == 5 ) { - v69 = &pDir; v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); + } + else + { + v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + if ( v80 * 307.2 > (double)v81 ) + { + v64 = (signed __int64)v47; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); + } + else + { + Actor::Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); + } } - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - //UNDEF(v53); - v69 = &pDir; - if ( !(v54 | v55) ) + } + else + { + v56 = v80 * 307.2; + if ( (double)v81 >= v56 ) { - v51 = a2; - v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; - } - Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69); - continue; - } - v56 = v80 * 307.2; - if ( (double)v81 >= v56 ) - { - if ( v81 >= 1024 ) - { - if ( v82 ) + if ( v81 >= 1024 ) { - v69 = &pDir; + if ( v21->pMonsterInfo.uMovementType == 5 ) + { + v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + v64 = (signed __int64)v47; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); + } + else + { + //monsters + Actor::Pursue3(actor_id, target_pid, 0, &pDir); + } + } + else if ( v21->pMonsterInfo.uMovementType == 5 ) + { v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } - v71 = &pDir; - v63 = 0; - - Actor::_402686(v32, a2, v63, v71); - continue; + else + { + v70 = (signed __int64)v56; + //monsters + //guard after player runs away + // follow player + Actor::Pursue2(actor_id, target_pid, 0, &pDir, v70); + } } - if ( v82 ) + else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) { - v69 = &pDir; v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } - v70 = (signed __int64)v56; - v62 = &pDir; - v59 = 0; - Actor::_40281C(v32, a2, v59, v62, v70); - continue; + else + { + //monsters + Actor::MeleeAttack(actor_id, target_pid, &pDir); + } } - v49 = v84 == 0; - v69 = &pDir; - if ( v49 ) - { - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; - v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; - } - Actor::_403C6C(v32, a2, &pDir); continue; } - if ( v45 != 1 ) + else if ( v45 == 2 || v45 == 3 ) { - if ( v45 > 1 && v45 <= 3 ) + if ( v45 == 2 ) + v46 = v21->pMonsterInfo.uSpell1ID; + else + v46 = v21->pMonsterInfo.uSpell2ID; + if ( v46 ) { - if ( v45 == 2 ) - v46 = v21->pMonsterInfo.uSpell1ID; - else - v46 = v21->pMonsterInfo.uSpell2ID; - if ( v46 ) + if ( (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 ) { - if ( v84 ) - { - if ( v45 == 2 ) - Actor::_403854(v32, a2, &pDir); - else - Actor::_403A60(v32, a2, &pDir); - continue; - } - if ( v80 * 307.2 > (double)v81 || v82 ) - { - v69 = &pDir; - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; - v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; - - } - v69 = &pDir; + if ( v45 == 2 ) + Actor::SpellAttack1(actor_id, target_pid, &pDir); + else + Actor::SpellAttack2(actor_id, target_pid, &pDir); + } + else if ( v80 * 307.2 > (double)v81 || v21->pMonsterInfo.uMovementType == 5 ) + { v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69); - continue; + v64 = (signed __int64)v47; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } + else + { + v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; + Actor::Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); + } + } + else + { v48 = v80 * 307.2; if ( (double)v81 >= v48 ) { if ( v81 >= 1024 ) { - v50 = v82 == 0; - if ( !v50 ) + if ( v21->pMonsterInfo.uMovementType == 5 ) { - v69 = &pDir; v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } - v71 = &pDir; - v63 = 256; - Actor::_402686(v32, a2, v63, v71); - continue; - + else + { + Actor::Pursue3(actor_id, target_pid, 256, &pDir); + } } - if ( v82 ) + else if ( v21->pMonsterInfo.uMovementType == 5 ) { - v69 = &pDir; v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } - v70 = (signed __int64)v48; - v62 = &pDir; - v59 = 0; - Actor::_40281C(v32, a2, v59, v62, v70); - continue; + else + { + v70 = (signed __int64)v48; + Actor::Pursue2(actor_id, target_pid, 0, &pDir, v70); + } } - v49 = v84 == 0; - v69 = &pDir; - if ( v49 ) + else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) { v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } - Actor::_403C6C(v32, a2, &pDir); - continue; + else + { + Actor::MeleeAttack(actor_id, target_pid, &pDir); + } } + continue; } } } - if ( v21->pMonsterInfo.uHostilityType != 4 || !a2 || v81 >= 5120 || v45 != 1 ) + + if ( v21->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Long || !target_pid || v81 >= 5120 || v45 != 1 ) { if ( !v21->pMonsterInfo.uMovementType ) { - v68 = 0; - v61 = 1024; - v41 = v32; - v40 = 4; - Actor::_4032B2(v41, v40, v61, v68); - continue; - + Actor::_4032B2(actor_id, 4, 1024, 0); } - if ( v21->pMonsterInfo.uMovementType == 1 ) + else if ( v21->pMonsterInfo.uMovementType == 1 ) { - v68 = 0; - v61 = 2560; - v41 = v32; - v40 = 4; - Actor::_4032B2(v41, v40, v61, v68); - continue; + Actor::_4032B2(actor_id, 4, 2560, 0); } - if ( v21->pMonsterInfo.uMovementType == 2 ) + else if ( v21->pMonsterInfo.uMovementType == 2 ) { - v68 = 0; - v61 = 5120; - v41 = v32; - v40 = 4; - Actor::_4032B2(v41, v40, v61, v68); - continue; + Actor::_4032B2(actor_id, 4, 5120, 0); } - if ( v21->pMonsterInfo.uMovementType == 4 ) + else if ( v21->pMonsterInfo.uMovementType == 4 ) { - v68 = 0; - v61 = 10240; - v41 = v32; - v40 = 4; - Actor::_4032B2(v41, v40, v61, v68); - continue; + Actor::_4032B2(actor_id, 4, 10240, 0); } - if ( v21->pMonsterInfo.uMovementType == 5 ) + else if ( v21->pMonsterInfo.uMovementType == 5 ) { v57 = Actor::GetDirectionInfo(a1, 4u, &v72, 0); v58 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; memcpy(&v74, v57, sizeof(v74)); memcpy(&pDir, &v74, sizeof(pDir)); - v69 = &pDir; - v52 = actor_id; v64 = (signed __int64)v58; - v51 = 4; - Actor::AI_Stand(v52, v51, v64, v69); - continue; - } - continue; - + Actor::AI_Stand(actor_id, 4, v64, &pDir); + } } - if ( !v21->pMonsterInfo.uMissleAttack2Type ) + else if ( !v21->pMonsterInfo.uMissleAttack2Type ) { v56 = v80 * 307.2; if ( (double)v81 >= v56 ) { if ( v81 >= 1024 ) { - v50 = v82 == 0; - if ( !v50 ) + if ( v21->pMonsterInfo.uMovementType == 5 ) { - v69 = &pDir; v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } - v71 = &pDir; - v63 = 256; - Actor::_402686(v32, a2, v63, v71); - continue; + else + { + Actor::Pursue3(actor_id, target_pid, 256, &pDir); + } } - if ( v82 ) + else if ( v21->pMonsterInfo.uMovementType == 5 ) { - v69 = &pDir; v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); } - v70 = (signed __int64)v56; - v62 = &pDir; - v59 = 0; - Actor::_40281C(v32, a2, v59, v62, v70); - continue; - + else + { + v70 = (signed __int64)v56; + Actor::Pursue2(actor_id, target_pid, 0, &pDir, v70); + } } - v49 = v84 == 0; - v69 = &pDir; - if ( v49 ) + else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) { v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; - v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; - } - Actor::_403C6C(v32, a2, &pDir); - continue; - } - if ( !v84 ) - { - if ( v82 ) - { - v69 = &pDir; - v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); + } + else + { + Actor::MeleeAttack(actor_id, target_pid, &pDir); } + } + else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 ) + { v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333; - //UNDEF(v53); - v69 = &pDir; - if ( !(v54 | v55) ) + if ( v80 * 307.2 > (double)v81 || v21->pMonsterInfo.uMovementType == 5 ) { - v51 = a2; v64 = (signed __int64)v47; - v52 = v32; - Actor::AI_Stand(v52, v51, v64, v69); - continue; + Actor::AI_Stand(actor_id, target_pid, v64, &pDir); + } + else + { + Actor::Pursue1(actor_id, target_pid, actor_id, (signed __int64)v47, &pDir); } - Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69); - continue; } - Actor::_40368B(v32, a2, &pDir); + else + { + Actor::MissileAttack2(actor_id, target_pid, &pDir); + } } } } @@ -15996,10 +15857,10 @@ v2 = this->pQueue; do { - if ( (v2->uPackedID & 7) == OBJECT_Actor ) - { - v3 = &pActors[v2->uPackedID >> 3]; - v4 = &pActors[v2->uPackedID >> 3]; + if ( PID_TYPE(v2->uPackedID) == OBJECT_Actor ) + { + v3 = &pActors[PID_ID(v2->uPackedID)]; + v4 = &pActors[PID_ID(v2->uPackedID)]; LOBYTE(v4->uAttributes) |= 0x80u; if ( !v4->CanAct() ) { @@ -16008,7 +15869,7 @@ LOBYTE(v3->uAttributes) &= 0x7Fu; } } - if ( (v2->uPackedID & 7) == OBJECT_Player) + if ( PID_TYPE(v2->uPackedID) == OBJECT_Player) { v5 = &pParty->pPlayers[v2->uPackedID >> 3]; if ( v5->pConditions[14] @@ -16044,8 +15905,8 @@ v10 = v7->field_4; if ( v9 < v10 || v9 == v10 - && ((v11 = v8->uPackedID & 7, v11 == OBJECT_Player) && (v7->uPackedID & 7) == OBJECT_Actor - || v11 == (v7->uPackedID & 7) && (v8->uPackedID & 0xFFFFFFF8) < (v7->uPackedID & 0xFFFFFFF8)) ) + && ((v11 = PID_TYPE(v8->uPackedID), v11 == OBJECT_Player) && PID_TYPE(v7->uPackedID) == OBJECT_Actor + || v11 == PID_TYPE(v7->uPackedID) && (v8->uPackedID & 0xFFFFFFF8) < (v7->uPackedID & 0xFFFFFFF8)) ) { v12 = v7->uPackedID; v13 = v7->field_4; @@ -16073,9 +15934,9 @@ } v1->uActorQueueSize = v19; result = v1->pQueue[0].uPackedID; - if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) - { - result = (result >> 3) + 1; + if ( PID_TYPE(v1->pQueue[0].uPackedID) == OBJECT_Player) + { + result = PID_ID(result) + 1; uActiveCharacter = result; v1->field_18 |= 4u; } @@ -16090,8 +15951,8 @@ v17 = v1->pQueue; do { - if ( (v17->uPackedID & 7) == OBJECT_Player) - pParty->pPlayers[v17->uPackedID >> 3].uTimeToRecovery = (signed __int64)((double)v17->field_4 * 0.46875); + if ( PID_TYPE(v17->uPackedID) == OBJECT_Player) + pParty->pPlayers[PID_ID(v17->uPackedID)].uTimeToRecovery = (signed __int64)((double)v17->field_4 * 0.46875); ++v22; ++v17; result = v22; @@ -16171,7 +16032,7 @@ { if ( v40->CanAct() ) { - *(&v1->field_0 + 4 * (v1->uActorQueueSize + 2)) = 8 * v3 | OBJECT_Player; + *(&v1->field_0 + 4 * (v1->uActorQueueSize + 2)) = PID(OBJECT_Player,v3); v1->pQueue[v1->uActorQueueSize].field_C = 2; v1->pQueue[v1->uActorQueueSize].uActionLength = 0; pParty->pTurnBasedPlayerRecoveryTimes[v1->uActorQueueSize++] = 0; @@ -16201,8 +16062,8 @@ v8 = ai_near_actors_targets_pid[v5]; LOBYTE(v7) = v7 | 0x80; v6->uAttributes = v7; - v33 = 8 * v5 | OBJECT_Actor; - memcpy(&v31, Actor::GetDirectionInfo(8 * v5 | OBJECT_Actor, v8, &a3, 0), sizeof(v31)); + 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); *(&v1->field_0 + 4 * (v1->uActorQueueSize + 2)) = v33; @@ -16228,7 +16089,7 @@ v12 = (char *)&v1->pQueue[0].field_4; while ( 1 ) { - v13 = *((int *)v12 - 1) & 7; + v13 = PID_TYPE(*((int *)v12 - 1)); if ( v13 != OBJECT_Player ) break; v14 = pPlayers[(*((int *)v12 - 1) >> 3) + 1]->uTimeToRecovery;
--- a/mm7_4.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/mm7_4.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -133,7 +133,7 @@ v5 = v8; } if ( (signed int)(((unsigned int)(11 * v5) >> 5) + (v6 >> 2) + v4) < v2 ) - EventProcessor(v1->field_16_event_id, 8 * i | 5, 1); + EventProcessor(v1->field_16_event_id, PID(OBJECT_Decoration,i), 1); } if ( v1->field_2 & 2 ) { @@ -977,7 +977,7 @@ { stru_721530.field_7C = v13; v14 = 8 * v16; - LOBYTE(v14) = 8 * v16 | 3; + LOBYTE(v14) = PID(OBJECT_Actor,v16); stru_721530.uFaceID = v14; } result = 1; @@ -1119,7 +1119,7 @@ do { v4 = *v3; - if ( (v4 & 7) == OBJECT_Decoration) + if ( PID_TYPE(v4) == OBJECT_Decoration) { v5 = &pLevelDecorations[(signed __int16)v4 >> 3]; if ( !(v5->field_2 & 0x20) ) @@ -1515,7 +1515,7 @@ v2 = this; v3 = operator new(8 * a2 + 16); v2->pBlockBase = v3; - v4 = (char *)v3 + (-(signed int)v3 & 7); + v4 = (char *)v3 + PID_TYPE(-(signed int)v3); result = v2; v2->pAlignedBlock = v4; } @@ -2133,11 +2133,11 @@ v17 = pActors[v16].vPosition.y; a1.vPosition.z = pActors[v16].vPosition.z; v18 = 8 * v15; - LOBYTE(v18) = 8 * v15 | 3; + LOBYTE(v18) = PID(OBJECT_Actor,v15); a1.vPosition.y = v17; a1.spell_target_pid = v18; v19 = a1.Create(0, 0, 0, 0); - DamageMonsterFromParty(8 * v19 | 2, *v14, &a3); + DamageMonsterFromParty(PID(OBJECT_Item,v19), *v14, &a3); ++v9; } while ( v9 < v13 ); @@ -5521,7 +5521,7 @@ v68 = v2; v5 = (Texture *)(v4 != -1 ? (int)&pBitmaps_LOD->pTextures[v3] : 0); v6 = 8 * uFaceID; - LOBYTE(v6) = 8 * uFaceID | 6; + LOBYTE(v6) = PID(OBJECT_BModel,uFaceID); stru_F8AD28.field_0 = v6; stru_F8AD28.plane_4.vNormal.x = v1->pFacePlane_old.vNormal.x; stru_F8AD28.plane_4.vNormal.y = v1->pFacePlane_old.vNormal.y; @@ -7931,7 +7931,7 @@ if ( v17->joins ) { num_menu_buttons = 1; - pDialogueWindow->CreateButton(480u, 160u, 140u, 30u, 1, 0, UIMSG_ClickNPCTopic, 0xDu, 0, "", 0); + pDialogueWindow->CreateButton(480u, 160u, 140u, 30, 1, 0, UIMSG_ClickNPCTopic, 0xDu, 0, "", 0); } if ( v17->evt_A) { @@ -8582,8 +8582,8 @@ v7 = this->pQueue; do { - if ( (v7->uPackedID & 7) == OBJECT_Actor ) - LOBYTE(pActors[v7->uPackedID >> 3].uAttributes) &= 0x7Fu; + if ( PID_TYPE(v7->uPackedID) == OBJECT_Actor ) + LOBYTE(pActors[PID_ID(v7->uPackedID)].uAttributes) &= 0x7Fu; ++v4; ++v7; } @@ -8612,8 +8612,8 @@ v11 = v2->pQueue; do { - objType = (ObjectType)(v11->uPackedID & 7); - objID = v11->uPackedID >> 3; + objType = (ObjectType)PID_TYPE(v11->uPackedID); + objID = PID_ID(v11->uPackedID); if ( objType == OBJECT_Player ) { pPlayers[objID + 1]->uTimeToRecovery = (signed __int64)((double)v11->field_4 * 2.133333333333333); @@ -8707,7 +8707,7 @@ if ( (signed int)v4->uCurrentActionTime >= v5 ) { v17 = ai_near_actors_targets_pid[v20]; - v6 = Actor::GetDirectionInfo(8 * v20 | OBJECT_Actor, v17, &a3, v2); + v6 = Actor::GetDirectionInfo(PID(OBJECT_Actor,v20), v17, &a3, v2); v7 = v4->uAIState; memcpy(&v15, v6, sizeof(v15)); v8 = v7 - 4; @@ -8996,9 +8996,9 @@ LOWORD(v25) = 0; LOBYTE(v26) = v41; - //v0->sZValue = v25 + (8 * i | OBJECT_Actor); + //v0->sZValue = v25 + (PID(OBJECT_Actor,i)); v0->actual_z = HIWORD(x); - v0->object_pid = v8 * i | OBJECT_Actor; + v0->object_pid = PID(OBJECT_Actor,i); v29 = HIDWORD(p->pActorBuffs[5].uExpireTime) == 0; v30 = HIDWORD(p->pActorBuffs[5].uExpireTime) < 0;
--- a/mm7_5.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/mm7_5.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -1741,9 +1741,9 @@ v42 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint->y]]; } v44 = (unsigned __int16)v42; - v45 = v44 & 7; + v45 = PID_TYPE(v44); uNumSeconds = v44; - v46 = v44 >> 3; + v46 = PID_ID(v44); if ( v45 == 3 ) { v47 = pActors[v46].uAIState == Dead; @@ -2087,14 +2087,14 @@ SaveGame(v0, 0); v64 = pMapStats->GetMapInfo(pCurrentMapName); v65 = uMessageParam; - if ( v64 == stru_4ECBB8[uMessageParam].uMapInfoID ) + if ( v64 == TownPortalList[uMessageParam].uMapInfoID ) { - pParty->vPosition.x = stru_4ECBB8[v65].pos.x; - pParty->vPosition.y = stru_4ECBB8[v65].pos.y; - pParty->vPosition.z = stru_4ECBB8[v65].pos.z; + pParty->vPosition.x = TownPortalList[v65].pos.x; + pParty->vPosition.y = TownPortalList[v65].pos.y; + pParty->vPosition.z = TownPortalList[v65].pos.z; pParty->uFallStartY = pParty->vPosition.z; - pParty->sRotationY = stru_4ECBB8[v65].rot_y; - pParty->sRotationX = stru_4ECBB8[v65].rot_x; + pParty->sRotationY = TownPortalList[v65].rot_y; + pParty->sRotationX = TownPortalList[v65].rot_x; } else { @@ -2102,13 +2102,13 @@ OnMapLeave(); dword_6BE364_game_settings_1 |= v0; uGameState = 2; - strcpy(pCurrentMapName, pMapStats->pInfos[stru_4ECBB8[uMessageParam].uMapInfoID].pFilename); + strcpy(pCurrentMapName, pMapStats->pInfos[TownPortalList[uMessageParam].uMapInfoID].pFilename); dword_5B65C0 = v0; - _5B65A8_npcdata_uflags_or_other = stru_4ECBB8[uMessageParam].pos.x; - _5B65AC_npcdata_fame_or_other = stru_4ECBB8[uMessageParam].pos.y; - _5B65B0_npcdata_rep_or_other = stru_4ECBB8[uMessageParam].pos.z; - v66 = stru_4ECBB8[uMessageParam].rot_x; - _5B65B4_npcdata_loword_house_or_other = stru_4ECBB8[uMessageParam].rot_y; + _5B65A8_npcdata_uflags_or_other = TownPortalList[uMessageParam].pos.x; + _5B65AC_npcdata_fame_or_other = TownPortalList[uMessageParam].pos.y; + _5B65B0_npcdata_rep_or_other = TownPortalList[uMessageParam].pos.z; + v66 = TownPortalList[uMessageParam].rot_x; + _5B65B4_npcdata_loword_house_or_other = TownPortalList[uMessageParam].rot_y; _5B65B8_npcdata_hiword_house_or_other = v66; InitializeActors(); } @@ -2397,7 +2397,7 @@ v83 = v81; v44 = (unsigned __int16)v81; v84 = v83 >> 16; - if ( (v44 & 7) != 3 || v84 >= 5120 ) + if ( PID_TYPE(v44) != 3 || v84 >= 5120 ) //goto LABEL_90; { v1 = ""; @@ -4520,24 +4520,24 @@ v1 = (char *)stru_50FE08.pZs; do { - v2 = *((short *)v1 - 300) & 7; - v3 = (signed int)*((short *)v1 - 300) >> 3; - v39 = (signed int)*((short *)v1 - 300) >> 3; + v2 = PID_TYPE(*((short *)v1 - 300)); + v3 = PID_ID((signed int)*((short *)v1 - 300)); + v39 = PID_ID((signed int)*((short *)v1 - 300)); if ( v2 == 2 ) { v4 = &pSpriteObjects[v3]; v36 = v4; v5 = v4->spell_caster_pid; - v2 = v5 & 7; - v3 = v5 >> 3; + v2 = PID_TYPE(v5); + v3 = PID_ID(v5); } v41 = v2; v37 = v3; if ( stru_50FE08.field_3EC[v0] & 1 ) { v6 = ai_near_actors_targets_pid[v3]; - v7 = v6 >> 3; - v8 = (v6 & 7) - 3; + v7 = PID_ID(v6); + v8 = PID_TYPE(v6) - 3; uActorID = v7; if ( v8 ) { @@ -4763,9 +4763,9 @@ v61 = 0; v59 = 0; v62 = 0; - if ( (a1 & 7) == OBJECT_Item) - { - v4 = &pSpriteObjects[a1 >> 3]; + if ( PID_TYPE(a1) == OBJECT_Item) + { + v4 = &pSpriteObjects[PID_ID(a1)]; //uDamageAmount = (int)v4; v61 = v4->field_60_distance_related_prolly_lod; a1 = v4->spell_caster_pid; @@ -4773,11 +4773,11 @@ } //v5 = a1 & 7; //uPlayerID = a1 >> 3; - if ((a1 & 7) != OBJECT_Player) + if (PID_TYPE(a1) != OBJECT_Player) return; - assert(abs(a1 >> 3) < 4); - auto player = &pParty->pPlayers[a1 >> 3]; + assert(PID_ID(abs(a1)) < 4); + auto player = &pParty->pPlayers[PID_ID(a1)]; pMonster = &pActors[uActorID_Monster_]; //uPlayerID = pMonster->IsAlive(); if (pMonster->IsNotAlive()) @@ -5034,7 +5034,7 @@ } if ( pMonster->sCurrentHP > 0 ) { - Actor::_4030AD(uActorID_Monster_, a1, 0); + Actor::Stun(uActorID_Monster_, a1, 0); Actor::AggroSurroundingPeasants(uActorID_Monster_, 1); if ( bShowDamage ) { @@ -5238,8 +5238,8 @@ signed int a4a; // [sp+60h] [bp+Ch]@162 Player *a4b; // [sp+60h] [bp+Ch]@168 - v4 = (signed int)uObjID >> 3; - v5 = (uObjID & 7) - 2; + v4 = PID_ID(uObjID); + v5 = PID_TYPE(uObjID) - 2; v74 = a2; uActorID = v4; if ( v5 ) @@ -5309,7 +5309,7 @@ } v17 = (SoundID)a4; LABEL_26: - pAudioPlayer->PlaySound(v17, (8 * a4 + 80) | 4, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(v17, PID(OBJECT_Player,a4 + 80), 0, -1, 0, 0, 0, 0); v18 = Actor::_43B3E0_CalcDamage(v7, v74); v19 = HIDWORD(v7->pActorBuffs[3].uExpireTime) == 0; v20 = SHIDWORD(v7->pActorBuffs[3].uExpireTime) < 0; @@ -5369,7 +5369,7 @@ { if ( v7->sCurrentHP >= 1 ) { - Actor::_4030AD(uActorID, 8 * a4 | OBJECT_Player, 0); + Actor::Stun(uActorID, PID(OBJECT_Player,a4), 0); Actor::AggroSurroundingPeasants(uActorID, 1); } else @@ -5436,10 +5436,10 @@ return; } v37 = &pSpriteObjects[uActorID]; - v38 = v37->spell_caster_pid & 7; - v39 = v37->spell_caster_pid >> 3; - v40 = v37->spell_caster_pid & 7; - uActorID = v37->spell_caster_pid >> 3; + v38 = PID_TYPE(v37->spell_caster_pid); + v39 = PID_ID(v37->spell_caster_pid); + v40 = PID_TYPE(v37->spell_caster_pid); + uActorID = PID_ID(v37->spell_caster_pid); v41 = v40 - 2; if ( !v41 ) goto LABEL_80; @@ -5555,7 +5555,7 @@ { if ( v44->sCurrentHP >= 1 ) { - Actor::_4030AD(uActorID, 8 * a4 | OBJECT_Player, 0); + Actor::Stun(uActorID, PID(OBJECT_Player,a4), 0); Actor::AggroSurroundingPeasants(uActorID, 1); } else @@ -5835,9 +5835,9 @@ a2 = uObjID; if ( !pActors[uActorID].IsNotAlive() ) { - if ( (a2 & 7) == OBJECT_Item) - { - v4 = &pSpriteObjects[(signed int)a2 >> 3]; + if ( PID_TYPE(a2) == OBJECT_Item) + { + v4 = &pSpriteObjects[PID_ID(a2)]; v5 = v4->spell_id; if ( v5 ) { @@ -5847,7 +5847,7 @@ if ( v7 ) { if ( pActor->sCurrentHP > 0 ) - Actor::_4030AD(uActorIDa, a2, 0); + Actor::Stun(uActorIDa, a2, 0); else Actor::Die(uActorIDa); a2a = 20 * v7 / (signed int)pActor->pMonsterInfo.uHP; @@ -5866,7 +5866,7 @@ } else { - Actor::_4030AD(uActorIDa, a2, 0); + Actor::Stun(uActorIDa, a2, 0); } } } @@ -5894,17 +5894,17 @@ v4 = 0; uActorID = a2; v17 = a1; - if ( (a1 & 7) == OBJECT_Item) - { - v5 = &pSpriteObjects[a1 >> 3]; + if ( PID_TYPE(a1) == OBJECT_Item) + { + v5 = &pSpriteObjects[PID_ID(a1)]; v4 = v5->field_60_distance_related_prolly_lod; v17 = v5->spell_caster_pid; } - LOWORD(v6) = v17 & 7; + LOWORD(v6) = PID_TYPE(v17); if ( v6 == OBJECT_Actor) { v7 = &pActors[a2]; - v8 = &pActors[v17 >> 3]; + v8 = &pActors[PID_ID(v17)]; v6 = pActors[a2].IsNotAlive(); if ( !v6 ) { @@ -5955,7 +5955,7 @@ if ( v14 ) { if ( v7->sCurrentHP > 0 ) - Actor::_4030AD(uActorID, v17, 0); + Actor::Stun(uActorID, v17, 0); else Actor::Die(uActorID); Actor::AggroSurroundingPeasants(uActorID, 0); @@ -5975,7 +5975,7 @@ } else { - Actor::_4030AD(uActorID, v17, 0); + Actor::Stun(uActorID, v17, 0); } return; } @@ -6747,7 +6747,7 @@ while ( 1 ) { v5 = v16->uPackedID; - if ( (v16->uPackedID & 7) == OBJECT_Player) + if ( PID_TYPE(v16->uPackedID) == OBJECT_Player) break; LABEL_8: ++v17; @@ -6755,8 +6755,8 @@ if ( v17 >= v1->uActorQueueSize ) goto LABEL_11; } - v15 = v5 >> 3; - if ( !pPlayers[(v5 >> 3) + 1]->CanAct() || v19 != v15 ) + v15 = PID_ID(v5); + if ( !pPlayers[(PID_ID(v5)) + 1]->CanAct() || v19 != v15 ) { v2 = 0; goto LABEL_8; @@ -6767,7 +6767,7 @@ { *(int *)v4 = 100; v6 = 8 * v19; - LOBYTE(v6) = 8 * v19 | 4; + LOBYTE(v6) = PID(OBJECT_Player,v19); *((int *)v4 + 2) = v2; *((int *)v4 - 1) = v6; *((int *)v4 + 1) = v2; @@ -6790,7 +6790,7 @@ v8 = v1->pQueue; do { - if ( (v8->uPackedID & 7) == OBJECT_Actor && ai_near_actors_ids[v20] == v8->uPackedID >> 3 ) + if ( PID_TYPE(v8->uPackedID) == OBJECT_Actor && ai_near_actors_ids[v20] == PID_ID(v8->uPackedID) ) break; ++v18; ++v8; @@ -6803,7 +6803,7 @@ v9 = ai_near_actors_ids[v20]; *(int *)v7 = 1; *((int *)v7 + 2) = v2; - *((int *)v7 - 1) = 8 * v9 | 3; + *((int *)v7 - 1) = PID(OBJECT_Actor,v9); *((int *)v7 + 1) = v2; ++v3; v7 += 16; @@ -6834,7 +6834,7 @@ v13 = (char *)&v1->pQueue[0].field_4; do { - v11 = *((int *)v13 - 1) & 7; + v11 = PID_TYPE(*((int *)v13 - 1)); if ( (char)v11 == 4 ) break; if ( *(int *)v13 > 0 ) @@ -6924,7 +6924,7 @@ if ( v6 != 8 ) goto LABEL_19; v3 = 0; - Actor::AI_StandOrBored(v2->uPackedID >> 3, ai_near_actors_targets_pid[v2->uPackedID >> 3], 32, 0); + Actor::AI_StandOrBored(PID_ID(v2->uPackedID), ai_near_actors_targets_pid[PID_ID(v2->uPackedID)], 32, 0); } } } @@ -7027,7 +7027,7 @@ } else { - v8 = &pActors[v1->pQueue[0].uPackedID >> 3]; + v8 = &pActors[PID_ID(v1->pQueue[0].uPackedID)]; if ( v4 > 0 ) { do @@ -7079,10 +7079,10 @@ v2 = this; v3 = *(&this->field_0 + 4 * (a2 + 2)); - if ( (*((char *)&this->field_0 + 16 * (a2 + 2)) & 7) == OBJECT_Player) - { - v4 = v3 >> 3; - v5 = (char *)&pParty->pTurnBasedPlayerRecoveryTimes[v3 >> 3]; + if ( (*((char *)&this->field_0 + 16 * PID_TYPE(a2 + 2))) == OBJECT_Player) + { + v4 = PID_ID(v3); + v5 = (char *)&pParty->pTurnBasedPlayerRecoveryTimes[PID_ID(v3)]; v6 = *(int *)v5; if ( *(int *)v5 ) *(int *)v5 = 0; @@ -7093,7 +7093,7 @@ } else { - v6 = pMonsterStats->pInfos[pActors[v3 >> 3].pMonsterInfo.uID].uRecoveryTime; + v6 = pMonsterStats->pInfos[pActors[PID_ID(v3)].pMonsterInfo.uID].uRecoveryTime; } v2->pQueue[a2].field_4 = v6; v2->_404544(); @@ -7131,7 +7131,7 @@ //----- (0040652A) -------------------------------------------------------- void stru262_TurnBased::_40652A() { - char *v1; // edx@2 + int *v1; // edx@2 Actor *v2; // eax@5 unsigned __int16 v3; // si@5 unsigned int v4; // esi@8 @@ -7140,14 +7140,14 @@ v5 = 0; if ( this->uActorQueueSize > 0 ) { - v1 = (char *)&this->pQueue[0].field_4; + v1 = &this->pQueue[0].field_4; do { if ( !*(int *)v1 ) { - if ( (*(v1 - 4) & 7) == OBJECT_Player) + if ( PID_TYPE(*(v1 - 4)) == OBJECT_Player) return; - v2 = &pActors[*((int *)v1 - 1) >> 3]; + v2 = &pActors[PID_ID(*(v1 - 1))]; v3 = v2->uAIState; if (v3 == Standing || v3 == Fleeing || v3 == Fidgeting) { @@ -7176,7 +7176,7 @@ v1 = this; LOWORD(v2) = _404544(); if ( v1->pQueue[0].field_4 <= 0 - || ((_4063A1(), v2 = v1->pQueue[0].uPackedID, PID_TYPE(v1->pQueue[0].uPackedID) != OBJECT_Player) ? (uActiveCharacter = 0) : (v2 = (v2 >> 3) + 1, uActiveCharacter = v2), + || ((_4063A1(), v2 = v1->pQueue[0].uPackedID, PID_TYPE(v1->pQueue[0].uPackedID) != OBJECT_Player) ? (uActiveCharacter = 0) : (v2 = (PID_ID(v2)) + 1, uActiveCharacter = v2), viewparams->bRedrawGameUI = 1, v1->pQueue[0].field_4 <= 0) ) { @@ -7187,7 +7187,7 @@ do { v2 = *(int *)v4; - if ( (*(char *)v4 & 7) == OBJECT_Player || *(int *)(v4 + 4) > 0 ) + if ( PID_TYPE(*(char *)v4) == OBJECT_Player || *(int *)(v4 + 4) > 0 ) break; if ( *(int *)(v4 + 8) <= 0 ) { @@ -7250,7 +7250,7 @@ a2a = ai_near_actors_targets_pid[PID_ID(v3)]; memcpy(&a3, Actor::GetDirectionInfo(v1->uPackedID, ai_near_actors_targets_pid[PID_ID(v3)], &a3, 0), sizeof(a3)); memcpy(&a4, &a3, sizeof(a4)); - v5 = &pActors[PID_ID(v3 >> 3)]; + v5 = &pActors[PID_ID(v3)]; LOWORD(v3) = v5->uAIState; if ( (short)v3 != Dead ) { @@ -7327,7 +7327,7 @@ v22 = 2; v17 = v5->pMonsterInfo.uSpell1ID; } - Actor::_404AC7(v4, &a4, v17, v22, v24); + Actor::SpellAttack(v4, &a4, v17, v22, v24); LABEL_25: v16 = a2a; v23 = &a4; @@ -7343,7 +7343,7 @@ v18 = v5->pMonsterInfo.uMissleAttack1Type; v25 = 0; } - Actor::_404874(v4, &a4, v18, v25); + Actor::RangedAttack(v4, &a4, v18, v25); goto LABEL_25; } } @@ -7357,8 +7357,8 @@ __int16 stru262_TurnBased::_40680F(int a2) { TurnBased_QueueElem *v2; // eax@1 - TurnBased_QueueElem *v3; // eax@1 - TurnBased_QueueElem *v4; // edi@2 + unsigned int v3; // eax@1 + unsigned int v4; // edi@2 Actor *v5; // ebx@2 unsigned int *v6; // esi@7 AIDirection *v7; // esi@10 @@ -7380,13 +7380,13 @@ v2 = (TurnBased_QueueElem *)((char *)this + 16 * (a2 + 2)); v21 = v2; v2->uActionLength = 0; - v3 = (TurnBased_QueueElem *)v2->uPackedID; + v3 = v2->uPackedID; if ( (unsigned __int8)v3 & 3 ) { - v3 = (TurnBased_QueueElem *)((signed int)v3 >> 3); + v3 = PID_ID(v3); v4 = v3; - a2a = (int)v3; - v5 = &pActors[(int)v3]; + a2a = v3; + v5 = &pActors[v3]; LOWORD(v3) = v5->uAIState; if ( (short)v3 != 5 ) { @@ -7397,7 +7397,7 @@ if ( v5->pMonsterInfo.uHostilityType && !*v6 ) v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; v22 = *v6; - v7 = Actor::GetDirectionInfo(8 * (int)v4 | 3, *v6, &a3, 0); + v7 = Actor::GetDirectionInfo(PID(OBJECT_Actor,(int)v4), *v6, &a3, 0); v8 = v5->uActorRadius; memcpy(&a3, v7, sizeof(a3)); memcpy(&v18, &a3, sizeof(v18)); @@ -7409,7 +7409,7 @@ v20 = 0; } if (PID_TYPE(v22) == OBJECT_Actor) - v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[v22 >> 3].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3); + v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3); else v10 = 4; if ( v10 == 1 ) @@ -7458,7 +7458,7 @@ { if ( v5->pMonsterInfo.uMissleAttack2Type ) { - Actor::_40368B(v13, v22, &v18); + Actor::MissileAttack2(v13, v22, &v18); goto LABEL_43; } } @@ -7473,35 +7473,36 @@ if ( v15 ) { if ( v14 == 2 ) - Actor::_403854(v13, v22, &v18); + Actor::SpellAttack1(v13, v22, &v18); else - Actor::_403A60(v13, v22, &v18); + Actor::SpellAttack2(v13, v22, &v18); goto LABEL_43; } goto LABEL_44; } if ( v5->pMonsterInfo.uMissleAttack1Type ) { - Actor::_403476(v13, v22, &v18); + Actor::MissileAttack1(v13, v22, &v18); LABEL_43: - v3 = v21; + //v3 = v21; v21->field_C = 1; LABEL_48: - v3->uActionLength = v5->uCurrentActionLength; - return (signed __int16)v3; + v21->uActionLength = v5->uCurrentActionLength; + //return (signed __int16)v3; + return (signed __int16)&v21; } } LABEL_44: if ( (double)(signed int)v20 < 307.2 ) { - Actor::_403C6C(v13, v22, &v18); - v3 = v21; + Actor::MeleeAttack(v13, v22, &v18); + //v3 = v21; v21->field_C = 3; goto LABEL_48; } LABEL_47: Actor::AI_Stand(v13, v22, 0x40u, &v18); - v3 = v21; + //v3 = v21; v21->field_C = 0; goto LABEL_48; } @@ -7543,7 +7544,7 @@ v8 = ai_near_actors_targets_pid[PID_ID(v5)]; memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, v2), sizeof(v7)); if ( !v1->_406D10(a2) ) - Actor::AI_Stand(v10->uPackedID >> 3, v8, 0x20u, &v7); + Actor::AI_Stand(PID_ID(v10->uPackedID), v8, 0x20u, &v7); } ++a2; ++v10; @@ -7634,7 +7635,7 @@ a1 = v14->uPackedID; if (PID_TYPE(a1) != OBJECT_Player) { - v5 = v4 >> 3; + v5 = PID_ID(v4); v12 = v5; v6 = &pActors[v5]; if ( SHIDWORD(v6->pActorBuffs[5].uExpireTime) < result @@ -7814,7 +7815,7 @@ goto LABEL_25; } LABEL_24: - Actor::_402968(v16, v15, v21, v23); + Actor::Flee(v16, v15, v21, v23); LABEL_25: v17 = v29; v29->field_C = 4; @@ -7831,9 +7832,9 @@ if ( (signed int)v11 < 5120 ) { if ( v4->pMonsterInfo.uMissleAttack1Type && (signed int)v11 < 1024 ) - Actor::_402AD7(uActorID, a2a, uActorID, 32, &pDir); + Actor::Pursue1(uActorID, a2a, uActorID, 32, &pDir); else - Actor::_40281C(uActorID, a2a, 32, &pDir, 307); + Actor::Pursue2(uActorID, a2a, 32, &pDir, 307); goto LABEL_59; } LABEL_46: @@ -8030,8 +8031,8 @@ int v65; // [sp+60h] [bp-8h]@4 int v66; // [sp+64h] [bp-4h]@7 - v2 = (signed int)uObjID >> 3; - v3 = (uObjID & 7) - 2; + v2 = PID_ID(uObjID); + v3 = PID_TYPE(uObjID) - 2; v4 = uObj2ID; if ( v3 ) { @@ -8066,8 +8067,8 @@ v65 = v11; } v66 = v7; - v12 = v4 >> 3; - v13 = (v4 & 7) - 2; + v12 = PID_ID(v4); + v13 = PID_TYPE(v4) - 2; if ( v13 ) { v14 = v13 - 1;
--- a/mm7_6.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/mm7_6.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -3557,7 +3557,7 @@ a1.vPosition.x = pActors[PID_ID(a2)].vPosition.x; a1.vPosition.z = pActors[PID_ID(a2)].vPosition.z; a1.vPosition.y = pActors[PID_ID(a2)].vPosition.y; - a1.spell_target_pid = PID(OBJECT_Actor, a2 >> 3); + a1.spell_target_pid = PID(OBJECT_Actor, PID_ID(a2)); auto obj_id = a1.Create(0, 0, 0, 0); DamageMonsterFromParty(PID(OBJECT_Item, obj_id), PID_ID(a2), &v697); LODWORD(v727) = 1; @@ -3569,12 +3569,12 @@ if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto play_sound_and_continue; - if ( !stru_50C198.GetMagicalResistance(&pActors[a2 >> 3], 3u) ) + if ( !stru_50C198.GetMagicalResistance(&pActors[PID_ID(a2)], 3u) ) { LODWORD(v727) = 1; goto play_sound_and_continue; } - pActors[a2 >> 3].pActorBuffs[10].Apply(pMiscTimer->uTotalGameTimeElapsed + 128, 0, 0, 0, 0); + pActors[PID_ID(a2)].pActorBuffs[10].Apply(pMiscTimer->uTotalGameTimeElapsed + 128, 0, 0, 0, 0); v704.x = 0; v704.y = 0; v704.z = 0; @@ -3730,7 +3730,7 @@ if (PID_TYPE(a2) != OBJECT_Actor || (v730 = PID_ID(a2), v721 = (int)&pActors[PID_ID(a2)], - !stru_50C198.GetMagicalResistance(&pActors[a2 >> 3], 9u)) ) + !stru_50C198.GetMagicalResistance(&pActors[PID_ID(a2)], 9u)) ) { LODWORD(v727) = 1; goto play_sound_and_continue; @@ -3784,7 +3784,7 @@ v58 = (signed __int64)((double)(23040 * v2) * 0.033333335); v59 = v721; //((SpellBuff *)((char *)&pActors[0].pActorBuffs[7] + v721))->Apply( - pActors[a2 >> 3].pActorBuffs[7].Apply(pParty->uTimePlayed + (signed int)v58, + pActors[PID_ID(a2)].pActorBuffs[7].Apply(pParty->uTimePlayed + (signed int)v58, v731, amount, 0, @@ -3826,7 +3826,7 @@ a1.spell_level = v2; a1.spell_skill = v731; v60 = pObjectList->ObjectIDByItemID(a1.uType); - v61 = a2 >> 3; + v61 = PID_ID(a2); goto LABEL_1086; } @@ -4365,7 +4365,7 @@ } if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto play_sound_and_continue; - LODWORD(v725) = a2 & 7; + LODWORD(v725) = PID_TYPE(a2); if (PID_TYPE(a2) == OBJECT_Actor) { uRequiredMana = pActors[PID_ID(a2)].vPosition.x; @@ -4731,11 +4731,11 @@ } if ( !pPlayer->CanCastSpell(uRequiredMana) ) goto play_sound_and_continue; - v208 = a2 & 7; - LODWORD(v725) = a2 & 7; + v208 = PID_TYPE(a2); + LODWORD(v725) = PID_TYPE(a2); if ( v208 == 3 ) { - v209 = a2 >> 3; + v209 = PID_ID(a2); LODWORD(v718) = pActors[v209].vPosition.x; v210 = pActors[v209].vPosition.y; v211 = pActors[v209].vPosition.z; @@ -5672,7 +5672,7 @@ } if (PID_TYPE(v342) == OBJECT_Actor) { - v343 = v342 >> 3; + v343 = PID_ID(v342); HIDWORD(v344) = 0 + ((pParty->uTimePlayed + 1280) >> 32); LODWORD(v344) = LODWORD(pParty->uTimePlayed) + 1280; pActors[v343].pActorBuffs[11].Apply(v344, v731, amount, 0, 0); @@ -7028,7 +7028,7 @@ } goto play_sound_and_continue; } - v577 = (Player *)(v576 >> 3); + v577 = (Player *)(PID_ID(v576)); //v726 = v577; if ( v577 == (Player *)-1 ) { @@ -7791,13 +7791,13 @@ //v7 = pMouse->uPointingObjectID; int target_pid = pMouse->uPointingObjectID; - int target_type = target_pid & 7, - target_id = target_pid >> 3; + int target_type = PID_TYPE(target_pid), + target_id = PID_ID(target_pid); if (target_type != OBJECT_Actor || !pActors[target_id].CanAct()) { target_pid = stru_50C198.FindClosestActor(5120, 0, 0); - target_type = target_pid & 7; - target_id = target_pid >> 3; + target_type = PID_TYPE(target_pid); + target_id = PID_ID(target_pid); } auto actor = &pActors[target_id];
--- a/mm7_data.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/mm7_data.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -279,7 +279,7 @@ struct PlayerFrameTable *pPlayerFrameTable; // idb #include "MM7.h" -stru161 stru_4ECBB8[6]; + stru289 stru_6BE158; int paperdoll_Weapon[4][16][2] = {//4E4C30 0x80, 0xCD, 0x1E, 0x90, 0x58, 0x55, 0, 0, 0, 0, 0, 0, 0x11, 0x68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -346,8 +346,8 @@ int (__stdcall *off_4DAFDC)(char); // weak char asc_4DB724[777]; // idb int dword_4DBD94; // weak -int dword_4DF380[777]; // weak -int dword_4DF390; // weak +int dword_4DF380[5]={0,1024,2560,5120,10240}; // weak +//int dword_4DF390; // weak char Str2[777]; // idb int dword_4DF3A4; // weak char byte_4E185C; // weak
--- a/stru6.cpp Mon Apr 01 13:39:19 2013 +0200 +++ b/stru6.cpp Mon Apr 01 13:39:39 2013 +0200 @@ -832,7 +832,7 @@ AddMobileLight(a2, 0xFF3C1E, 256); if (pRenderer->pRenderD3D) { - result = a2->spell_caster_pid & 7; + result = PID_TYPE(a2->spell_caster_pid); if (PID_TYPE(a2->spell_caster_pid) != OBJECT_Actor && PID_TYPE(a2->spell_caster_pid) != OBJECT_Item) {