Mercurial > mm7
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; |