annotate Engine/Objects/Actor.cpp @ 2541:a902abdfc7f2

1. Renamed class Game to class Engine. 2. Separated game logic as state of FSM from game logic as engine. 3. Found out that many UI screen initializers were optimized away, intially they all returned newly created window as separate object like it is done in CharacterUI_Initialize.
author a.parshin
date Sun, 10 May 2015 01:29:11 +0200
parents 1bcadc6dd203
children b6140dfeac27
rev   line source
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1 #define _CRTDBG_MAP_ALLOC
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2 #include <stdlib.h>
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3 #include <crtdbg.h>
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5 #define _CRT_SECURE_NO_WARNINGS
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
6
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
7 #include "Engine/Engine.h"
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
8
2499
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
9 #include "../Graphics/PaletteManager.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
10 #include "../Graphics/DecalBuilder.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
11 #include "../Graphics/Sprites.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
12 #include "../../stru6.h"
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
13 #include "Actor.h"
2499
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
14 #include "../OurMath.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
15 #include "../Graphics/Outdoor.h"
2502
a77c34acdbc9 Media folder
Ritor1
parents: 2499
diff changeset
16 #include "Media/Audio/AudioPlayer.h"
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
17 #include "ObjectList.h"
2499
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
18 #include "../Graphics/Overlays.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
19 #include "../Tables/FactionTable.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
20 #include "../TurnEngine/TurnEngine.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
21 #include "../Spells/CastSpellInfo.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
22 #include "../Timer.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
23 #include "../LOD.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
24 #include "../Party.h"
2502
a77c34acdbc9 Media folder
Ritor1
parents: 2499
diff changeset
25 #include "GUI/GUIWindow.h"
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
26 #include "SpriteObject.h"
2499
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
27 #include "../stru298.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
28 #include "../Texts.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
29 #include "../Graphics/Level/Decoration.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
30 #include "../Graphics/Viewport.h"
68cdef6879a0 engine folder
Ritor1
parents: 2497
diff changeset
31 #include "../Graphics/Vis.h"
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
33
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
35
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
36
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
37 std::array<Actor, 500> pActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
38 size_t uNumActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
39
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
40 stru319 stru_50C198; // idb
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
41
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
42
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
43 std::array<uint, 5> _4DF380_hostilityRanges = {0, 1024, 2560, 5120, 10240};
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
44
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
46
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
47
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
48 //----- (0042FB5C) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
49 // True if monster should play attack animation when casting this spell.
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
50 bool ShouldMonsterPlayAttackAnim(signed int spell_id)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
51 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
52 switch (spell_id)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
53 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
54 case SPELL_FIRE_HASTE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
55 case SPELL_AIR_SHIELD:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
56 case SPELL_EARTH_STONESKIN:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
57 case SPELL_SPIRIT_BLESS:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
58 case SPELL_SPIRIT_FATE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
59 case SPELL_SPIRIT_HEROISM:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
60 case SPELL_BODY_HAMMERHANDS:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
61 case SPELL_BODY_POWER_CURE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
62 case SPELL_LIGHT_DISPEL_MAGIC:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
63 case SPELL_LIGHT_DAY_OF_PROTECTION:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
64 case SPELL_LIGHT_HOUR_OF_POWER:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
65 case SPELL_DARK_PAIN_REFLECTION:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
66 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
67 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
68
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
69 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
70 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
71
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
72
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
73 //----- (0041AF52) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
74 void Actor::DrawHealthBar(Actor *actor, GUIWindow *window)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
75 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
76 unsigned int bar_length; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
77 unsigned int uX; // ebx@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
78 unsigned int v9; // [sp+14h] [bp-Ch]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
79 unsigned int v10; // [sp+1Ch] [bp-4h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
80
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
81 if (actor->pMonsterInfo.uHP <= 25)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
82 bar_length = 25;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
83 else if ( actor->pMonsterInfo.uHP < 200 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
84 bar_length = actor->pMonsterInfo.uHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
85 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
86 bar_length = 200;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
87
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
88 v10 = bar_length;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
89 if ( actor->sCurrentHP <= (0.34 * actor->pMonsterInfo.uHP) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
90 v9 = uTextureID_mhp_red;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
91 else if ( actor->sCurrentHP <= ( 0.67 * actor->pMonsterInfo.uHP) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
92 v9 = uTextureID_mhp_yel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
93 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
94 v9 = uTextureID_mhp_grn;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
95
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
96 if ( actor->sCurrentHP < (int)actor->pMonsterInfo.uHP )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
97 v10 = bar_length / actor->pMonsterInfo.uHP * actor->sCurrentHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
98
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
99 uX = window->uFrameX + (signed int)(window->uFrameWidth - bar_length) / 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
100
2524
c7264ab7132f Main menu rendered using d3d11
a.parshin
parents: 2506
diff changeset
101 pRenderer->SetUIClipRect(uX, window->uFrameY + 32, uX + bar_length, window->uFrameY + 52);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
102 pRenderer->DrawTextureIndexed(uX, window->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_bd));
2524
c7264ab7132f Main menu rendered using d3d11
a.parshin
parents: 2506
diff changeset
103 pRenderer->SetUIClipRect(uX, window->uFrameY + 32, uX + v10, window->uFrameY + 52);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
104 pRenderer->DrawTextureIndexed(uX, window->uFrameY + 34, pIcons_LOD->GetTexture(v9));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
105
2524
c7264ab7132f Main menu rendered using d3d11
a.parshin
parents: 2506
diff changeset
106 pRenderer->ResetUIClipRect();
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
107 pRenderer->DrawTextureIndexed(uX - 5, window->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capl));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
108 pRenderer->DrawTextureIndexed(uX + bar_length, window->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capr));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
109 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
110
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
111 //----- (00448A40) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
112 void Actor::ToggleFlag(signed int uActorID, unsigned int uFlag, int bToggle)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
113 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
114 if ( uActorID >= 0 && uActorID <= (signed int)(uNumActors - 1) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
115 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
116 if ( bToggle )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
117 pActors[uActorID].uAttributes |= uFlag;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
118 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
119 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
120 if ( uFlag == 0x10000 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
121 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
122 if (pActors[uActorID].uAIState == Disabled )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
123 pActors[uActorID].uAIState = Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
124 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
125 pActors[uActorID].uAttributes &= ~uFlag;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
126 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
127 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
128 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
129
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
130 //----- (00448518) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
131 void __fastcall sub_448518_npc_set_item(int npc, unsigned int item, int a3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
132 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
133 for (uint i = 0; i < uNumActors; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
134 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
135 if (pActors[uNumActors].sNPC_ID == npc)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
136 Actor::GiveItem(i, item, a3);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
137 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
138 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
139
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
140 //----- (004485A7) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
141 void Actor::GiveItem(signed int uActorID, unsigned int uItemID, unsigned int bGive)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
142 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
143 if ( (uActorID >= 0) && (signed int)uActorID <= (signed int)(uNumActors - 1) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
144 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
145 if ( bGive )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
146 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
147 if ( pActors[uActorID].uCarriedItemID == 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
148 pActors[uActorID].uCarriedItemID = uItemID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
149 else if ( pActors[uActorID].ActorHasItems[0].uItemID == 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
150 pActors[uActorID].ActorHasItems[0].uItemID = uItemID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
151 else if ( pActors[uActorID].ActorHasItems[1].uItemID == 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
152 pActors[uActorID].ActorHasItems[1].uItemID = uItemID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
153 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
154 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
155 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
156 if ( pActors[uActorID].uCarriedItemID == uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
157 pActors[uActorID].uCarriedItemID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
158 else if ( pActors[uActorID].ActorHasItems[0].uItemID == uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
159 pActors[uActorID].ActorHasItems[0].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
160 else if ( pActors[uActorID].ActorHasItems[1].uItemID == uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
161 pActors[uActorID].ActorHasItems[1].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
162 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
163 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
164 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
165
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
166 //----- (0040894B) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
167 bool Actor::CanAct()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
168 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
169 bool isparalyzed; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
170 bool isstoned; // edi@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
171
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
172 isstoned = (signed __int64)this->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0;// stoned
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
173 isparalyzed = (signed __int64)this->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime > 0;// paralyzed
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
174 return !(isstoned || isparalyzed || this->uAIState == Dying || this->uAIState == Dead
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
175 || this->uAIState == Removed || this->uAIState == Summoned || this->uAIState == Disabled);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
176 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
177
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
178 //----- (004089C7) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
179 bool Actor::IsNotAlive()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
180 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
181 bool isstoned; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
182
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
183 isstoned = (signed __int64)this->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0;// stoned
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
184 return (isstoned || (uAIState == Dying) || (uAIState == Dead) || (uAIState == Removed) || (uAIState == Summoned) || (uAIState == Disabled));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
185 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
186
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
187 //----- (004086E9) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
188 void Actor::SetRandomGoldIfTheresNoItem()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
189 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
190 int v2; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
191
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
192 v2 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
193 if ( !this->ActorHasItems[3].uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
194 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
195 if ( this->pMonsterInfo.uTreasureDiceRolls )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
196 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
197 for (int i = 0; i < this->pMonsterInfo.uTreasureDiceRolls; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
198 v2 += rand() % this->pMonsterInfo.uTreasureDiceSides + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
199 if ( v2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
200 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
201 this->ActorHasItems[3].uItemID = 197;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
202 this->ActorHasItems[3].uSpecEnchantmentType = v2; //actual gold amount
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
203 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
204 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
205 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
206 if ( rand() % 100 < this->pMonsterInfo.uTreasureDropChance )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
207 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
208 if ( this->pMonsterInfo.uTreasureLevel )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
209 pItemsTable->GenerateItem(this->pMonsterInfo.uTreasureLevel, this->pMonsterInfo.uTreasureType, &this->ActorHasItems[2]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
210 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
211 this->uAttributes |= ACTOR_HAS_ITEM;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
212 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
213
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
214 //----- (00404AC7) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
215 void Actor::AI_SpellAttack(unsigned int uActorID, AIDirection *pDir, int uSpellID, int a4, unsigned int uSkillLevel)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
216 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
217 Actor *actorPtr; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
218 unsigned int realPoints; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
219 unsigned int masteryLevel; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
220 int v8; // edi@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
221 signed int v10; // ecx@22
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
222 int v19; // edi@34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
223 int v20; // eax@35
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
224 signed int v23; // eax@41
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
225 int v28; // st6@50
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
226 int v30; // esi@50
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
227 int v31; // ST3C_4@51
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
228 unsigned int v32; // edi@51
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
229 signed int v36; // eax@67
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
230 int v39; // ecx@75
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
231 int v42; // ecx@91
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
232 int v44; // ecx@100
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
233 int v48; // ecx@110
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
234 int v51; // ecx@130
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
235 int v54; // ecx@138
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
236 int v59; // edi@146
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
237 int v61; // edi@146
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
238 signed int v63; // edi@146
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
239 int v68; // edi@168
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
240 signed int v70; // ecx@172
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
241 int v79; // edx@185
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
242 int v80; // eax@185
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
243 signed int v91; // eax@200
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
244 int v94; // ecx@208
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
245 int v96; // ecx@217
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
246 int pitch; // [sp+2Ch] [bp-A4h]@51
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
247 int v114; // [sp+48h] [bp-88h]@41
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
248 SpriteObject a1; // [sp+4Ch] [bp-84h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
249 int v116; // [sp+BCh] [bp-14h]@49
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
250 int v118; // [sp+C4h] [bp-Ch]@29
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
251 int v119; // [sp+C8h] [bp-8h]@48
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
252 int v120; // [sp+CCh] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
253 int spellnuma; // [sp+D8h] [bp+8h]@29
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
254 int spellnumb; // [sp+D8h] [bp+8h]@48
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
255 int spellnumc; // [sp+D8h] [bp+8h]@50
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
256 int spellnume; // [sp+D8h] [bp+8h]@179
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
257 int a1a; // [sp+E0h] [bp+10h]@34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
258 int a1c; // [sp+E0h] [bp+10h]@184
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
259
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
260
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
261 actorPtr = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
262 realPoints = uSkillLevel & 0x3F;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
263 masteryLevel = SkillToMastery(uSkillLevel);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
264
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
265 switch (uSpellID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
266 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
267 case SPELL_FIRE_FIRE_BOLT:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
268 case SPELL_FIRE_FIREBALL:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
269 case SPELL_FIRE_INCINERATE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
270 case SPELL_AIR_LIGHNING_BOLT:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
271 case SPELL_WATER_ICE_BOLT:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
272 case SPELL_WATER_ACID_BURST:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
273 case SPELL_EARTH_BLADES:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
274 case SPELL_EARTH_ROCK_BLAST:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
275 case SPELL_MIND_MIND_BLAST:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
276 case SPELL_MIND_PSYCHIC_SHOCK:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
277 case SPELL_BODY_HARM:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
278 case SPELL_LIGHT_LIGHT_BOLT:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
279 case SPELL_DARK_TOXIC_CLOUD:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
280 case SPELL_DARK_DRAGON_BREATH:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
281 a1.uType = stru_4E3ACC[uSpellID].uType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
282 a1.uObjectDescID = GetObjDescId(uSpellID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
283 a1.stru_24.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
284 a1.spell_id = uSpellID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
285 a1.spell_level = uSkillLevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
286 a1.vPosition.x = actorPtr->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
287 a1.spell_skill = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
288 a1.vPosition.y = actorPtr->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
289 a1.vPosition.z = actorPtr->vPosition.z + ((signed int)actorPtr->uActorHeight >> 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
290 a1.uFacing = LOWORD(pDir->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
291 a1.uSoundID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
292 a1.uAttributes = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
293 a1.uSectorID = pIndoor->GetSector(a1.vPosition.x, a1.vPosition.y, a1.vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
294 a1.uSpriteFrameID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
295 a1.spell_caster_pid = PID(OBJECT_Actor, uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
296 a1.spell_target_pid = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
297 if ((double)pDir->uDistance < 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
298 a1.field_60_distance_related_prolly_lod = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
299 else if ( pDir->uDistance < 1024 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
300 a1.field_60_distance_related_prolly_lod = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
301 else if ( pDir->uDistance < 2560 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
302 a1.field_60_distance_related_prolly_lod = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
303 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
304 a1.field_60_distance_related_prolly_lod = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
305
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
306 a1.field_61 = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
307 v91 = a1.Create(pDir->uYawAngle, pDir->uPitchAngle, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
308 if ( v91 != -1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
309 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
310 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], PID(OBJECT_Item, v91), 0, -1, 0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
311 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
312 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
313 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
314 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
315
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
316 case SPELL_FIRE_HASTE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
317 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
318 v39 = 60 * (realPoints + 60);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
319 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
320 v39 = 180 * (realPoints + 20);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
321 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
322 v39 = 240 * (realPoints + 15);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
323 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
324 v39 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
325 actorPtr->pActorBuffs[ACTOR_BUFF_HASTE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(v39 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
326 masteryLevel, 0, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
327 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr, 0xFF3C1Eu);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
328 pAudioPlayer->PlaySound((SoundID)SOUND_Haste, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
329 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
330
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
331 case SPELL_FIRE_METEOR_SHOWER:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
332 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
333 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
334 v114 = pParty->vPosition.z + 2500;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
335 v23 = 8;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
336 if (masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
337 v23 = 10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
338 else if (masteryLevel == 3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
339 v23 = 12;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
340 else if (masteryLevel == 4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
341 v23 = 14;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
342 spellnumb = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
343 v28 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
344 for ( int i = 0; i < v23; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
345 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
346 v30 = rand() % 1000;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
347 spellnumc = v30 - 2500;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
348 v120 = v28 * v28;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
349 v119 = spellnumb * spellnumb;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
350 if ( sqrt((float)(spellnumc * spellnumc + v119 + v120)) <= 1.0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
351 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
352 v32 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
353 pitch = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
354 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
355 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
356 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
357 v31 = (signed __int64)sqrt((float)(v119 + v120));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
358 v32 = stru_5C6E00->Atan2(spellnumb, (int)v28);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
359 pitch = stru_5C6E00->Atan2(v31, (int)spellnumc);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
360 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
361 a1.stru_24.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
362 a1.uType = stru_4E3ACC[uSpellID].uType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
363 a1.uObjectDescID = GetObjDescId(uSpellID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
364 a1.spell_level = uSkillLevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
365 a1.vPosition.x = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
366 a1.vPosition.y = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
367 a1.vPosition.z = v30 + v114;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
368 a1.spell_id = SPELL_FIRE_METEOR_SHOWER;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
369 a1.spell_skill = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
370 a1.uAttributes = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
371 a1.uSectorID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
372 a1.uSpriteFrameID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
373 a1.spell_caster_pid = PID(OBJECT_Actor, uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
374 a1.spell_target_pid = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
375 a1.field_60_distance_related_prolly_lod = stru_50C198._427546(v30 + 2500);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
376 a1.uFacing = v32;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
377 a1.uSoundID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
378 if (pDir->uDistance < 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
379 a1.field_60_distance_related_prolly_lod = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
380 else if ( pDir->uDistance < 1024 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
381 a1.field_60_distance_related_prolly_lod = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
382 else if ( pDir->uDistance < 2560 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
383 a1.field_60_distance_related_prolly_lod = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
384 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
385 a1.field_60_distance_related_prolly_lod = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
386 a1.field_61 = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
387 v36 = a1.Create(v32, pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
388 if ( v36 != -1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
389 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[9], PID(OBJECT_Item, v36), 0, -1, 0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
390 spellnumb = rand() % 1024 - 512;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
391 v28 = rand() % 1024 - 512;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
392 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
393 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
394 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
395
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
396 case SPELL_AIR_SPARKS:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
397 if (masteryLevel == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
398 v10 = 5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
399 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
400 v10 = 7;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
401 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
402 v10 = 9;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
403 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
404 v10 = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
405 spellnuma = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
406 a1.uType = stru_4E3ACC[uSpellID].uType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
407 v118 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v10 - 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
408 a1.uObjectDescID = GetObjDescId(uSpellID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
409
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
410 a1.stru_24.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
411 a1.spell_id = SPELL_AIR_SPARKS;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
412 a1.spell_level = uSkillLevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
413 a1.vPosition.x = actorPtr->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
414 a1.spell_skill = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
415 a1.vPosition.y = actorPtr->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
416 a1.vPosition.z = actorPtr->vPosition.z + ((signed int)actorPtr->uActorHeight >> 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
417 a1.uFacing = pDir->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
418 a1.uSoundID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
419 a1.uAttributes = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
420 a1.uSectorID = pIndoor->GetSector(a1.vPosition.x, a1.vPosition.y, a1.vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
421 a1.spell_caster_pid = PID(OBJECT_Actor, uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
422 a1.uSpriteFrameID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
423 a1.spell_target_pid = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
424 a1.field_60_distance_related_prolly_lod = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
425 v19 = spellnuma / -2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
426 a1a = spellnuma / 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
427 if ( spellnuma / -2 > spellnuma / 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
428 v20 = spellnuma / 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
429 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
430 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
431 do
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
432 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
433 a1.uFacing = v19 + LOWORD(pDir->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
434 v20 = a1.Create((signed __int16)a1.uFacing, pDir->uPitchAngle,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
435 pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
436 v19 += v118;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
437 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
438 while ( v19 <= a1a );
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
439 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
440 if ( v20 != -1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
441 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
442 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[15], PID(OBJECT_Item, v20), 0, -1, 0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
443 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
444 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
445 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
446 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
447
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
448 case SPELL_AIR_SHIELD:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
449 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
450 v8 = 300 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
451 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
452 v8 = 900 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
453 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
454 v8 = 3600 * (realPoints + 64);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
455 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
456 v8 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
457 actorPtr->pActorBuffs[ACTOR_BUFF_SHIELD].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
458 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v8 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
459 masteryLevel, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
460 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
461
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
462 case SPELL_EARTH_STONESKIN:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
463 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
464 v44 = 300 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
465 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
466 v44 = 900 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
467 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
468 v44 = 3600 * (realPoints + 64);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
469 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
470 v44 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
471 actorPtr->pActorBuffs[ACTOR_BUFF_STONESKIN].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
472 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v44 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
473 masteryLevel, realPoints + 5, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
474 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr,0x5C310Eu);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
475 pAudioPlayer->PlaySound((SoundID)SOUND_Stoneskin, PID(OBJECT_Actor,uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
476 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
477
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
478 case SPELL_SPIRIT_BLESS:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
479 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
480 v42 = 300 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
481 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
482 v42 = 900 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
483 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
484 v42 = 1200 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
485 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
486 v42 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
487 actorPtr->pActorBuffs[ACTOR_BUFF_BLESS].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
488 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v42 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
489 masteryLevel, realPoints + 5, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
490 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr,0xC8C805u);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
491 pAudioPlayer->PlaySound((SoundID)SOUND_Bless, PID(OBJECT_Actor,uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
492 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
493 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
494
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
495 case SPELL_SPIRIT_FATE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
496 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
497 v48 = 2 * realPoints + 40;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
498 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
499 v48 = 3 * realPoints + 60;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
500 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
501 v48 = 2 * (3 * realPoints + 60);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
502 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
503 v48 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
504 actorPtr->pActorBuffs[ACTOR_BUFF_FATE].Apply(pParty->uTimePlayed + 1280, masteryLevel, v48, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
505 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr,0xC8C805u);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
506 pAudioPlayer->PlaySound((SoundID)SOUND_Fate, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
507 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
508
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
509 case SPELL_SPIRIT_HEROISM:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
510 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
511 v54 = 300 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
512 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
513 v54 = 900 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
514 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
515 v54 = 1200 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
516 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
517 v54 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
518 actorPtr->pActorBuffs[ACTOR_BUFF_HEROISM].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
519 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v54 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
520 masteryLevel, realPoints + 5, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
521 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr,0xC8C805u);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
522 pAudioPlayer->PlaySound((SoundID)SOUND_51heroism03, PID(OBJECT_Actor,uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
523 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
524
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
525 case SPELL_BODY_HAMMERHANDS:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
526 if ( (signed int)masteryLevel <= 0 || (signed int)masteryLevel > 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
527 v51 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
528 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
529 v51 = 3600 * realPoints;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
530 actorPtr->pActorBuffs[ACTOR_BUFF_PAIN_HAMMERHANDS].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
531 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v51 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
532 masteryLevel,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
533 realPoints,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
534 0,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
535 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
536 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr, 0xA81376u);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
537 pAudioPlayer->PlaySound((SoundID)SOUND_51heroism03, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
538 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
539
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
540 case SPELL_BODY_POWER_CURE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
541 actorPtr->sCurrentHP += 5 * realPoints + 10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
542 if ( actorPtr->sCurrentHP >= (signed int)actorPtr->pMonsterInfo.uHP )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
543 actorPtr->sCurrentHP = LOWORD(actorPtr->pMonsterInfo.uHP);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
544 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr, 0xA81376u);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
545 pAudioPlayer->PlaySound((SoundID)SOUND_Fate, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
546 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
547
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
548 case SPELL_LIGHT_DISPEL_MAGIC:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
549 for (int i = 0; i < 20; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
550 pParty->pPartyBuffs[i].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
551 for (int i = 1; i <= 4; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
552 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
553 v59 = pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualWillpower());
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
554 v61 = (pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualIntelligence()) + v59) / 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
555 v63 = v61 + pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualLuck()) + 30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
556 if ( rand() % v63 < 30 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
557 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
558 for (uint k = 0; k < pPlayers[i]->pPlayerBuffs.size(); k++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
559 pPlayers[i]->pPlayerBuffs[k].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
560 pOtherOverlayList->_4418B1(11210, i + 99, 0, 65536);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
561 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
562 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
563 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[80], PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
564 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
565
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
566 case SPELL_LIGHT_DAY_OF_PROTECTION:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
567 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
568 v96 = 300 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
569 else if (masteryLevel == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
570 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
571 LOWORD(realPoints) = 3 * realPoints;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
572 v96 = 900 * (uSkillLevel & 0x3F) + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
573 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
574 else if (masteryLevel == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
575 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
576 v96 = 1200 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
577 LOWORD(realPoints) = 4 * realPoints;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
578 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
579 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
580 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
581 LOWORD(realPoints) = uSkillLevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
582 v96 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
583 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
584 actorPtr->pActorBuffs[ACTOR_BUFF_DAY_OF_PROTECTION].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
585 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v96 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
586 masteryLevel, realPoints, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
587 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr, 0xFFFFFFu);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
588 pAudioPlayer->PlaySound((SoundID)SOUND_94dayofprotection03, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
589 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
590
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
591 case SPELL_LIGHT_HOUR_OF_POWER:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
592 if (masteryLevel == 1 || masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
593 v94 = 300 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
594 else if (masteryLevel == 3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
595 v94 = 900 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
596 else if (masteryLevel == 4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
597 v94 = 1200 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
598 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
599 v94 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
600 actorPtr->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
601 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v94 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
602 masteryLevel, realPoints + 5, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
603 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr, 0xFFFFFFu);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
604 pAudioPlayer->PlaySound((SoundID)SOUND_9armageddon01, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
605 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
606
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
607 case SPELL_DARK_SHARPMETAL:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
608 if (masteryLevel == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
609 v70 = 5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
610 else if (masteryLevel == 3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
611 v70 = 7;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
612 else if (masteryLevel == 4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
613 v70 = 9;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
614 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
615 v70 = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
616
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
617 spellnume = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
618 a1.uType = stru_4E3ACC[uSpellID].uType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
619 v116 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v70 - 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
620 a1.uObjectDescID = GetObjDescId(uSpellID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
621 a1.stru_24.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
622 a1.spell_id = uSpellID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
623 a1.spell_level = uSkillLevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
624 a1.vPosition.x = actorPtr->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
625 a1.spell_skill = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
626 a1.vPosition.y = actorPtr->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
627 a1.vPosition.z = actorPtr->vPosition.z + ((signed int)actorPtr->uActorHeight >> 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
628 a1.uFacing = pDir->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
629 a1.uSoundID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
630 a1.uAttributes = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
631 a1.uSectorID = pIndoor->GetSector(a1.vPosition.x, a1.vPosition.y, a1.vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
632 a1.spell_caster_pid = PID(OBJECT_Actor, uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
633 a1.uSpriteFrameID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
634 a1.spell_target_pid = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
635 a1.field_60_distance_related_prolly_lod = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
636 a1c = spellnume / -2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
637 if ( spellnume / -2 > spellnume / 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
638 v80 = spellnume / -2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
639 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
640 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
641 do
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
642 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
643 v79 = pDir->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
644 a1.uFacing = a1c + LOWORD(pDir->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
645 v80 = a1.Create(v79, pDir->uPitchAngle,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
646 pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
647 a1c += v116;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
648 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
649 while ( a1c <= spellnume / 2 );
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
650 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
651 if ( v80 != -1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
652 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
653 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[93], PID(OBJECT_Item, v80), 0, -1, 0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
654 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
655 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
656 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
657 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
658
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
659 case SPELL_DARK_PAIN_REFLECTION:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
660 if (masteryLevel == 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
661 v68 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
662 else if (masteryLevel == 1 || (masteryLevel == 2) || (masteryLevel == 3))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
663 v68 = 300 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
664 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
665 v68 = 900 * realPoints + 3840;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
666 actorPtr->pActorBuffs[ACTOR_BUFF_PAIN_REFLECTION].Apply(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
667 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v68 << 7) * 0.033333335),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
668 masteryLevel, 0, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
669 pEngine->pStru6Instance->_4A7E89_sparkles_on_actor_after_it_casts_buff(actorPtr,0x7E7E7Eu);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2524
diff changeset
670 pAudioPlayer->PlaySound((SoundID)SOUND_Sacrifice2, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
671 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
672 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
673 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
674
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
675 //----- (new func) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
676 unsigned short Actor::GetObjDescId( int spellId )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
677 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
678 for (unsigned int i = 0; i < pObjectList->uNumObjects; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
679 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
680 if (stru_4E3ACC[spellId].uType == pObjectList->pObjects[i].uObjectID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
681 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
682 return i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
683 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
684 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
685 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
686 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
687 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
688
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
689
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
690 //----- (0043ABB0) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
691 bool Actor::ArePeasantsOfSameFaction(Actor *a1, Actor *a2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
692 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
693 unsigned int v2; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
694 unsigned int v3; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
695
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
696 v2 = a1->uAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
697 if ( !a1->uAlly )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
698 v2 = (a1->pMonsterInfo.uID - 1) / 3 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
699
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
700 v3 = a2->uAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
701 if ( !a2->uAlly )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
702 v3 = (a2->pMonsterInfo.uID - 1) / 3 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
703
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
704 if ( v2 >= 39 && v2 <= 44 && v3 >= 39 && v3 <= 44
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
705 || v2 >= 45 && v2 <= 50 && v3 >= 45 && v3 <= 50
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
706 || v2 >= 51 && v2 <= 62 && v3 >= 51 && v3 <= 62
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
707 || v2 >= 78 && v2 <= 83 && v3 >= 78 && v3 <= 83
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
708 || v2 == v3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
709 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
710 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
711 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
712 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
713 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
714
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
715 //----- (0043AC45) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
716 void Actor::AggroSurroundingPeasants(unsigned int uActorID, int a2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
717 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
718 int v4; // ebx@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
719 int v5; // ST1C_4@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
720 int v6; // eax@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
721
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
722 int x = 0; x |= 0x80000;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
723 int y = 0; y |= 0x80000;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
724 Actor* victim = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
725 if ( a2 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
726 victim->uAttributes |= ACTOR_AGGRESSOR;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
727
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
728 for (uint i = 0; i < uNumActors; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
729 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
730 Actor* actor = &pActors[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
731 if (!actor->CanAct() || i == uActorID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
732 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
733
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
734 if (Actor::ArePeasantsOfSameFaction(victim, actor))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
735 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
736 v4 = abs(actor->vPosition.x - victim->vPosition.x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
737 v5 = abs(actor->vPosition.y - victim->vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
738 v6 = abs(actor->vPosition.z - victim->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
739 if (int_get_vector_length(v4, v5, v6) < 4096)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
740 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
741 actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
742 if ( a2 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
743 actor->uAttributes |= ACTOR_AGGRESSOR;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
744
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
745 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
746 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
747 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
748 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
749
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
750 //----- (00404874) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
751 void Actor::AI_RangedAttack( unsigned int uActorID, struct AIDirection *pDir, int type, char a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
752 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
753 char specAb; // al@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
754 int v13; // edx@28
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
755
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
756 SpriteObject a1; // [sp+Ch] [bp-74h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
757
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
758 switch ( type )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
759 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
760 case 1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
761 a1.uType = 545;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
762 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
763 case 2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
764 a1.uType = 550;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
765 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
766 case 3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
767 a1.uType = 510;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
768 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
769 case 4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
770 a1.uType = 500;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
771 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
772 case 5:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
773 a1.uType = 515;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
774 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
775 case 6:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
776 a1.uType = 505;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
777 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
778 case 7:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
779 a1.uType = 530;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
780 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
781 case 8:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
782 a1.uType = 525;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
783 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
784 case 9:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
785 a1.uType = 520;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
786 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
787 case 10:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
788 a1.uType = 535;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
789 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
790 case 11:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
791 a1.uType = 540;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
792 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
793 case 13:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
794 a1.uType = 555;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
795 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
796 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
797 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
798 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
799 bool found = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
800 for ( uint i = 0; i < pObjectList->uNumObjects; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
801 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
802 if (pObjectList->pObjects[i].uObjectID == a1.uType)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
803 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
804 a1.uObjectDescID = i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
805 found = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
806 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
807 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
808 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
809 if (!found)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
810 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
811 Error("Item not found");
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
812 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
813 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
814 a1.stru_24.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
815 a1.spell_id = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
816 a1.vPosition.x = pActors[uActorID].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
817 a1.vPosition.y = pActors[uActorID].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
818 a1.vPosition.z = pActors[uActorID].vPosition.z - (unsigned int)(pActors[uActorID].uActorHeight * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
819 a1.spell_level = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
820 a1.spell_skill = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
821 a1.uFacing = pDir->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
822 a1.uSoundID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
823 a1.uAttributes = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
824 a1.uSectorID = pIndoor->GetSector(a1.vPosition.x, a1.vPosition.y, a1.vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
825 a1.uSpriteFrameID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
826 a1.spell_caster_pid = PID(OBJECT_Actor, uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
827 a1.spell_target_pid = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
828 if (pDir->uDistance < 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
829 a1.field_60_distance_related_prolly_lod = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
830 else if ( pDir->uDistance < 1024 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
831 a1.field_60_distance_related_prolly_lod = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
832 else if ( pDir->uDistance < 2560 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
833 a1.field_60_distance_related_prolly_lod = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
834 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
835 a1.field_60_distance_related_prolly_lod = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
836
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
837 a1.field_61 = a4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
838 a1.Create(pDir->uYawAngle, pDir->uPitchAngle, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
839 if ( pActors[uActorID].pMonsterInfo.uSpecialAbilityType == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
840 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
841 specAb = pActors[uActorID].pMonsterInfo.uSpecialAbilityDamageDiceBonus;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
842 if ( specAb == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
843 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
844 a1.vPosition.z += 40;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
845 v13 = pDir->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
846 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
847 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
848 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
849 if ( specAb != 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
850 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
851 a1.Create(pDir->uYawAngle + 30, //TODO find out why the YawAngle change
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
852 pDir->uPitchAngle, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
853 v13 = pDir->uYawAngle - 30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
854 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
855 a1.Create(v13, pDir->uPitchAngle, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
856 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
857 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
858 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
859
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
860 //----- (00404736) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
861 void Actor::Explode( unsigned int uActorID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
862 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
863 SpriteObject a1; // [sp+Ch] [bp-78h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
864
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
865 a1.uType = 600;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
866 a1.uObjectDescID = GetObjDescId(a1.uType);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
867 a1.stru_24.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
868 a1.spell_id = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
869 a1.spell_level = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
870 a1.spell_skill = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
871 a1.vPosition.x = pActors[uActorID].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
872 a1.vPosition.y = pActors[uActorID].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
873 a1.vPosition.z = pActors[uActorID].vPosition.z - (unsigned int)(pActors[uActorID].uActorHeight * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
874 a1.uFacing = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
875 a1.uSoundID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
876 a1.uAttributes = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
877 a1.uSectorID = pIndoor->GetSector(a1.vPosition.x, a1.vPosition.y, a1.vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
878 a1.uSpriteFrameID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
879 a1.spell_caster_pid = PID(OBJECT_Actor, uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
880 a1.spell_target_pid = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
881 a1.field_60_distance_related_prolly_lod = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
882 a1.field_61 = 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
883 a1.Create(0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
884 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
885 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
886
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
887 //----- (004040E9) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
888 // // Get direction vector from object1 to object2,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
889 // // distance from object1 to object2 and Euler angles of the direction vector
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
890 // //
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
891 // //
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
892 // // object1 & object2 format : objectType | (objectID << 3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
893 // // objectType == 2 - SpriteObject
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
894 // // objectType == 3 - Actor
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
895 // // objectType == 4 - Party
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
896 // // objectType == 5 - Decoration
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
897 // //
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
898 // // originally this function had following prototype:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
899 // // struct DirectionInfo GetDirectionInfo(signed int object1, signed int object2, signed int a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
900 // // but compiler converts functions returning structures by value in the such way
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
901 void Actor::GetDirectionInfo( unsigned int uObj1ID, unsigned int uObj2ID, struct AIDirection *pOut, int a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
902 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
903 signed int v4; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
904 signed int v5; // ecx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
905 int v18; // edx@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
906 float v31; // st7@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
907 float v32; // st6@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
908 float v33; // st7@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
909 Vec3_int_ v37; // [sp-10h] [bp-5Ch]@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
910 AIDirection v41; // [sp+14h] [bp-38h]@46
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
911 float outy2; // [sp+38h] [bp-14h]@33
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
912 float outx2; // [sp+3Ch] [bp-10h]@33
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
913 int outz; // [sp+40h] [bp-Ch]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
914 int outy; // [sp+44h] [bp-8h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
915 int outx; // [sp+48h] [bp-4h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
916 float a4a; // [sp+58h] [bp+Ch]@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
917
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
918 v4 = PID_ID(uObj1ID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
919 //v6 = uObj2ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
920 v5 = PID_ID(uObj2ID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
921 switch( PID_TYPE(uObj1ID) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
922 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
923 case OBJECT_Item:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
924 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
925 outx = pSpriteObjects[v4].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
926 outy = pSpriteObjects[v4].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
927 outz = pSpriteObjects[v4].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
928 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
929 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
930 case OBJECT_Actor:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
931 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
932 outx = pActors[v4].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
933 outy = pActors[v4].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
934 outz = pActors[v4].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v4].uActorHeight * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
935 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
936 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
937 case OBJECT_Player:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
938 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
939 if ( !v4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
940 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
941 outx = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
942 outy = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
943 outz = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
944 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
945 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
946 if ( v4 == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
947 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
948 v18 = pParty->sRotationY - stru_5C6E00->uIntegerHalfPi;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
949 v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
950 v37.x = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
951 v37.y = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
952 Vec3_int_::Rotate(24, v18, 0, v37, &outx, &outy, &outz);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
953 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
954 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
955 if ( v4 == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
956 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
957 v18 = pParty->sRotationY - stru_5C6E00->uIntegerHalfPi;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
958 v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
959 v37.x = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
960 v37.y = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
961 Vec3_int_::Rotate(8, v18, 0, v37, &outx, &outy, &outz);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
962 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
963 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
964 if ( v4 == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
965 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
966 v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
967 v18 = stru_5C6E00->uIntegerHalfPi + pParty->sRotationY;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
968 v37.x = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
969 v37.y = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
970 Vec3_int_::Rotate(8, v18, 0, v37, &outx, &outy, &outz);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
971 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
972 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
973 if ( v4 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
974 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
975 v37.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
976 v18 = stru_5C6E00->uIntegerHalfPi + pParty->sRotationY;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
977 v37.x = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
978 v37.y = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
979 Vec3_int_::Rotate(24, v18, 0, v37, &outx, &outy, &outz);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
980 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
981 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
982 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
983 case OBJECT_Decoration:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
984 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
985 outx = pLevelDecorations[v4].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
986 outy = pLevelDecorations[v4].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
987 outz = pLevelDecorations[v4].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
988 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
989 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
990 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
991 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
992 outz = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
993 outy = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
994 outx = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
995 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
996 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
997 case OBJECT_BModel:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
998 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
999 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1000 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1001 outx = (pIndoor->pFaces[v4].pBounding.x1 + pIndoor->pFaces[v4].pBounding.x2) >> 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1002 outy = (pIndoor->pFaces[v4].pBounding.y1 + pIndoor->pFaces[v4].pBounding.y2) >> 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1003 outz = (pIndoor->pFaces[v4].pBounding.z1 + pIndoor->pFaces[v4].pBounding.z2) >> 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1004 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1005 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1006 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1007 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1008
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1009 switch( PID_TYPE(uObj2ID) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1010 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1011 case OBJECT_Item:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1012 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1013 outx2 = (float)pSpriteObjects[v5].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1014 outy2 =(float) pSpriteObjects[v5].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1015 a4 = pSpriteObjects[v5].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1016 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1017 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1018 case OBJECT_Actor:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1019 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1020 outx2 = (float)pActors[v5].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1021 outy2 = (float)pActors[v5].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1022 a4 = pActors[v5].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v5].uActorHeight * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1023 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1024 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1025 case OBJECT_Player:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1026 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1027 outx2 = (float)pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1028 outy2 = (float)pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1029 if ( !a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1030 a4 = pParty->sEyelevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1031 a4 = pParty->vPosition.z + a4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1032 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1033 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1034 case OBJECT_Decoration:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1035 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1036 outx2 = (float)pLevelDecorations[v5].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1037 outy2 = (float)pLevelDecorations[v5].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1038 a4 = pLevelDecorations[v5].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1039 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1040 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1041 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1042 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1043 outx2 = 0.0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1044 outy2 = 0.0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1045 a4 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1046 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1047 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1048 case OBJECT_BModel:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1049 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1050 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1051 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1052 outx2 = (float)((pIndoor->pFaces[v5].pBounding.x1 + pIndoor->pFaces[v5].pBounding.x2) >> 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1053 outy2 = (float)((pIndoor->pFaces[v5].pBounding.y1 + pIndoor->pFaces[v5].pBounding.y2) >> 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1054 a4 = (pIndoor->pFaces[v5].pBounding.z1 + pIndoor->pFaces[v5].pBounding.z2) >> 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1055 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1056 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1057 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1058 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1059
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1060 v31 = (float)outx2 - (float)outx;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1061 v32 = (float)outy2 - (float)outy;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1062 a4a = (float)a4 - (float)outz;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1063 outx2 = v32 * v32;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1064 outy2 = v31 * v31;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1065 v33 = sqrt(a4a * a4a + outy2 + outx2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1066 if ( v33 <= 1.0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1067 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1068 pOut->vDirection.x = 65536;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1069 pOut->vDirection.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1070 pOut->vDirection.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1071 pOut->uDistance = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1072 pOut->uDistanceXZ = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1073 pOut->uYawAngle = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1074 pOut->uPitchAngle = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1075 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1076 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1077 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1078 pOut->vDirection.x = (int32_t)(1.0 / v33 * v31 * 65536.0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1079 pOut->vDirection.y = (int32_t)(1.0 / v33 * v32 * 65536.0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1080 pOut->vDirection.z = (int32_t)(1.0 / v33 * a4a * 65536.0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1081 pOut->uDistance = (uint)v33;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1082 pOut->uDistanceXZ = (uint)sqrt(outy2 + outx2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1083 pOut->uYawAngle = stru_5C6E00->Atan2((signed __int64)v31, (signed __int64)v32);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1084 pOut->uPitchAngle = stru_5C6E00->Atan2(pOut->uDistanceXZ, (signed __int64)a4a);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1085 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1086 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1087
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1088 //----- (00404030) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1089 void Actor::AI_FaceObject(unsigned int uActorID, unsigned int uObjID, int _48, AIDirection *a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1090 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1091 AIDirection *v7; // eax@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1092 AIDirection v1; // eax@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1093 AIDirection a3; // [sp+8h] [bp-38h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1094
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1095 if ( rand() % 100 >= 5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1096 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1097 //v9 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1098 if ( !a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1099 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1100 Actor::GetDirectionInfo(PID(OBJECT_Actor, uActorID), uObjID, &v1, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1101 v7 = &v1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1102 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1103 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1104 v7 = a4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1105 pActors[uActorID].uYawAngle = v7->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1106 pActors[uActorID].uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1107 pActors[uActorID].vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1108 pActors[uActorID].vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1109 pActors[uActorID].vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1110 pActors[uActorID].uPitchAngle = v7->uPitchAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1111 pActors[uActorID].uCurrentActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1112 pActors[uActorID].uAIState = Interacting;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1113 pActors[uActorID].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1114 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1115 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1116 Actor::AI_Bored(uActorID, uObjID, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1117 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1118
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1119 //----- (00403F58) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1120 void Actor::AI_StandOrBored(unsigned int uActorID, signed int uObjID, int uActionLength, AIDirection *a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1121 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1122 if (rand() % 2)//0 or 1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1123 AI_Bored(uActorID, uObjID, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1124 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1125 AI_Stand(uActorID, uObjID, uActionLength, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1126 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1127
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1128 //----- (00403EB6) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1129 void Actor::AI_Stand(unsigned int uActorID, unsigned int object_to_face_pid, unsigned int uActionLength, AIDirection *a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1130 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1131 assert(uActorID < uNumActors);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1132 // Actor* actor = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1133
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1134 AIDirection a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1135 if (!a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1136 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1137 Actor::GetDirectionInfo(PID(OBJECT_Actor, uActorID), object_to_face_pid, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1138 a4 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1139 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1140
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1141 pActors[uActorID].uAIState = Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1142 if (!uActionLength)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1143 pActors[uActorID].uCurrentActionLength = rand() % 256 + 256;// от 256 до 256 + 256
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1144 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1145 pActors[uActorID].uCurrentActionLength = uActionLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1146 pActors[uActorID].uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1147 pActors[uActorID].uYawAngle = a4->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1148 pActors[uActorID].uPitchAngle = a4->uPitchAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1149 pActors[uActorID].vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1150 pActors[uActorID].vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1151 pActors[uActorID].vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1152 pActors[uActorID].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1153 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1154
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1155 //----- (00403E61) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1156 void __fastcall Actor::StandAwhile(unsigned int uActorID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1157 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1158 pActors[uActorID].uCurrentActionLength = rand() % 128 + 128;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1159 pActors[uActorID].uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1160 pActors[uActorID].uAIState = Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1161 pActors[uActorID].vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1162 pActors[uActorID].vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1163 pActors[uActorID].vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1164 pActors[uActorID].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1165 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1166
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1167 //----- (00403C6C) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1168 void Actor::AI_MeleeAttack(unsigned int uActorID, signed int sTargetPid, struct AIDirection *arg0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1169 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1170 int16_t v6; // esi@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1171 int16_t v7; // edi@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1172 signed int v8; // eax@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1173 Vec3_int_ v10; // ST04_12@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1174 AIDirection *v12; // eax@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1175 AIDirection a3; // [sp+Ch] [bp-48h]@12
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1176 AIDirection v20; // [sp+28h] [bp-2Ch]@12
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1177 int v23; // [sp+4Ch] [bp-8h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1178 unsigned int v25; // [sp+5Ch] [bp+8h]@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1179
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1180 assert(uActorID < uNumActors);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1181
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1182 if ( pActors[uActorID].pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY && pActors[uActorID].pMonsterInfo.uAIType == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1183 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1184 Actor::AI_Stand(uActorID, sTargetPid, 0, arg0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1185 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1186 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1187
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1188 if ( PID_TYPE(sTargetPid) == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1189 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1190 v8 = PID_ID(sTargetPid);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1191 v6 = pActors[v8].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1192 v7 = pActors[v8].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1193 v23 = (int)(pActors[v8].uActorHeight * 0.75 + pActors[v8].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1194 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1195 else if ( PID_TYPE(sTargetPid) == OBJECT_Player)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1196 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1197 v6 = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1198 v7 = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1199 v23 = pParty->vPosition.z + pParty->sEyelevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1200 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1201 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1202 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1203 Error("Should not get here");
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1204 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1205 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1206
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1207 v10.x = pActors[uActorID].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1208 v10.y = pActors[uActorID].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1209 v10.z = (int32_t)(pActors[uActorID].uActorHeight * 0.75 + pActors[uActorID].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1210
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1211 if ( sub_407A1C((int)v6, (int)v7, v23, v10) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1212 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1213 if (arg0 != nullptr)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1214 v12 = arg0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1215 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1216 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1217 Actor::GetDirectionInfo(PID(OBJECT_Actor, uActorID), sTargetPid, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1218 v12 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1219 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1220 pActors[uActorID].uYawAngle = LOWORD(v12->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1221 pActors[uActorID].uCurrentActionLength = pSpriteFrameTable->pSpriteSFrames[pActors[uActorID].pSpriteIDs[ANIM_AtkMelee]].uAnimLength * 8;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1222 pActors[uActorID].uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1223 pActors[uActorID].uAIState = AttackingMelee;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1224 Actor::PlaySound(uActorID, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1225 v25 = pMonsterStats->pInfos[pActors[uActorID].pMonsterInfo.uID].uRecoveryTime;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1226 if ( pActors[uActorID].pActorBuffs[ACTOR_BUFF_SLOWED].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1227 v25 *= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1228 if ( pParty->bTurnBasedModeOn != 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1229 pActors[uActorID].pMonsterInfo.uRecoveryTime = (int)(flt_6BE3A8_debug_recmod2 * v25 * 2.133333333333333);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1230 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1231 pActors[uActorID].pMonsterInfo.uRecoveryTime = v25;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1232 pActors[uActorID].vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1233 pActors[uActorID].vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1234 pActors[uActorID].vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1235 pActors[uActorID].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1236 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1237 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1238 Actor::AI_Pursue1(uActorID, sTargetPid, rand() % 2, 64, arg0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1239 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1240
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1241 //----- (00438CF3) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1242 void Actor::ApplyFineForKillingPeasant(unsigned int uActorID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1243 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1244 if ( uLevelMapStatsID == 0 || !pActors[uActorID].IsPeasant())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1245 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1246
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1247 if ( (uLevelMapStatsID == 6 || uLevelMapStatsID == 7) && pParty->IsPartyEvil()) //celeste and bracada
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1248 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1249
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1250 if ( (uLevelMapStatsID == 5 || uLevelMapStatsID == 8) && pParty->IsPartyGood()) // the pit and deyja
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1251 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1252
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1253 pParty->uFine += 100 * (pMapStats->pInfos[uLevelMapStatsID]._steal_perm + pActors[uActorID].pMonsterInfo.uLevel + pParty->GetPartyReputation());
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1254 if ( pParty->uFine < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1255 pParty->uFine = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1256 if ( pParty->uFine > 4000000 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1257 pParty->uFine = 4000000;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1258
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1259 if (uCurrentlyLoadedLevelType == LEVEL_Outdoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1260 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1261 if (pOutdoor->ddm.uReputation < 10000)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1262 pOutdoor->ddm.uReputation++;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1263 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1264 else if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1265 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1266 if (pIndoor->dlv.uReputation < 10000)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1267 pIndoor->dlv.uReputation++;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1268 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1269 else assert(false);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1270
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1271 if ( pParty->uFine )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1272 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1273 for ( int i = 1; i <= 4; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1274 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1275 if ( !_449B57_test_bit(pPlayers[i]->_achieved_awards_bits, 1) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1276 _449B7E_toggle_bit(pPlayers[i]->_achieved_awards_bits, 1, 1u);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1277 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1278 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1279 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1280
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1281 //----- (0043AE80) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1282 void Actor::AddBloodsplatOnDamageOverlay(unsigned int uActorID, int a2, signed int a3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1283 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1284 unsigned int v4; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1285
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1286 v4 = PID(OBJECT_Actor,uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1287 switch ( a2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1288 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1289 case 1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1290 if ( a3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1291 pOtherOverlayList->_4418B6(904, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1292 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1293 case 2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1294 if ( a3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1295 pOtherOverlayList->_4418B6(905, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1296 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1297 case 3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1298 if ( a3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1299 pOtherOverlayList->_4418B6(906, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1300 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1301 case 4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1302 if ( a3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1303 pOtherOverlayList->_4418B6(907, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1304 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1305 case 5:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1306 pOtherOverlayList->_4418B6(901, v4, 0, PID(OBJECT_Actor,uActorID), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1307 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1308 case 6:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1309 pOtherOverlayList->_4418B6(902, v4, 0, PID(OBJECT_Actor,uActorID), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1310 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1311 case 7:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1312 pOtherOverlayList->_4418B6(903, v4, 0, PID(OBJECT_Actor,uActorID), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1313 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1314 case 8:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1315 pOtherOverlayList->_4418B6(900, v4, 0, PID(OBJECT_Actor,uActorID), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1316 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1317 case 9:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1318 pOtherOverlayList->_4418B6(909, v4, 0, PID(OBJECT_Actor,uActorID), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1319 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1320 case 10:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1321 pOtherOverlayList->_4418B6(908, v4, 0, PID(OBJECT_Actor,uActorID), 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1322 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1323 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1324 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1325 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1326 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1327 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1328
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1329 //----- (0043B3E0) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1330 int Actor::_43B3E0_CalcDamage( signed int dmgSource )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1331 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1332 signed int v2; // ebp@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1333 int v3; // eax@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1334 signed int v4; // edi@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1335 int v5; // esi@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1336 unsigned __int16 v8; // si@21
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1337 int v9; // edi@21
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1338 signed int v10; // eax@23
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1339 int v11; // [sp+10h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1340
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1341 v2 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1342 v11 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1343
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1344 switch( dmgSource )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1345 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1346 case 0:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1347 if ( this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1348 v2 = this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1349 if ( this->pActorBuffs[ACTOR_BUFF_HEROISM].uExpireTime > 0 && this->pActorBuffs[ACTOR_BUFF_HEROISM].uPower > v2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1350 v2 = this->pActorBuffs[ACTOR_BUFF_HEROISM].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1351 if ( this->pActorBuffs[ACTOR_BUFF_PAIN_HAMMERHANDS].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1352 v2 += this->pActorBuffs[ACTOR_BUFF_PAIN_HAMMERHANDS].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1353 v3 = this->pMonsterInfo.uAttack1DamageDiceRolls;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1354 v4 = this->pMonsterInfo.uAttack1DamageDiceSides;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1355 v5 = this->pMonsterInfo.uAttack1DamageBonus;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1356 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1357 case 1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1358 v3 = this->pMonsterInfo.uAttack2DamageDiceRolls;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1359 v4 = this->pMonsterInfo.uAttack2DamageDiceSides;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1360 v5 = this->pMonsterInfo.uAttack2DamageBonus;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1361 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1362 case 2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1363 v8 = this->pMonsterInfo.uSpellSkillAndMastery1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1364 v9 = this->pMonsterInfo.uSpell1ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1365 v10 = SkillToMastery(v8);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1366 return _43AFE3_calc_spell_damage(v9, v8 & 0x3F, v10, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1367 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1368 case 3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1369 v8 = this->pMonsterInfo.uSpellSkillAndMastery2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1370 v9 = this->pMonsterInfo.uSpell2ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1371 v10 = SkillToMastery(v8);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1372 return _43AFE3_calc_spell_damage(v9, v8 & 0x3F, v10, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1373 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1374 case 4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1375 v3 = this->pMonsterInfo.uSpecialAbilityDamageDiceRolls;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1376 v4 = this->pMonsterInfo.uSpecialAbilityDamageDiceSides;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1377 v5 = this->pMonsterInfo.uSpecialAbilityDamageDiceBonus;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1378 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1379 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1380 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1381 for ( int i = 0; i < v3; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1382 v11 += rand() % v4 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1383 return v11 + v5 + v2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1384 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1385
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1386 //----- (00438B9B) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1387 bool Actor::IsPeasant()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1388 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1389 unsigned int InHostile_Id; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1390
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1391 InHostile_Id = this->uAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1392 if ( !this->uAlly )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1393 InHostile_Id = (this->pMonsterInfo.uID - 1) / 3 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1394 return (signed int)InHostile_Id >= 39 && (signed int)InHostile_Id <= 44//Dwarfs peasants
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1395 || (signed int)InHostile_Id >= 45 && (signed int)InHostile_Id <= 50//Elves peasants
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1396 || (signed int)InHostile_Id >= 51 && (signed int)InHostile_Id <= 62//Humans peasants
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1397 || (signed int)InHostile_Id >= 78 && (signed int)InHostile_Id <= 83;//Goblins peasants
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1398 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1399
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1400 //----- (0042EBEE) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1401 void Actor::StealFrom( unsigned int uActorID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1402 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1403 Player *pPlayer; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1404 int v4; // ebx@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1405 unsigned int v5; // eax@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1406 DDM_DLV_Header *v6; // esi@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1407 int v8; // [sp+8h] [bp-4h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1408
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1409 pPlayer = &pParty->pPlayers[uActiveCharacter-1];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1410 if ( pPlayer->CanAct() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1411 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1412 CastSpellInfoHelpers::_427D48();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1413 v4 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1414 v5 = pMapStats->GetMapInfo(pCurrentMapName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1415 if ( v5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1416 v4 = pMapStats->pInfos[v5]._steal_perm;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1417 v6 = &pOutdoor->ddm;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1418 if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1419 v6 = &pIndoor->dlv;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1420 pPlayer->StealFromActor(uActorID, v4, v6->uReputation++);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1421 v8 = pPlayer->GetAttackRecoveryTime(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1422 if ( v8 < 30 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1423 v8 = 30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1424 if ( !pParty->bTurnBasedModeOn )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1425 pPlayer->SetRecoveryTime((int)(flt_6BE3A4_debug_recmod1 * v8 * 2.133333333333333));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1426 pTurnEngine->ApplyPlayerAction();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1427 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1428 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1429 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1430
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1431 //----- (00403A60) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1432 void Actor::AI_SpellAttack2(unsigned int uActorID, signed int edx0, AIDirection *pDir)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1433 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1434 Actor *v3; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1435 int16_t v4; // esi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1436 int16_t v5; // edi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1437 signed int v6; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1438 Vec3_int_ v7; // ST04_12@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1439 AIDirection *v9; // eax@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1440 __int16 v13; // ax@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1441 AIDirection a3; // [sp+Ch] [bp-48h]@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1442 AIDirection v18; // [sp+28h] [bp-2Ch]@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1443 int v19; // [sp+44h] [bp-10h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1444 signed int a2; // [sp+48h] [bp-Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1445 int v21; // [sp+4Ch] [bp-8h]@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1446 unsigned int pDira; // [sp+5Ch] [bp+8h]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1447
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1448 v3 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1449 a2 = edx0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1450 if ( PID_TYPE(edx0) == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1451 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1452 v6 = PID_ID(edx0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1453 v4 = pActors[v6].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1454 v5 = pActors[v6].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1455 v21 = (int)(pActors[v6].uActorHeight * 0.75 + pActors[v6].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1456 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1457 else if ( PID_TYPE(edx0) == OBJECT_Player)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1458 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1459 v4 = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1460 v5 = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1461 v21 = pParty->vPosition.z + pParty->sEyelevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1462 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1463 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1464 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1465 Error("Should not get here");
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1466 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1467 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1468 v19 = v3->uActorHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1469 v7.z = v3->vPosition.z - (int)(v19 * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1470 v7.y = v3->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1471 v7.x = v3->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1472 if ( sub_407A1C(v4, v5, v21, v7) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1473 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1474 if ( pDir == nullptr)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1475 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1476 Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), a2, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1477 v9 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1478 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1479 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1480 v9 = pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1481 v3->uYawAngle = LOWORD(v9->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1482 v13 = pSpriteFrameTable->pSpriteSFrames[v3->pSpriteIDs[ANIM_AtkRanged]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1483 v3->uCurrentActionLength = 8 * v13;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1484 v3->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1485 v3->uAIState = AttackingRanged4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1486 Actor::PlaySound(uActorID, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1487 pDira = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1488 if (v3->pActorBuffs[ACTOR_BUFF_SLOWED].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1489 pDira *= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1490 if ( pParty->bTurnBasedModeOn == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1491 v3->pMonsterInfo.uRecoveryTime = pDira;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1492 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1493 v3->pMonsterInfo.uRecoveryTime = v3->uCurrentActionLength + (int)(flt_6BE3A8_debug_recmod2 * pDira * 2.133333333333333);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1494 v3->vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1495 v3->vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1496 v3->vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1497 if ( ShouldMonsterPlayAttackAnim(v3->pMonsterInfo.uSpell2ID) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1498 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1499 v3->uCurrentActionLength = 64;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1500 v3->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1501 v3->uAIState = Fidgeting;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1502 v3->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1503 v3->uAIState = AttackingRanged4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1504 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1505 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1506 v3->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1507 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1508 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1509 Actor::AI_Pursue1(uActorID, a2, uActorID, 64, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1510 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1511
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1512 //----- (00403854) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1513 void Actor::AI_SpellAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1514 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1515 Actor *v3; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1516 int16_t v4; // esi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1517 int16_t v5; // edi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1518 signed int v6; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1519 Vec3_int_ v7; // ST04_12@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1520 AIDirection *v9; // eax@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1521 __int16 v13; // ax@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1522 signed int v16; // ecx@17
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1523 AIDirection a3; // [sp+Ch] [bp-48h]@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1524 AIDirection v18; // [sp+28h] [bp-2Ch]@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1525 int v19; // [sp+44h] [bp-10h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1526 int v21; // [sp+4Ch] [bp-8h]@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1527 unsigned int pDira; // [sp+5Ch] [bp+8h]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1528
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1529 v3 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1530 if ( PID_TYPE(sTargetPid) == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1531 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1532 v6 = PID_ID(sTargetPid);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1533 v4 = pActors[v6].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1534 v5 = pActors[v6].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1535 v21 = (int)(pActors[v6].uActorHeight * 0.75 + pActors[v6].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1536 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1537 else if ( PID_TYPE(sTargetPid) == OBJECT_Player)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1538 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1539 v4 = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1540 v5 = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1541 v21 = pParty->vPosition.z + pParty->sEyelevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1542 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1543 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1544 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1545 Error("Should not get here");
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1546 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1547 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1548 v19 = v3->uActorHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1549 v7.z = v3->vPosition.z - (int)(v19 * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1550 v7.y = v3->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1551 v7.x = v3->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1552 if ( sub_407A1C(v4, v5, v21, v7) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1553 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1554 if ( pDir == nullptr )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1555 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1556 Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), sTargetPid, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1557 v9 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1558 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1559 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1560 v9 = pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1561 v3->uYawAngle = LOWORD(v9->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1562 v13 = pSpriteFrameTable->pSpriteSFrames[v3->pSpriteIDs[ANIM_AtkRanged]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1563 v3->uCurrentActionLength = 8 * v13;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1564 v3->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1565 v3->uAIState = AttackingRanged3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1566 Actor::PlaySound(uActorID, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1567 pDira = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1568 if (v3->pActorBuffs[ACTOR_BUFF_SLOWED].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1569 pDira *= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1570 if ( pParty->bTurnBasedModeOn == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1571 v3->pMonsterInfo.uRecoveryTime = pDira;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1572 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1573 v3->pMonsterInfo.uRecoveryTime = v3->uCurrentActionLength + (int)(flt_6BE3A8_debug_recmod2 * pDira * 2.133333333333333);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1574 v16 = v3->pMonsterInfo.uSpell1ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1575 v3->vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1576 v3->vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1577 v3->vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1578 if ( ShouldMonsterPlayAttackAnim(v3->pMonsterInfo.uSpell1ID) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1579 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1580 v3->uCurrentActionLength = 64;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1581 v3->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1582 v3->uAIState = Fidgeting;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1583 v3->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1584 v3->uAIState = AttackingRanged3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1585 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1586 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1587 v3->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1588 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1589 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1590 Actor::AI_Pursue1(uActorID, sTargetPid, uActorID, 64, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1591 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1592
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1593 //----- (0040368B) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1594 void Actor::AI_MissileAttack2(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1595 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1596 Actor *v3; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1597 int16_t v4; // esi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1598 int16_t v5; // edi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1599 signed int v6; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1600 Vec3_int_ v7; // ST04_12@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1601 AIDirection *v9; // eax@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1602 __int16 v13; // ax@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1603 AIDirection a3; // [sp+Ch] [bp-48h]@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1604 AIDirection v17; // [sp+28h] [bp-2Ch]@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1605 int v18; // [sp+44h] [bp-10h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1606 int v20; // [sp+4Ch] [bp-8h]@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1607 unsigned int pDira; // [sp+5Ch] [bp+8h]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1608
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1609 v3 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1610 if ( PID_TYPE(sTargetPid) == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1611 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1612 v6 = PID_ID(sTargetPid);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1613 v4 = pActors[v6].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1614 v5 = pActors[v6].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1615 v20 = (int)(pActors[v6].uActorHeight * 0.75 + pActors[v6].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1616 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1617 else if ( PID_TYPE(sTargetPid) == OBJECT_Player)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1618 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1619 v4 = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1620 v5 = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1621 v20 = pParty->vPosition.z + pParty->sEyelevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1622 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1623 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1624 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1625 Error("Should not get here");
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1626 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1627 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1628 v18 = v3->uActorHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1629 v7.z = v3->vPosition.z - (int)(v18 * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1630 v7.y = v3->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1631 v7.x = v3->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1632 if ( sub_407A1C(v4, v5, v20, v7) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1633 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1634 if ( pDir == nullptr )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1635 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1636 Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), sTargetPid, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1637 v9 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1638 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1639 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1640 v9 = pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1641 v3->uYawAngle = LOWORD(v9->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1642 v13 = pSpriteFrameTable->pSpriteSFrames[v3->pSpriteIDs[ANIM_AtkRanged]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1643 v3->uCurrentActionLength = 8 * v13;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1644 v3->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1645 v3->uAIState = AttackingRanged2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1646 Actor::PlaySound(uActorID, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1647 pDira = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1648 if ( v3->pActorBuffs[ACTOR_BUFF_SLOWED].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1649 pDira *= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1650 if ( pParty->bTurnBasedModeOn != 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1651 v3->pMonsterInfo.uRecoveryTime = (int)(flt_6BE3A8_debug_recmod2 * pDira * 2.133333333333333);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1652 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1653 v3->pMonsterInfo.uRecoveryTime = pDira;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1654 v3->vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1655 v3->vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1656 v3->vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1657 v3->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1658 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1659 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1660 Actor::AI_Pursue1(uActorID, sTargetPid, uActorID, 64, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1661 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1662
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1663 //----- (00403476) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1664 void Actor::AI_MissileAttack1(unsigned int uActorID, signed int sTargetPid, AIDirection *pDir)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1665 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1666 Actor *v3; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1667 int v4; // esi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1668 int v5; // edi@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1669 signed int v6; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1670 Vec3_int_ v7; // ST04_12@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1671 AIDirection *v10; // eax@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1672 __int16 v14; // ax@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1673 AIDirection a3; // [sp+Ch] [bp-48h]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1674 AIDirection v18; // [sp+28h] [bp-2Ch]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1675 int v19; // [sp+44h] [bp-10h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1676 //signed int a2; // [sp+48h] [bp-Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1677 int v22; // [sp+50h] [bp-4h]@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1678 unsigned int pDira; // [sp+5Ch] [bp+8h]@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1679
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1680 v3 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1681 //a2 = edx0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1682 if ( PID_TYPE(sTargetPid) == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1683 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1684 v6 = PID_ID(sTargetPid);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1685 v4 = pActors[v6].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1686 v5 = pActors[v6].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1687 v22 = (int)(pActors[v6].uActorHeight * 0.75 + pActors[v6].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1688 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1689 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1690 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1691 if ( PID_TYPE(sTargetPid) == OBJECT_Player)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1692 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1693 v4 = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1694 v5 = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1695 v22 = pParty->vPosition.z + pParty->sEyelevel;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1696 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1697 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1698 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1699 v4 = (int)pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1700 v5 = (int)pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1701 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1702 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1703 v19 = v3->uActorHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1704 v7.z = v3->vPosition.z - (unsigned int)(signed __int64)((double)v19 * -0.75);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1705 v7.y = v3->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1706 v7.x = v3->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1707 if ( sub_407A1C(v4, v5, v22, v7) || sub_407A1C(v7.x, v7.y, v7.z, Vec3_int_(v4, v5, v22)))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1708 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1709 if ( pDir == nullptr )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1710 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1711 Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), sTargetPid, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1712 v10 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1713 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1714 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1715 v10 = pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1716 v3->uYawAngle = LOWORD(v10->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1717 v14 = pSpriteFrameTable->pSpriteSFrames[v3->pSpriteIDs[ANIM_AtkRanged]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1718 v3->uCurrentActionLength = 8 * v14;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1719 v3->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1720 v3->uAIState = AttackingRanged1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1721 Actor::PlaySound(uActorID, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1722 pDira = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uRecoveryTime;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1723 if ( v3->pActorBuffs[ACTOR_BUFF_SLOWED].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1724 pDira *= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1725 if ( pParty->bTurnBasedModeOn == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1726 v3->pMonsterInfo.uRecoveryTime = pDira;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1727 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1728 v3->pMonsterInfo.uRecoveryTime = v3->uCurrentActionLength - (int)(flt_6BE3A8_debug_recmod2 * pDira * -2.133333333333333);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1729 v3->vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1730 v3->vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1731 v3->vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1732 v3->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1733 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1734 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1735 Actor::AI_Pursue1(uActorID, sTargetPid, uActorID, 64, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1736 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1737
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1738 //----- (004032B2) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1739 void Actor::AI_RandomMove( unsigned int uActor_id, unsigned int uTarget_id, int radius, int uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1740 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1741 int x; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1742 int absy; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1743 unsigned int v9; // ebx@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1744 int v10; // ebx@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1745 AIDirection doNotInitializeBecauseShouldBeRandom; // [sp+Ch] [bp-30h]@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1746 int y; // [sp+30h] [bp-Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1747 int absx; // [sp+38h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1748
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1749 x = pActors[uActor_id].vInitialPosition.x - pActors[uActor_id].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1750 y = pActors[uActor_id].vInitialPosition.y - pActors[uActor_id].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1751 absx = abs(x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1752 absy = abs(y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1753 if ( absx <= absy )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1754 absx = absy + (absx / 2 );
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1755 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1756 absx = absx + absy / 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1757 if ( MonsterStats::BelongsToSupertype(pActors[uActor_id].pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1758 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1759 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1760 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1761 Actor::AI_StandOrBored(uActor_id, OBJECT_Player, uActionLength, &doNotInitializeBecauseShouldBeRandom);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1762 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1763 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1764 if ( pActors[uActor_id].pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_GLOBAL && absx < 128 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1765 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1766 Actor::AI_Stand(uActor_id, uTarget_id, 256, &doNotInitializeBecauseShouldBeRandom);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1767 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1768 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1769 absx += ((rand() & 0xF) * radius) / 16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1770 v9 = (stru_5C6E00->uIntegerDoublePi - 1) & stru_5C6E00->Atan2(x, y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1771 if ( rand() % 100 < 25 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1772 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1773 Actor::StandAwhile(uActor_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1774 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1775 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1776 v10 = v9 + rand() % 256 - 128;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1777 if ( abs(v10 - pActors[uActor_id].uYawAngle) > 256 && !(pActors[uActor_id].uAttributes & ACTOR_ANIMATION) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1778 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1779 Actor::AI_Stand(uActor_id, uTarget_id, 256, &doNotInitializeBecauseShouldBeRandom);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1780 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1781 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1782 pActors[uActor_id].uYawAngle = v10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1783 if ( pActors[uActor_id].uMovementSpeed)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1784 pActors[uActor_id].uCurrentActionLength = 32 * absx / pActors[uActor_id].uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1785 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1786 pActors[uActor_id].uCurrentActionLength = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1787 pActors[uActor_id].uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1788 pActors[uActor_id].uAIState = Tethered;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1789 if ( rand() % 100 < 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1790 Actor::PlaySound(uActor_id, 3);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1791 pActors[uActor_id].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1792 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1793
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1794 //----- (004031C1) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1795 char __fastcall Actor::_4031C1_update_job_never_gets_called(unsigned int uActorID, signed int a2, int a3) //attempted to implement something like jobs for actors, but apparently was never finished
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1796 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1797 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1798 /*unsigned int v3; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1799 Actor *v4; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1800 ActorJob *v5; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1801 signed int v6; // edx@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1802 ActorJob *v7; // eax@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1803 signed int v8; // edi@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1804 ActorJob *v9; // ecx@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1805 __int16 v10; // cx@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1806 signed int v12; // [sp+8h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1807
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1808 v3 = uActorID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1809 v12 = a2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1810 v4 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1811 v5 = (ActorJob *)pActors[uActorID].CanAct();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1812 if ( v5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1813 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1814 v6 = 65535;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1815 v7 = &v4->pScheduledJobs[v3];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1816 v8 = 7;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1817 v9 = &v7[7];//(char *)&v7[7].uHour;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1818 while ( !(v9->uAttributes & 1) || v9->uHour > v12 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1819 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1820 --v8;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1821 --v9;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1822 if ( v8 < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1823 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1824 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1825 if( v8 >= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1826 v6 = v8;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1827 if ( !v8 && v6 == 65535 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1828 v6 = 7;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1829 v5 = &v7[v6];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1830 if ( v4->vInitialPosition.x != v5->vPos.x
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1831 || v4->vInitialPosition.y != v5->vPos.y
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1832 || v4->vInitialPosition.z != v5->vPos.z
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1833 || v4->pMonsterInfo.uMovementType != v5->uAction )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1834 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1835 v4->vInitialPosition.x = v5->vPos.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1836 v4->vInitialPosition.y = v5->vPos.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1837 v10 = v5->vPos.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1838 v4->vInitialPosition.z = v10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1839 LOBYTE(v5) = v5->uAction;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1840 v4->pMonsterInfo.uMovementType = MONSTER_MOVEMENT_TYPE_STAIONARY;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1841 if ( a3 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1842 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1843 v4->vPosition.x = v4->vInitialPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1844 v4->vPosition.y = v4->vInitialPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1845 LOBYTE(v5) = v10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1846 v4->vPosition.z = v10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1847 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1848 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1849 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1850 return (char)v5;*/
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1851 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1852
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1853 //----- (004030AD) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1854 void Actor::AI_Stun(unsigned int uActorID, signed int edx0, int stunRegardlessOfState)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1855 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1856 __int16 v7; // ax@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1857 AIDirection a3; // [sp+Ch] [bp-40h]@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1858
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1859 if ( pActors[uActorID].uAIState == Fleeing )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1860 pActors[uActorID].uAttributes |= ACTOR_FLEEING;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1861 if ( pActors[uActorID].pMonsterInfo.uHostilityType != 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1862 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1863 pActors[uActorID].uAttributes &= 0xFFFFFFFB;//~0x4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1864 pActors[uActorID].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1865 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1866 if ( pActors[uActorID].pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1867 pActors[uActorID].pActorBuffs[ACTOR_BUFF_CHARM].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1868 if ( pActors[uActorID].pActorBuffs[ACTOR_BUFF_AFRAID].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1869 pActors[uActorID].pActorBuffs[ACTOR_BUFF_AFRAID].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1870 if ( stunRegardlessOfState || (pActors[uActorID].uAIState != Stunned
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1871 && pActors[uActorID].uAIState != AttackingRanged1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1872 && pActors[uActorID].uAIState != AttackingRanged2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1873 && pActors[uActorID].uAIState != AttackingRanged3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1874 && pActors[uActorID].uAIState != AttackingRanged4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1875 && pActors[uActorID].uAIState != AttackingMelee))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1876 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1877 Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), edx0, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1878 //v10 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1879 pActors[uActorID].uYawAngle = LOWORD(a3.uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1880 v7 = pSpriteFrameTable->pSpriteSFrames[pActors[uActorID].pSpriteIDs[ANIM_GotHit]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1881 pActors[uActorID].uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1882 pActors[uActorID].uAIState = Stunned;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1883 pActors[uActorID].uCurrentActionLength = 8 * v7;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1884 Actor::PlaySound(uActorID, 2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1885 pActors[uActorID].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1886 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1887 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1888
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1889 //----- (00402F87) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1890 void Actor::AI_Bored(unsigned int uActorID, unsigned int uObjID, AIDirection *a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1891 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1892 unsigned int v7; // eax@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1893 unsigned int v9; // eax@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1894
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1895 Actor* actor = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1896
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1897 AIDirection a3; // [sp+Ch] [bp-5Ch]@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1898 if (!a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1899 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1900 Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), uObjID, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1901 a4 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1902 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1903
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1904 actor->uCurrentActionLength = 8 * pSpriteFrameTable->pSpriteSFrames[actor->pSpriteIDs[ANIM_Bored]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1905
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1906 v7 = stru_5C6E00->Atan2(actor->vPosition.x - pEngine->pIndoorCameraD3D->vPartyPos.x, actor->vPosition.y - pEngine->pIndoorCameraD3D->vPartyPos.y);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1907 v9 = stru_5C6E00->uIntegerPi + actor->uYawAngle + ((signed int)stru_5C6E00->uIntegerPi >> 3) - v7;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1908
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1909 if ( v9 & 0x700 ) // turned away - just stand
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1910 Actor::AI_Stand(uActorID, uObjID, actor->uCurrentActionLength, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1911 else // facing player - play bored anim
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1912 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1913 actor->uAIState = Fidgeting;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1914 actor->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1915 actor->uYawAngle = a4->uYawAngle;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1916 actor->vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1917 actor->vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1918 actor->vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1919 if ( rand() % 100 < 5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1920 Actor::PlaySound(uActorID, 3);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1921 actor->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1922 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1923 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1924
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1925 //----- (00402F27) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1926 void Actor::Resurrect(unsigned int uActorID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1927 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1928 Actor *pActor; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1929
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1930 pActor = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1931 pActor->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1932 pActor->uAIState = Resurrected;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1933 pActor->uCurrentActionAnimation = ANIM_Dying;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1934 pActor->uCurrentActionLength = 8 * pSpriteFrameTable->pSpriteSFrames[pActor->pSpriteIDs[ANIM_Dying]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1935 pActor->sCurrentHP = LOWORD(pActor->pMonsterInfo.uHP);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1936 Actor::PlaySound(uActorID, 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1937 pActor->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1938 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1939
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1940 //----- (00402D6E) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1941 void Actor::Die(unsigned int uActorID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1942 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1943 Actor* actor = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1944
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1945 actor->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1946 actor->uAIState = Dying;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1947 actor->uCurrentActionAnimation = ANIM_Dying;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1948 actor->sCurrentHP = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1949 actor->uCurrentActionLength = 8 * pSpriteFrameTable->pSpriteSFrames[actor->pSpriteIDs[ANIM_Dying]].uAnimLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1950 actor->pActorBuffs[ACTOR_BUFF_PARALYZED].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1951 actor->pActorBuffs[ACTOR_BUFF_STONED].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1952 Actor::PlaySound(uActorID, 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1953 actor->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1954
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1955 for (uint i = 0; i < 5; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1956 if (pParty->monster_id_for_hunting[i] == actor->pMonsterInfo.uID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1957 pParty->monster_for_hunting_killed[i] = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1958
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1959 for (uint i = 0; i < 22; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1960 actor->pActorBuffs[i].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1961
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1962 ItemGen drop;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1963 drop.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1964 switch (actor->pMonsterInfo.uID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1965 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1966 case MONSTER_HARPY_1: case MONSTER_HARPY_2: case MONSTER_HARPY_3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1967 drop.uItemID = ITEM_HARPY_FEATHER;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1968 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1969
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1970 case MONSTER_OOZE_1: case MONSTER_OOZE_2: case MONSTER_OOZE_3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1971 drop.uItemID = ITEM_OOZE_ECTOPLASM_BOTTLE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1972 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1973
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1974 case MONSTER_TROLL_1: case MONSTER_TROLL_2: case MONSTER_TROLL_3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1975 drop.uItemID = ITEM_TROLL_BLOOD;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1976 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1977
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1978 case MONSTER_DEVIL_1: case MONSTER_DEVIL_2: case MONSTER_DEVIL_3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1979 drop.uItemID = ITEM_DEVIL_ICHOR;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1980 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1981
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1982 case MONSTER_DRAGON_1: case MONSTER_DRAGON_2: case MONSTER_DRAGON_3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1983 drop.uItemID = ITEM_DRAGON_EYE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1984 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1985 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1986
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1987 if (rand() % 100 < 20 && drop.uItemID != 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1988 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1989 SpriteObject::sub_42F7EB_DropItemAt(pItemsTable->pItems[drop.uItemID].uSpriteID,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1990 actor->vPosition.x,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1991 actor->vPosition.y,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1992 actor->vPosition.z + 16,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1993 rand() % 200 + 200,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1994 1,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1995 1,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1996 0,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1997 &drop);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1998 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
1999
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2000 if (actor->pMonsterInfo.uSpecialAbilityType == MONSTER_SPECIAL_ABILITY_EXPLODE)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2001 Actor::Explode(uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2002 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2003
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2004 //----- (00402CED) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2005 void Actor::PlaySound(unsigned int uActorID, unsigned int uSoundID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2006 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2007 unsigned __int16 v3; // dx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2008
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2009 v3 = pActors[uActorID].pSoundSampleIDs[uSoundID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2010 if ( v3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2011 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2012 if ( pActors[uActorID].pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2013 pAudioPlayer->PlaySound((SoundID)v3, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2014 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2015 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2016 switch(pActors[uActorID].pActorBuffs[ACTOR_BUFF_SHRINK].uPower)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2017 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2018 case 1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2019 pAudioPlayer->PlaySound((SoundID)v3, PID(OBJECT_Actor, uActorID), 0, 0, 0, 0, 0, 33075);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2020 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2021 case 2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2022 pAudioPlayer->PlaySound((SoundID)v3, PID(OBJECT_Actor, uActorID), 0, 0, 0, 0, 0, 33075);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2023 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2024 case 3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2025 case 4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2026 pAudioPlayer->PlaySound((SoundID)v3, PID(OBJECT_Actor, uActorID), 0, 0, 0, 0, 0, 33075);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2027 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2028 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2029 pAudioPlayer->PlaySound((SoundID)v3, PID(OBJECT_Actor, uActorID), 0, -1, 0, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2030 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2031 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2032 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2033 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2034 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2035
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2036 //----- (00402AD7) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2037 void Actor::AI_Pursue1(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, AIDirection *pDir)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2038 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2039 int v6; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2040 Actor *v7; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2041 unsigned int v8; // ecx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2042 AIDirection *v10; // esi@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2043 AIDirection a3; // [sp+Ch] [bp-5Ch]@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2044 unsigned int v18; // [sp+64h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2045
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2046 v6 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2047 v7 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2048 v8 = PID(OBJECT_Actor,uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2049 if ( v7->pMonsterInfo.uFlying != 0 && !pParty->bFlying ) //TODO: Does v6 have a point?
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2050 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2051 if ( v7->pMonsterInfo.uMissleAttack1Type )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2052 v6 = v7->uActorRadius + 512;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2053 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2054 v6 = pParty->uPartyHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2055 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2056
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2057 if ( pDir == nullptr )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2058 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2059 Actor::GetDirectionInfo(v8, a2, &a3, v6);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2060 v10 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2061 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2062 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2063 v10 = pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2064 if ( MonsterStats::BelongsToSupertype(v7->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2065 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2066 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2067 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2068 Actor::AI_StandOrBored(uActorID, 4, uActionLength, v10);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2069 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2070 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2071 if ( v10->uDistance < 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2072 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2073 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2074 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2075 Actor::AI_Stand(uActorID, a2, uActionLength, v10);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2076 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2077 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2078 if ( v7->uMovementSpeed == 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2079 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2080 Actor::AI_Stand(uActorID, a2, uActionLength, v10);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2081 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2082 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2083 if ( arg0 % 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2084 v18 = -16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2085 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2086 v18 = 16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2087
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2088 v7->uYawAngle = stru_5C6E00->Atan2(
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2089 pParty->vPosition.x + (int)fixpoint_mul(stru_5C6E00->Cos(v18 + stru_5C6E00->uIntegerPi + v10->uYawAngle), v10->uDistanceXZ) - v7->vPosition.x,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2090 pParty->vPosition.y + (int)fixpoint_mul(stru_5C6E00->Sin(v18 + stru_5C6E00->uIntegerPi + v10->uYawAngle), v10->uDistanceXZ) - v7->vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2091 if ( uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2092 v7->uCurrentActionLength = uActionLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2093 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2094 v7->uCurrentActionLength = 128;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2095 v7->uPitchAngle = LOWORD(v10->uPitchAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2096 v7->uAIState = Pursuing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2097 v7->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2098 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2099
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2100 //----- (00402968) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2101 void Actor::AI_Flee(unsigned int uActorID, signed int sTargetPid, int uActionLength, AIDirection *a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2102 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2103 Actor *v5; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2104 int v7; // ecx@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2105 unsigned __int16 v9; // ax@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2106 AIDirection v10; // [sp+8h] [bp-7Ch]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2107 AIDirection a3; // [sp+24h] [bp-60h]@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2108 AIDirection* v13; // [sp+5Ch] [bp-28h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2109
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2110 v5 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2111 if ( v5->CanAct() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2112 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2113 v7 = PID(OBJECT_Actor,uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2114 if ( !a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2115 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2116 Actor::GetDirectionInfo(v7, sTargetPid, &a3, v5->pMonsterInfo.uFlying);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2117 a4 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2118 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2119 Actor::GetDirectionInfo(v7, 4u, &v10, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2120 v13 = &v10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2121 if ( MonsterStats::BelongsToSupertype(v5->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2122 || PID_TYPE(sTargetPid) == OBJECT_Actor && v13->uDistance < 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2123 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2124 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2125 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2126 Actor::AI_StandOrBored(uActorID, 4, uActionLength, v13);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2127 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2128 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2129 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2130 if ( v5->uMovementSpeed )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2131 v5->uCurrentActionLength = (signed int)(a4->uDistanceXZ << 7) / v5->uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2132 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2133 v5->uCurrentActionLength = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2134 if ( v5->uCurrentActionLength > 256 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2135 v5->uCurrentActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2136 v5->uYawAngle = LOWORD(stru_5C6E00->uIntegerHalfPi) + LOWORD(a4->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2137 v5->uYawAngle = LOWORD(stru_5C6E00->uDoublePiMask) & (v5->uYawAngle + rand() % (signed int)stru_5C6E00->uIntegerPi);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2138 v9 = LOWORD(a4->uPitchAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2139 v5->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2140 v5->uPitchAngle = v9;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2141 v5->uAIState = Fleeing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2142 v5->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2143 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2144 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2145 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2146
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2147 //----- (0040281C) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2148 void Actor::AI_Pursue2(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *pDir, int a5)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2149 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2150 int v6; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2151 Actor *v7; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2152 unsigned int v8; // ecx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2153 AIDirection *v10; // esi@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2154 signed __int16 v13; // cx@19
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2155 unsigned __int16 v14; // ax@25
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2156 AIDirection a3; // [sp+Ch] [bp-40h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2157 AIDirection v18; // [sp+28h] [bp-24h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2158
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2159 v6 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2160 v7 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2161 v8 = PID(OBJECT_Actor,uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2162 if ( v7->pMonsterInfo.uFlying != 0 && !pParty->bFlying )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2163 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2164 if ( v7->pMonsterInfo.uMissleAttack1Type && uCurrentlyLoadedLevelType == LEVEL_Outdoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2165 v6 = v7->uActorRadius + 512;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2166 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2167 v6 = pParty->uPartyHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2168 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2169 v10 = pDir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2170 if ( !pDir )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2171 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2172 Actor::GetDirectionInfo(v8, a2, &a3, v6);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2173 v10 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2174 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2175 if ( MonsterStats::BelongsToSupertype(v7->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2176 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2177 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2178 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2179 Actor::AI_StandOrBored(uActorID, 4, uActionLength, v10);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2180 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2181 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2182 if ( (signed int)v10->uDistance < a5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2183 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2184 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2185 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2186 Actor::AI_StandOrBored(uActorID, a2, uActionLength, v10);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2187 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2188 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2189 if ( uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2190 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2191 v7->uCurrentActionLength = uActionLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2192 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2193 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2194 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2195 v13 = v7->uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2196 if ( v13 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2197 v7->uCurrentActionLength = (signed int)(v10->uDistanceXZ << 7) / v13;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2198 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2199 v7->uCurrentActionLength = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2200 if ( v7->uCurrentActionLength > 32 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2201 v7->uCurrentActionLength = 32;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2202 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2203 v7->uYawAngle = LOWORD(v10->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2204 v14 = LOWORD(v10->uPitchAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2205 v7->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2206 v7->uPitchAngle = v14;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2207 v7->uAIState = Pursuing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2208 v7->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2209 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2210
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2211 //----- (00402686) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2212 void Actor::AI_Pursue3(unsigned int uActorID, unsigned int a2, signed int uActionLength, AIDirection *a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2213 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2214 int v5; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2215 Actor *v6; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2216 int v7; // ecx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2217 signed __int16 v12; // cx@19
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2218 __int16 v14; // ax@25
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2219 unsigned __int16 v16; // ax@28
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2220 AIDirection a3; // [sp+Ch] [bp-40h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2221 AIDirection* v20; // [sp+28h] [bp-24h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2222
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2223 v5 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2224 v6 = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2225 v7 = PID(OBJECT_Actor,uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2226 if ( v6->pMonsterInfo.uFlying != 0 && !pParty->bFlying )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2227 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2228 if ( v6->pMonsterInfo.uMissleAttack1Type && uCurrentlyLoadedLevelType == LEVEL_Outdoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2229 v5 = v6->uActorRadius + 512;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2230 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2231 v5 = pParty->uPartyHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2232 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2233 if ( !a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2234 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2235 Actor::GetDirectionInfo(v7, a2, &a3, v5);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2236 v20 = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2237 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2238 if ( MonsterStats::BelongsToSupertype(v6->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2239 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2240 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2241 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2242 return Actor::AI_StandOrBored(uActorID, 4, uActionLength, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2243 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2244 if ( a4->uDistance < 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2245 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2246 if ( !uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2247 uActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2248 return Actor::AI_StandOrBored(uActorID, a2, uActionLength, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2249 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2250 if ( uActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2251 v6->uCurrentActionLength = uActionLength + rand() % uActionLength;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2252 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2253 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2254 v12 = v6->uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2255 if ( v12 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2256 v6->uCurrentActionLength = (signed int)(a4->uDistanceXZ << 7) / v12;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2257 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2258 v6->uCurrentActionLength = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2259 if ( v6->uCurrentActionLength > 128 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2260 v6->uCurrentActionLength = 128;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2261 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2262 v14 = LOWORD(a4->uYawAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2263 if ( rand() % 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2264 v14 += 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2265 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2266 v14 -= 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2267 v6->uYawAngle = v14;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2268 v16 = LOWORD(a4->uPitchAngle);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2269 v6->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2270 v6->uPitchAngle = v16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2271 v6->uAIState = Pursuing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2272 if ( rand() % 100 < 2 )
2506
9b96a51011fb for sound
Ritor1
parents: 2502
diff changeset
2273 Actor::PlaySound(uActorID, 2);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2274 v6->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2275 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2276
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2277 //----- (00401221) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2278 void Actor::_SelectTarget(unsigned int uActorID, int *a2, bool can_target_party)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2279 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2280 int v5; // ecx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2281 signed int v10; // eax@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2282 uint v11; // ebx@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2283 uint v12; // eax@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2284 signed int v14; // eax@31
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2285 uint v15; // edi@43
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2286 uint v16; // ebx@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2287 uint v17; // eax@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2288 signed int closestId; // [sp+14h] [bp-1Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2289 uint v23; // [sp+1Ch] [bp-14h]@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2290 unsigned int lowestRadius; // [sp+24h] [bp-Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2291 uint v27; // [sp+2Ch] [bp-4h]@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2292 uint v28; // [sp+2Ch] [bp-4h]@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2293
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2294 lowestRadius = UINT_MAX;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2295 v5 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2296 *a2 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2297 closestId = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2298 assert(uActorID < uNumActors);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2299 Actor* thisActor = &pActors[uActorID];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2300
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2301 for (uint i = 0; i < uNumActors; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2302 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2303 Actor* actor = &pActors[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2304 if (actor->uAIState == Dead || actor->uAIState == Dying ||
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2305 actor->uAIState == Removed || actor->uAIState == Summoned || actor->uAIState == Disabled || uActorID == i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2306 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2307
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2308 if (thisActor->uLastCharacterIDToHit == 0 || PID(OBJECT_Actor,v5) != thisActor->uLastCharacterIDToHit )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2309 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2310 v10 = thisActor->GetActorsRelation(actor);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2311 if ( v10 == 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2312 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2313 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2314 else if (thisActor->IsNotAlive())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2315 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2316 thisActor->uLastCharacterIDToHit = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2317 v10 = thisActor->GetActorsRelation(actor);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2318 if ( v10 == 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2319 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2320 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2321 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2322 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2323 if ( (actor->uGroup != 0 || thisActor->uGroup != 0) && actor->uGroup == thisActor->uGroup )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2324 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2325 v10 = 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2326 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2327 if ( thisActor->pMonsterInfo.uHostilityType )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2328 v10 = pMonsterStats->pInfos[thisActor->pMonsterInfo.uID].uHostilityType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2329 v11 = _4DF380_hostilityRanges[v10];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2330 v23 = abs(thisActor->vPosition.x - actor->vPosition.x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2331 v27 = abs(thisActor->vPosition.y - actor->vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2332 v12 = abs(thisActor->vPosition.z - actor->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2333 if ( v23 <= v11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2334 && v27 <= v11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2335 && v12 <= v11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2336 && sub_4070EF_prolly_detect_player(PID(OBJECT_Actor, i), PID(OBJECT_Actor, uActorID))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2337 && v23 * v23 + v27 * v27 + v12 * v12 < lowestRadius )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2338 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2339 lowestRadius = v23 * v23 + v27 * v27 + v12 * v12;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2340 closestId = i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2341 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2342 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2343
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2344 if ( lowestRadius != UINT_MAX )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2345 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2346 *a2 = PID(OBJECT_Actor, closestId);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2347 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2348
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2349 if (can_target_party && !pParty->Invisible())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2350 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2351 if ( thisActor->ActorEnemy()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2352 && thisActor->pActorBuffs[ACTOR_BUFF_ENSLAVED].uExpireTime <= 0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2353 && thisActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime <= 0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2354 && thisActor->pActorBuffs[ACTOR_BUFF_SUMMONED].uExpireTime <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2355 v14 = 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2356 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2357 v14 = thisActor->GetActorsRelation(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2358 if ( v14 != 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2359 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2360 if ( !thisActor->pMonsterInfo.uHostilityType )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2361 v15 = _4DF380_hostilityRanges[v14];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2362 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2363 v15 = _4DF380_hostilityRanges[4];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2364 v16 = abs(thisActor->vPosition.x - pParty->vPosition.x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2365 v28 = abs(thisActor->vPosition.y - pParty->vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2366 v17 = abs(thisActor->vPosition.z - pParty->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2367 if ( v16 <= v15 && v28 <= v15 && v17 <= v15 && (v16 * v16 + v28 * v28 + v17 * v17 < lowestRadius))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2368 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2369 *a2 = OBJECT_Player;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2370 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2371 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2372 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2373 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2374 // 4DF380: using guessed type int dword_4DF380[];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2375 // 4DF390: using guessed type int dword_4DF390;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2376
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2377 //----- (0040104C) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2378 signed int Actor::GetActorsRelation(Actor *otherActPtr)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2379 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2380 unsigned int thisGroup; // ebp@19
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2381 int otherGroup; // eax@22
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2382 unsigned int thisAlly; // edx@25
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2383 unsigned int otherAlly; // edx@33
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2384
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2385 if ( otherActPtr)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2386 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2387 if ( otherActPtr->uGroup != 0 && this->uGroup != 0 && otherActPtr->uGroup == this->uGroup )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2388 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2389 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2390
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2391 if (this->pActorBuffs[ACTOR_BUFF_BERSERK].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2392 return 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2393 thisAlly = this->uAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2394 if ( this->pActorBuffs[ACTOR_BUFF_ENSLAVED].uExpireTime > 0 || thisAlly == 9999)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2395 thisGroup = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2396 else if ( thisAlly > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2397 thisGroup = thisAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2398 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2399 thisGroup = (this->pMonsterInfo.uID - 1) / 3 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2400
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2401 if ( otherActPtr )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2402 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2403 if (otherActPtr->pActorBuffs[ACTOR_BUFF_BERSERK].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2404 return 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2405 otherAlly = otherActPtr->uAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2406 if ( otherActPtr->pActorBuffs[ACTOR_BUFF_ENSLAVED].uExpireTime > 0 || otherAlly == 9999)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2407 otherGroup = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2408 else if ( otherAlly > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2409 otherGroup = otherAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2410 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2411 otherGroup = (otherActPtr->pMonsterInfo.uID - 1) / 3 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2412 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2413 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2414 otherGroup = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2415
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2416 if ( this->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 && !otherGroup
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2417 || otherActPtr && otherActPtr->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 && !thisGroup )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2418 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2419 if ( this->pActorBuffs[ACTOR_BUFF_ENSLAVED].uExpireTime <= 0 && this->ActorEnemy() && !otherGroup )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2420 return 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2421 if (thisGroup >= 89 || otherGroup >= 89)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2422 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2423
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2424 if ( thisGroup == 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2425 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2426 if ( (!otherActPtr || this->pActorBuffs[ACTOR_BUFF_ENSLAVED].uExpireTime > 0 && otherActPtr->ActorFriend()) && !pFactionTable->relations[otherGroup][0])
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2427 return pFactionTable->relations[0][otherGroup];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2428 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2429 return 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2430 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2431 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2432 return pFactionTable->relations[thisGroup][otherGroup];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2433 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2434
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2435 //----- (0045976D) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2436 void Actor::UpdateAnimation()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2437 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2438 ResetAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2439 switch (uAIState)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2440 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2441 case Tethered:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2442 uCurrentActionAnimation = ANIM_Walking;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2443 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2444
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2445 case AttackingMelee:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2446 uCurrentActionAnimation = ANIM_AtkMelee;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2447 uAttributes |= ACTOR_ANIMATION;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2448 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2449
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2450 case AttackingRanged1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2451 case AttackingRanged2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2452 case AttackingRanged3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2453 case AttackingRanged4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2454 uCurrentActionAnimation = ANIM_AtkRanged;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2455 uAttributes |= ACTOR_ANIMATION;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2456 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2457
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2458 case Dying:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2459 case Resurrected:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2460 uCurrentActionAnimation = ANIM_Dying;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2461 uAttributes |= ACTOR_ANIMATION;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2462 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2463
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2464 case Pursuing:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2465 case Fleeing:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2466 uCurrentActionAnimation = ANIM_Walking;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2467 uAttributes |= ACTOR_ANIMATION;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2468 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2469
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2470 case Stunned:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2471 uCurrentActionAnimation = ANIM_GotHit;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2472 uAttributes |= ACTOR_ANIMATION;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2473 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2474
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2475 case Fidgeting:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2476 uCurrentActionAnimation = ANIM_Bored;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2477 uAttributes |= ACTOR_ANIMATION;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2478 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2479
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2480 case Standing:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2481 case Interacting:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2482 case Summoned:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2483 uCurrentActionAnimation = ANIM_Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2484 uAttributes |= ACTOR_ANIMATION;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2485 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2486
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2487 case Dead:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2488 if (pSpriteFrameTable->pSpriteSFrames[pSpriteIDs[ANIM_Dead]].pHwSpriteIDs[0] <= 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2489 uAIState = Removed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2490 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2491 uCurrentActionAnimation = ANIM_Dead;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2492 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2493
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2494 case Removed:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2495 case Disabled:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2496 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2498 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2499 assert(false);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2500 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2501 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2502
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2503 //----- (00459671) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2504 void Actor::Reset()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2505 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2506 this->pActorName[0] = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2507 this->word_000086_some_monster_id = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2508 this->sNPC_ID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2509 this->vPosition.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2510 this->vPosition.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2511 this->vPosition.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2512 this->vVelocity.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2513 this->vVelocity.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2514 this->vVelocity.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2515 this->uYawAngle = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2516 this->uPitchAngle = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2517 this->uAttributes = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2518 this->uSectorID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2519 this->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2520 this->vInitialPosition.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2521 this->vInitialPosition.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2522 this->vInitialPosition.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2523 this->vGuardingPosition.z = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2524 this->vGuardingPosition.y = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2525 this->vGuardingPosition.x = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2526 this->uTetherDistance = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2527 this->uActorRadius = 32;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2528 this->uActorHeight = 128;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2529 this->uAIState = Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2530 this->uCurrentActionAnimation = ANIM_Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2531 this->uMovementSpeed = 200;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2532 this->uCarriedItemID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2533 this->uGroup = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2534 this->uAlly = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2535 this->uSummonerID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2536 this->uLastCharacterIDToHit = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2537 this->dword_000334_unique_name = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2538 memset(this->pSpriteIDs, 0, sizeof(pSpriteIDs));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2539 memset(this->pActorBuffs, 0, 0x160u);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2540 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2541
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2542 //----- (0045959A) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2543 void Actor::PrepareSprites(char load_sounds_if_bit1_set)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2544 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2545
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2546 MonsterDesc *v3; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2547 MonsterInfo *v9; // [sp+84h] [bp-10h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2548
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2549 v3 = &pMonsterList->pMonsters[pMonsterInfo.uID - 1];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2550 v9 = &pMonsterStats->pInfos[pMonsterInfo.uID - 1 + 1];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2551 //v12 = pSpriteIDs;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2552 //Source = (char *)v3->pSpriteNames;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2553 //do
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2554 for (uint i = 0; i < 8; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2555 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2556 //strcpy(pSpriteName, v3->pSpriteNames[i]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2557 pSpriteIDs[i] = pSpriteFrameTable->FastFindSprite(v3->pSpriteNames[i]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2558 pSpriteFrameTable->InitializeSprite(pSpriteIDs[i]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2559 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2560 uActorHeight = v3->uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2561 uActorRadius = v3->uMonsterRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2562 uMovementSpeed = v9->uBaseSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2563 if ( !(load_sounds_if_bit1_set & 1) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2564 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2565 for ( int i = 0; i < 4; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2566 pSoundSampleIDs[i] = v3->pSoundSampleIDs[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2567 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2568 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2569
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2570 //----- (00459667) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2571 void Actor::Remove()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2572 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2573 this->uAIState = Removed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2574 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2575
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2576
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2577 //----- (0043B1B0) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2578 void Actor::ActorDamageFromMonster(signed int attacker_id, unsigned int actor_id, Vec3_int_ *pVelocity, signed int a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2579 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2580 int v4; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2581 int dmgToRecv; // qax@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2582 signed int v12; // ecx@20
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2583 int finalDmg; // edi@30
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2584 int pushDistance; // [sp+20h] [bp+Ch]@34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2585
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2586 v4 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2587 if ( PID_TYPE(attacker_id) == OBJECT_Item)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2588 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2589 v4 = pSpriteObjects[PID_ID(attacker_id)].field_60_distance_related_prolly_lod;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2590 attacker_id = pSpriteObjects[PID_ID(attacker_id)].spell_caster_pid;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2591 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2592 if ( PID_TYPE(attacker_id) == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2593 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2594 if ( !pActors[actor_id].IsNotAlive() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2595 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2596 pActors[actor_id].uLastCharacterIDToHit = attacker_id;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2597 if ( pActors[actor_id].uAIState == Fleeing )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2598 pActors[actor_id].uAttributes |= ACTOR_FLEEING;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2599 if ( pActors[PID_ID(attacker_id)]._4273BB_DoesHitOtherActor(&pActors[actor_id], v4, 0) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2600 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2601 dmgToRecv = pActors[PID_ID(attacker_id)]._43B3E0_CalcDamage(a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2602 if ( pActors[PID_ID(attacker_id)].pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2603 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2604 if ( pActors[PID_ID(attacker_id)].pActorBuffs[ACTOR_BUFF_SHRINK].uPower )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2605 dmgToRecv = dmgToRecv / pActors[PID_ID(attacker_id)].pActorBuffs[ACTOR_BUFF_SHRINK].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2606 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2607 if ( pActors[actor_id].pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2608 dmgToRecv = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2609 if ( a4 == 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2610 v12 = pActors[PID_ID(attacker_id)].pMonsterInfo.uAttack1Type;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2611 else if ( a4 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2612 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2613 v12 = pActors[PID_ID(attacker_id)].pMonsterInfo.uAttack2Type;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2614 if ( SHIDWORD(pActors[actor_id].pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime) > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2615 dmgToRecv = dmgToRecv / 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2616 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2617 else if ( a4 == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2618 v12 = pSpellStats->pInfos[pActors[actor_id].pMonsterInfo.uSpell1ID].uSchool;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2619 else if ( a4 == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2620 v12 = pSpellStats->pInfos[pActors[actor_id].pMonsterInfo.uSpell2ID].uSchool;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2621 else if ( a4 == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2622 v12 = pActors[PID_ID(attacker_id)].pMonsterInfo.field_3C_some_special_attack;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2623 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2624 v12 = 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2625 finalDmg = pActors[actor_id].CalcMagicalDamageToActor((DAMAGE_TYPE)v12, dmgToRecv);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2626 pActors[actor_id].sCurrentHP -= finalDmg;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2627 if ( finalDmg )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2628 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2629 if ( pActors[actor_id].sCurrentHP > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2630 Actor::AI_Stun(actor_id, attacker_id, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2631 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2632 Actor::Die(actor_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2633 Actor::AggroSurroundingPeasants(actor_id, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2634 pushDistance = 20 * finalDmg / pActors[actor_id].pMonsterInfo.uHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2635 if ( pushDistance > 10 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2636 pushDistance = 10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2637 if ( !MonsterStats::BelongsToSupertype(pActors[actor_id].pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2638 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2639 pVelocity->x = (int32)fixpoint_mul(pushDistance, pVelocity->x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2640 pVelocity->y = (int32)fixpoint_mul(pushDistance, pVelocity->y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2641 pVelocity->z = (int32)fixpoint_mul(pushDistance, pVelocity->z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2642 pActors[actor_id].vVelocity.x = 50 * LOWORD(pVelocity->x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2643 pActors[actor_id].vVelocity.y = 50 * LOWORD(pVelocity->y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2644 pActors[actor_id].vVelocity.z = 50 * LOWORD(pVelocity->z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2645 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2646 Actor::AddBloodsplatOnDamageOverlay(actor_id, 1, finalDmg);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2647 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2648 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2649 Actor::AI_Stun(actor_id, attacker_id, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2650 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2651 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2652 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2653 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2654 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2655
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2656 //----- (0044FD29) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2657 void Actor::SummonMinion( int summonerId )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2658 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2659 unsigned __int8 extraSummonLevel; // al@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2660 int summonMonsterBaseType; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2661 int v5; // edx@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2662 int v7; // edi@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2663 Actor *actor; // esi@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2664 MonsterInfo *v9; // ebx@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2665 //MonsterDesc *v10; // edi@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2666 int v13; // ebx@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2667 int v15; // edi@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2668 int v17; // ebx@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2669 unsigned int v19; // qax@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2670 int result; // eax@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2671 unsigned int monsterId; // [sp+10h] [bp-18h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2672 int v27; // [sp+18h] [bp-10h]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2673 int actorSector; // [sp+1Ch] [bp-Ch]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2674
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2675
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2676 actorSector = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2677 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2678 actorSector = pIndoor->GetSector(this->vPosition.x, this->vPosition.y, this->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2679
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2680 v19 = this->uAlly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2681 if ( !this->uAlly )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2682 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2683 monsterId = this->pMonsterInfo.uID - 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2684 v19 = (uint)(monsterId * 0.33333334);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2685 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2686 v27 = uCurrentlyLoadedLevelType == LEVEL_Outdoor ? 128 : 64;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2687 v13 = rand() % 2048;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2688 v15 = fixpoint_mul(stru_5C6E00->Cos(v13), v27) + this->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2689 v17 = fixpoint_mul(stru_5C6E00->Sin(v13), v27) + this->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2690
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2691 if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2692 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2693 result = pIndoor->GetSector(v15, v17, this->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2694 if (result != actorSector)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2695 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2696 result = BLV_GetFloorLevel(v15, v17, v27, result, &monsterId);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2697 if (result != -30000)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2698 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2699 if (abs(result - v27) > 1024)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2700 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2701 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2702
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2703 extraSummonLevel = this->pMonsterInfo.uSpecialAbilityDamageDiceRolls;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2704 summonMonsterBaseType = this->pMonsterInfo.field_3C_some_special_attack;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2705 if ( extraSummonLevel )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2706 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2707 if ( extraSummonLevel >= 1 && extraSummonLevel <= 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2708 summonMonsterBaseType = summonMonsterBaseType + extraSummonLevel - 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2709 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2710 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2711 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2712 v5 = rand() % 100;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2713 if ( v5 >= 90 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2714 summonMonsterBaseType += 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2715 else if ( v5 >= 60 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2716 summonMonsterBaseType += 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2717 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2718 v7 = summonMonsterBaseType - 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2719 actor = &pActors[uNumActors];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2720 v9 = &pMonsterStats->pInfos[v7 + 1];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2721 pActors[uNumActors].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2722 strcpy(actor->pActorName, v9->pName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2723 actor->sCurrentHP = LOWORD(v9->uHP);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2724 memcpy(&actor->pMonsterInfo, v9, sizeof(actor->pMonsterInfo));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2725 actor->word_000086_some_monster_id = summonMonsterBaseType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2726 actor->uActorRadius = pMonsterList->pMonsters[v7].uMonsterRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2727 actor->uActorHeight = pMonsterList->pMonsters[v7].uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2728 actor->pMonsterInfo.uTreasureDiceRolls = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2729 actor->pMonsterInfo.uTreasureType = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2730 actor->pMonsterInfo.uExp = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2731 actor->uMovementSpeed = pMonsterList->pMonsters[v7].uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2732
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2733 actor->vInitialPosition.x = v15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2734 actor->vInitialPosition.y = v17;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2735 actor->vInitialPosition.z = this->vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2736 actor->vPosition.x = v15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2737 actor->vPosition.y = v17;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2738 actor->vPosition.z = this->vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2739
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2740 actor->uTetherDistance = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2741 actor->uSectorID = actorSector;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2742 actor->PrepareSprites(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2743 actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2744 actor->uAlly = v19;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2745 actor->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2746 actor->uGroup = this->uGroup;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2747 actor->uAIState = Summoned;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2748 actor->uCurrentActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2749 actor->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2750
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2751 ++uNumActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2752 ++this->pMonsterInfo.uSpecialAbilityDamageDiceBonus;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2753 if ( ActorEnemy())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2754 actor->uAttributes |= ACTOR_AGGRESSOR;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2755 actor->uSummonerID = PID(OBJECT_Actor,summonerId);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2756
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2757 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2758 // 46DF1A: using guessed type int __fastcall 46DF1A_collide_against_actor(int, int);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2759 //----- (0046DF1A) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2760 bool Actor::_46DF1A_collide_against_actor( int a1, int a2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2761 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2762 Actor *v2; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2763 unsigned __int16 v3; // ax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2764 int v4; // esi@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2765 int v8; // ecx@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2766 int v9; // eax@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2767 int v10; // ebx@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2768 int v11; // esi@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2769 int v12; // ebx@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2770 int v13; // ebx@17
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2771
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2772 v2 = &pActors[a1];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2773 v3 = v2->uAIState;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2774 if ( v3 == Removed || v3 == Dying || v3 == Disabled || v3 == Dead || v3 == Summoned )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2775 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2776 v4 = v2->uActorRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2777 if ( a2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2778 v4 = a2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2779
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2780 if (stru_721530.sMaxX > v2->vPosition.x + v4 ||
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2781 stru_721530.sMinX < v2->vPosition.x - v4 ||
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2782 stru_721530.sMaxY > v2->vPosition.y + v4 ||
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2783 stru_721530.sMinY < v2->vPosition.y - v4 ||
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2784 stru_721530.sMaxZ > v2->vPosition.z + v2->uActorHeight ||
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2785 stru_721530.sMinZ < v2->vPosition.z)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2786 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2787 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2788 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2789 v8 = v2->vPosition.x - stru_721530.normal.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2790 v9 = v2->vPosition.y - stru_721530.normal.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2791 v10 = stru_721530.prolly_normal_d + v4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2792 v11 = (v8 * stru_721530.direction.y - v9 * stru_721530.direction.x) >> 16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2793 v12 = (v8 * stru_721530.direction.x + v9 * stru_721530.direction.y) >> 16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2794 if ( abs(v11) > v10 || v12 <= 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2795 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2796 if (fixpoint_mul(stru_721530.direction.z, v12) + stru_721530.normal.z < v2->vPosition.z)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2797 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2798
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2799 v13 = v12 - integer_sqrt(v10 * v10 - v11 * v11);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2800 if ( v13 < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2801 v13 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2802 if ( v13 < stru_721530.field_7C )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2803 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2804 stru_721530.field_7C = v13;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2805 stru_721530.uFaceID = PID(OBJECT_Actor,a1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2806 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2807 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2808 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2809 //----- (00401A91) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2810 void Actor::UpdateActorAI()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2811 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2812 signed int v4; // edi@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2813 signed int sDmg; // eax@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2814 Player *pPlayer; // ecx@21
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2815 Actor *pActor; // esi@34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2816 //unsigned __int16 v22; // ax@86
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2817 unsigned int v27; // ecx@123
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2818 unsigned int v28; // eax@123
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2819 int v33; // eax@144
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2820 int v34; // eax@147
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2821 char v35; // al@150
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2822 unsigned int v36; // edi@152
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2823 signed int v37; // eax@154
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2824 double v42; // st7@176
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2825 double v43; // st6@176
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2826 int v45; // eax@192
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2827 unsigned __int8 v46; // cl@197
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2828 signed int v47; // st7@206
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2829 uint v58; // st7@246
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2830 unsigned int v65; // [sp-10h] [bp-C0h]@144
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2831 int v70; // [sp-10h] [bp-C0h]@213
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2832 AIDirection v72; // [sp+0h] [bp-B0h]@246
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2833 AIDirection a3; // [sp+1Ch] [bp-94h]@129
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2834 int target_pid_type; // [sp+70h] [bp-40h]@83
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2835 signed int a1; // [sp+74h] [bp-3Ch]@129
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2836 int v78; // [sp+78h] [bp-38h]@79
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2837 AIDirection* pDir; // [sp+7Ch] [bp-34h]@129
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2838 float radiusMultiplier; // [sp+98h] [bp-18h]@33
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2839 int v81; // [sp+9Ch] [bp-14h]@100
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2840 signed int target_pid; // [sp+ACh] [bp-4h]@83
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2841 AIState uAIState;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2842 uint v38;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2843
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2844 //Build AI array
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2845 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2846 Actor::MakeActorAIList_ODM();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2847 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2848 Actor::MakeActorAIList_BLV();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2849
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2850 //Armageddon damage mechanic
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2851 if ( uCurrentlyLoadedLevelType != LEVEL_Indoor && pParty->armageddon_timer > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2852 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2853 if ( pParty->armageddon_timer > 417 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2854 pParty->armageddon_timer = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2855 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2856 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2857 pParty->sRotationY = (stru_5C6E00->uIntegerDoublePi - 1) & (pParty->sRotationY + rand() % 16 - 8);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2858 pParty->sRotationX = pParty->sRotationX + rand() % 16 - 8;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2859 if ( pParty->sRotationX > 128)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2860 pParty->sRotationX = 128;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2861 else if ( pParty->sRotationX < -128 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2862 pParty->sRotationX = -128;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2863
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2864 pParty->uFlags |= 2u;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2865 pParty->armageddon_timer -= pMiscTimer->uTimeElapsed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2866 v4 = pParty->armageddonDamage + 50;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2867 if ( pParty->armageddon_timer <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2868 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2869 pParty->armageddon_timer = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2870 for(size_t i = 0; i < uNumActors; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2871 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2872 pActor=&pActors[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2873 if ( pActor->CanAct() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2874 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2875 sDmg = pActor->CalcMagicalDamageToActor((DAMAGE_TYPE)5, v4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2876 pActor->sCurrentHP -= sDmg;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2877 if ( sDmg )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2878 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2879 if ( pActor->sCurrentHP >= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2880 Actor::AI_Stun(i, 4, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2881 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2882 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2883 Actor::Die(i);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2884 if ( pActor->pMonsterInfo.uExp )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2885 pParty->GivePartyExp(pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uExp);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2886 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2887 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2888 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2889 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2890 for(int i = 1; i <= 4; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2891 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2892 pPlayer = pPlayers[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2893 if ( !pPlayer->pConditions[Condition_Dead] && !pPlayer->pConditions[Condition_Pertified] && !pPlayer->pConditions[Condition_Eradicated] )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2894 pPlayer->ReceiveDamage(v4, DMGT_MAGICAL);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2895 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2896 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2897 if (pTurnEngine->pending_actions)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2898 --pTurnEngine->pending_actions;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2899 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2900 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2901
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2902 //Turn-based mode: return
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2903 if (pParty->bTurnBasedModeOn)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2904 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2905 pTurnEngine->AITurnBasedAction();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2906 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2907 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2908
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2909 for (uint i = 0; i < uNumActors; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2910 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2911 pActor = &pActors[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2912 ai_near_actors_targets_pid[i] = OBJECT_Player;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2913
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2914 //Skip actor if: Dead / Removed / Disabled / uAttributes & 0x0400
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2915 if (pActor->uAIState == Dead || pActor->uAIState == Removed || pActor->uAIState == Disabled || pActor->uAttributes & ACTOR_ALIVE)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2916 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2917
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2918 //Kill actor if HP == 0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2919 if (!pActor->sCurrentHP && pActor->uAIState != Dying)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2920 Actor::Die(i);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2921
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2922 //Kill buffs if expired
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2923 for (uint j = 0; j < 22; ++j)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2924 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2925 if (j != 10)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2926 pActor->pActorBuffs[j].IsBuffExpiredToTime(pParty->uTimePlayed);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2927 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2928
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2929 //If shrink expired: reset height
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2930 if (pActor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2931 pActor->uActorHeight = pMonsterList->pMonsters[pActor->pMonsterInfo.uID - 1].uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2932
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2933 //If Charm still active: make actor friendly
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2934 if (pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2935 pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2936 //Else: reset hostilty
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2937 else if (pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2938 pActor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uHostilityType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2939
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2940 //If actor Paralyzed or Stoned: skip
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2941 if (pActor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime > 0 || pActor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2942 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2943
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2944 //Calculate RecoveryTime
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2945 pActor->pMonsterInfo.uRecoveryTime = max(pActor->pMonsterInfo.uRecoveryTime - pMiscTimer->uTimeElapsed, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2946
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2947 pActor->uCurrentActionTime += pMiscTimer->uTimeElapsed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2948 if (pActor->uCurrentActionTime < pActor->uCurrentActionLength)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2949 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2950
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2951 if (pActor->uAIState == Dying)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2952 pActor->uAIState = Dead;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2953 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2954 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2955 if (pActor->uAIState != Summoned)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2956 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2957 Actor::AI_StandOrBored(i, OBJECT_Player, 256, nullptr);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2958 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2959 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2960 pActor->uAIState = Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2961 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2962
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2963 pActor->uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2964 pActor->uCurrentActionLength = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2965 pActor->UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2966 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2967
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2968 for(v78 = 0; v78 < ai_arrays_size; ++v78)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2969 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2970 uint actor_id = ai_near_actors_ids[v78];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2971 assert(actor_id < uNumActors);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2972
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2973 pActor = &pActors[actor_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2974
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2975 v47 = (signed int)(pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2976
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2977 Actor::_SelectTarget(actor_id, &ai_near_actors_targets_pid[actor_id], true);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2978
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2979 if (pActor->pMonsterInfo.uHostilityType && !ai_near_actors_targets_pid[actor_id])
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2980 pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2981
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2982 target_pid = ai_near_actors_targets_pid[actor_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2983 target_pid_type = PID_TYPE(target_pid);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2984
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2985 if ( target_pid_type == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2986 radiusMultiplier = 0.5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2987 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2988 radiusMultiplier = 1.0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2989
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2990 //v22 = pActor->uAIState;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2991 if ( pActor->uAIState == Dying || pActor->uAIState == Dead || pActor->uAIState == Removed
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2992 || pActor->uAIState == Disabled || pActor->uAIState == Summoned)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2993 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2994
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2995 if ( !pActor->sCurrentHP )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2996 Actor::Die(actor_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2997
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2998 for( int i = 0;i < 22; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
2999 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3000 if ( i != 10 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3001 pActor->pActorBuffs[i].IsBuffExpiredToTime(pParty->uTimePlayed);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3002 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3003
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3004 if ( pActor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3005 pActor->uActorHeight = pMonsterList->pMonsters[pActor->pMonsterInfo.uID - 1].uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3006 if ( pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3007 pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3008 else if ( pActor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3009 pActor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uHostilityType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3010
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3011 //If actor is summoned and buff expired: continue and set state to Removed
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3012 if ( pActor->pActorBuffs[ACTOR_BUFF_SUMMONED].uExpireTime < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3013 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3014 pActor->uAIState = Removed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3015 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3016 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3017
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3018 if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0 || (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3019 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3020 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3021 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3022
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3023 v27 = pMiscTimer->uTimeElapsed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3024 v28 = pActor->pMonsterInfo.uRecoveryTime;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3025 pActor->uCurrentActionTime += pMiscTimer->uTimeElapsed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3026
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3027 if ( (signed int)v28 > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3028 pActor->pMonsterInfo.uRecoveryTime = v28 - v27;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3029 if ( pActor->pMonsterInfo.uRecoveryTime < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3030 pActor->pMonsterInfo.uRecoveryTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3031 if ( !pActor->ActorNearby() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3032 pActor->uAttributes |= ACTOR_NEARBY;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3033
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3034 a1 = PID(OBJECT_Actor,actor_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3035 Actor::GetDirectionInfo(PID(OBJECT_Actor,actor_id), target_pid, &a3, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3036 pDir = &a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3037 uAIState = pActor->uAIState;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3038
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3039 if ( pActor->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3040 || (signed int)pActor->pMonsterInfo.uRecoveryTime > 0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3041 || radiusMultiplier * 307.2 < pDir->uDistance
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3042 || uAIState != Pursuing && uAIState != Standing && uAIState != Tethered && uAIState != Fidgeting
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3043 && !pActor->pMonsterInfo.uMissleAttack1Type || uAIState != Stunned )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3044 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3045 if ( (signed int)pActor->uCurrentActionTime < pActor->uCurrentActionLength )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3046 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3047 else if ( pActor->uAIState == AttackingMelee )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3048 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3049 v35 = pActor->special_ability_use_check(actor_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3050 AttackerInfo.Add(a1, 5120, pActor->vPosition.x, pActor->vPosition.y, pActor->vPosition.z + ((signed int)pActor->uActorHeight >> 1), v35, 1 );
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3051 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3052 else if ( pActor->uAIState == AttackingRanged1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3053 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3054 v34 = pActor->pMonsterInfo.uMissleAttack1Type;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3055 Actor::AI_RangedAttack(actor_id, pDir, v34, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3056 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3057 else if ( pActor->uAIState == AttackingRanged2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3058 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3059 v34 = pActor->pMonsterInfo.uMissleAttack2Type;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3060 Actor::AI_RangedAttack(actor_id, pDir, v34, 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3061 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3062 else if ( pActor->uAIState == AttackingRanged3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3063 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3064 v65 = pActor->pMonsterInfo.uSpellSkillAndMastery1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3065 v33 = pActor->pMonsterInfo.uSpell1ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3066 Actor::AI_SpellAttack(actor_id, pDir, v33, 2, v65);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3067 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3068 else if ( pActor->uAIState == AttackingRanged4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3069 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3070 v65 = pActor->pMonsterInfo.uSpellSkillAndMastery2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3071 v33 = pActor->pMonsterInfo.uSpell2ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3072 Actor::AI_SpellAttack(actor_id, pDir, v33, 3, v65);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3073 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3074 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3075
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3076 v36 = pDir->uDistance;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3077
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3078 if ( pActor->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3079 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3080 if ( target_pid_type == OBJECT_Actor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3081 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3082 v36 = pDir->uDistance;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3083 v37 =pFactionTable->relations[(pActor->pMonsterInfo.uID-1) / 3 + 1][(pActors[PID_ID(target_pid)].pMonsterInfo.uID - 1) / 3 + 1];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3084 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3085 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3086 v37 = 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3087 v38 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3088 if ( v37 == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3089 v38 = 1024;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3090 else if ( v37 == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3091 v38 = 2560;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3092 else if ( v37 == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3093 v38 = 5120;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3094 if ( v37 >= 1 && v37 <= 4 && v36 < v38 || v37 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3095 pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3096 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3097
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3098 //If actor afraid: flee or if out of range random move
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3099 if (pActor->pActorBuffs[ACTOR_BUFF_AFRAID].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3100 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3101 if ( (signed int)v36 >= 10240 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3102 Actor::AI_RandomMove(actor_id, target_pid, 1024, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3103 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3104 Actor::AI_Flee(actor_id, target_pid, 0, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3105 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3106 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3107
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3108 if ( pActor->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Long && target_pid )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3109 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3110 if ( pActor->pMonsterInfo.uAIType == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3111 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3112 if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3113 Actor::AI_Stand(actor_id, target_pid, (uint)(pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333), pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3114 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3115 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3116 Actor::AI_Flee(actor_id, target_pid, 0, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3117 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3118 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3119
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3120 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3121 if ( !(pActor->uAttributes & ACTOR_FLEEING) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3122 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3123 if ( pActor->pMonsterInfo.uAIType == 2 || pActor->pMonsterInfo.uAIType == 3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3124 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3125 if ( pActor->pMonsterInfo.uAIType == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3126 v43 = (double)(signed int)pActor->pMonsterInfo.uHP * 0.2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3127 if ( pActor->pMonsterInfo.uAIType == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3128 v43 = (double)(signed int)pActor->pMonsterInfo.uHP * 0.1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3129 v42 = (double)pActor->sCurrentHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3130 if ( v43 > v42 && (signed int)v36 < 10240 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3131 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3132 Actor::AI_Flee(actor_id, target_pid, 0, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3133 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3134 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3135 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3136 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3137
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3138 v81 = v36 - pActor->uActorRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3139 if ( target_pid_type == OBJECT_Actor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3140 v81 -= pActors[PID_ID(target_pid)].uActorRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3141 if ( v81 < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3142 v81 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3143 rand();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3144 pActor->uAttributes &= ~ACTOR_UNKNOW5;//~0x40000
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3145 if ( v81 < 5120 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3146 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3147 v45 = pActor->special_ability_use_check(actor_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3148 if ( v45 == 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3149 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3150 if ( pActor->pMonsterInfo.uMissleAttack1Type )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3151 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3152 if ( (signed int)pActor->pMonsterInfo.uRecoveryTime <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3153 Actor::AI_MissileAttack1(actor_id, target_pid, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3154 else if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3155 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3156 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3157 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3158 if ( radiusMultiplier * 307.2 > (double)v81 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3159 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3160 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3161 Actor::AI_Pursue1(actor_id, target_pid, actor_id, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3162 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3163 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3164 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3165 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3166 if ( (double)v81 >= radiusMultiplier * 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3167 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3168 if (pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3169 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3170 else if ( v81 >= 1024 )//monsters
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3171 Actor::AI_Pursue3(actor_id, target_pid, 0, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3172 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3173 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3174 v70 = (signed int)(radiusMultiplier * 307.2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3175 //monsters
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3176 //guard after player runs away
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3177 // follow player
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3178 Actor::AI_Pursue2(actor_id, target_pid, 0, pDir, v70);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3179 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3180 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3181 else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3182 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3183 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3184 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3185 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3186 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3187 //monsters
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3188 Actor::AI_MeleeAttack(actor_id, target_pid, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3189 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3190 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3191 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3192 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3193 else if ( v45 == 2 || v45 == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3194 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3195 if ( v45 == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3196 v46 = pActor->pMonsterInfo.uSpell1ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3197 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3198 v46 = pActor->pMonsterInfo.uSpell2ID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3199 if ( v46 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3200 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3201 if ( (signed int)pActor->pMonsterInfo.uRecoveryTime <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3202 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3203 if ( v45 == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3204 Actor::AI_SpellAttack1(actor_id, target_pid, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3205 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3206 Actor::AI_SpellAttack2(actor_id, target_pid, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3207 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3208 else if ( radiusMultiplier * 307.2 > (double)v81 || pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3209 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3210 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3211 Actor::AI_Pursue1(actor_id, target_pid, actor_id, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3212 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3213 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3214 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3215 if ( (double)v81 >= radiusMultiplier * 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3216 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3217 if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3218 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3219 else if ( v81 >= 1024 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3220 Actor::AI_Pursue3(actor_id, target_pid, 256, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3221 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3222 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3223 v70 = (signed int)(radiusMultiplier * 307.2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3224 Actor::AI_Pursue2(actor_id, target_pid, 0, pDir, v70);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3225 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3226 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3227 else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3228 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3229 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3230 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3231 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3232 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3233 Actor::AI_MeleeAttack(actor_id, target_pid, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3234 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3235 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3236 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3237 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3238 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3239 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3240
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3241 if ( pActor->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Long || !target_pid || v81 >= 5120 || v45 != 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3242 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3243 if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_SHORT )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3244 Actor::AI_RandomMove(actor_id, 4, 1024, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3245 else if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_MEDIUM )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3246 Actor::AI_RandomMove(actor_id, 4, 2560, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3247 else if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_LONG )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3248 Actor::AI_RandomMove(actor_id, 4, 5120, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3249 else if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_FREE )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3250 Actor::AI_RandomMove(actor_id, 4, 10240, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3251 else if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3252 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3253 Actor::GetDirectionInfo(a1, 4, &v72, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3254 v58 = (uint)(pActor->pMonsterInfo.uRecoveryTime * 2.133333333333333);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3255 Actor::AI_Stand(actor_id, 4, v58, &v72);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3256 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3257 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3258 else if ( !pActor->pMonsterInfo.uMissleAttack2Type )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3259 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3260 if ( (double)v81 >= radiusMultiplier * 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3261 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3262 if ( pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3263 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3264 else if ( v81 >= 1024 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3265 Actor::AI_Pursue3(actor_id, target_pid, 256, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3266 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3267 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3268 v70 = (int)(radiusMultiplier * 307.2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3269 Actor::AI_Pursue2(actor_id, target_pid, 0, pDir, v70);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3270 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3271 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3272 else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3273 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3274 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3275 Actor::AI_MeleeAttack(actor_id, target_pid, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3276 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3277 else if ( (signed int)pActor->pMonsterInfo.uRecoveryTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3278 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3279 if ( radiusMultiplier * 307.2 > (double)v81 || pActor->pMonsterInfo.uMovementType == MONSTER_MOVEMENT_TYPE_STAIONARY )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3280 Actor::AI_Stand(actor_id, target_pid, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3281 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3282 Actor::AI_Pursue1(actor_id, target_pid, actor_id, v47, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3283 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3284 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3285 Actor::AI_MissileAttack2(actor_id, target_pid, pDir);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3286 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3287 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3288 //----- (0044665D) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3289 // uType: 0 -> any monster
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3290 // 1 -> uParam is GroupID
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3291 // 2 -> uParam is MonsterID
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3292 // 3 -> uParam is ActorID
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3293 // uNumAlive: 0 -> all must be alive
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3294 int __fastcall IsActorAlive(unsigned int uType, unsigned int uParam, unsigned int uNumAlive)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3295 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3296 unsigned int uAliveActors; // eax@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3297 unsigned int uTotalActors; // [sp+0h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3298
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3299 uTotalActors = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3300 if ( uType )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3301 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3302 if ( uType == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3303 uAliveActors = Actor::SearchActorByGroup(&uTotalActors, uParam);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3304 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3305 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3306 if ( uType == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3307 uAliveActors = Actor::SearchActorByMonsterID(&uTotalActors, uParam);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3308 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3309 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3310 if ( uType != 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3311 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3312 uAliveActors = Actor::SearchActorByID(&uTotalActors, uParam);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3313 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3314 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3315 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3316 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3317 uAliveActors = Actor::SearchAliveActors(&uTotalActors);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3318
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3319 if (uNumAlive)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3320 return uAliveActors >= uNumAlive;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3321 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3322 return uTotalActors == uAliveActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3323 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3324 //----- (00408B54) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3325 unsigned int Actor::SearchActorByID(unsigned int *pTotalActors, unsigned int a2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3326 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3327 //int v4; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3328 unsigned int result; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3329
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3330 //v4 = GetAlertStatus();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3331 *pTotalActors = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3332 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3333 if ( (pActors[a2].uAttributes & ACTOR_UNKNOW7) == GetAlertStatus() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3334 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3335 *pTotalActors = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3336 if ( pActors[a2].IsNotAlive() == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3337 result = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3338 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3339 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3340 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3341 //----- (00408AE7) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3342 unsigned int Actor::SearchActorByGroup(unsigned int *pTotalActors, unsigned int uGroup)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3343 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3344 unsigned int result; // [sp+10h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3345
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3346 int v8 = GetAlertStatus();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3347 *pTotalActors = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3348 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3349 for ( uint i = 0; i < uNumActors; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3350 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3351 if ( (pActors[i].uAttributes & ACTOR_UNKNOW7) == v8 && pActors[i].uGroup == uGroup)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3352 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3353 ++*pTotalActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3354 if ( pActors[i].IsNotAlive() == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3355 ++result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3356 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3357 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3358 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3359 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3360 //----- (00408A7E) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3361 unsigned int Actor::SearchActorByMonsterID(unsigned int *pTotalActors, int uMonsterID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3362 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3363 int v8; // [sp+Ch] [bp-8h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3364 unsigned int result; // [sp+10h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3365
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3366 v8 = GetAlertStatus();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3367 *pTotalActors = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3368 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3369 for ( uint i = 0; i < uNumActors; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3370 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3371 if ( (pActors[i].uAttributes & ACTOR_UNKNOW7) == v8 && pActors[i].pMonsterInfo.field_33 == uMonsterID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3372 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3373 ++*pTotalActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3374 if ( pActors[i].IsNotAlive() == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3375 ++result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3376 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3377 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3378 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3379 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3380 //----- (00408A27) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3381 unsigned int Actor::SearchAliveActors(unsigned int *pTotalActors)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3382 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3383 int v2; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3384 unsigned int result; // ebp@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3385
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3386 v2 = GetAlertStatus();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3387 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3388 *pTotalActors = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3389 for ( uint i = 0; i < uNumActors; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3390 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3391 if ( (pActors[i].uAttributes & ACTOR_UNKNOW7) == v2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3392 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3393 ++*pTotalActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3394 if ( pActors[i].IsNotAlive() == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3395 ++result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3396 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3397 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3398 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3399 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3400 //----- (00408768) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3401 void Actor::InitializeActors()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3402 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3403 bool evil; // [sp+Ch] [bp-10h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3404 bool bPit; // [sp+10h] [bp-Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3405 bool good; // [sp+14h] [bp-8h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3406 bool bCelestia; // [sp+18h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3407
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3408 bCelestia = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3409 bPit = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3410 good = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3411 evil = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3412 if ( !_stricmp(pCurrentMapName, "d25.blv") )//the Celestia
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3413 bCelestia = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3414 if ( !_stricmp(pCurrentMapName, "d26.blv") )//the Pit
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3415 bPit = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3416 if (pParty->IsPartyGood())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3417 good = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3418 if (pParty->IsPartyEvil())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3419 evil = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3420
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3421 Log::Warning(L"%S %S %u", __FILE__, __FUNCTION__, __LINE__); // ai_near_actors_targets_pid[i] for AI_Stand seems always 0; original code behaviour is identical
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3422 for (uint i = 0; i < uNumActors; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3423 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3424 Actor* actor = &pActors[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3425
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3426 if (actor->CanAct() || actor->uAIState == Disabled)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3427 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3428 actor->vPosition.x = actor->vInitialPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3429 actor->vPosition.y = actor->vInitialPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3430 actor->vPosition.z = actor->vInitialPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3431 actor->sCurrentHP = actor->pMonsterInfo.uHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3432 if (actor->uAIState != Disabled)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3433 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3434 Actor::AI_Stand(i, ai_near_actors_targets_pid[i], actor->pMonsterInfo.uRecoveryTime, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3435 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3436 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3437
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3438 actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3439
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3440 if (!bCelestia || good)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3441 if (!bPit || evil)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3442 if (actor->IsPeasant())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3443 actor->ResetAggressor();//~0x80000
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3444
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3445 actor->ResetHasItem();//~0x800000
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3446 if (actor->uAttributes & ACTOR_UNKNOW9)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3447 Actor::_4031C1_update_job_never_gets_called(i, pParty->uCurrentHour, 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3448 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3449 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3450 //----- (00439474) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3451 void Actor::DamageMonsterFromParty(signed int a1, unsigned int uActorID_Monster, Vec3_int_ *pVelocity)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3452 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3453 SpriteObject *projectileSprite; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3454 Actor *pMonster; // esi@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3455 unsigned __int16 v16; // cx@25
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3456 int v33; // eax@100
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3457 int v40; // ebx@107
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3458 int extraRecoveryTime; // qax@125
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3459 unsigned __int16 v43; // ax@132
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3460 unsigned __int16 v45; // ax@132
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3461 unsigned __int64 v46; // [sp+Ch] [bp-60h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3462 char *pPlayerName; // [sp+18h] [bp-54h]@12
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3463 char *pMonsterName; // [sp+1Ch] [bp-50h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3464 signed int a4; // [sp+44h] [bp-28h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3465 bool IsAdditionalDamagePossible; // [sp+50h] [bp-1Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3466 int v61; // [sp+58h] [bp-14h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3467 bool isLifeStealing; // [sp+5Ch] [bp-10h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3468 int uDamageAmount; // [sp+60h] [bp-Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3469 DAMAGE_TYPE attackElement; // [sp+64h] [bp-8h]@27
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3470
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3471 projectileSprite = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3472 uDamageAmount = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3473 a4 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3474 v61 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3475 IsAdditionalDamagePossible = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3476 isLifeStealing = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3477 if ( PID_TYPE(a1) == OBJECT_Item)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3478 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3479 projectileSprite = &pSpriteObjects[PID_ID(a1)];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3480 v61 = projectileSprite->field_60_distance_related_prolly_lod;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3481 a1 = projectileSprite->spell_caster_pid;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3482 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3483 if (PID_TYPE(a1) != OBJECT_Player)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3484 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3485
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3486 assert(PID_ID(abs(a1)) < 4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3487 Player* player = &pParty->pPlayers[PID_ID(a1)];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3488 pMonster = &pActors[uActorID_Monster];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3489 if (pMonster->IsNotAlive())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3490 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3491
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3492 pMonster->uAttributes |= 0xC000;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3493 if ( pMonster->uAIState == Fleeing )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3494 pMonster->uAttributes |= ACTOR_FLEEING;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3495 bool hit_will_stun = false,
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3496 hit_will_paralyze = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3497 if ( !projectileSprite )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3498 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3499 int main_hand_idx = player->pEquipment.uMainHand;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3500 IsAdditionalDamagePossible = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3501 if ( player->HasItemEquipped(EQUIP_TWO_HANDED) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3502 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3503 uint main_hand_skill = player->GetMainHandItem()->GetPlayerSkillType();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3504 uint main_hand_mastery = SkillToMastery(player->pActiveSkills[main_hand_skill]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3505 switch (main_hand_skill)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3506 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3507 case PLAYER_SKILL_STAFF:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3508 if (main_hand_mastery >= 3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3509 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3510 if (rand() % 100 < (player->GetActualSkillLevel(PLAYER_SKILL_STAFF) & 0x3F)) // stun chance when mastery >= 3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3511 hit_will_stun = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3512 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3513 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3514
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3515 case PLAYER_SKILL_MACE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3516 if (main_hand_mastery >= 3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3517 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3518 if (rand() % 100 < (player->GetActualSkillLevel(PLAYER_SKILL_MACE) & 0x3F))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3519 hit_will_stun = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3520 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3521 if (main_hand_mastery >= 4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3522 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3523 if (rand() % 100 < (player->GetActualSkillLevel(PLAYER_SKILL_MACE) & 0x3F))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3524 hit_will_paralyze = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3525 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3526 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3527 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3528 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3529 attackElement = DMGT_PHISYCAL;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3530 uDamageAmount = player->CalculateMeleeDamageTo(false, false, pMonster->pMonsterInfo.uID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3531 if ( !player->PlayerHitOrMiss(pMonster, v61, a4) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3532 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3533 player->PlaySound(SPEECH_52, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3534 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3535 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3536 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3537 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3538 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3539 v61 = projectileSprite->field_60_distance_related_prolly_lod;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3540 if ( projectileSprite->spell_id != SPELL_DARK_SOULDRINKER )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3541 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3542 int d1 = abs(pParty->vPosition.x - projectileSprite->vPosition.x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3543 int d2 = abs(pParty->vPosition.y - projectileSprite->vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3544 int d3 = abs(pParty->vPosition.z - projectileSprite->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3545 v61 = int_get_vector_length(d1, d2, d3);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3546
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3547 if ( v61 >= 5120 && !(pMonster->uAttributes & ACTOR_ALIVE) )//0x400
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3548 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3549 else if ( v61 >= 2560 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3550 v61 = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3551 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3552 v61 = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3553 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3554
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3555 switch (projectileSprite->spell_id)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3556 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3557 case SPELL_LASER_PROJECTILE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3558 v16 = player->pActiveSkills[PLAYER_SKILL_BLASTER];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3559 v61 = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3560 if ( SkillToMastery(v16) >= 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3561 a4 = player->pActiveSkills[PLAYER_SKILL_BLASTER] & 0x3F;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3562 attackElement = DMGT_PHISYCAL;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3563 uDamageAmount = player->CalculateMeleeDamageTo(true, true, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3564 if ( !player->PlayerHitOrMiss(pMonster, v61, a4) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3565 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3566 player->PlaySound(SPEECH_52, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3567 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3568 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3569 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3570 case SPELL_101:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3571 attackElement = DMGT_FIRE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3572 uDamageAmount = player->CalculateRangedDamageTo(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3573 if ( pMonster->pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3574 uDamageAmount >>= 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3575 IsAdditionalDamagePossible = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3576 if ( !player->PlayerHitOrMiss(pMonster, v61, a4) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3577 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3578 player->PlaySound(SPEECH_52, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3579 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3580 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3581 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3582 case SPELL_EARTH_BLADES:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3583 a4 = 5 * projectileSprite->spell_level;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3584 attackElement = (DAMAGE_TYPE)player->GetSpellSchool(SPELL_EARTH_BLADES);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3585 uDamageAmount = _43AFE3_calc_spell_damage(39, projectileSprite->spell_level, projectileSprite->spell_skill, pMonster->sCurrentHP);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3586 if ( pMonster->pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3587 uDamageAmount >>= 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3588 IsAdditionalDamagePossible = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3589 if ( !player->PlayerHitOrMiss( pMonster, v61, a4) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3590 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3591 player->PlaySound(SPEECH_52, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3592 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3593 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3594 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3595 case SPELL_EARTH_STUN:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3596 uDamageAmount = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3597 attackElement = DMGT_PHISYCAL;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3598 hit_will_stun = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3599 if ( !player->PlayerHitOrMiss( pMonster, v61, a4) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3600 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3601 player->PlaySound(SPEECH_52, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3602 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3603 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3604 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3605 case SPELL_BOW_ARROW:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3606 attackElement = DMGT_PHISYCAL;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3607 uDamageAmount = player->CalculateRangedDamageTo(pMonster->word_000086_some_monster_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3608 if ( pMonster->pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3609 uDamageAmount /= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3610 IsAdditionalDamagePossible = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3611 if ( projectileSprite->stru_24.uItemID != 0 && projectileSprite->stru_24.uSpecEnchantmentType == 3 ) //of carnage
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3612 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3613 attackElement = DMGT_FIRE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3614 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3615 else if ( !player->PlayerHitOrMiss( pMonster, v61, a4) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3616 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3617 player->PlaySound(SPEECH_52, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3618 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3619 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3620 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3621
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3622 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3623 attackElement = (DAMAGE_TYPE)player->GetSpellSchool(projectileSprite->spell_id);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3624 IsAdditionalDamagePossible = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3625 uDamageAmount = _43AFE3_calc_spell_damage(projectileSprite->spell_id, projectileSprite->spell_level, projectileSprite->spell_skill, pMonster->sCurrentHP);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3626 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3627 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3628 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3629
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3630 if (player->IsWeak())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3631 uDamageAmount /= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3632 if ( pMonster->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3633 uDamageAmount = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3634 v61 = pMonster->CalcMagicalDamageToActor(attackElement, uDamageAmount);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3635 if ( !projectileSprite && player->IsUnarmed() && player->pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3636 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3637 v61 += pMonster->CalcMagicalDamageToActor((DAMAGE_TYPE)8, player->pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].uPower);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3638 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3639 uDamageAmount = v61;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3640 if ( IsAdditionalDamagePossible )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3641 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3642 if ( projectileSprite )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3643 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3644 a4 = projectileSprite->stru_24._439DF3_get_additional_damage((int*)&attackElement, &isLifeStealing);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3645 if ( isLifeStealing && pMonster->sCurrentHP > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3646 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3647 player->sHealth += v61 / 5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3648 if ( player->sHealth > player->GetMaxHealth() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3649 player->sHealth = player->GetMaxHealth();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3650 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3651 uDamageAmount += pMonster->CalcMagicalDamageToActor(attackElement, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3652 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3653 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3654 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3655 for (int i = 0; i < 2; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3656 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3657 if ( player->HasItemEquipped((ITEM_EQUIP_TYPE)i) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3658 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3659 ItemGen* item;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3660 if (i == 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3661 item = player->GetOffHandItem();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3662 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3663 item = player->GetMainHandItem();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3664 a4 = item->_439DF3_get_additional_damage((int*)&attackElement, &isLifeStealing);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3665 if ( isLifeStealing && pMonster->sCurrentHP > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3666 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3667 player->sHealth += v61 / 5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3668 if ( player->sHealth > player->GetMaxHealth() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3669 player->sHealth = player->GetMaxHealth();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3670 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3671 uDamageAmount += pMonster->CalcMagicalDamageToActor(attackElement, a4);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3672 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3673 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3674 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3675 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3676 pMonster->sCurrentHP -= uDamageAmount;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3677 if ( uDamageAmount == 0 && !hit_will_stun )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3678 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3679 player->PlaySound(SPEECH_52, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3680 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3681 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3682 if ( pMonster->sCurrentHP > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3683 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3684 Actor::AI_Stun(uActorID_Monster, a1, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3685 Actor::AggroSurroundingPeasants(uActorID_Monster, 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3686 if ( bShowDamage )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3687 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3688 if ( projectileSprite )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3689 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[189], player->pName, pMonster->pActorName, uDamageAmount);// "%s shoots %s for %lu points"
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3690 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3691 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[164], player->pName, pMonster->pActorName, uDamageAmount);// "%s hits %s for %lu damage"
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3692 ShowStatusBarString(pTmpBuf.data(), 2u);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3693 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3694 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3695 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3696 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3697 if ( pMonsterStats->pInfos[pMonster->pMonsterInfo.uID].bQuestMonster & 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3698 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3699 if ( /*pRenderer->pRenderD3D &&*/ pEngine->uFlags2 & GAME_FLAGS_2_DRAW_BLOODSPLATS )
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3700 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3701 v33 = byte_4D864C && pEngine->uFlags & 0x80000 ? 10 * pMonster->uActorRadius : pMonster->uActorRadius;
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3702 pDecalBuilder->AddBloodsplat((float)pMonster->vPosition.x, (float)pMonster->vPosition.y, (float)pMonster->vPosition.z, 1.0, 0.0, 0.0, (float)v33, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3703 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3704 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3705 Actor::Die(uActorID_Monster);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3706 Actor::ApplyFineForKillingPeasant(uActorID_Monster);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3707 Actor::AggroSurroundingPeasants(uActorID_Monster, 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3708 if ( pMonster->pMonsterInfo.uExp )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3709 pParty->GivePartyExp(pMonsterStats->pInfos[pMonster->pMonsterInfo.uID].uExp);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3710 v40 = SPEECH_51;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3711 if ( rand() % 100 < 20 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3712 v40 = ((signed int)pMonster->pMonsterInfo.uHP >= 100) + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3713 player->PlaySound((PlayerSpeech)v40, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3714 if ( bShowDamage )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3715 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3716 pMonsterName = (char *)uDamageAmount;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3717 pPlayerName = player->pName; // "%s inflicts %lu points killing %s"
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3718 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[175], player->pName, uDamageAmount, pMonster);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3719 ShowStatusBarString(pTmpBuf.data(), 2u);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3720 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3721 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3722 if ( pMonster->pActorBuffs[ACTOR_BUFF_PAIN_REFLECTION].uExpireTime > 0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3723 && uDamageAmount != 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3724 player->ReceiveDamage(uDamageAmount, attackElement);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3725 int knockbackValue = 20 * v61 / (signed int)pMonster->pMonsterInfo.uHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3726 if ( (player->GetSpecialItemBonus(24) || hit_will_stun) && pMonster->DoesDmgTypeDoDamage(DMGT_EARTH) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3727 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3728 extraRecoveryTime = 20;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3729 knockbackValue = 10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3730 if ( !pParty->bTurnBasedModeOn )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3731 extraRecoveryTime = (int)(flt_6BE3A8_debug_recmod2 * 42.66666666666666);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3732 pMonster->pMonsterInfo.uRecoveryTime += extraRecoveryTime;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3733 if ( bShowDamage )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3734 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3735 pMonsterName = player->pName; // "%s stuns %s"
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3736 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[635], player->pName, pMonster);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3737 ShowStatusBarString(pTmpBuf.data(), 2u);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3738 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3739 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3740 if ( hit_will_paralyze && pMonster->CanAct() && pMonster->DoesDmgTypeDoDamage(DMGT_EARTH))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3741 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3742 v43 = player->GetActualSkillLevel(PLAYER_SKILL_MACE);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3743 v45 = SkillToMastery(v43);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3744 v46 = pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)(7680 * (v43 & 0x3F)) * 0.033333335);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3745 pMonster->pActorBuffs[ACTOR_BUFF_PARALYZED].Apply(v46, v45, 0, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3746 if ( bShowDamage )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3747 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3748 pMonsterName = player->pName; // "%s paralyzes %s"
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3749 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[636], player->pName, pMonster);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3750 ShowStatusBarString(pTmpBuf.data(), 2u);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3751 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3752 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3753 if ( knockbackValue > 10 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3754 knockbackValue = 10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3755 if ( !MonsterStats::BelongsToSupertype(pMonster->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3756 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3757 pVelocity->x = fixpoint_mul(knockbackValue, pVelocity->x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3758 pVelocity->y = fixpoint_mul(knockbackValue, pVelocity->y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3759 pVelocity->z = fixpoint_mul(knockbackValue, pVelocity->z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3760 pMonster->vVelocity.x = 50 * LOWORD(pVelocity->x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3761 pMonster->vVelocity.y = 50 * LOWORD(pVelocity->y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3762 pMonster->vVelocity.z = 50 * LOWORD(pVelocity->z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3763 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3764 Actor::AddBloodsplatOnDamageOverlay(uActorID_Monster, 1, v61);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3765 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3766 //----- (004BBF61) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3767 void Actor::Arena_summon_actor( int monster_id, __int16 x, int y, int z )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3768 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3769 int v12; // ebx@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3770 int v13; // eax@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3771 __int16 v16; // [sp+10h] [bp-4h]@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3772
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3773 if (uNumActors < 500)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3774 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3775 v16 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3776 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3777 v16 = pIndoor->GetSector(x, y, z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3778 pActors[uNumActors].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3779 strcpy(pActors[uNumActors].pActorName, pMonsterStats->pInfos[monster_id].pName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3780 pActors[uNumActors].sCurrentHP = LOWORD(pMonsterStats->pInfos[monster_id].uHP);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3781 memcpy(&pActors[uNumActors].pMonsterInfo, &pMonsterStats->pInfos[monster_id], 0x58u);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3782 pActors[uNumActors].word_000086_some_monster_id = monster_id;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3783 pActors[uNumActors].uActorRadius = pMonsterList->pMonsters[monster_id - 1].uMonsterRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3784 pActors[uNumActors].uActorHeight = pMonsterList->pMonsters[monster_id - 1].uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3785 pActors[uNumActors].uMovementSpeed = pMonsterList->pMonsters[monster_id - 1].uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3786 pActors[uNumActors].vInitialPosition.x = x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3787 pActors[uNumActors].vPosition.x = x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3788 pActors[uNumActors].uAttributes |= ACTOR_AGGRESSOR;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3789 pActors[uNumActors].pMonsterInfo.uTreasureType = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3790 pActors[uNumActors].pMonsterInfo.uTreasureLevel = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3791 pActors[uNumActors].pMonsterInfo.uTreasureDiceSides = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3792 pActors[uNumActors].pMonsterInfo.uTreasureDiceRolls = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3793 pActors[uNumActors].pMonsterInfo.uTreasureDropChance = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3794 pActors[uNumActors].vInitialPosition.y = y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3795 pActors[uNumActors].vPosition.y = y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3796 pActors[uNumActors].vInitialPosition.z = z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3797 pActors[uNumActors].vPosition.z = z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3798 pActors[uNumActors].uTetherDistance = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3799 pActors[uNumActors].uSectorID = v16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3800 pActors[uNumActors].uGroup = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3801 pActors[uNumActors].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3802 pActors[uNumActors].PrepareSprites(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3803 for ( int i = 0; i < 4; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3804 pSoundList->LoadSound(pMonsterList->pMonsters[monster_id - 1].pSoundSampleIDs[i], 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3805 v12 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3806 do
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3807 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3808 v13 = pSoundList->LoadSound(v12 + word_4EE088_sound_ids[pMonsterStats->pInfos[monster_id].uSpell1ID], 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3809 v12++;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3810 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3811 while ( v13 );
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3812 ++uNumActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3813 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3814 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3815 //----- (00426E10) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3816 int stru319::which_player_to_attack(Actor *pActor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3817 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3818 signed int v2; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3819 bool flag; // edi@37
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3820 int v22; // [sp+8h] [bp-140h]@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3821 int Victims_list[60]; // [sp+48h] [bp-100h]@48
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3822 int for_sex; // [sp+13Ch] [bp-Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3823 int for_race; // [sp+140h] [bp-8h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3824 int for_class; // [sp+144h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3825
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3826 for_class = -1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3827 for_race = -1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3828 for_sex = -1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3829 v2 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3830 if ( pActor->pMonsterInfo.uAttackPreference )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3831 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3832 for ( uint i = 0; i < 16; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3833 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3834 v22 = pActor->pMonsterInfo.uAttackPreference & (1 << i);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3835 if ( v22 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3836 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3837 switch ( v22 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3838 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3839 case 1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3840 for_class = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3841 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3842 case 2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3843 for_class = 12;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3844 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3845 case 4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3846 for_class = 16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3847 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3848 case 8:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3849 for_class = 28;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3850 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3851 case 16:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3852 for_class = 24;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3853 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3854 case 32:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3855 for_class = 32;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3856 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3857 case 64:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3858 for_class = 20;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3859 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3860 case 128:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3861 for_class = 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3862 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3863 case 256:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3864 for_class = 8;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3865 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3866 case 512:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3867 for_sex = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3868 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3869 case 1024:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3870 for_sex = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3871 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3872 case 2048:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3873 for_race = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3874 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3875 case 4096:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3876 for_race = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3877 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3878 case 8192:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3879 for_race = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3880 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3881 case 16384:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3882 for_race = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3883 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3884 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3885 v2 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3886 for ( uint j = 0; j < 4; ++j )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3887 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3888 flag = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3889 if ( for_class != -1 && for_class == pPlayers[j + 1]->classType )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3890 flag = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3891 if ( for_sex != -1 && for_sex == pPlayers[j + 1]->uSex )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3892 flag = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3893 if ( for_race != -1 && for_race == pPlayers[j + 1]->GetRace() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3894 flag = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3895 if ( flag == true )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3896 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3897 if ( !(pPlayers[j + 1]->pConditions[Condition_Paralyzed] | pPlayers[j + 1]->pConditions[Condition_Unconcious]
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3898 | pPlayers[j + 1]->pConditions[Condition_Dead] | pPlayers[j + 1]->pConditions[Condition_Pertified] | pPlayers[j + 1]->pConditions[Condition_Eradicated]) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3899 Victims_list[v2++] = j;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3900 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3901 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3902 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3903 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3904 if ( v2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3905 return Victims_list[rand() % v2];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3906 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3907 for ( uint i = 0; i < 4; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3908 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3909 if ( !(pPlayers[i + 1]->pConditions[Condition_Paralyzed] | pPlayers[i + 1]->pConditions[Condition_Unconcious]
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3910 | pPlayers[i + 1]->pConditions[Condition_Dead] | pPlayers[i + 1]->pConditions[Condition_Pertified] | pPlayers[i + 1]->pConditions[Condition_Eradicated]) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3911 Victims_list[v2++] = i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3912 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3913 if ( v2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3914 return Victims_list[rand() % v2];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3915 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3916 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3917 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3918 //----- (00427546) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3919 int stru319::_427546(int a2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3920 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3921 int result; // eax@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3922
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3923 if (a2 >= 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3924 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3925 if (a2 >= 1)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3926 result = (a2 >= 2) + 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3927 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3928 result = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3929 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3930 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3931 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3932 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3933 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3934 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3935 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3936 //----- (0042F184) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3937 int stru319::FindClosestActor(int pick_depth, int a3, int a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3938 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3939 int v4; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3940 stru319 *v5; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3941 int v6; // eax@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3942 int v7; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3943 // int result; // eax@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3944 // int *v9; // edx@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3945 // signed int v10; // ebx@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3946 // int v11; // edi@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3947 //Actor *v12; // esi@12
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3948 //unsigned __int16 v13; // ax@12
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3949 // int v14; // eax@22
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3950 //char v15; // zf@30
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3951 // int v16; // esi@32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3952 // int v17; // ecx@34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3953 // stru319 *v18; // eax@39
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3954 // int v19; // edx@39
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3955 // int v20; // ecx@41
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3956 // unsigned __int16 v21; // ax@42
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3957 // unsigned int v22; // [sp+8h] [bp-24h]@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3958 //unsigned int v23; // [sp+Ch] [bp-20h]@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3959 stru319 *v24; // [sp+10h] [bp-1Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3960 // unsigned int v25; // [sp+14h] [bp-18h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3961 // int *v26; // [sp+18h] [bp-14h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3962 // int v27; // [sp+1Ch] [bp-10h]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3963 // int *v28; // [sp+20h] [bp-Ch]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3964 //unsigned int v29; // [sp+24h] [bp-8h]@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3965 // int v30; // [sp+28h] [bp-4h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3966 // int i; // [sp+38h] [bp+Ch]@33
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3967 // signed int v32; // [sp+3Ch] [bp+10h]@32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3968
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3969 v4 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3970 v5 = this;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3971 v24 = this;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3972 //if ( pRenderer->pRenderD3D )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3973 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3974 v6 = a3 != 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3975 if (a4)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3976 LOBYTE(v6) = v6 | 8;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3977 v7 = pEngine->pVisInstance->PickClosestActor(OBJECT_Actor, pick_depth, v6, 657456, -1);
2497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3978 if (v7 != -1)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3979 return (unsigned __int16)v7;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3980 else return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3981 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3982 /*else // software impl
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3983 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3984 v30 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3985 if ( pRenderer->pActiveZBuffer )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3986 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3987 if ( (signed int)viewparams->uScreen_topL_Y < (signed int)viewparams->uScreen_BttmR_Y )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3988 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3989 v9 = &pRenderer->pActiveZBuffer[viewparams->uScreen_topL_X + 640 * viewparams->uScreen_topL_Y];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3990 v26 = &pRenderer->pActiveZBuffer[viewparams->uScreen_topL_X + 640 * viewparams->uScreen_topL_Y];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3991 for ( v25 = viewparams->uScreen_BttmR_Y - viewparams->uScreen_topL_Y; v25; --v25 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3992 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3993 if ( (signed int)viewparams->uScreen_topL_X < (signed int)viewparams->uScreen_BttmR_X )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3994 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3995 v28 = v9;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3996 v10 = v4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3997 for ( v27 = viewparams->uScreen_BttmR_X - viewparams->uScreen_topL_X; v27; --v27 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3998 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
3999 v22 = *v28;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4000 v11 = *v28 & 0xFFFF;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4001 if (PID_TYPE(v11) == OBJECT_Actor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4002 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4003 if ( pActors[PID_ID(v11)].uAIState != Dead )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4004 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4005 if ( pActors[PID_ID(v11)].uAIState != Dying && pActors[PID_ID(v11)].uAIState != Removed
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4006 && pActors[PID_ID(v11)].uAIState != Summoned && pActors[PID_ID(v11)].uAIState != Disabled
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4007 && (!a3 || pActors[PID_ID(v11)].GetActorsRelation(0)) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4008 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4009 if ( (!a4 || MonsterStats::BelongsToSupertype(pActors[PID_ID(v11)].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4010 && v22 <= pick_depth << 16 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4011 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4012 v14 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4013 if ( v10 > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4014 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4015 for ( v14; v14 < v30; ++v14 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4016 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4017 if ( dword_50BDA0[v14] == v11 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4018 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4019 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4020 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4021 if ( v14 == v30 && v10 < 100 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4022 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4023 ++v30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4024 dword_50BC10[v10] = v22;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4025 dword_50BDA0[v10] = v11;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4026 ++v10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4027 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4028 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4029 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4030 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4031 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4032 ++v28;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4033 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4034 v4 = v30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4035 v5 = v24;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4036 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4037 v9 = v26 + 640;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4038 v26 += 640;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4039 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4040 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4041 if ( v4 > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4042 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4043 v16 = (int)dword_50BC10.data();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4044 for ( v32 = 1; v32 - 1 < v4; ++v32 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4045 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4046 for ( i = v32; i < v4; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4047 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4048 v17 = dword_50BC10[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4049 if ( dword_50BC10[i] < *(int *)v16 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4050 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4051 dword_50BC10[i] = *(int *)v16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4052 *(int *)v16 = v17;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4053 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4054 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4055 v16 += 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4056 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4057 v5 = v24;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4058 if ( v4 > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4059 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4060 v18 = v24;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4061 for ( v19 = v4; v19; --v19 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4062 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4063 *(int *)&v18->field_0 = (*(int *)&v18[(char *)dword_50BC10.data() - (char *)v24].field_0 >> 3) & 0x1FFF;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4064 v18 += 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4065 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4066 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4067 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4068 v20 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4069 for ( *(int *)&v5[2000].field_0 = v4; v20 < v4; ++v20 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4070 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4071 v21 = pActors[*(int *)&v5[4 * v20].field_0].uAIState;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4072 if ( v21 != 4 && v21 != 5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4073 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4074 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4075 if ( v20 != v4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4076 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4077 result = 8 * *(int *)&v5[4 * v20].field_0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4078 LOBYTE(result) = result | 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4079 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4080 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4081 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4082 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4083 return 0;*/
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4084 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4085
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4086 //----- (0042F4DA) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4087 bool CheckActors_proximity()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4088 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4089 signed int distance; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4090 int for_x; // ebx@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4091 int for_y; // [sp+Ch] [bp-10h]@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4092 int for_z; // [sp+10h] [bp-Ch]@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4093
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4094
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4095 distance = 5120;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4096 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4097 distance = 2560;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4098
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4099 if ( (signed int)uNumActors <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4100 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4101 for ( uint i = 0; i < (signed int)uNumActors; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4102 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4103 for_x = abs(pActors[i].vInitialPosition.x - pParty->vPosition.x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4104 for_y = abs(pActors[i].vInitialPosition.y - pParty->vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4105 for_z = abs(pActors[i].vInitialPosition.z - pParty->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4106 if ( int_get_vector_length(for_x, for_y, for_z) < distance )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4107 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4108 if ( pActors[i].uAIState != Dead )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4109 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4110 if ( pActors[i].uAIState != Dying && pActors[i].uAIState != Removed
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4111 && pActors[i].uAIState != Disabled && pActors[i].uAIState != Summoned
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4112 && (pActors[i].ActorEnemy() || pActors[i].GetActorsRelation(0) ) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4113 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4114 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4115 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4116 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4117 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4118 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4119
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4120
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4121 //----- (00426A5A) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4122 void Actor::LootActor()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4123 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4124 signed int v2; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4125 unsigned __int8 v7; // al@30
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4126 char *v9; // [sp-4h] [bp-3Ch]@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4127 char *v10; // [sp-4h] [bp-3Ch]@31
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4128 char *v11; // [sp-4h] [bp-3Ch]@38
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4129 ItemGen Dst; // [sp+Ch] [bp-2Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4130 bool itemFound; // [sp+30h] [bp-8h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4131 int v14; // [sp+34h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4132
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4133 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4134 Dst.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4135 v2 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4136 itemFound = false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4137 v14 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4138 if ( !ActorHasItem() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4139 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4140 for (uchar i = 0; i < this->pMonsterInfo.uTreasureDiceRolls; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4141 v14 += rand() % this->pMonsterInfo.uTreasureDiceSides + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4142 if ( v14 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4143 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4144 pParty->PartyFindsGold(v14, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4145 viewparams->bRedrawGameUI = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4146 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4147 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4148 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4149 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4150 if ( this->ActorHasItems[3].uItemID != 0 && this->ActorHasItems[3].GetItemEquipType() == EQUIP_GOLD )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4151 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4152 v14 = this->ActorHasItems[3].uSpecEnchantmentType;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4153 this->ActorHasItems[3].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4154 if ( v14 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4155 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4156 pParty->PartyFindsGold(v14, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4157 viewparams->bRedrawGameUI = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4158 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4159 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4160 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4161 if ( this->uCarriedItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4162 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4163 Dst.Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4164 Dst.uItemID = this->uCarriedItemID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4165 v9 = pItemsTable->pItems[Dst.uItemID].pUnidentifiedName;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4166 if ( v14 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4167 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[490], v14, v9);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4168 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4169 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], v9);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4170 ShowStatusBarString(pTmpBuf2.data(), 2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4171 if ( Dst.GetItemEquipType() == 12 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4172 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4173 Dst.uNumCharges = rand() % 6 + Dst.GetDamageMod() + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4174 Dst.uMaxCharges = Dst.uNumCharges;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4175 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4176 if ( pItemsTable->pItems[Dst.uItemID].uEquipType == 14 && Dst.uItemID != 220 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4177 Dst.uEnchantmentType = 2 * rand() % 4 + 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4178 pItemsTable->SetSpecialBonus(&Dst);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4179 if ( !pParty->AddItemToParty(&Dst) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4180 pParty->SetHoldingItem(&Dst);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4181 this->uCarriedItemID = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4182 if ( this->ActorHasItems[0].uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4183 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4184 if ( !pParty->AddItemToParty(this->ActorHasItems) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4185 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4186 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4187 pParty->SetHoldingItem(this->ActorHasItems);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4188 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4189 this->ActorHasItems[0].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4190 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4191 if ( this->ActorHasItems[1].uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4192 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4193 if ( !pParty->AddItemToParty(&this->ActorHasItems[1]) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4194 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4195 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4196 pParty->SetHoldingItem(&this->ActorHasItems[1]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4197 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4198 this->ActorHasItems[1].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4199 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4200 this->Remove();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4201 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4202 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4203 if ( this->ActorHasItem() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4204 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4205 if ( this->ActorHasItems[3].uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4206 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4207 memcpy(&Dst, &this->ActorHasItems[3], sizeof(Dst));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4208 this->ActorHasItems[3].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4209 //v11 = pItemsTable->pItems[Dst.uItemID].pUnidentifiedName;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4210 if ( v14 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4211 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[490], v14, pItemsTable->pItems[Dst.uItemID].pUnidentifiedName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4212 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4213 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], pItemsTable->pItems[Dst.uItemID].pUnidentifiedName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4214 ShowStatusBarString(pTmpBuf2.data(), 2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4215 if ( !pParty->AddItemToParty(&Dst) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4216 pParty->SetHoldingItem(&Dst);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4217 itemFound = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4218 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4219 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4220 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4221 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4222 if ( rand() % 100 < this->pMonsterInfo.uTreasureDropChance && (v7 = this->pMonsterInfo.uTreasureLevel) != 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4223 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4224 pItemsTable->GenerateItem(v7, this->pMonsterInfo.uTreasureType, &Dst);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4225 v10 = pItemsTable->pItems[Dst.uItemID].pUnidentifiedName;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4226 if ( v14 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4227 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[490], v14, v10);//Вы нашли ^I[%d] золот^L[ой;ых;ых] и предмет (%s)!
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4228 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4229 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], v10);//Вы нашли ^Pv[%s]!
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4230 ShowStatusBarString(pTmpBuf2.data(), 2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4231 if ( !pParty->AddItemToParty(&Dst) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4232 pParty->SetHoldingItem(&Dst);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4233 itemFound = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4234 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4235 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4236 if ( this->ActorHasItems[0].uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4237 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4238 if ( !pParty->AddItemToParty(this->ActorHasItems) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4239 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4240 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4241 pParty->SetHoldingItem(this->ActorHasItems);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4242 itemFound = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4243 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4244 this->ActorHasItems[0].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4245 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4246 if ( this->ActorHasItems[1].uItemID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4247 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4248 if ( !pParty->AddItemToParty(&this->ActorHasItems[1]) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4249 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4250 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4251 pParty->SetHoldingItem(&this->ActorHasItems[1]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4252 itemFound = true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4253 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4254 this->ActorHasItems[1].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4255 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4256 if ( !itemFound || rand() % 100 < 90 )//for repeatedly get gold and item
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4257 this->Remove();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4258 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4259
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4260
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4261 //----- (00427102) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4262 bool Actor::_427102_IsOkToCastSpell( signed int a2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4263 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4264 switch(a2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4265 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4266 case SPELL_BODY_POWER_CURE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4267 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4268 if ( this->sCurrentHP >= (signed int)this->pMonsterInfo.uHP )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4269 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4270 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4271 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4272 case SPELL_LIGHT_DISPEL_MAGIC:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4273 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4274 for (int i = 0; i < 20; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4275 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4276 if (pParty->pPartyBuffs[i].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4277 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4278 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4279 for ( int i = 1; i <= 4; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4280 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4281 for ( int j = 0; j < 22; j++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4282 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4283 if (pPlayers[i]->pPlayerBuffs[j].uExpireTime > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4284 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4285 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4286 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4287 return false;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4288 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4289 case SPELL_LIGHT_DAY_OF_PROTECTION:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4290 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4291 return this->pActorBuffs[ACTOR_BUFF_DAY_OF_PROTECTION].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4292 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4293 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4294 case SPELL_LIGHT_HOUR_OF_POWER:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4295 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4296 return this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4297 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4298 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4299 case SPELL_DARK_PAIN_REFLECTION:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4300 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4301 return this->pActorBuffs[ACTOR_BUFF_PAIN_REFLECTION].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4302 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4303 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4304 case SPELL_BODY_HAMMERHANDS:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4305 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4306 return this->pActorBuffs[ACTOR_BUFF_PAIN_HAMMERHANDS].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4307 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4308 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4309 case SPELL_FIRE_HASTE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4310 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4311 return this->pActorBuffs[ACTOR_BUFF_HASTE].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4312 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4313 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4314 case SPELL_AIR_SHIELD:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4315 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4316 return this->pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4317 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4318 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4319 case SPELL_EARTH_STONESKIN:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4320 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4321 return this->pActorBuffs[ACTOR_BUFF_STONESKIN].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4322 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4323 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4324 case SPELL_SPIRIT_BLESS:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4325 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4326 return this->pActorBuffs[ACTOR_BUFF_BLESS].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4327 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4328 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4329 case SPELL_SPIRIT_FATE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4330 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4331 return this->pActorBuffs[ACTOR_BUFF_FATE].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4332 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4333 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4334 case SPELL_SPIRIT_HEROISM:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4335 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4336 return this->pActorBuffs[ACTOR_BUFF_HEROISM].uExpireTime <= 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4337 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4338 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4339 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4340 return true;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4341 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4342 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4343
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4344
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4345 //----- (0042704B) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4346 ABILITY_INDEX Actor::special_ability_use_check( int a2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4347 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4348 signed int okToCastSpell1; // ebx@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4349 signed int okToCastSpell2; // edi@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4350
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4351 if ( this->pMonsterInfo.uSpecialAbilityType == 2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4352 && this->pMonsterInfo.uSpecialAbilityDamageDiceBonus < 3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4353 && rand() % 100 < 5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4354 this->SummonMinion(a2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4355 okToCastSpell1 = this->_427102_IsOkToCastSpell(this->pMonsterInfo.uSpell1ID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4356 okToCastSpell2 = this->_427102_IsOkToCastSpell(this->pMonsterInfo.uSpell2ID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4357 if ( okToCastSpell1 && this->pMonsterInfo.uSpell1UseChance && rand() % 100 < this->pMonsterInfo.uSpell1UseChance )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4358 return ABILITY_SPELL1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4359 if ( okToCastSpell2 && this->pMonsterInfo.uSpell2UseChance && rand() % 100 < this->pMonsterInfo.uSpell2UseChance )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4360 return ABILITY_SPELL2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4361 if (this->pMonsterInfo.uAttack2Chance && rand() % 100 < this->pMonsterInfo.uAttack2Chance)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4362 return ABILITY_ATTACK2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4363 return ABILITY_ATTACK1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4364 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4365
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4366
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4367
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4368 //----- (004273BB) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4369 bool Actor::_4273BB_DoesHitOtherActor( Actor *defender, int a3, int a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4370 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4371 signed int v6; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4372 signed int v7; // esi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4373 int armorSum; // ebx@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4374 signed int a2a; // [sp+18h] [bp+Ch]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4375
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4376 v6 = defender->pMonsterInfo.uAC;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4377 v7 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4378 a2a = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4379 if ( defender->pActorBuffs[ACTOR_BUFF_SOMETHING_THAT_HALVES_AC].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4380 v6 /= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4381 if ( defender->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4382 v7 = defender->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4383 if ( defender->pActorBuffs[ACTOR_BUFF_STONESKIN].uExpireTime > 0 && defender->pActorBuffs[ACTOR_BUFF_STONESKIN].uPower > v7 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4384 v7 = defender->pActorBuffs[ACTOR_BUFF_STONESKIN].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4385 armorSum = v7 + v6;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4386 if ( this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4387 a2a = this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4388 if ( this->pActorBuffs[ACTOR_BUFF_BLESS].uExpireTime > 0 && this->pActorBuffs[ACTOR_BUFF_BLESS].uPower > a2a )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4389 a2a = this->pActorBuffs[ACTOR_BUFF_BLESS].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4390 if ( this->pActorBuffs[ACTOR_BUFF_FATE].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4391 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4392 a2a += this->pActorBuffs[ACTOR_BUFF_FATE].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4393 this->pActorBuffs[ACTOR_BUFF_FATE].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4394 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4395 return rand() % (armorSum + 2 * this->pMonsterInfo.uLevel + 10) + a2a + 1 > armorSum + 5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4396 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4397
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4398 //----- (004274AD) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4399 bool Actor::ActorHitOrMiss(Player *pPlayer)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4400 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4401 signed int v3; // edi@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4402 signed int v4; // esi@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4403 int v5; // esi@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4404
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4405 v3 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4406 if ( this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4407 v3 = this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4408 if ( this->pActorBuffs[ACTOR_BUFF_BLESS].uExpireTime > 0 && this->pActorBuffs[ACTOR_BUFF_BLESS].uPower > v3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4409 v3 = this->pActorBuffs[ACTOR_BUFF_BLESS].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4410 if ( this->pActorBuffs[ACTOR_BUFF_FATE].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4411 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4412 v3 += this->pActorBuffs[ACTOR_BUFF_FATE].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4413 this->pActorBuffs[ACTOR_BUFF_FATE].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4414 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4415 v4 = pPlayer->GetActualAC() + 2 * this->pMonsterInfo.uLevel + 10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4416 v5 = rand() % v4 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4417 return (v3 + v5 > pPlayer->GetActualAC() + 5);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4418 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4419
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4420
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4421 //----- (0042756B) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4422 int Actor::CalcMagicalDamageToActor(DAMAGE_TYPE dmgType, signed int incomingDmg)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4423 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4424 int v4; // edx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4425 int v5; // ecx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4426 signed int v6; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4427 signed int result; // eax@17
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4428 signed int v8; // esi@18
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4429
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4430 v4 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4431 v5 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4432 if ( this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uExpireTime > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4433 v5 = this->pActorBuffs[ACTOR_BUFF_HOUR_OF_POWER].uPower;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4434 switch ( dmgType )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4435 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4436 case DMGT_FIRE:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4437 v6 = this->pMonsterInfo.uResFire;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4438 v4 = v5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4439 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4440 case DMGT_ELECTR:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4441 v6 = this->pMonsterInfo.uResAir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4442 v4 = v5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4443 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4444 case DMGT_COLD:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4445 v6 = this->pMonsterInfo.uResWater;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4446 v4 = v5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4447 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4448 case DMGT_EARTH:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4449 v6 = this->pMonsterInfo.uResEarth;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4450 v4 = v5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4451 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4452 case DMGT_PHISYCAL:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4453 v6 = this->pMonsterInfo.uResPhysical;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4454 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4455 case DMGT_SPIRIT:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4456 v6 = this->pMonsterInfo.uResSpirit;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4457 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4458 case DMGT_MIND:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4459 v6 = this->pMonsterInfo.uResMind;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4460 v4 = v5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4461 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4462 case DMGT_BODY:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4463 v6 = this->pMonsterInfo.uResBody;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4464 v4 = v5;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4465 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4466 case DMGT_LIGHT:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4467 v6 = this->pMonsterInfo.uResLight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4468 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4469 case DMGT_DARK:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4470 v6 = this->pMonsterInfo.uResDark;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4471 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4472 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4473 v6 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4474 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4475 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4476 if ( v6 < 200 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4477 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4478 v8 = v4 + v6 + 30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4479 for (int i = 0; i < 4; i++)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4480 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4481 if ( rand() % v8 < 30 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4482 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4483 incomingDmg /= 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4484 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4485 result = incomingDmg;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4486 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4487 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4488 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4489 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4490 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4491
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4492 //----- (00427662) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4493 bool Actor::DoesDmgTypeDoDamage(DAMAGE_TYPE uType)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4494 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4495 signed int resist; // esi@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4496 bool result; // eax@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4497
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4498 switch ( uType )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4499 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4500 case 0:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4501 resist = this->pMonsterInfo.uResFire;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4502 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4503 case 1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4504 resist = this->pMonsterInfo.uResAir;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4505 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4506 case 2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4507 resist = this->pMonsterInfo.uResWater;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4508 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4509 case 3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4510 resist = this->pMonsterInfo.uResEarth;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4511 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4512 case 4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4513 resist = this->pMonsterInfo.uResPhysical;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4514 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4515 case 6:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4516 resist = this->pMonsterInfo.uResSpirit;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4517 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4518 case 7:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4519 resist = this->pMonsterInfo.uResMind;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4520 case 8:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4521 resist = this->pMonsterInfo.uResBody;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4522 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4523 case 9:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4524 resist = this->pMonsterInfo.uResLight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4525 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4526 case 10:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4527 resist = this->pMonsterInfo.uResDark;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4528 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4529 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4530 return 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4531 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4532 if ( resist < 200 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4533 result = rand() % ((this->pMonsterInfo.uLevel >> 2) + resist + 30) < 30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4534 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4535 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4536 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4537 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4538
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4539 //----- (00448A98) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4540 void __fastcall ToggleActorGroupFlag(unsigned int uGroupID, unsigned int uFlag, unsigned int bToggle)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4541 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4542 if ( uGroupID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4543 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4544 if ( bToggle )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4545 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4546 for ( uint i = 0; i < (unsigned int)uNumActors; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4547 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4548 if ( pActors[i].uGroup == uGroupID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4549 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4550 pActors[i].uAttributes |= uFlag;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4551 if ( uFlag == 0x10000 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4552 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4553 pActors[i].uAIState = Disabled;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4554 pActors[i].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4555 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4556 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4557 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4558 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4559 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4560 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4561 for ( uint i = 0; i < (unsigned int)uNumActors; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4562 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4563 if ( pActors[i].uGroup == uGroupID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4564 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4565 if ( uFlag == 0x10000 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4566 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4567 if ( pActors[i].uAIState != Dead )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4568 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4569 if ( pActors[i].uAIState != 4 && pActors[i].uAIState != 11 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4570 pActors[i].uAIState = Standing;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4571 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4572 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4573 LODWORD(pActors[i].uAttributes) &= ~uFlag;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4574 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4575 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4576 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4577 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4578 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4579
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4580 //----- (004014E6) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4581 void Actor::MakeActorAIList_ODM()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4582 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4583 int v1; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4584 unsigned int v7; // ST20_4@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4585 int distance; // edi@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4586 int v10; // ebx@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4587 int v21; // [sp+Ch] [bp-14h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4588 int v22; // [sp+10h] [bp-10h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4589
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4590 pParty->uFlags &= 0xFFFFFFCF;//~0x30
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4591
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4592 ai_arrays_size = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4593 for (uint i = 0; i < uNumActors; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4594 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4595 Actor* actor = &pActors[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4596
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4597 actor->ResetAlive();//~0x400
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4598 if (!actor->CanAct())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4599 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4600 actor->ResetActive();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4601 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4602 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4603
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4604 v22 = abs(pParty->vPosition.z - actor->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4605 v21 = abs(pParty->vPosition.y - actor->vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4606 v1 = abs(pParty->vPosition.x - actor->vPosition.x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4607 v7 = int_get_vector_length(v22, v21, v1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4608 distance = v7 - actor->uActorRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4609 if ( distance < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4610 distance = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4611
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4612 if (distance < 5632)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4613 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4614 actor->ResetHostile();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4615 if ( actor->ActorEnemy() || actor->GetActorsRelation(0) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4616 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4617 //v11 = (pParty->uFlags & 0x10) == 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4618 actor->uAttributes |= ACTOR_HOSTILE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4619 if (distance < 5120 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4620 pParty->SetYellowAlert();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4621 if (distance < 307)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4622 pParty->SetRedAlert();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4623 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4624 actor->uAttributes |= ACTOR_ACTIVE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4625 ai_near_actors_distances[ai_arrays_size] = distance;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4626 ai_near_actors_ids[ai_arrays_size++] = i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4627 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4628 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4629 actor->ResetActive();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4630 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4631
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4632 /*
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4633 result = v27;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4634 if ( v27 > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4635 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4636 v14 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4637 v15 = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4638 v26 = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4639 do
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4640 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4641 while ( 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4642 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4643 v24 = v15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4644 if ( v15 >= result )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4645 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4646 v16 = ai_near_actors_distances[v14];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4647 if ( v16 > ai_near_actors_distances[v15] )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4648 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4649 v17 = &ai_near_actors_ids[v15];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4650 v18 = ai_near_actors_ids[v14];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4651 ai_near_actors_ids[v14] = *v17;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4652 *v17 = v18;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4653 v15 = v24;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4654 ai_near_actors_distances[v14] = ai_near_actors_distances[v24];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4655 ai_near_actors_distances[v24] = v16;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4656 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4657 result = v27;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4658 ++v15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4659 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4660 ++v14;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4661 v15 = v26 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4662 v26 = v15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4663 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4664 while ( v15 - 1 < result );
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4665 }*/
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4666
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4667 for (uint i = 0; i < ai_arrays_size; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4668 for (uint j = 0; j < i; ++j)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4669 if (ai_near_actors_distances[j] > ai_near_actors_distances[i])
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4670 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4671 int tmp = ai_near_actors_distances[j];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4672 ai_near_actors_distances[j] = ai_near_actors_distances[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4673 ai_near_actors_distances[i] = tmp;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4674
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4675 tmp = ai_near_actors_ids[j];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4676 ai_near_actors_ids[j] = ai_near_actors_ids[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4677 ai_near_actors_ids[i] = tmp;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4678 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4679
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4680
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4681 if (ai_arrays_size > 30)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4682 ai_arrays_size = 30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4683
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4684 for (uint i = 0; i < ai_arrays_size; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4685 pActors[ai_near_actors_ids[i]].uAttributes |= ACTOR_ALIVE;//0x400
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4686 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4687
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4688 //----- (004016FA) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4689 int Actor::MakeActorAIList_BLV()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4690 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4691 int v1; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4692 int distance; // edi@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4693 int v13; // edx@24
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4694 int v15; // ebx@26
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4695 unsigned int v17; // esi@27
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4696 int v18; // ecx@31
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4697 signed int v19; // edi@31
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4698 signed int v25; // eax@40
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4699 int j; // edi@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4700 int v30; // eax@48
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4701 int v37; // [sp+Ch] [bp-18h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4702 int v38; // [sp+10h] [bp-14h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4703 int v39; // [sp+14h] [bp-10h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4704 int i; // [sp+18h] [bp-Ch]@31
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4705 uint v45; // [sp+20h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4706
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4707 // __debugbreak(); // refactor for blv ai
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4708 pParty->uFlags &= 0xFFFFFFCF;//~0x30
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4709 v37 = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4710 v45 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4711 for ( uint i = 0; i < (signed int)uNumActors; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4712 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4713 pActors[i].ResetAlive();//~0x0400
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4714 if ( !pActors[i].CanAct() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4715 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4716 pActors[i].ResetActive();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4717 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4718 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4719 v1 = abs(pParty->vPosition.x - pActors[i].vPosition.x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4720 v38 = abs(pParty->vPosition.y - pActors[i].vPosition.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4721 v39 = abs(pParty->vPosition.z - pActors[i].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4722
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4723 distance = int_get_vector_length(v39, v38, v1) - pActors[i].uActorRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4724 if ( distance < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4725 distance = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4726 if ( distance < 10240 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4727 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4728 pActors[i].ResetHostile();//~0x01000000
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4729 if ( pActors[i].ActorEnemy() || pActors[i].GetActorsRelation(0) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4730 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4731 pActors[i].uAttributes |= ACTOR_HOSTILE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4732 if ( !(pParty->uFlags & 0x10) && (double)distance < 307.2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4733 pParty->SetRedAlert();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4734 if ( !(pParty->uFlags & 0x20) && distance < 5120 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4735 pParty->SetYellowAlert();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4736 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4737 ai_near_actors_distances[v45] = distance;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4738 ai_near_actors_ids[v45] = i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4739 v45++;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4740 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4741 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4742 pActors[i].ResetActive();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4743 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4744 v13 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4745 if ( v45 > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4746 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4747 for ( uint i = 1; i < v45; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4748 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4749 for ( uint j = 1; j < v45; ++j )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4750 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4751 v15 = ai_near_actors_distances[v13];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4752 if ( ai_near_actors_distances[v13] > ai_near_actors_distances[j] )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4753 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4754 v17 = ai_near_actors_ids[v13];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4755 ai_near_actors_ids[v13] = ai_near_actors_ids[j];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4756 ai_near_actors_ids[j] = v17;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4757 ai_near_actors_distances[v13] = ai_near_actors_distances[j];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4758 ai_near_actors_distances[j] = v15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4759 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4760 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4761 ++v13;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4762 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4763 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4764 v18 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4765 v19 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4766 for ( i = 0; i < v45; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4767 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4768 if ( pActors[ai_near_actors_ids[i]].ActorNearby()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4769 || sub_4070EF_prolly_detect_player(PID(OBJECT_Actor,ai_near_actors_ids[i]), 4) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4770 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4771 pActors[ai_near_actors_ids[i]].uAttributes |= ACTOR_NEARBY;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4772 ai_array_4F6638_actor_ids[v19] = ai_near_actors_ids[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4773 ai_array_4F5E68[v19++] = ai_near_actors_distances[i];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4774 if ( v19 >= 30 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4775 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4776 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4777 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4778 ai_arrays_size = v19;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4779 if ( (signed int)uNumActors > 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4780 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4781 for ( uint i = 0; i < (signed int)uNumActors; ++i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4782 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4783 if ( pActors[i].CanAct() && pActors[i].uSectorID == v37 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4784 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4785 v25 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4786 if ( v19 <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4787 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4788 pActors[i].uAttributes |= ACTOR_ACTIVE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4789 ai_array_4F6638_actor_ids[ai_arrays_size++] = i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4790 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4791 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4792 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4793 while ( ai_array_4F6638_actor_ids[v25] != i )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4794 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4795 ++v25;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4796 if ( v25 >= v19 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4797 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4798 pActors[i].uAttributes |= ACTOR_ACTIVE;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4799 ai_array_4F6638_actor_ids[ai_arrays_size++] = i;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4800 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4801 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4802 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4803 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4804 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4805 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4806 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4807 for ( j = 0; j < v45; ++j )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4808 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4809 if ( pActors[ai_near_actors_ids[j]].uAttributes & 0xC000 && pActors[ai_near_actors_ids[j]].CanAct() )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4810 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4811 v30 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4812 if ( ai_arrays_size <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4813 ai_array_4F6638_actor_ids[ai_arrays_size++] = ai_near_actors_ids[j];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4814 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4815 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4816 while ( ai_array_4F6638_actor_ids[v30] != ai_near_actors_ids[j] )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4817 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4818 ++v30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4819 if ( v30 >= ai_arrays_size )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4820 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4821 ai_array_4F6638_actor_ids[ai_arrays_size++] = ai_near_actors_ids[j];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4822 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4823 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4824 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4825 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4826 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4827 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4828 if ( ai_arrays_size > 30 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4829 ai_arrays_size = 30;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4830 memcpy(ai_near_actors_ids.data(), ai_array_4F6638_actor_ids.data(), 4 * ai_arrays_size);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4831 memcpy(ai_near_actors_distances.data(), ai_array_4F5E68.data(), 4 * ai_arrays_size);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4832 for ( uint i = 0; i < ai_arrays_size; i++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4833 pActors[ai_near_actors_ids[i]].uAttributes |= ACTOR_ALIVE;//0x400
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4834 return ai_arrays_size;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4835 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4836
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4837
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4838 //----- (004070EF) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4839 bool __fastcall sub_4070EF_prolly_detect_player(unsigned int uObjID, unsigned int uObj2ID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4840 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4841 signed int v2; // eax@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4842 int obj1_sector; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4843 float v8; // ST24_4@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4844 signed int v12; // eax@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4845 int obj2_z; // edi@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4846 int obj2_x; // esi@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4847 int obj2_sector; // eax@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4848 float v20; // ST24_4@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4849 int dist_x; // ebx@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4850 signed int dist_3d; // ecx@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4851 int v25; // eax@18
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4852 BLVFace *v29; // ebx@32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4853 Vec3_short_ *v30; // esi@32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4854 int v31; // eax@32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4855 int v32; // ST50_4@44
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4856 int v33; // ST54_4@44
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4857 int v34; // eax@44
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4858 signed int v38; // esi@45
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4859 __int16 next_sector; // bx@58
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4860 int v47; // [sp+18h] [bp-50h]@20
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4861 int v48; // [sp+1Ch] [bp-4Ch]@20
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4862 int v49; // [sp+20h] [bp-48h]@20
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4863 int dist_z; // [sp+24h] [bp-44h]@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4864 signed int higher_z; // [sp+24h] [bp-44h]@27
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4865 signed int lower_z; // [sp+28h] [bp-40h]@26
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4866 signed int higher_y; // [sp+2Ch] [bp-3Ch]@23
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4867 signed int lower_y; // [sp+30h] [bp-38h]@22
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4868 signed int higher_x; // [sp+34h] [bp-34h]@21
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4869 signed int lower_x; // [sp+38h] [bp-30h]@20
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4870 signed int sectors_visited; // [sp+3Ch] [bp-2Ch]@28
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4871 int v58; // [sp+44h] [bp-24h]@50
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4872 int v59; // [sp+48h] [bp-20h]@44
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4873 int obj2_y; // [sp+50h] [bp-18h]@11
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4874 int obj1_x; // [sp+58h] [bp-10h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4875 int obj1_y; // [sp+5Ch] [bp-Ch]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4876 int obj1_z; // [sp+60h] [bp-8h]@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4877 int current_sector; // [sp+64h] [bp-4h]@7
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4878 int dist_y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4879 int v70;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4880
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4881 v2 = PID_ID(uObjID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4882 switch( PID_TYPE(uObjID) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4883 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4884 case OBJECT_Decoration:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4885 obj1_x = pLevelDecorations[v2].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4886 obj1_y = pLevelDecorations[v2].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4887 obj1_z = pLevelDecorations[v2].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4888 obj1_sector = pIndoor->GetSector(obj1_x, obj1_y, obj1_z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4889 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4890 case OBJECT_Actor:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4891 obj1_x = pActors[v2].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4892 obj1_y = pActors[v2].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4893 v8 = (double)pActors[v2].uActorHeight * 0.69999999;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4894 //v9 = v8 + 6.7553994e15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4895 //obj1_z = LODWORD(v9) + pActors[v2].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4896 obj1_z = (int)v8 + pActors[v2].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4897 obj1_sector = pActors[v2].uSectorID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4898 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4899 case OBJECT_Item:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4900 obj1_x = pSpriteObjects[v2].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4901 obj1_y = pSpriteObjects[v2].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4902 obj1_z = pSpriteObjects[v2].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4903 obj1_sector = pSpriteObjects[v2].uSectorID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4904 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4905 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4906 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4907 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4908 v12 = PID_ID(uObj2ID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4909 switch( PID_TYPE(uObj2ID) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4910 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4911 case OBJECT_Decoration:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4912 obj2_z = pLevelDecorations[v12].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4913 obj2_x = pLevelDecorations[v12].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4914 obj2_y = pLevelDecorations[v12].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4915 obj2_sector = pIndoor->GetSector(obj2_x, obj2_y, obj2_z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4916 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4917 case OBJECT_Player:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4918 obj2_x = pParty->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4919 obj2_z = pParty->sEyelevel + pParty->vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4920 obj2_y = pParty->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4921 obj2_sector = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4922 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4923 case OBJECT_Actor:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4924 obj2_y = pActors[v12].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4925 obj2_x = pActors[v12].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4926 v20 = (double)pActors[v12].uActorHeight * 0.69999999;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4927 //v21 = v20 + 6.7553994e15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4928 //obj2_z = LODWORD(v21) + pActors[v12].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4929 obj2_z = (int)v20 + pActors[v12].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4930 obj2_sector = pActors[v12].uSectorID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4931 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4932 case OBJECT_Item:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4933 obj2_x = pSpriteObjects[v12].vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4934 obj2_z = pSpriteObjects[v12].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4935 obj2_y = pSpriteObjects[v12].vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4936 obj2_sector = pSpriteObjects[v12].uSectorID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4937 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4938 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4939 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4940 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4941 dist_x = obj2_x - obj1_x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4942 dist_z = obj2_z - obj1_z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4943 dist_y = obj2_y - obj1_y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4944 dist_3d = integer_sqrt(dist_x * dist_x + dist_y * dist_y + dist_z * dist_z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4945 //range check
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4946 if ( dist_3d > 5120 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4947 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4948 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4949 return 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4950 v25 = 65536;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4951 if ( dist_3d )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4952 v25 = 65536 / dist_3d;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4953 v49 = dist_x * v25;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4954 v47 = dist_z * v25;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4955 v48 = dist_y * v25;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4956 if ( obj1_x < obj2_x )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4957 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4958 lower_x = obj1_x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4959 higher_x = obj2_x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4960 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4961 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4962 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4963 lower_x = obj2_x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4964 higher_x = obj1_x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4965 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4966 if ( obj1_y < obj2_y )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4967 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4968 lower_y = obj1_y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4969 higher_y = obj2_y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4970 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4971 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4972 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4973 lower_y = obj2_y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4974 higher_y = obj1_y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4975 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4976 if ( obj1_z < obj2_z )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4977 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4978 lower_z = obj1_z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4979 higher_z = obj2_z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4980 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4981 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4982 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4983 lower_z = obj2_z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4984 higher_z = obj1_z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4985 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4986 sectors_visited = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4987 //monster in same sector with player
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4988 if ( obj1_sector == obj2_sector )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4989 return 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4990 //search starts from monster
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4991 current_sector = obj1_sector;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4992 for( int current_portal = 0; current_portal < pIndoor->pSectors[current_sector].uNumPortals; current_portal++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4993 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4994 v29 = &pIndoor->pFaces[pIndoor->pSectors[current_sector].pPortals[current_portal]];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4995 v30 = &pIndoor->pVertices[*v29->pVertexIDs];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4996 v31 = v29->pFacePlane_old.vNormal.z * (v30->z - obj1_z)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4997 + v29->pFacePlane_old.vNormal.y * (v30->y - obj1_y)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4998 + v29->pFacePlane_old.vNormal.x * (v30->x - obj1_x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
4999
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5000 if ( current_sector != v29->uSectorID )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5001 v31 = -v31;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5002
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5003 if ( v31 >= 0 && v30->x != obj1_x && v30->y != obj1_y && v30->z != obj1_z)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5004 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5005
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5006 if( lower_x > v29->pBounding.x2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5007 || higher_x < v29->pBounding.x1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5008 || lower_y > v29->pBounding.y2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5009 || higher_y < v29->pBounding.y1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5010 || lower_z > v29->pBounding.z2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5011 || higher_z < v29->pBounding.z1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5012 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5013 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5014 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5015
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5016 v32 = fixpoint_mul(v29->pFacePlane_old.vNormal.x,v49);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5017 v34 = fixpoint_mul(v29->pFacePlane_old.vNormal.y,v48);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5018 v33 = fixpoint_mul(v29->pFacePlane_old.vNormal.z,v47);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5019
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5020 v59 = v32 + v33 + v34;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5021 if ( v59 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5022 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5023 v70 = v29->pFacePlane_old.dist
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5024 + obj1_z * v29->pFacePlane_old.vNormal.z
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5025 + obj1_x * v29->pFacePlane_old.vNormal.x
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5026 + obj1_y * v29->pFacePlane_old.vNormal.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5027 v38 = -v70;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5028
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5029 // if ( v59 <= 0 ^ v70 <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5030
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5031 /* TEMPORARY
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5032 if ( v59 <= 0 && v70 <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5033 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5034 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5035 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5036 if ( !(v59 <= 0 && v70 <= 0) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5037 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5038 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5039 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5040 */
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5041
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5042 if( abs(v38) >> 14 > abs(v59) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5043 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5044
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5045 v58 = fixpoint_div(v38,v59);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5046
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5047 if( v58 < 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5048 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5049
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5050 if(!sub_4075DB(obj1_x + ((fixpoint_mul(v49,v58) + 32768) >> 16), obj1_y + ((fixpoint_mul(v48,v58) + 32768) >> 16),
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5051 obj1_z + ((fixpoint_mul(v47,v58) + 32768) >> 16), v29) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5052 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5053 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5054 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5055
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5056 //if there is no next sector turn back
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5057 if ( v29->uSectorID == current_sector )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5058 next_sector = v29->uBackSectorID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5059 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5060 next_sector = v29->uSectorID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5061
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5062 //no more portals, quit
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5063 if ( next_sector == current_sector )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5064 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5065
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5066 ++sectors_visited;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5067 current_sector = next_sector;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5068
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5069 //found player, quit
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5070 if ( next_sector == obj2_sector )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5071 return 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5072
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5073 current_sector = next_sector;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5074
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5075 //did we hit limit for portals?
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5076 //does the next room have portals?
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5077 if ( sectors_visited < 30 && pIndoor->pSectors[current_sector].uNumPortals > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5078 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5079 current_portal=-1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5080 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5081 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5082 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5083 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5084 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5085 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5086 //did we stop in the sector where player is?
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5087 if ( current_sector != obj2_sector )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5088 return 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5089 return 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5090 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5091
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5092
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5093 //----- (00450B0A) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5094 bool __fastcall SpawnActor(unsigned int uMonsterID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5095 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5096 unsigned int v1; // ebx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5097 bool result; // eax@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5098 unsigned int v6; // ecx@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5099 Actor actor; // [sp+4h] [bp-350h]@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5100 Vec3_int_ pOut; // [sp+348h] [bp-Ch]@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5101
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5102 v1 = uMonsterID;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5103 if ( uNumActors == 499 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5104 result = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5105 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5106 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5107 if ( (signed int)uMonsterID >= (signed int)pMonsterList->uNumMonsters )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5108 v1 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5109 memset(&actor, 0, sizeof(Actor));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5110 strcpy(actor.pActorName, pMonsterStats->pInfos[v1 + 1].pName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5111 actor.sCurrentHP = LOWORD(pMonsterStats->pInfos[v1 + 1].uHP);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5112 memcpy(&actor.pMonsterInfo, &pMonsterStats->pInfos[v1 + 1], sizeof(MonsterInfo));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5113 actor.word_000086_some_monster_id = v1 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5114 actor.uActorRadius = pMonsterList->pMonsters[v1].uMonsterRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5115 actor.uActorHeight = pMonsterList->pMonsters[v1].uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5116 actor.uMovementSpeed = pMonsterList->pMonsters[v1].uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5117
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5118 Vec3_int_::Rotate(200, pParty->sRotationY, 0, pParty->vPosition, &pOut.x, &pOut.z, &pOut.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5119 actor.vInitialPosition.x = pOut.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5120 actor.vPosition.x = pOut.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5121 actor.uTetherDistance = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5122 actor.vInitialPosition.y = LOWORD(pOut.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5123 actor.vPosition.y = LOWORD(pOut.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5124 actor.vInitialPosition.z = LOWORD(pOut.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5125 actor.vPosition.z = LOWORD(pOut.y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5126 pSprites_LOD->DeleteSomeSprites();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5127 pPaletteManager->ResetNonTestLocked();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5128 v6 = uNumActors - 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5129 if ( dword_5C6DF8 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5130 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5131 dword_5C6DF8 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5132 v6 = uNumActors++;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5133 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5134 memcpy(&pActors[v6], &actor, sizeof(Actor));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5135 pActors[v6].PrepareSprites(1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5136 result = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5137 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5138 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5139 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5140 // 5C6DF8: using guessed type int dword_5C6DF8;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5141
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5142
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5143 //----- (0044FA4C) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5144 signed int __fastcall sub_44FA4C_spawn_light_elemental(int a1, int a2, int a3)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5145 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5146 signed int result; // eax@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5147 int v10; // ebx@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5148 const char *v15; // [sp-4h] [bp-24h]@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5149 unsigned int uFaceID; // [sp+8h] [bp-18h]@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5150 int v19; // [sp+Ch] [bp-14h]@16
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5151 size_t v20; // [sp+10h] [bp-10h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5152 int v21; // [sp+14h] [bp-Ch]@14
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5153 unsigned int v23; // [sp+1Ch] [bp-4h]@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5154
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5155 if ( a2 == 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5156 v15 = "Elemental Light C";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5157 else if ( a2 == 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5158 v15 = "Elemental Light B";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5159 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5160 v15 = "Elemental Light A";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5161
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5162 v23 = pMonsterList->GetMonsterIDByName(v15);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5163 v20 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5164 for ( v20; v20 < uNumActors; v20++ )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5165 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5166 if ( pActors[v20].uAIState == Removed )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5167 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5168 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5169
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5170 result = uNumActors + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5171 if ( v20 != uNumActors || result < 500 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5172 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5173 v21 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5174 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5175 v21 = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5176 v19 = (((uCurrentlyLoadedLevelType != LEVEL_Outdoor) - 1) & 0x40) + 64;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5177 pActors[v20].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5178 strcpy(pActors[v20].pActorName, pMonsterStats->pInfos[v23 + 1].pName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5179 pActors[v20].sCurrentHP = pMonsterStats->pInfos[v23 + 1].uHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5180 memcpy(&pActors[v20].pMonsterInfo, &pMonsterStats->pInfos[v23 + 1], sizeof(MonsterInfo));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5181 pActors[v20].word_000086_some_monster_id = v23 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5182 pActors[v20].uActorRadius = pMonsterList->pMonsters[v23].uMonsterRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5183 pActors[v20].uActorHeight = pMonsterList->pMonsters[v23].uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5184 pActors[v20].pMonsterInfo.uTreasureDiceRolls = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5185 pActors[v20].pMonsterInfo.uTreasureType = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5186 pActors[v20].pMonsterInfo.uExp = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5187 pActors[v20].uMovementSpeed = pMonsterList->pMonsters[v23].uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5188 v10 = rand() % 2048;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5189 pActors[v20].vInitialPosition.x = pParty->vPosition.x + fixpoint_mul(stru_5C6E00->Cos(v10), v19);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5190 pActors[v20].vPosition.x = pActors[v20].vInitialPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5191 pActors[v20].vInitialPosition.y = pParty->vPosition.y + fixpoint_mul(stru_5C6E00->Sin(v10), v19);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5192 pActors[v20].vPosition.y = pActors[v20].vInitialPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5193 pActors[v20].vInitialPosition.z = pParty->vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5194 pActors[v20].vPosition.z = pActors[v20].vInitialPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5195 pActors[v20].uTetherDistance = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5196 pActors[v20].uSectorID = v21;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5197 pActors[v20].PrepareSprites(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5198 pActors[v20].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5199 pActors[v20].uAlly = 9999;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5200 pActors[v20].uGroup = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5201 pActors[v20].uCurrentActionTime = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5202 pActors[v20].uAIState = Summoned;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5203 pActors[v20].uCurrentActionLength = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5204 pActors[v20].UpdateAnimation();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5205
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5206 result = pIndoor->GetSector(pActors[v20].vPosition.x, pActors[v20].vPosition.y, pActors[v20].vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5207 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5208 || result == v21
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5209 && (result = BLV_GetFloorLevel(pActors[v20].vPosition.x, pActors[v20].vPosition.y, pActors[v20].vPosition.z, result, &uFaceID), result != -30000)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5210 && (result = abs(result - pParty->vPosition.z), result <= 1024) )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5211 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5212 if ( v20 == uNumActors )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5213 ++uNumActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5214 pActors[v20].uSummonerID = PID(OBJECT_Player, a1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5215 result = pActors[v20].pActorBuffs[ACTOR_BUFF_SUMMONED].Apply(pParty->uTimePlayed + (a3 * 128) / 30.0f, a2, a1, 0, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5216 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5217 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5218 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5219 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5220
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5221 //----- (0044F57C) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5222 void SpawnEncounter(MapInfo *pMapInfo, SpawnPointMM7 *spawn, int a3, int a4, int a5)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5223 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5224 int v7; // eax@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5225 char v8; // zf@5
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5226 int v12; // edx@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5227 int v18; // esi@31
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5228 Actor *pMonster; // esi@35
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5229 int v23; // edx@36
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5230 signed int v24; // edi@36
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5231 int v25; // ecx@36
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5232 MonsterDesc *v27; // edi@48
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5233 signed int v28; // eax@48
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5234 int v32; // eax@50
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5235 int v37; // eax@51
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5236 int v38; // eax@52
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5237 int v39; // edi@52
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5238 std::string v40; // [sp-18h] [bp-100h]@60
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5239 const char *v44; // [sp-8h] [bp-F0h]@13
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5240 char *pTexture; // [sp-4h] [bp-ECh]@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5241 char Str[32]; // [sp+Ch] [bp-DCh]@60
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5242 char Str2[120]; // [sp+2Ch] [bp-BCh]@29
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5243 unsigned int uFaceID; // [sp+A4h] [bp-44h]@52
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5244 MonsterInfo *Src; // [sp+A8h] [bp-40h]@50
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5245 int v50; // [sp+ACh] [bp-3Ch]@47
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5246 char Source[32]; // [sp+B0h] [bp-38h]@20
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5247 int v52; // [sp+D0h] [bp-18h]@34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5248 int v53; // [sp+D4h] [bp-14h]@34
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5249 int pSector; // [sp+D8h] [bp-10h]@32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5250 int pPosX; // [sp+DCh] [bp-Ch]@32
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5251 int v56; // [sp+E0h] [bp-8h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5252 int v57; // [sp+E4h] [bp-4h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5253
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5254 //auto a2 = spawn;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5255 v57 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5256 //v5 = pMapInfo;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5257 //v6 = spawn;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5258 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5259 v7 = pOutdoor->ddm.field_C_alert;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5260 else if (uCurrentlyLoadedLevelType == LEVEL_Outdoor)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5261 v7 = pIndoor->dlv.field_C_alert;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5262 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5263 v7 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5264 if (v7)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5265 v8 = (spawn->uAttributes & 1) == 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5266 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5267 v8 = (spawn->uAttributes & 1) == 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5268 if (v8)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5269 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5270 //result = (void *)(spawn->uIndex - 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5271 v56 = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5272 switch (spawn->uIndex - 1)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5273 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5274 case 0:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5275 //v9 = pMapInfo->uEncounterMonster1AtLeast;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5276 //v10 = rand();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5277 //v11 = pMapInfo->uEncounterMonster1AtMost;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5278 //pTexture = pMapInfo->pEncounterMonster1Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5279 v12 = rand() % (pMapInfo->uEncounterMonster1AtMost - pMapInfo->uEncounterMonster1AtLeast + 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5280 //v13 = pMapInfo->Dif_M1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5281 v57 = pMapInfo->Dif_M1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5282 v56 = pMapInfo->uEncounterMonster1AtLeast + v12;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5283 strcpy(Source, pMapInfo->pEncounterMonster1Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5284 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5285 case 3:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5286 //pTexture = pMapInfo->pEncounterMonster1Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5287 //v44 = "%s A";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5288 sprintf(Source, "%s A", pMapInfo->pEncounterMonster1Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5289 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5290 case 4:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5291 //pTexture = pMapInfo->pEncounterMonster2Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5292 //v44 = "%s A";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5293 sprintf(Source, "%s A", pMapInfo->pEncounterMonster2Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5294 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5295 case 5:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5296 //pTexture = pMapInfo->pEncounterMonster3Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5297 //v44 = "%s A";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5298 sprintf(Source, "%s A", pMapInfo->pEncounterMonster3Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5299 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5300 case 1:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5301 //v9 = pMapInfo->uEncounterMonster2AtLeast;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5302 //v14 = rand();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5303 //v15 = pMapInfo->uEncounterMonster2AtMost;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5304 //pTexture = pMapInfo->pEncounterMonster2Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5305 v12 = rand() % (pMapInfo->uEncounterMonster2AtMost - pMapInfo->uEncounterMonster2AtLeast + 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5306 //v13 = pMapInfo->Dif_M2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5307 v57 = pMapInfo->Dif_M2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5308 v56 = pMapInfo->uEncounterMonster2AtLeast + v12;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5309 strcpy(Source, pMapInfo->pEncounterMonster2Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5310 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5311 case 6:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5312 //pTexture = pMapInfo->pEncounterMonster1Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5313 //v44 = "%s B";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5314 sprintf(Source, "%s B", pMapInfo->pEncounterMonster1Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5315 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5316 case 7:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5317 //pTexture = pMapInfo->pEncounterMonster2Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5318 //v44 = "%s B";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5319 sprintf(Source, "%s B", pMapInfo->pEncounterMonster2Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5320 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5321 case 8:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5322 //pTexture = pMapInfo->pEncounterMonster3Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5323 //v44 = "%s B";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5324 sprintf(Source, "%s B", pMapInfo->pEncounterMonster3Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5325 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5326 case 2:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5327 //v9 = pMapInfo->uEncounterMonster3AtLeast;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5328 //v16 = rand();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5329 //v17 = pMapInfo->uEncounterMonster3AtMost;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5330 //pTexture = pMapInfo->pEncounterMonster3Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5331 v12 = rand() % (pMapInfo->uEncounterMonster3AtMost - pMapInfo->uEncounterMonster3AtLeast + 1);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5332 //v13 = pMapInfo->Dif_M3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5333 v57 = pMapInfo->Dif_M3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5334 v56 = pMapInfo->uEncounterMonster3AtLeast + v12;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5335 strcpy(Source, pMapInfo->pEncounterMonster3Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5336 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5337 case 9:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5338 //pTexture = pMapInfo->pEncounterMonster1Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5339 //v44 = "%s C";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5340 sprintf(Source, "%s C", pMapInfo->pEncounterMonster1Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5341 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5342 case 10:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5343 //pTexture = pMapInfo->pEncounterMonster2Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5344 //v44 = "%s C";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5345 sprintf(Source, "%s C", pMapInfo->pEncounterMonster2Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5346 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5347 case 11:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5348 //pTexture = pMapInfo->pEncounterMonster3Texture;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5349 //v44 = "%s C";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5350 sprintf(Source, "%s C", pMapInfo->pEncounterMonster3Texture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5351 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5352 default:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5353 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5354 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5355 if (Source[0] == '0')
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5356 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5357 v57 += a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5358 if ( v57 > 4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5359 v57 = 4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5360 strcpy(Str2, Source);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5361 if ( a4 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5362 v56 = a4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5363 v18 = v56;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5364 if ( (signed int)(v56 + uNumActors) >= 500 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5365 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5366 pSector = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5367 pPosX = spawn->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5368 a4 = spawn->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5369 a3 = spawn->vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5370 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5371 pSector = pIndoor->GetSector(spawn->vPosition.x, spawn->vPosition.y, spawn->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5372 v53 = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5373 v52 = (((uCurrentlyLoadedLevelType != LEVEL_Outdoor) - 1) & 0x40) + 64;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5374 if ( v18 <= 0 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5375 return;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5376 for (uint i = v53; i < v56; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5377 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5378 pMonster = &pActors[uNumActors];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5379 pActors[uNumActors].Reset();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5380 if ( v57 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5381 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5382 v23 = rand() % 100;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5383 v24 = 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5384 v25 = (unsigned __int16)word_4E8152[3 * v57];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5385 if ( v23 >= v25 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5386 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5387 if ( v23 < v25 + (unsigned __int16)word_4E8152[3 * v57 + 1] )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5388 v24 = 2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5389 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5390 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5391 v24 = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5392 if ( v24 == 1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5393 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5394 pTexture = Source;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5395 v44 = "%s A";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5396 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5397 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5398 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5399 if ( v24 == 2 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5400 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5401 pTexture = Source;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5402 v44 = "%s B";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5403 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5404 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5405 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5406 if ( v24 != 3 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5407 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5408 pTexture = Source;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5409 v44 = "%s C";
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5410 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5411 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5412 sprintf(Str2, v44, pTexture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5413 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5414 v50 = pMonsterList->GetMonsterIDByName(Str2);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5415 pTexture = Str2;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5416 if ( (signed __int16)v50 == -1 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5417 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5418 sprintf(Str, "Can't create random monster: '%s'! See MapStats.txt and Monsters.txt!", pTexture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5419 MessageBoxA(nullptr, Str, nullptr, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5420 ExitProcess(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5421 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5422 v27 = &pMonsterList->pMonsters[(signed __int16)v50];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5423 v28 = pMonsterStats->FindMonsterByTextureName(pTexture);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5424 if ( !v28 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5425 v28 = 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5426 Src = &pMonsterStats->pInfos[v28];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5427 strcpy(pMonster->pActorName, Src->pName);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5428 pMonster->sCurrentHP = Src->uHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5429 assert(sizeof(MonsterInfo) == 88);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5430 memcpy(&pMonster->pMonsterInfo, Src, sizeof(MonsterInfo));//Uninitialized portail memory access
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5431 pMonster->word_000086_some_monster_id = v50 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5432 pMonster->uActorRadius = v27->uMonsterRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5433 pMonster->uActorHeight = v27->uMonsterHeight;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5434 pMonster->uMovementSpeed = v27->uMovementSpeed;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5435 pMonster->vInitialPosition.x = spawn->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5436 pMonster->vPosition.x = spawn->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5437 pMonster->uTetherDistance = 256;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5438 pMonster->vInitialPosition.y = a4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5439 pMonster->vPosition.y = a4;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5440 pMonster->vInitialPosition.z = a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5441 pMonster->vPosition.z = a3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5442 pMonster->uSectorID = pSector;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5443 pMonster->uGroup = spawn->uGroup;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5444 pMonster->PrepareSprites(0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5445 pMonster->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5446 v32 = rand();
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5447 a3 = fixpoint_mul(stru_5C6E00->Cos(v32 % 2048), v52);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5448 pPosX = a3 + spawn->vPosition.x;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5449 a3 = fixpoint_mul(stru_5C6E00->Sin(v32 % 2048), v52);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5450 a4 = a3 + spawn->vPosition.y;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5451 a3 = spawn->vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5452 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5453 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5454 if ( a5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5455 pMonster->uAttributes |= ACTOR_AGGRESSOR;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5456 ++uNumActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5457 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5458 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5459 v37 = pIndoor->GetSector(pPosX, a4, spawn->vPosition.z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5460 if ( v37 == pSector )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5461 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5462 v38 = BLV_GetFloorLevel(pPosX, a4, a3, v37, &uFaceID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5463 v39 = v38;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5464 if ( v38 != -30000 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5465 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5466 if ( abs(v38 - a3) <= 1024 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5467 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5468 a3 = v39;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5469 if ( a5 )
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5470 pMonster->uAttributes |= ACTOR_AGGRESSOR;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5471 ++uNumActors;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5472 continue;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5473 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5474 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5475 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5476 ;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5477 //v53 = (char *)v53 + 1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5478 //result = v53;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5479 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5480 //while ( (signed int)v53 < v56 );
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5481 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5482
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5483 //----- (00438F8F) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5484 void area_of_effect__damage_evaluate()
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5485 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5486 int attacker_type; // ecx@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5487 signed int v3; // eax@3
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5488 unsigned int target_id; // edi@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5489 int target_type; // eax@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5490 int v10; // edi@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5491 Vec3_int_ attacker_coord; // ST04_12@9
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5492 // int v12; // ST0C_4@10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5493 int v15; // edx@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5494 int v19; // edi@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5495 int v23; // edx@18
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5496 int v24; // eax@18
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5497 // int v30; // eax@29
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5498 int v31; // edx@29
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5499 int v32; // eax@29
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5500 int v33; // ST24_4@29
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5501 SpriteObject *v36; // [sp+0h] [bp-28h]@0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5502 int attacker_id; // [sp+10h] [bp-18h]@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5503 int v44; // [sp+14h] [bp-14h]@15
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5504 //Vec3_int_ *pVelocity; // [sp+1Ch] [bp-Ch]@2
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5505 signed int a1; // [sp+20h] [bp-8h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5506 int v48; // [sp+24h] [bp-4h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5507
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5508
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5509 for (attacker_id = 0; attacker_id < AttackerInfo.count; ++attacker_id)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5510 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5511 attacker_type = PID_TYPE(AttackerInfo.pIDs[attacker_id]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5512 v3 = PID_ID(AttackerInfo.pIDs[attacker_id]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5513
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5514 if (attacker_type == 2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5515 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5516 v36 = &pSpriteObjects[v3];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5517 attacker_type = PID_TYPE(pSpriteObjects[v3].spell_caster_pid);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5518 v3 = PID_ID(pSpriteObjects[v3].spell_caster_pid);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5519 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5520
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5521 if (AttackerInfo.field_3EC[attacker_id] & 1)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5522 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5523 target_id = PID_ID(ai_near_actors_targets_pid[v3]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5524 target_type = PID_TYPE(ai_near_actors_targets_pid[v3]) - 3;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5525 if (target_type)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5526 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5527 if (target_type == 1)//party damage from monsters(повреждения группе от монстров)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5528 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5529 v10 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5530 a1 = pParty->vPosition.x - AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5531 v48 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5532 if (a1 * a1 + v10 * v10
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5533 + ((signed int)(pParty->vPosition.z + pParty->uPartyHeight) >> (1 - AttackerInfo.pZs[attacker_id]))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5534 * ((signed int)(pParty->vPosition.z + pParty->uPartyHeight) >> (1 - AttackerInfo.pZs[attacker_id]))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5535 < (unsigned int)((AttackerInfo.field_324[attacker_id] + 32) * (AttackerInfo.field_324[attacker_id] + 32)))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5536 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5537 attacker_coord.x = AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5538 attacker_coord.y = AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5539 attacker_coord.z = AttackerInfo.pZs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5540 if (sub_407A1C(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + pParty->sEyelevel, attacker_coord))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5541 DamagePlayerFromMonster(AttackerInfo.pIDs[attacker_id], AttackerInfo.field_450[attacker_id], &AttackerInfo.vec_4B4[attacker_id], stru_50C198.which_player_to_attack(&pActors[v3]));
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5542 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5543 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5544 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5545 else//Actor damage from monsters(повреждение местного жителя)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5546 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5547 if (SHIDWORD(pActors[target_id].pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime) > 0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5548 || SHIDWORD(pActors[target_id].pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime) >= 0
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5549 && LODWORD(pActors[target_id].pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5550 || pActors[target_id].CanAct())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5551 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5552 v15 = pActors[target_id].vPosition.y - AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5553 a1 = pActors[target_id].vPosition.x - AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5554 v44 = pActors[target_id].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5555 v19 = AttackerInfo.field_324[attacker_id] + pActors[target_id].uActorRadius;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5556 v48 = v15;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5557 if (a1 * a1 + v15 * v15 + (pActors[target_id].vPosition.z + (pActors[target_id].uActorHeight >> 1) - AttackerInfo.pZs[attacker_id])
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5558 * (pActors[target_id].vPosition.z + (pActors[target_id].uActorHeight >> 1) - AttackerInfo.pZs[attacker_id]) < (unsigned int)(v19 * v19))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5559 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5560 attacker_coord.x = AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5561 attacker_coord.y = AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5562 attacker_coord.z = AttackerInfo.pZs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5563 if (sub_407A1C(pActors[target_id].vPosition.x, pActors[target_id].vPosition.y, pActors[target_id].vPosition.z + 50, attacker_coord))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5564 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5565 Vec3_int_::Normalize(&a1, &v48, &v44);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5566 AttackerInfo.vec_4B4[attacker_id].x = a1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5567 AttackerInfo.vec_4B4[attacker_id].y = v48;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5568 AttackerInfo.vec_4B4[attacker_id].z = v44;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5569 Actor::ActorDamageFromMonster(AttackerInfo.pIDs[attacker_id], target_id, &AttackerInfo.vec_4B4[attacker_id], AttackerInfo.field_450[attacker_id]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5570 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5571 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5572 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5573 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5574 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5575 else //damage from spells(повреждения от заклов(метеоритный дождь))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5576 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5577 v23 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5578 v24 = ((signed int)pParty->uPartyHeight / 2) - AttackerInfo.pZs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5579 a1 = pParty->vPosition.x - AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5580 v48 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5581 if (a1 * a1 + v23 * v23 + (pParty->vPosition.z + v24) * (pParty->vPosition.z + v24) < (unsigned int)((AttackerInfo.field_324[attacker_id] + 32) * (AttackerInfo.field_324[attacker_id] + 32)))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5582 {//party damage (повреждения группе)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5583 attacker_coord.x = AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5584 attacker_coord.y = AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5585 attacker_coord.z = AttackerInfo.pZs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5586 if (sub_407A1C(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + pParty->sEyelevel, attacker_coord))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5587 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5588 for (uint i = 0; i < 4; ++i)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5589 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5590 if (!(HIDWORD(pParty->pPlayers[i].pConditions[Condition_Dead]) | LODWORD(pParty->pPlayers[i].pConditions[Condition_Dead]))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5591 && !pParty->pPlayers[i].pConditions[Condition_Pertified] && !pParty->pPlayers[i].pConditions[Condition_Eradicated])
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5592 DamagePlayerFromMonster(AttackerInfo.pIDs[attacker_id], AttackerInfo.field_450[attacker_id], &AttackerInfo.vec_4B4[attacker_id], i);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5593 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5594 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5595 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5596 if ((signed int)uNumActors > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5597 {//actors damage(повреждения другим участникам)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5598 for (int actorID = 0; (signed int)actorID < (signed int)uNumActors; ++actorID)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5599 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5600 if (pActors[actorID].CanAct())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5601 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5602 //v30 = pActors[actorID].vPosition.y - AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5603 a1 = pActors[actorID].vPosition.x - AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5604 v31 = pActors[actorID].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5605 v48 = pActors[actorID].vPosition.y - AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5606 v44 = pActors[actorID].vPosition.z;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5607 v32 = (pActors[actorID].uActorHeight / 2) - AttackerInfo.pZs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5608 v33 = pActors[actorID].uActorRadius + AttackerInfo.field_324[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5609 if (a1 * a1 + v48 * v48 + (v31 + v32) * (v31 + v32) < (unsigned int)(v33 * v33))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5610 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5611 attacker_coord.x = AttackerInfo.pXs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5612 attacker_coord.y = AttackerInfo.pYs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5613 attacker_coord.z = AttackerInfo.pZs[attacker_id];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5614 if (sub_407A1C(pActors[actorID].vPosition.x, pActors[actorID].vPosition.y, pActors[actorID].vPosition.z + 50, attacker_coord))//что делает ф-ция?
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5615 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5616 Vec3_int_::Normalize(&a1, &v48, &v44);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5617 AttackerInfo.vec_4B4[attacker_id].x = a1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5618 AttackerInfo.vec_4B4[attacker_id].y = v48;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5619 AttackerInfo.vec_4B4[attacker_id].z = v44;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5620 switch (attacker_type)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5621 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5622 case OBJECT_Player:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5623 Actor::DamageMonsterFromParty(AttackerInfo.pIDs[attacker_id], actorID, &AttackerInfo.vec_4B4[attacker_id]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5624 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5625 case OBJECT_Actor:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5626 if (v36 && pActors[v3].GetActorsRelation(&pActors[actorID]))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5627 Actor::ActorDamageFromMonster(AttackerInfo.pIDs[attacker_id], actorID, &AttackerInfo.vec_4B4[attacker_id], v36->field_61);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5628 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5629 case OBJECT_Item:
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5630 ItemDamageFromActor(AttackerInfo.pIDs[attacker_id], actorID, &AttackerInfo.vec_4B4[attacker_id]);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5631 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5632 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5633 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5634 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5635 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5636 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5637 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5638 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5639 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5640 AttackerInfo.count = 0;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5641 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5642
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5643 //----- (0043AE12) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5644 double __fastcall sub_43AE12(signed int a1)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5645 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5646 //signed int v1; // ST00_4@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5647 signed int v2; // ecx@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5648 double v3; // st7@1
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5649 double result; // st7@6
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5650
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5651 v3 = (double)a1;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5652 for (v2 = 0; v2 < 5; ++v2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5653 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5654 if (v3 < flt_4E4A80[v2 + 5])
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5655 break;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5656 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5657 if (v2 <= 0 || v2 >= 5)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5658 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5659 if (v2)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5660 result = flt_4E4A80[4];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5661 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5662 result = flt_4E4A80[0];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5663 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5664 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5665 result = (flt_4E4A80[v2] - flt_4E4A80[v2 - 1]) * (v3 - flt_4E4A80[v2 + 4]) / (flt_4E4A80[v2 + 5] - flt_4E4A80[v2 + 4]) + flt_4E4A80[v2];
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5666 return result;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5667 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5668
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5669 //----- (0043B057) --------------------------------------------------------
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5670 void ItemDamageFromActor(unsigned int uObjID, unsigned int uActorID, Vec3_int_ *pVelocity)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5671 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5672 int v6; // eax@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5673 int damage; // edi@4
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5674 int a2a; // [sp+Ch] [bp-4h]@8
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5675
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5676 if (!pActors[uActorID].IsNotAlive())
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5677 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5678 if (PID_TYPE(uObjID) == OBJECT_Item)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5679 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5680 if (pSpriteObjects[PID_ID(uObjID)].spell_id)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5681 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5682 v6 = _43AFE3_calc_spell_damage(pSpriteObjects[PID_ID(uObjID)].spell_id, pSpriteObjects[PID_ID(uObjID)].spell_level, pSpriteObjects[PID_ID(uObjID)].spell_skill, pActors[uActorID].sCurrentHP);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5683 damage = pActors[uActorID].CalcMagicalDamageToActor((DAMAGE_TYPE)0, v6);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5684 pActors[uActorID].sCurrentHP -= damage;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5685 if (damage)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5686 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5687 if (pActors[uActorID].sCurrentHP > 0)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5688 Actor::AI_Stun(uActorID, uObjID, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5689 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5690 Actor::Die(uActorID);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5691 a2a = 20 * damage / (signed int)pActors[uActorID].pMonsterInfo.uHP;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5692 if (20 * damage / (signed int)pActors[uActorID].pMonsterInfo.uHP > 10)
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5693 a2a = 10;
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5694 if (!MonsterStats::BelongsToSupertype(pActors[uActorID].pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT))
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5695 {
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5696 pVelocity->x = fixpoint_mul(a2a, pVelocity->x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5697 pVelocity->y = fixpoint_mul(a2a, pVelocity->y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5698 pVelocity->z = fixpoint_mul(a2a, pVelocity->z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5699 pActors[uActorID].vVelocity.x = 50 * LOWORD(pVelocity->x);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5700 pActors[uActorID].vVelocity.y = 50 * LOWORD(pVelocity->y);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5701 pActors[uActorID].vVelocity.z = 50 * LOWORD(pVelocity->z);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5702 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5703 Actor::AddBloodsplatOnDamageOverlay(uActorID, 1, damage);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5704 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5705 else
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5706 Actor::AI_Stun(uActorID, uObjID, 0);
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5707 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5708 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5709 }
82d5d92a097c for MVS2012
Ritor1
parents:
diff changeset
5710 }