comparison mm7_5.cpp @ 828:0f56abdcce94

Massive refactors of spells + PID (packed id) macros introduced.
author Nomad
date Wed, 27 Mar 2013 00:27:38 +0200
parents fe4c8b113548
children dfd683c4f538
comparison
equal deleted inserted replaced
824:fe4c8b113548 828:0f56abdcce94
5678 } 5678 }
5679 5679
5680 //----- (0043A97E) -------------------------------------------------------- 5680 //----- (0043A97E) --------------------------------------------------------
5681 void __fastcall sub_43A97E(unsigned int uLayingItemID, signed int a2) 5681 void __fastcall sub_43A97E(unsigned int uLayingItemID, signed int a2)
5682 { 5682 {
5683 unsigned int v2; // esi@1 5683 if ( PID_TYPE(a2) == OBJECT_BLVDoor)
5684 unsigned int v3; // ebx@1 5684 {
5685 int v4; // edi@1 5685 layingitem_vel_50FDFC.x = pSpriteObjects[uLayingItemID].vVelocity.x;
5686 int v5; // edx@1 5686 layingitem_vel_50FDFC.y = pSpriteObjects[uLayingItemID].vVelocity.y;
5687 unsigned int v6; // [sp+10h] [bp-4h]@1 5687 layingitem_vel_50FDFC.z = pSpriteObjects[uLayingItemID].vVelocity.z;
5688 5688
5689 v6 = uLayingItemID;
5690 v2 = uLayingItemID;
5691 v3 = a2 >> 3;
5692 v4 = pSpriteObjects[uLayingItemID].spell_caster_pid & 7;
5693 v5 = (a2 & 7) - 3;
5694 if ( v5 )
5695 {
5696 if ( v5 == 1 )
5697 {
5698 layingitem_vel_50FDFC.x = pSpriteObjects[v2].vVelocity.x;
5699 layingitem_vel_50FDFC.y = pSpriteObjects[v2].vVelocity.y;
5700 layingitem_vel_50FDFC.z = pSpriteObjects[v2].vVelocity.z;
5701 Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z);
5702 DamagePlayerFromMonster(8 * v6 | 2, pSpriteObjects[v2].field_61, &layingitem_vel_50FDFC, 0xFFFFFFFFu);
5703 }
5704 }
5705 else
5706 {
5707 layingitem_vel_50FDFC.x = pSpriteObjects[v2].vVelocity.x;
5708 layingitem_vel_50FDFC.y = pSpriteObjects[v2].vVelocity.y;
5709 layingitem_vel_50FDFC.z = pSpriteObjects[v2].vVelocity.z;
5710 Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z); 5689 Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z);
5711 switch ( v4 ) 5690 DamagePlayerFromMonster(PID(OBJECT_Item, uLayingItemID), pSpriteObjects[uLayingItemID].field_61, &layingitem_vel_50FDFC, 0xFFFFFFFFu);
5691 }
5692 else if (PID_TYPE(a2) == OBJECT_Actor)
5693 {
5694 layingitem_vel_50FDFC.x = pSpriteObjects[uLayingItemID].vVelocity.x;
5695 layingitem_vel_50FDFC.y = pSpriteObjects[uLayingItemID].vVelocity.y;
5696 layingitem_vel_50FDFC.z = pSpriteObjects[uLayingItemID].vVelocity.z;
5697
5698 Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z);
5699 switch (PID_TYPE(pSpriteObjects[uLayingItemID].spell_caster_pid))
5712 { 5700 {
5713 case OBJECT_Actor: 5701 case OBJECT_Actor:
5714 sub_43B1B0(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC, pSpriteObjects[v2].field_61); 5702 sub_43B1B0(PID(OBJECT_Item, uLayingItemID), PID_ID(a2), &layingitem_vel_50FDFC, pSpriteObjects[uLayingItemID].field_61);
5715 break; 5703 break;
5716 case OBJECT_Player: 5704 case OBJECT_Player:
5717 DamageMonsterFromParty(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC); 5705 DamageMonsterFromParty(PID(OBJECT_Item, uLayingItemID), PID_ID(a2), &layingitem_vel_50FDFC);
5718 break; 5706 break;
5719 case OBJECT_Item: 5707 case OBJECT_Item:
5720 sub_43B057(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC); 5708 sub_43B057(PID(OBJECT_Item, uLayingItemID), PID_ID(a2), &layingitem_vel_50FDFC);
5721 break; 5709 break;
5722 } 5710 }
5723 } 5711 }
5724 } 5712 }
5725 5713
6892 6880
6893 v1 = this; 6881 v1 = this;
6894 _404544(); 6882 _404544();
6895 v2 = v1->pQueue; 6883 v2 = v1->pQueue;
6896 v3 = 0; 6884 v3 = 0;
6897 if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) 6885 if (PID_TYPE(v1->pQueue[0].uPackedID) == OBJECT_Player)
6898 uActiveCharacter = (v1->pQueue[0].uPackedID >> 3) + 1; 6886 uActiveCharacter = PID_ID(v1->pQueue[0].uPackedID) + 1;
6899 else 6887 else
6900 uActiveCharacter = 0; 6888 uActiveCharacter = 0;
6901 viewparams->bRedrawGameUI = 1; 6889 viewparams->bRedrawGameUI = 1;
6902 if ( v1->field_1C ) 6890 if ( v1->field_1C )
6903 { 6891 {
6911 v13 = 0; 6899 v13 = 0;
6912 if ( v1->uActorQueueSize <= 0 ) 6900 if ( v1->uActorQueueSize <= 0 )
6913 goto LABEL_27; 6901 goto LABEL_27;
6914 do 6902 do
6915 { 6903 {
6916 if ( (v2->uPackedID & 7) != OBJECT_Player) 6904 if (PID_TYPE(v2->uPackedID) != OBJECT_Player)
6917 { 6905 {
6918 v5 = &pActors[v2->uPackedID >> 3]; 6906 v5 = &pActors[PID_ID(v2->uPackedID)];
6919 LOWORD(v6) = v5->uAIState; 6907 LOWORD(v6) = v5->uAIState;
6920 if ( (short)v6 == 4 6908 if ( (short)v6 == 4
6921 || (short)v6 == 8 6909 || (short)v6 == 8
6922 || (short)v6 == 2 6910 || (short)v6 == 2
6923 || (short)v6 == 3 6911 || (short)v6 == 3
6969 if ( v1->uActorQueueSize > v3 ) 6957 if ( v1->uActorQueueSize > v3 )
6970 { 6958 {
6971 v9 = v1->pQueue; 6959 v9 = v1->pQueue;
6972 do 6960 do
6973 { 6961 {
6974 if ( (v9->uPackedID & 7) != OBJECT_Player) 6962 if (PID_TYPE(v9->uPackedID) != OBJECT_Player)
6975 { 6963 {
6976 v10 = v9->uPackedID >> 3; 6964 v10 = PID_ID(v9->uPackedID);
6977 v11 = pActors[v10].uAIState; 6965 v11 = pActors[v10].uAIState;
6978 if ( v11 != 5 ) 6966 if ( v11 != 5 )
6979 { 6967 {
6980 if ( v11 != 4 && v11 != 11 && v11 != 19 ) 6968 if ( v11 != 4 && v11 != 11 && v11 != 19 )
6981 { 6969 {
7021 result = 1; 7009 result = 1;
7022 viewparams->bRedrawGameUI = 1; 7010 viewparams->bRedrawGameUI = 1;
7023 v4 = v1->pQueue[0].field_4; 7011 v4 = v1->pQueue[0].field_4;
7024 if ( v4 ) 7012 if ( v4 )
7025 { 7013 {
7026 if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) 7014 if (PID_TYPE(v1->pQueue[0].uPackedID) == OBJECT_Player)
7027 { 7015 {
7028 v5 = v1->uActorQueueSize; 7016 v5 = v1->uActorQueueSize;
7029 while ( 1 ) 7017 while ( 1 )
7030 { 7018 {
7031 v6 = 0; 7019 v6 = 0;
7120 { 7108 {
7121 v6 = pMonsterStats->pInfos[pActors[v3 >> 3].pMonsterInfo.uID].uRecoveryTime; 7109 v6 = pMonsterStats->pInfos[pActors[v3 >> 3].pMonsterInfo.uID].uRecoveryTime;
7122 } 7110 }
7123 v2->pQueue[a2].field_4 = v6; 7111 v2->pQueue[a2].field_4 = v6;
7124 v2->_404544(); 7112 v2->_404544();
7125 if ( (v2->pQueue[0].uPackedID & 7) == OBJECT_Player) 7113 if (PID_TYPE(v2->pQueue[0].uPackedID) == OBJECT_Player)
7126 uActiveCharacter = (v2->pQueue[0].uPackedID >> 3) + 1; 7114 uActiveCharacter = PID_ID(v2->pQueue[0].uPackedID) + 1;
7127 else 7115 else
7128 uActiveCharacter = 0; 7116 uActiveCharacter = 0;
7129 result = (int)&v2->pQueue[0].field_4; 7117 result = (int)&v2->pQueue[0].field_4;
7130 viewparams->bRedrawGameUI = 1; 7118 viewparams->bRedrawGameUI = 1;
7131 while ( *(int *)result > 0 ) 7119 while ( *(int *)result > 0 )
7199 unsigned int v5; // edi@14 7187 unsigned int v5; // edi@14
7200 7188
7201 v1 = this; 7189 v1 = this;
7202 LOWORD(v2) = _404544(); 7190 LOWORD(v2) = _404544();
7203 if ( v1->pQueue[0].field_4 <= 0 7191 if ( v1->pQueue[0].field_4 <= 0
7204 || ((_4063A1(), v2 = v1->pQueue[0].uPackedID, (v1->pQueue[0].uPackedID & 7) != OBJECT_Player) ? (uActiveCharacter = 0) : (v2 = (v2 >> 3) + 1, uActiveCharacter = v2), 7192 || ((_4063A1(), v2 = v1->pQueue[0].uPackedID, PID_TYPE(v1->pQueue[0].uPackedID) != OBJECT_Player) ? (uActiveCharacter = 0) : (v2 = (v2 >> 3) + 1, uActiveCharacter = v2),
7205 viewparams->bRedrawGameUI = 1, 7193 viewparams->bRedrawGameUI = 1,
7206 v1->pQueue[0].field_4 <= 0) ) 7194 v1->pQueue[0].field_4 <= 0) )
7207 { 7195 {
7208 v3 = 0; 7196 v3 = 0;
7209 if ( v1->uActorQueueSize > 0 ) 7197 if ( v1->uActorQueueSize > 0 )
7267 unsigned int a2a; // [sp+50h] [bp+8h]@2 7255 unsigned int a2a; // [sp+50h] [bp+8h]@2
7268 7256
7269 v1 = (TurnBased_QueueElem *)((char *)this + 16 * (a2 + 2)); 7257 v1 = (TurnBased_QueueElem *)((char *)this + 16 * (a2 + 2));
7270 v28 = v1; 7258 v28 = v1;
7271 v3 = v1->uPackedID; 7259 v3 = v1->uPackedID;
7272 if ( (v1->uPackedID & 7) != OBJECT_Player) 7260 if (PID_TYPE(v1->uPackedID) != OBJECT_Player)
7273 { 7261 {
7274 v4 = v3 >> 3; // turn based only stuff 7262 v4 = PID_ID(v3);
7275 a2a = ai_near_actors_targets_pid[v3 >> 3]; 7263 a2a = ai_near_actors_targets_pid[PID_ID(v3)];
7276 memcpy(&a3, Actor::GetDirectionInfo(v1->uPackedID, ai_near_actors_targets_pid[v3 >> 3], &a3, 0), sizeof(a3)); 7264 memcpy(&a3, Actor::GetDirectionInfo(v1->uPackedID, ai_near_actors_targets_pid[PID_ID(v3)], &a3, 0), sizeof(a3));
7277 memcpy(&a4, &a3, sizeof(a4)); 7265 memcpy(&a4, &a3, sizeof(a4));
7278 v5 = &pActors[v3 >> 3]; 7266 v5 = &pActors[PID_ID(v3 >> 3)];
7279 LOWORD(v3) = v5->uAIState; 7267 LOWORD(v3) = v5->uAIState;
7280 if ( (short)v3 != Dead ) 7268 if ( (short)v3 != Dead )
7281 { 7269 {
7282 if ( (short)v3 != Disabled ) 7270 if ( (short)v3 != Disabled )
7283 { 7271 {
7431 if ( ((a3.uDistance - v8) & 0x80000000u) != 0 ) 7419 if ( ((a3.uDistance - v8) & 0x80000000u) != 0 )
7432 { 7420 {
7433 v9 = 0; 7421 v9 = 0;
7434 v20 = 0; 7422 v20 = 0;
7435 } 7423 }
7436 if ( (v22 & 7) == OBJECT_Actor) 7424 if (PID_TYPE(v22) == OBJECT_Actor)
7437 v10 = (unsigned __int8)*(&byte_5C8D1A[89 7425 v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[v22 >> 3].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3);
7438 * (pMonsterStats->pInfos[pActors[v22 >> 3].pMonsterInfo.uID].uID - 1)
7439 / 3]
7440 + (v5->pMonsterInfo.uID - 1) / 3);
7441 else 7426 else
7442 v10 = 4; 7427 v10 = 4;
7443 if ( v10 == 1 ) 7428 if ( v10 == 1 )
7444 { 7429 {
7445 if ( (double)(signed int)v20 < 307.2 ) 7430 if ( (double)(signed int)v20 < 307.2 )
7564 { 7549 {
7565 v10 = this->pQueue; 7550 v10 = this->pQueue;
7566 while ( 1 ) 7551 while ( 1 )
7567 { 7552 {
7568 v5 = v10->uPackedID; 7553 v5 = v10->uPackedID;
7569 if ( (v10->uPackedID & 7) == OBJECT_Actor) 7554 if (PID_TYPE(v10->uPackedID) == OBJECT_Actor)
7570 { 7555 {
7571 v8 = ai_near_actors_targets_pid[v5 >> 3]; 7556 v8 = ai_near_actors_targets_pid[PID_ID(v5)];
7572 memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, v2), sizeof(v7)); 7557 memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, v2), sizeof(v7));
7573 if ( !v1->_406D10(a2) ) 7558 if ( !v1->_406D10(a2) )
7574 Actor::AI_Stand(v10->uPackedID >> 3, v8, 0x20u, &v7); 7559 Actor::AI_Stand(v10->uPackedID >> 3, v8, 0x20u, &v7);
7575 } 7560 }
7576 ++a2; 7561 ++a2;
7603 if ( this->uActorQueueSize > 0 ) 7588 if ( this->uActorQueueSize > 0 )
7604 { 7589 {
7605 v2 = this->pQueue; 7590 v2 = this->pQueue;
7606 do 7591 do
7607 { 7592 {
7608 if ( (v2->uPackedID & 7) == OBJECT_Actor) 7593 if (PID_TYPE(v2->uPackedID) == OBJECT_Actor)
7609 { 7594 {
7610 v3 = v2->uPackedID >> 3; 7595 v3 = PID_ID(v2->uPackedID);
7611 v8 = v3; 7596 v8 = v3;
7612 if ( pActors[v3].CanAct() ) 7597 if ( pActors[v3].CanAct() )
7613 { 7598 {
7614 v4 = v2->uPackedID; 7599 v4 = v2->uPackedID;
7615 v9 = ai_near_actors_targets_pid[v3]; 7600 v9 = ai_near_actors_targets_pid[v3];
7658 v14 = this->pQueue; 7643 v14 = this->pQueue;
7659 while ( 1 ) 7644 while ( 1 )
7660 { 7645 {
7661 v4 = v14->uPackedID; 7646 v4 = v14->uPackedID;
7662 a1 = v14->uPackedID; 7647 a1 = v14->uPackedID;
7663 if ( (a1 & 7) != OBJECT_Player) 7648 if (PID_TYPE(a1) != OBJECT_Player)
7664 { 7649 {
7665 v5 = v4 >> 3; 7650 v5 = v4 >> 3;
7666 v12 = v5; 7651 v12 = v5;
7667 v6 = &pActors[v5]; 7652 v6 = &pActors[v5];
7668 if ( SHIDWORD(v6->pActorBuffs[5].uExpireTime) < result 7653 if ( SHIDWORD(v6->pActorBuffs[5].uExpireTime) < result
7741 unsigned int v28; // [sp+48h] [bp-Ch]@10 7726 unsigned int v28; // [sp+48h] [bp-Ch]@10
7742 TurnBased_QueueElem *v29; // [sp+4Ch] [bp-8h]@7 7727 TurnBased_QueueElem *v29; // [sp+4Ch] [bp-8h]@7
7743 unsigned int uActorID; // [sp+50h] [bp-4h]@2 7728 unsigned int uActorID; // [sp+50h] [bp-4h]@2
7744 unsigned int a2a; // [sp+5Ch] [bp+8h]@7 7729 unsigned int a2a; // [sp+5Ch] [bp+8h]@7
7745 7730
7731 __debugbreak();
7746 v2 = *(&this->field_0 + 4 * (a2 + 2)); 7732 v2 = *(&this->field_0 + 4 * (a2 + 2));
7747 if ( (v2 & 7) == OBJECT_Player) 7733 if (PID_TYPE(v2) == OBJECT_Player)
7748 return 0; 7734 return 0;
7749 v3 = v2 >> 3; 7735 v3 = PID_ID(v2);
7750 uActorID = v3; 7736 uActorID = v3;
7751 v4 = &pActors[v3]; 7737 v4 = &pActors[v3];
7752 v5 = v4->uAIState; 7738 v5 = v4->uAIState;
7753 if ( v5 == 5 || v5 == 4 || v5 == 11 || v5 == 19 || v5 == 17 ) 7739 if ( v5 == 5 || v5 == 4 || v5 == 11 || v5 == 19 || v5 == 17 )
7754 return 1; 7740 return 1;
7936 v3 = this->pQueue; 7922 v3 = this->pQueue;
7937 v18 = (char *)&pTurnEngine - (char *)this; 7923 v18 = (char *)&pTurnEngine - (char *)this;
7938 v14 = this->pQueue; 7924 v14 = this->pQueue;
7939 do 7925 do
7940 { 7926 {
7941 if ( (v3->uPackedID & 7) != OBJECT_Player) 7927 if (PID_TYPE(v3->uPackedID) != OBJECT_Player)
7942 { 7928 {
7943 v4 = v3->uPackedID >> 3; 7929 v4 = PID_ID(v3->uPackedID);
7944 uActorID = v4; 7930 uActorID = v4;
7945 v5 = &pActors[v4]; 7931 v5 = &pActors[v4];
7946 v6 = v5->uAIState; 7932 v6 = v5->uAIState;
7947 if ( v6 != 5 ) 7933 if ( v6 != 5 )
7948 { 7934 {
11618 if ( pRenderer->pRenderD3D ) 11604 if ( pRenderer->pRenderD3D )
11619 v5 = pGame->pVisInstance->get_picked_object_zbuf_val(); 11605 v5 = pGame->pVisInstance->get_picked_object_zbuf_val();
11620 else 11606 else
11621 v5 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; 11607 v5 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]];
11622 v6 = (unsigned __int16)v5; 11608 v6 = (unsigned __int16)v5;
11623 if ( (v5 & 7) == OBJECT_Actor 11609 if (PID_TYPE(v5) == OBJECT_Actor
11624 && uActiveCharacter 11610 && uActiveCharacter
11625 && v5 < 33554432 11611 && v5 < 0x2000000
11626 && pPlayers[uActiveCharacter]->CanAct() 11612 && pPlayers[uActiveCharacter]->CanAct()
11627 && pPlayers[uActiveCharacter]->CanSteal() ) 11613 && pPlayers[uActiveCharacter]->CanSteal() )
11628 { 11614 {
11629 /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) 11615 /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
11630 { 11616 {
11631 pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)27; 11617 pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)27;
11632 pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v6 >> 3; 11618 pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v6 >> 3;
11633 *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; 11619 *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
11634 ++pMessageQueue_50CBD0->uNumMessages; 11620 ++pMessageQueue_50CBD0->uNumMessages;
11635 }*/ 11621 }*/
11636 pMessageQueue_50CBD0->AddMessage(UIMSG_1B, v6 >> 3, 0); 11622 pMessageQueue_50CBD0->AddMessage(UIMSG_1B, PID_ID(v6), 0);
11637 11623
11638 if ( pParty->bTurnBasedModeOn == 1 ) 11624 if ( pParty->bTurnBasedModeOn == 1 )
11639 { 11625 {
11640 if ( pTurnEngine->field_4 == 3 ) 11626 if ( pTurnEngine->field_4 == 3 )
11641 pTurnEngine->field_18 |= 8u; 11627 pTurnEngine->field_18 |= 8u;