annotate Engine/Spells/CastSpellInfo.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
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1 #define _CRTDBG_MAP_ALLOC
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2 #include <stdlib.h>
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3 #include <crtdbg.h>
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
4
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
5 #define _CRT_SECURE_NO_WARNINGS
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
6
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:
diff changeset
9 #include "CastSpellInfo.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
10 #include "../Objects/Actor.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
11 #include "../Party.h"
2502
a77c34acdbc9 Media folder
Ritor1
parents: 2501
diff changeset
12 #include "IO/Mouse.h"
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
13 #include "../../stru6.h"
2502
a77c34acdbc9 Media folder
Ritor1
parents: 2501
diff changeset
14 #include "GUI/GUIWindow.h"
a77c34acdbc9 Media folder
Ritor1
parents: 2501
diff changeset
15 #include "Media/Audio/AudioPlayer.h"
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
16 #include "../Graphics/Outdoor.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
17 #include "../Graphics/Overlays.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
18 #include "../Events.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
19 #include "../Graphics/Viewport.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
20 #include "../OurMath.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
21 #include "../Objects/SpriteObject.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
22 #include "../Objects/ObjectList.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
23 #include "../stru123.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
24 #include "../Timer.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
25 #include "../Tables/IconFrameTable.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
26 #include "../Awards.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
27 #include "../TurnEngine/TurnEngine.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
28 #include "../texts.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
29 #include "../LOD.h"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
30 #include "../Graphics/Level/Decoration.h"
2501
0ff6a9e9bf7f GUI folger
Ritor1
parents: 2499
diff changeset
31 #include "..\..\GUI\UI\UIPartyCreation.h"
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
32
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
33 const size_t CastSpellInfoCount = 10;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
34 std::array<CastSpellInfo, CastSpellInfoCount> pCastSpellInfo;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
35
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
36 //----- (00427E01) --------------------------------------------------------
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
37 void CastSpellInfoHelpers::_427E01_cast_spell()
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
38 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
39 int spell_level; // edi@1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
40 CastSpellInfo *pCastSpell; // ebx@2
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
41 signed int v6; // eax@14
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
42 unsigned __int16 v11; // cx@45
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
43 signed int i; // esi@76
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
44 // Actor *pActor; // edi@177
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
45 int v61; // ecx@184
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
46 int v111; // eax@274
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
47 int dist_X; // eax@278
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
48 // int new_dist_Y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
49 int dist_Z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
50 // int v116; // edx@279
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
51 // int v117; // edx@281
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
52 // int v118; // edx@283
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
53 int v169; // eax@344
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
54 int v188; // esi@369
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
55 int v189; // edi@369
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
56 int v206; // eax@407
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
57 double v241; // st7@478
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
58 ItemGen *v245; // edi@492
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
59 int v258; // ecx@514
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
60 char v259; // al@516
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
61 int v260; // eax@518
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
62 int v261; // esi@519
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
63 int v262; // edx@521
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
64 int *v263; // ecx@521
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
65 int v264; // esi@521
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
66 int v265; // edx@521
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
67 int *ii; // eax@522
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
68 int v267; // eax@524
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
69 int v268; // eax@524
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
70 int v278; // ecx@548
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
71 char v279; // al@550
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
72 int v280; // eax@552
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
73 int *v281; // esi@553
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
74 int v282; // edx@555
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
75 int *v283; // ecx@555
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
76 int v284; // esi@555
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
77 int v285; // edx@555
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
78 int *l; // eax@556
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
79 int v295; // edx@575
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
80 char v313; // al@606pGame->GetStru6()
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
81 const char *v317; // ecx@617
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
82 // int v396; // eax@752
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
83 __int16 v448; // ax@864
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
84 DDM_DLV_Header *v613; // eax@1108
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
85 int v642; // edi@1156
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
86 int v643; // eax@1156
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
87 int v659; // [sp+0h] [bp-E84h]@123
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
88 unsigned __int64 v663; // [sp+0h] [bp-E84h]@639
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
89 int v666; // [sp+4h] [bp-E80h]@12
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
90 PLAYER_SKILL_TYPE v667; // [sp+4h] [bp-E80h]@25
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
91 int v679[800]; // [sp+14h] [bp-E70h]@515
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
92 unsigned __int64 v685; // [sp+D08h] [bp-17Ch]@416
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
93 unsigned __int64 v687; // [sp+D24h] [bp-160h]@327
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
94 Vec3_int_ v688; // [sp+D2Ch] [bp-158h]@943
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
95 Vec3_int_ v691; // [sp+D38h] [bp-14Ch]@137
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
96 Vec3_int_ v694; // [sp+D44h] [bp-140h]@982
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
97 Vec3_int_ v697; // [sp+D50h] [bp-134h]@129
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
98 Vec3_int_ v700; // [sp+D5Ch] [bp-128h]@339
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
99 Vec3_int_ v701; // [sp+D68h] [bp-11Ch]@286
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
100 Vec3_int_ v704; // [sp+D74h] [bp-110h]@132
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
101 Vec3_int_ v707; // [sp+D80h] [bp-104h]@1127
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
102 int v710; // [sp+D8Ch] [bp-F8h]@1156
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
103 int n; // [sp+DA0h] [bp-E4h]@1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
104 AIDirection v715; // [sp+DA4h] [bp-E0h]@21
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
105 int mon_id;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
106 int dist_Y; // [sp+DD8h] [bp-ACh]@163
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
107 int v723; // [sp+E4Ch] [bp-38h]@1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
108 ItemGen *_this; // [sp+E50h] [bp-34h]@23
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
109 int v725; // [sp+E54h] [bp-30h]@23
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
110 int buff_resist;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
111 bool spell_sound_flag; // [sp+E5Ch] [bp-28h]@1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
112 Player *pPlayer; // [sp+E64h] [bp-20h]@8
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
113 int v730; // [sp+E68h] [bp-1Ch]@53
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
114 ItemGen *v730c;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
115 int skill_level; // [sp+E6Ch] [bp-18h]@48
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
116 signed int v732; // [sp+E70h] [bp-14h]@325
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
117 unsigned __int64 v733; // [sp+E74h] [bp-10h]@1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
118 int duration;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
119 signed int a2; // [sp+E7Ch] [bp-8h]@14
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
120 int amount; // [sp+E80h] [bp-4h]@1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
121 int obj_type;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
122 ItemDesc* _item;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
123
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
124 SpriteObject pSpellSprite; // [sp+DDCh] [bp-A8h]@1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
125
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
126 spell_level = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
127 amount = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
128 LODWORD(v733) = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
129 v723 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
130 spell_sound_flag = false;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
131 for(n = 0; n < CastSpellInfoCount; ++n)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
132 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
133 pCastSpell = &pCastSpellInfo[n];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
134 HIDWORD(v733) = (int)pCastSpell;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
135 if ( pCastSpell->uSpellID == 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
136 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
137
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
138 if (pParty->Invisible())
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
139 pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
140
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
141 if ( pCastSpell->uFlags & 0x3CA )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
142 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
143 if ( !pParty->pPlayers[pCastSpell->uPlayerID].CanAct() )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
144 _427D48();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
145 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
146 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
147 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
148
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
149 a2 = pCastSpell->spell_target_pid;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
150 if (!pCastSpell->spell_target_pid)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
151 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
152 if (pCastSpell->uSpellID == SPELL_LIGHT_DESTROY_UNDEAD ||
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
153 pCastSpell->uSpellID == SPELL_SPIRIT_TURN_UNDEAD ||
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
154 pCastSpell->uSpellID == SPELL_DARK_CONTROL_UNDEAD )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
155 v666 = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
156 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
157 v666 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
158
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
159 a2 = stru_50C198.FindClosestActor(5120, 1, v666);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
160 v6 = pMouse->uPointingObjectID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
161 if ( pMouse->uPointingObjectID && PID_TYPE(v6) == OBJECT_Actor && pActors[PID_ID(v6)].CanAct() )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
162 a2 = pMouse->uPointingObjectID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
163 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
164
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
165
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
166 pSpellSprite.uType = stru_4E3ACC[pCastSpell->uSpellID].uType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
167 if (pSpellSprite.uType)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
168 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
169 if (PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
170 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
171 Actor::GetDirectionInfo(PID(OBJECT_Player, pCastSpell->uPlayerID + 1), a2, &v715, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
172 spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
173 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
174 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
175 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
176 v715.uYawAngle = pParty->sRotationY;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
177 v715.uPitchAngle = pParty->sRotationX;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
178 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
179 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
180
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
181 v725 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
182 _this = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
183 if (pCastSpell->forced_spell_skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
184 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
185 v11 = pCastSpell->forced_spell_skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
186 v723 = v11 & 0x3F; // 6 bytes
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
187 spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
188 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
189 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
190 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
191 //v667 = PLAYER_SKILL_STAFF;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
192 if (pCastSpell->uSpellID < SPELL_AIR_WIZARD_EYE)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
193 v667 = PLAYER_SKILL_FIRE;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
194 else if (pCastSpell->uSpellID < SPELL_WATER_AWAKEN)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
195 v667 = PLAYER_SKILL_AIR;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
196 else if (pCastSpell->uSpellID < SPELL_EARTH_STUN)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
197 v667 = PLAYER_SKILL_WATER;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
198 else if (pCastSpell->uSpellID < SPELL_SPIRIT_DETECT_LIFE)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
199 v667 = PLAYER_SKILL_EARTH;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
200 else if (pCastSpell->uSpellID < SPELL_MIND_REMOVE_FEAR)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
201 v667 = PLAYER_SKILL_SPIRIT;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
202 else if (pCastSpell->uSpellID < SPELL_BODY_CURE_WEAKNESS)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
203 v667 = PLAYER_SKILL_MIND;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
204 else if (pCastSpell->uSpellID < SPELL_LIGHT_LIGHT_BOLT)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
205 v667 = PLAYER_SKILL_BODY;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
206 else if (pCastSpell->uSpellID < SPELL_DARK_REANIMATE)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
207 v667 = PLAYER_SKILL_LIGHT;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
208 else if (pCastSpell->uSpellID < SPELL_BOW_ARROW)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
209 v667 = PLAYER_SKILL_DARK;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
210 else if (pCastSpell->uSpellID == SPELL_BOW_ARROW)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
211 v667 = PLAYER_SKILL_BOW;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
212 else if (pCastSpell->uSpellID == SPELL_101 || pCastSpell->uSpellID == SPELL_LASER_PROJECTILE )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
213 v667 = PLAYER_SKILL_BLASTER;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
214 else assert(false && "Unknown spell");
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
215
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
216 v725 = v667;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
217 v723 = pPlayer->GetActualSkillLevel(v667) & 0x3F;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
218 spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
219 v11 = pPlayer->pActiveSkills[v725];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
220 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
221
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
222 skill_level = SkillToMastery(v11);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
223 if (pCastSpell->uSpellID < SPELL_BOW_ARROW )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
224 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
225 if (pCastSpell->forced_spell_skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
226 uRequiredMana = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
227 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
228 uRequiredMana = pSpellDatas[pCastSpell->uSpellID].mana_per_skill[skill_level - 1];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
229 sRecoveryTime = pSpellDatas[pCastSpell->uSpellID].recovery_per_skill[skill_level - 1];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
230 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
231
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
232 if (v725 == PLAYER_SKILL_DARK && pParty->uCurrentHour == 0 && pParty->uCurrentMinute == 0 ||
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
233 v725 == PLAYER_SKILL_LIGHT && pParty->uCurrentHour == 12 && pParty->uCurrentMinute == 0)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
234 uRequiredMana = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
235
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
236 if (pCastSpell->uSpellID < SPELL_BOW_ARROW && pPlayer->sMana < uRequiredMana)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
237 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
238 ShowStatusBarString(pGlobalTXT_LocalizationStrings[586], 2); // "Not enough spell points"
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
239 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
240 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
241 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
242 v730 = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
243 if (pPlayer->IsCursed() && pCastSpell->uSpellID < SPELL_BOW_ARROW && rand() % 100 < 50)//íåóäà÷íîå êàñòîâàíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
244 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
245 if (!pParty->bTurnBasedModeOn)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
246 pPlayer->SetRecoveryTime((signed __int64)(flt_6BE3A4_debug_recmod1 * 213.3333333333333));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
247 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
248 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
249 pParty->pTurnBasedPlayerRecoveryTimes[pCastSpellInfo[n].uPlayerID] = 100;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
250 pPlayer->SetRecoveryTime(sRecoveryTime);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
251 pTurnEngine->ApplyPlayerAction();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
252 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
253 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // "Spell failed"
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
254 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
255 pCastSpellInfo[n].uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
256 pPlayer->sMana -= uRequiredMana;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
257 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
258 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
259
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
260 switch ( pCastSpell->uSpellID )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
261 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
262 case SPELL_101:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
263 assert(false && "Unknown spell effect #101 (prolly flaming bow arrow");
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
264 case SPELL_BOW_ARROW://ñòðåëüáà èç ëóêà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
265 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
266 amount = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
267 if ( SkillToMastery(pPlayer->pActiveSkills[PLAYER_SKILL_BOW]) >= 3 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
268 amount = 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
269 sRecoveryTime = pPlayer->GetAttackRecoveryTime(true);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
270 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
271 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
272 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
273 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
274 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
275 if ( pPlayer->WearsItem(ITEM_ARTEFACT_ULLYSES, EQUIP_BOW) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
276 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(0xBD6u);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
277 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
278 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
279 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
280 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
281 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
282 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
283 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
284 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
285 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
286 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
287 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
288 memcpy(&pSpellSprite.stru_24, &pPlayer->pInventoryItemList[pPlayer->pEquipment.uBow-1], sizeof(pSpellSprite.stru_24));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
289 pSpellSprite.uAttributes = 256;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
290 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
291 pSpellSprite.uAttributes = 260;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
292 for ( i = 0; i < amount; ++i )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
293 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
294 if ( i )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
295 pSpellSprite.vPosition.z += 32;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
296 pSpellSprite.uSectorID = pIndoor->GetSector(pSpellSprite.vPosition.x, pSpellSprite.vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
297 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
298 pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
299 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
300 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
301 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
302 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
303 case SPELL_LASER_PROJECTILE://ñòðåëüáà èç áëàñòåðà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
304 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
305 sRecoveryTime = pPlayer->GetAttackRecoveryTime(0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
306 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
307 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
308 pSpellSprite.spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
309 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
310 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
311 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
312 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
313 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
314 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
315 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
316 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
317 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
318 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
319 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
320 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
321 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
322 memcpy(&pSpellSprite.stru_24, &pPlayer->pInventoryItemList[pPlayer->pEquipment.uMainHand - 1],sizeof(pSpellSprite.stru_24));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
323 // &pParty->pPlayers[pCastSpell->uPlayerID].spellbook.pDarkSpellbook.bIsSpellAvailable[36
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
324 // * pParty->pPlayers[pCastSpell->uPlayerID].pEquipment.uMainHand + 5], );
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
325 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
326 HIBYTE(pSpellSprite.uAttributes) |= 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
327 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
328 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
329 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
330 pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
331 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
332 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
333 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
334 case SPELL_FIRE_TORCH_LIGHT://ñâåò ôàêåëà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
335 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
336 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
337 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
338 case 1: amount = 2; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
339 case 2: amount = 3; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
340 case 3:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
341 case 4: amount = 4; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
342 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
343 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
344 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
345 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
346 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
347 pParty->pPartyBuffs[PARTY_BUFF_TORCHLIGHT].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)3600 * spell_level * 4.2666669), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
348 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
349 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
350 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
351 case SPELL_FIRE_FIRE_SPIKE://îãíåííûé øèï
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
352 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
353 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
354 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
355 case 1: amount = 3; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
356 case 2: amount = 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
357 case 3: amount = 7; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
358 case 4: amount = 9; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
359 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
360 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
361 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
362 int _v733 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
363 for (uint i = 0; i < uNumSpriteObjects; ++i)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
364 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
365 SpriteObject* object = &pSpriteObjects[i];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
366 if (object->uType && object->spell_id == SPELL_FIRE_FIRE_SPIKE && object->spell_caster_pid == PID(OBJECT_Player, pCastSpell->uPlayerID))
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
367 ++_v733;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
368 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
369 if ( _v733 > amount )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
370 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
371 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
372 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
373 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
374 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
375 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
376 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
377 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
378 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
379 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
380 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
381 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
382 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
383 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
384 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
385 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
386 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
387 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
388 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
389 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
390 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
391 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
392 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
393 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
394 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
395 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
396 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
397 if ( pSpellSprite.Create(pParty->sRotationY, pParty->sRotationX + 10, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
398 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
399 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
400 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
401 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
402 case SPELL_AIR_IMPLOSION://Òî÷íûé âçðûâ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
403 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
404 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
405 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
406 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
407 if (!a2)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
408 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
409 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
410 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
411 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
412 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
413 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
414 if (PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
415 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
416 v697.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
417 v697.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
418 v697.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
419 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
420 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
421 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
422 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
423 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
424 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
425 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
426 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
427 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
428 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
429 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
430 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
431 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
432 pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
433 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
434 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, mon_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
435 Actor::DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), mon_id, &v697);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
436 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
437 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
438 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
439 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
440 case SPELL_EARTH_MASS_DISTORTION://Èçìåíåíèå âåñà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
441 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
442 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
443 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
444 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
445 if ( pActors[mon_id].DoesDmgTypeDoDamage((DAMAGE_TYPE)3) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
446 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
447 pActors[mon_id].pActorBuffs[ACTOR_BUFF_MASS_DISTORTION].Apply(pMiscTimer->uTotalGameTimeElapsed + 128, 0, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
448 v704.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
449 v704.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
450 v704.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
451 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
452 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
453 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
454 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
455 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
456 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
457 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
458 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
459 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
460 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
461 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
462 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
463 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
464 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
465 pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
466 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, mon_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
467 Actor::DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), mon_id, &v704);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
468 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
469 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
470 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
471 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
472 case SPELL_LIGHT_DESTROY_UNDEAD://Óíè÷òîæåíèå íåæèòè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
473 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
474 if ( !pPlayer->CanCastSpell(uRequiredMana) || !a2 || PID_TYPE(a2) != OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
475 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
476 //v730 = a2 >> 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
477 //HIDWORD(v733) = (int)&pActors[PID_ID(a2)];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
478 v691.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
479 v691.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
480 v691.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
481 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
482 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
483 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
484 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
485 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
486 pSpellSprite.vPosition.x = pActors[PID_ID(a2)].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
487 pSpellSprite.vPosition.y = pActors[PID_ID(a2)].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
488 pSpellSprite.vPosition.z = pActors[PID_ID(a2)].vPosition.z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
489 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
490 pSpellSprite.uSectorID = pIndoor->GetSector(pSpellSprite.vPosition.x, pSpellSprite.vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
491 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
492 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
493 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
494 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
495 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
496 pSpellSprite.uAttributes |= 0x80u;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
497 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
498 int obj_id = pSpellSprite.Create(0, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
499 if ( !MonsterStats::BelongsToSupertype(pActors[PID_ID(a2)].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
500 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
501 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
502 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
503 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
504 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
505 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
506 Actor::DamageMonsterFromParty(PID(OBJECT_Item, obj_id), PID_ID(a2), &v691);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
507 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
508 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
509 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
510 case SPELL_FIRE_FIRE_BOLT://Óäàð îãíÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
511 case SPELL_FIRE_FIREBALL://Îãíåííûé øàð
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
512 case SPELL_FIRE_INCINERATE://Èñïåïåëåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
513 case SPELL_AIR_LIGHNING_BOLT://Óäàð ìîëíèè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
514 case SPELL_WATER_ICE_BOLT://Ëüäÿíàÿ ìîëíèÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
515 case SPELL_WATER_ICE_BLAST://Ëüäÿíîé âçðûâ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
516 case SPELL_EARTH_STUN://Îãëóøèòü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
517 case SPELL_EARTH_DEADLY_SWARM://Ðîé ñìåðòè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
518 case SPELL_MIND_MIND_BLAST://Óäàð ìûñëè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
519 case SPELL_MIND_PSYCHIC_SHOCK://Ïñèõè÷åñêèé øîê
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
520 case SPELL_BODY_HARM://Âðåä
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
521 case SPELL_LIGHT_LIGHT_BOLT://Ëó÷ ñâåòà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
522 case SPELL_DARK_DRAGON_BREATH://Äûõàíèå äðàêîíà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
523 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
524 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
525 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
526 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
527 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
528 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
529 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
530 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
531 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
532 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
533 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
534 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
535 if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
536 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
537 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
538 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
539 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
540 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
541 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
542 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
543 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
544 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
545 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
546 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
547 if ( pCastSpell->uSpellID == SPELL_AIR_LIGHNING_BOLT )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
548 LOBYTE(pSpellSprite.uAttributes) |= 0x40;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
549 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
550 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
551 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
552 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
553 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
554 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
555 case SPELL_WATER_ACID_BURST://Âñïëåñê êèñëîòû
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
556 case SPELL_EARTH_BLADES://Ëåçâèÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
557 case SPELL_BODY_FLYING_FIST://Ëåòàþùèé êóëàê
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
558 case SPELL_DARK_TOXIC_CLOUD://Îáëàêî-òîêñèí
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
559 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
560 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
561 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
562 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
563 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
564 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
565 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
566 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
567 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
568 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
569 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
570 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
571 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
572 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
573 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
574 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
575 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
576 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
577 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
578 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
579 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
580 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
581 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
582 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
583 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
584 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
585 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
586 case SPELL_LIGHT_SUNRAY://Ëó÷ Ñîëíöà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
587 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
588 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
589 || uCurrentlyLoadedLevelType == LEVEL_Outdoor && (pParty->uCurrentHour < 5 || pParty->uCurrentHour >= 21) )//òîëüêî â äíåâíîå âðåìÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
590 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
591 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
592 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
593 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
594 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
595 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
596 if ( pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
597 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
598 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
599 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
600 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
601 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
602 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
603 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
604 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
605 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
606 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
607 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
608 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
609 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
610 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
611 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
612 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
613 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
614 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
615 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
616 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
617 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
618 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
619 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
620 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
621 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
622 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
623 case SPELL_LIGHT_PARALYZE://Ïàðàëè÷
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
624 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
625 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
626 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
627 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
628 if (PID_TYPE(a2) == OBJECT_Actor && pActors[mon_id].DoesDmgTypeDoDamage((DAMAGE_TYPE)9) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
629 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
630 Actor::AI_Stand(PID_ID(a2), 4, 0x80, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
631 pActors[mon_id].pActorBuffs[ACTOR_BUFF_PARALYZED].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)23040 * spell_level * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
632 pActors[mon_id].uAttributes |= ACTOR_AGGRESSOR;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
633 pActors[mon_id].vVelocity.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
634 pActors[mon_id].vVelocity.y = 0;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
635 pEngine->GetStru6()->_4A7E89_sparkles_on_actor_after_it_casts_buff(&pActors[mon_id], 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
636 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
637 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
638 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
639 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
640 case SPELL_EARTH_SLOW://Çàìåäëåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
641 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
642 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
643 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
644 case 1: LODWORD(v733) = 180 * spell_level; amount = 2; break;//LODWORD(v733)???íå ïðèìåíÿåòñÿ äàëåå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
645 case 2: LODWORD(v733) = 300 * spell_level; amount = 2; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
646 case 3: LODWORD(v733) = 300 * spell_level; amount = 4; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
647 case 4: LODWORD(v733) = 300 * spell_level; amount = 8; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
648 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
649 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
650 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
651 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
652 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
653 //v721 = 836 * PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
654 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
655 if (PID_TYPE(a2) == OBJECT_Actor && pActors[mon_id].DoesDmgTypeDoDamage((DAMAGE_TYPE)3) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
656 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
657 pActors[mon_id].pActorBuffs[ACTOR_BUFF_SLOWED].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)23040 * spell_level * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
658 pActors[mon_id].uAttributes |= ACTOR_AGGRESSOR;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
659 pEngine->GetStru6()->_4A7E89_sparkles_on_actor_after_it_casts_buff(&pActors[mon_id], 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
660 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
661 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
662 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
663 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
664 case SPELL_MIND_CHARM:// Î÷àðîâàíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
665 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
666 v61 = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
667 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
668 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
669 if ( pActors[v61].DoesDmgTypeDoDamage((DAMAGE_TYPE)7) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
670 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
671 uint power = 300 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
672 if ( skill_level == 2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
673 power = 600 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
674 else if ( skill_level == 3 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
675 power = 29030400;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
676
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
677 pActors[v61].pActorBuffs[ACTOR_BUFF_BERSERK].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
678 pActors[v61].pActorBuffs[ACTOR_BUFF_ENSLAVED].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
679 pActors[v61].pActorBuffs[ACTOR_BUFF_CHARM].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)(power << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
680 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
681 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
682 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
683 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
684 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
685 pSpellSprite.vPosition.x = pActors[v61].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
686 pSpellSprite.vPosition.y = pActors[v61].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
687 pSpellSprite.vPosition.z = pActors[v61].vPosition.z + pActors[v61].uActorHeight;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
688 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
689 pSpellSprite.uSectorID = pIndoor->GetSector(pActors[v61].vPosition.x, pActors[v61].vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
690 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
691 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
692 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
693 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
694 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
695 LOBYTE(pSpellSprite.uAttributes) |= 0x80u;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
696 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
697 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
698 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
699 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
700 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
701 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
702 case SPELL_DARK_SHRINKING_RAY://Ñæèìàþùèé ëó÷
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
703 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
704 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
705 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
706 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
707 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
708 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
709 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
710 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
711 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
712 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
713 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
714 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
715 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
716 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
717 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
718 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
719 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
720 pSpellSprite.spell_id = SPELL_FIRE_PROTECTION_FROM_FIRE;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
721 pSpellSprite.spell_level = 300 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
722 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
723 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
724 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
725 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
726 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
727 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
728 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
729 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
730 case SPELL_FIRE_FIRE_AURA: //Àóðà îãíÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
731 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
732 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
733 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
734 case 1: duration = 3600 * spell_level; amount = 10; break; //Îãíÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
735 case 2: duration = 3600 * spell_level; amount = 11; break; //Îãíåííîãî æàðà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
736 case 3: duration = 3600 * spell_level; amount = 12; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
737 case 4: duration = 0; amount = 12; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
738 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
739 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
740 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
741 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
742 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
743 v730c = &pParty->pPlayers[pCastSpell->uPlayerID_2].pInventoryItemList[a2];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
744 _item = &pItemsTable->pItems[v730c->uItemID];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
745 v730c->UpdateTempBonus(pParty->uTimePlayed);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
746 if ( v730c->uItemID < 64 || v730c->uItemID > 65
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
747 && !v730c->IsBroken()
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
748 && !v730c->uSpecEnchantmentType
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
749 && !v730c->uEnchantmentType
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
750 && ( _item->uEquipType == EQUIP_SINGLE_HANDED || _item->uEquipType == EQUIP_TWO_HANDED || _item->uEquipType == EQUIP_BOW)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
751 && !pItemsTable->IsMaterialNonCommon(v730c) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
752 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
753 v730c->uSpecEnchantmentType = amount;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
754 if ( skill_level != 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
755 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
756 v730c->uExpireTime = pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
757 v730c->uAttributes |= ITEM_TEMP_BONUS;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
758 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
759 v730c->uAttributes |= ITEM_AURA_EFFECT_RED;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
760 _50C9A8_item_enchantment_timer = 256;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
761 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
762 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
763 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
764 _50C9D0_AfterEnchClickEventId = 113;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
765 _50C9D4_AfterEnchClickEventSecondParam = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
766 _50C9D8_AfterEnchClickEventTimeout = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
767 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
768 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
769 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
770 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
771 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
772 case SPELL_BODY_REGENERATION://Ðåãåíåðàöèÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
773 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
774 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
775 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
776 case 1: amount = 1; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
777 case 2: amount = 1; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
778 case 3: amount = 3; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
779 case 4: amount = 10; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
780 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
781 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
782 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
783 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
784 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
785 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
786 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_REGENERATION].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(3600 * spell_level) * 4.2666669), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
787 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
788 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
789 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
790 case SPELL_FIRE_PROTECTION_FROM_FIRE://Çàùèòà îò Îãíÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
791 case SPELL_AIR_PROTECTION_FROM_AIR://Çâùèòà îò Âîçäóõà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
792 case SPELL_WATER_PROTECTION_FROM_WATER://Çàùèòà îò Âîäû
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
793 case SPELL_EARTH_PROTECTION_FROM_EARTH://Çàùèòà îò Çåìëè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
794 case SPELL_MIND_PROTECTION_FROM_MIND://Çàùèòà îò Ìûñëè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
795 case SPELL_BODY_PROTECTION_FROM_BODY://Çàùèòà îò Òåëà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
796 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
797 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
798 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
799 case 1:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
800 case 2:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
801 case 3:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
802 case 4: amount = skill_level * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
803 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
804 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
805 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
806 switch (pCastSpell->uSpellID)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
807 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
808 case SPELL_FIRE_PROTECTION_FROM_FIRE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
809 buff_resist = PARTY_BUFF_RESIST_FIRE;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
810 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
811 case SPELL_AIR_PROTECTION_FROM_AIR:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
812 buff_resist = PARTY_BUFF_RESIST_AIR;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
813 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
814 case SPELL_WATER_PROTECTION_FROM_WATER:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
815 buff_resist = PARTY_BUFF_RESIST_WATER;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
816 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
817 case SPELL_EARTH_PROTECTION_FROM_EARTH:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
818 buff_resist = PARTY_BUFF_RESIST_EARTH;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
819 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
820 case SPELL_MIND_PROTECTION_FROM_MIND:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
821 buff_resist = PARTY_BUFF_RESIST_MIND;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
822 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
823 case SPELL_BODY_PROTECTION_FROM_BODY:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
824 buff_resist = PARTY_BUFF_RESIST_BODY;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
825 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
826 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
827 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
828 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
829 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
830 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
831 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
832 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
833 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
834 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
835 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
836 //v90 = (double)(signed int)(3600 * spell_level) * 4.2666669;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
837 pParty->pPartyBuffs[buff_resist].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)(3600 * spell_level) * 4.2666669), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
838 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
839 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
840 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
841 case SPELL_FIRE_HASTE://Ñïåøêà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
842 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
843 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
844 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
845 case 1: duration = 60 * (spell_level + 60); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
846 case 2: duration = 60 * (spell_level + 60); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
847 case 3: duration = 180 * (spell_level + 20); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
848 case 4: duration = 240 * (spell_level + 15); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
849 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
850 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
851 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
852 if ( pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
853 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
854 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
855 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
856 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
857 if ( pParty->pPlayers[pl_id].pConditions[Condition_Weak] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
858 spell_sound_flag = false;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
859 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
860 if ( spell_sound_flag )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
861 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
862 pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, 0, 0, 0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
863 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
864 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
865 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
866 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
867 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
868 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
869 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
870 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
871 case SPELL_SPIRIT_BLESS://Áëàãîñëîâåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
872 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
873 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
874 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
875 case 1: duration = 300 * (spell_level + 12); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
876 case 2: duration = 300 * (spell_level + 12); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
877 case 3: duration = 900 * (spell_level + 4); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
878 case 4: duration = 3600 * (spell_level + 1); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
879 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
880 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
881 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
882 amount = spell_level + 5;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
883 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
884 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
885 if ( skill_level == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
886 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
887 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
888 v111 = pOtherOverlayList->_4418B1(10000, pCastSpell->uPlayerID_2 + 310, 0, 65536);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
889 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_BLESS].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
890 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), 1, amount, v111, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
891 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
892 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
893 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
894 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
895 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
896 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_id);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
897 v111 = pOtherOverlayList->_4418B1(10000, pl_id + 310, 0, 65536);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
898 pParty->pPlayers[pl_id].pPlayerBuffs[1].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
899 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, amount, v111, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
900 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
901 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
902 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
903 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
904 case SPELL_SPIRIT_SPIRIT_LASH://Ïëåòü Äóõà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
905 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
906 if ( pPlayer->CanCastSpell(uRequiredMana) && a2 && PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
907 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
908 int mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
909 dist_X = abs(pActors[mon_id].vPosition.x - pParty->vPosition.x);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
910 dist_Y = abs(pActors[mon_id].vPosition.y - pParty->vPosition.y);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
911 dist_Z = abs(pActors[mon_id].vPosition.z - pParty->vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
912 int count = int_get_vector_length(dist_X, dist_Y, dist_Z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
913 if ( (double)count <= 307.2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
914 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
915 v701.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
916 v701.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
917 v701.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
918 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
919 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
920 pSpellSprite.spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
921 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
922 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
923 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
924 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
925 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
926 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
927 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
928 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
929 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
930 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
931 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
932 pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z - (unsigned int)(signed __int64)((double)pActors[mon_id].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
933 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
934 Actor::DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), mon_id, &v701);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
935 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
936 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
937 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
938 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
939 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2);//"Íå ïîëó÷èëîñü!!!"
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
940 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
941 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
942 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
943 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
944 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
945 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
946 case SPELL_AIR_SHIELD://Ùèò
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
947 case SPELL_EARTH_STONESKIN://Êàìåííàÿ êîæà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
948 case SPELL_SPIRIT_HEROISM://Ãåðîèçì
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
949 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
950 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
951 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
952 case 1: duration = 300 * (spell_level + 12); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
953 case 2: duration = 300 * (spell_level + 12); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
954 case 3: duration = 900 * (spell_level + 4); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
955 case 4: duration = 3600 * (spell_level + 1); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
956 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
957 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
958 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
959 switch (pCastSpell->uSpellID)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
960 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
961 case SPELL_AIR_SHIELD:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
962 amount = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
963 buff_resist = PARTY_BUFF_SHIELD;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
964 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
965 case SPELL_EARTH_STONESKIN:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
966 amount = spell_level + 5;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
967 buff_resist = PARTY_BUFF_STONE_SKIN;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
968 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
969 case SPELL_SPIRIT_HEROISM:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
970 amount = spell_level + 5;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
971 buff_resist = PARTY_BUFF_HEROISM;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
972 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
973 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
974 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
975 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
976 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
977 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
978 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
979 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
980 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
981 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
982 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
983 pParty->pPartyBuffs[buff_resist].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
984 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
985 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
986 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
987 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
988 case SPELL_FIRE_IMMOLATION://Êîëüöî îãíÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
989 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
990 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
991 duration = 600 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
992 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
993 duration = 60 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
994 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
995 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
996 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
997 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
998 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
999 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1000 pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1001 (signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, spell_level, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1002 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1003 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1004 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1005 case SPELL_FIRE_METEOR_SHOWER://Ïîòîê ìåòåîðîâ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1006 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1007 //if (skill_level < 3)//äëÿ ìàñòåðà è ìàãèñòðà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1008 //break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1009 int meteor_num;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1010 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1011 meteor_num = 20;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1012 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1013 meteor_num = 16;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1014 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1015 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1016 ShowStatusBarString(pGlobalTXT_LocalizationStrings[491], 2); // Can't cast Meteor Shower indoors!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1017 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1018 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1019 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1020 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1021 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1022 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1023 obj_type = PID_TYPE(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1024 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1025 if (obj_type == OBJECT_Actor)//åñëè çàêë ïîñòàâèòü íà áûñòðîå çàêë., òî ìîæíî óêàçûâàòü êóäà êèäàòü ìåòåîðû
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1026 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1027 dist_X = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1028 dist_Y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1029 dist_Z = pActors[mon_id].vPosition.z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1030 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1031 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1032 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1033 dist_X = pParty->vPosition.x + fixpoint_mul(2048, stru_5C6E00->Cos(pParty->sRotationY));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1034 dist_Y = pParty->vPosition.y + fixpoint_mul(2048, stru_5C6E00->Sin(pParty->sRotationY));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1035 dist_Z = pParty->vPosition.z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1036 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1037 unsigned __int64 k = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1038 int j = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1039 if ( meteor_num > 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1040 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1041 v730 = obj_type == OBJECT_Actor ? a2 : 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1042 for ( meteor_num; meteor_num; meteor_num-- )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1043 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1044 a2 = rand() % 1000;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1045 if ( sqrt(((double)a2 - 2500) * ((double)a2 - 2500) + j * j + k * k) <= 1.0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1046 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1047 LODWORD(v687) = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1048 HIDWORD(v687) = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1049 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1050 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1051 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1052 HIDWORD(v687) = stru_5C6E00->Atan2((signed __int64)sqrt((float)(j * j + k * k)), (double)a2 - 2500);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1053 LODWORD(v687) = stru_5C6E00->Atan2(j, k);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1054 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1055 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1056 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1057 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1058 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1059 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1060 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1061 pSpellSprite.vPosition.x = dist_X;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1062 pSpellSprite.vPosition.y = dist_Y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1063 pSpellSprite.vPosition.z = a2 + dist_Z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1064 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1065 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1066 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1067 pSpellSprite.spell_target_pid = v730;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1068 pSpellSprite.field_60_distance_related_prolly_lod = stru_50C198._427546(a2 + 2500);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1069 pSpellSprite.uFacing = v687;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1070 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1071 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1072 pSpellSprite.uAttributes = 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1073 if ( pSpellSprite.Create(v687, SHIDWORD(v687), pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed, 0) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1074 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1075 j = rand() % 1024 - 512;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1076 k = rand() % 1024 - 512;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1077 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1078 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1079 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1080 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1081 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1082 case SPELL_FIRE_INFERNO://Àäñêèé îãîíü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1083 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1084 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1085 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1086 ShowStatusBarString(pGlobalTXT_LocalizationStrings[492], 2); // Can't cast Inferno outdoors!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1087 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1088 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1089 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1090 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1091 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1092 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1093 int mon_num = pRenderer->_46À6ÀÑ_GetActorsInViewport(4096);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1094 v700.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1095 v700.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1096 v700.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1097 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1098 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1099 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1100 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1101 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1102 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1103 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1104 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1105 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1106 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1107 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1108 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1109 for ( uint i = 0; i < mon_num; i++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1110 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1111 pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[i]].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1112 pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[i]].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1113 pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[i]].vPosition.z - (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[i]].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1114 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[i]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1115 Actor::DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), _50BF30_actors_in_viewport_ids[i], &v700);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1116 pEngine->GetStru6()->_4A81CA(&pSpellSprite);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1117 pEngine->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xFF3C1E, 0x40);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1118 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1119 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1120 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1121 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1122 case SPELL_AIR_WIZARD_EYE://Îêî ÷àðîäåÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1123 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1124 duration = 3600 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1125 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1126 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1127 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1128 v169 = pOtherOverlayList->_4418B1(2000, pl_id + 100, 0, 65536);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1129 pParty->pPartyBuffs[PARTY_BUFF_WIZARD_EYE].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, 0, v169, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1130 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1131 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1132 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1133 case SPELL_AIR_FEATHER_FALL://Ïàäåíèå ïåðà(ï¸ðûøêîì)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1134 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1135 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1136 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1137 case 1: duration = 300 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1138 case 2: duration = 600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1139 case 3: duration = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1140 case 4: duration = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1141 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1142 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1143 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1144 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1145 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1146 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1147 pOtherOverlayList->_4418B1(2010, pl_id + 100, 0, 65536);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1148 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1149 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1150 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1151 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1152
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1153 pParty->pPartyBuffs[PARTY_BUFF_FEATHER_FALL].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1154 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1155 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1156 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1157 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1158 case SPELL_AIR_SPARKS://Èñêðû
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1159 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1160 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1161 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1162 case 1: amount = 3; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1163 case 2: amount = 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1164 case 3: amount = 7; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1165 case 4: amount = 9; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1166 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1167 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1168 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1169 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1170 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1171 int _v726 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1172 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1173 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1174 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1175 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1176 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1177 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1178 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1179 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1180 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1181 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1182 pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1183 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1184 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1185 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1186 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1187 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1188 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1189 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1190 v188 = (signed int)_v726 / -2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1191 v189 = (signed int)_v726 / 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1192 while ( v188 <= v189 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1193 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1194 pSpellSprite.uFacing = v188 + LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1195 if ( pSpellSprite.Create((signed __int16)(v188 + LOWORD(v715.uYawAngle)), v715.uPitchAngle,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1196 pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed, pCastSpell->uPlayerID + 1) != -1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1197 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1198 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1199 v188 += _v726 / (amount - 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1200 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1201 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1202 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1203 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1204 case SPELL_AIR_JUMP://Ïðûæîê
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1205 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1206 if ( pParty->uFlags & PARTY_FLAGS_1_FALLING)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1207 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1208 ShowStatusBarString(pGlobalTXT_LocalizationStrings[493], 2); // Can't cast Jump while airborne!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1209 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1210 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1211 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1212 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1213 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1214 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1215 pOtherOverlayList->_4418B1(2040, pl_id + 100, 0, 65536);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1216 pParty->uFlags |= 0x100;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1217 pParty->uFallSpeed = 1000;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1218 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1219 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1220 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1221 case SPELL_AIR_INVISIBILITY://Íåâèäèìîñòü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1222 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1223 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1224 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1225 case 1: duration = 600 * spell_level; amount = spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1226 case 2: duration = 600 * spell_level; amount = 2 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1227 case 3: duration = 600 * spell_level; amount = 3 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1228 case 4: duration = 3600 * spell_level; amount = 4 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1229 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1230 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1231 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1232 if (pParty->uFlags & (PARTY_FLAGS_1_ALERT_RED | PARTY_FLAGS_1_ALERT_YELLOW))
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1233 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1234 ShowStatusBarString(pGlobalTXT_LocalizationStrings[638], 2); // There are hostile creatures nearby!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1235 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1236 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1237 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1238 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1239 if ( pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1240 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1241 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1242 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1243 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1244 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1245 pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1246 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1247 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1248 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1249 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1250 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1251 case SPELL_AIR_FLY://Ïîë¸ò
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1252 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1253 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1254 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1255 ShowStatusBarString(pGlobalTXT_LocalizationStrings[494], 2); // Can not cast Fly indoors!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1256 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1257 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1258 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1259 if ( !pPlayers[pCastSpell->uPlayerID + 1]->GetMaxMana() )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1260 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1261 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1262 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1263 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1264 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1265 if ( skill_level == 1 || skill_level == 2 || skill_level == 3 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1266 amount = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1267 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1268 amount = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1269 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1270 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1271 for ( uint pl_id = 0; pl_id < 4; pl_id++)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1272 pOtherOverlayList->_4418B1(2090, pl_id + 100, 0, 65536);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1273 v206 = pOtherOverlayList->_4418B1(10008, 203, 0, 65536);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1274 pParty->pPartyBuffs[PARTY_BUFF_FLY].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)(3600 * spell_level) << 7)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1275 * 0.033333335), skill_level, amount, v206, pCastSpell->uPlayerID + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1276 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1277 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1278 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1279 case SPELL_AIR_STARBURST://Çâåçäîïàä
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1280 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1281 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1282 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1283 ShowStatusBarString(pGlobalTXT_LocalizationStrings[495], 2); // Can't cast Starburst indoors!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1284 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1285 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1286 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1287 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1288 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1289 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1290 obj_type = PID_TYPE(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1291 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1292 if ( obj_type == OBJECT_Actor )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1293 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1294 dist_X = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1295 dist_Y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1296 dist_Z = pActors[mon_id].vPosition.z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1297 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1298 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1299 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1300 dist_X = pParty->vPosition.x + fixpoint_mul(2048, stru_5C6E00->Cos(pParty->sRotationY));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1301 dist_Y = pParty->vPosition.y + fixpoint_mul(2048, stru_5C6E00->Sin(pParty->sRotationY));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1302 dist_Z = pParty->vPosition.z;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1303 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1304 unsigned __int64 k = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1305 int j = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1306 v730 = obj_type == OBJECT_Actor ? a2 : 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1307 for ( uint star_num = 20; star_num; star_num-- )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1308 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1309 a2 = rand() % 1000;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1310 if ( sqrt(((double)a2 + (double)dist_Z - (double)(dist_Z + 2500)) * ((double)a2 + (double)dist_Z - (double)(dist_Z + 2500))
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1311 + j * j + k * k) <= 1.0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1312 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1313 LODWORD(v685) = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1314 HIDWORD(v685) = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1315 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1316 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1317 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1318 HIDWORD(v685) = stru_5C6E00->Atan2((signed __int64)sqrt((float)(j * j + k * k)), ((double)a2 + (double)dist_Z - (double)(dist_Z + 2500)));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1319 LODWORD(v685) = stru_5C6E00->Atan2(j, k);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1320 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1321 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1322 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1323 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1324 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1325 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1326 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1327 pSpellSprite.vPosition.x = dist_X;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1328 pSpellSprite.vPosition.y = dist_Y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1329 pSpellSprite.vPosition.z = (int)(a2 + (dist_Z + 2500));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1330 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1331 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1332 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1333 pSpellSprite.spell_target_pid = v730;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1334 pSpellSprite.field_60_distance_related_prolly_lod = stru_50C198._427546(a2 + 2500);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1335 pSpellSprite.uFacing = v685;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1336 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1337 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1338 pSpellSprite.uAttributes = 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1339 if ( pSpellSprite.Create(v685, SHIDWORD(v685), pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed, 0) != -1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1340 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1341 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1342 j = rand() % 1024 - 512;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1343 k = rand() % 1024 - 512;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1344 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1345 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1346 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1347 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1348 case SPELL_WATER_AWAKEN://Ïðîáóæäåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1349 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1350 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1351 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1352 case 1: amount = 180 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1353 case 2: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1354 case 3: amount = 86400 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1355 case 4: amount = 0; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1356 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1357 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1358 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1359 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1360 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1361 for( int i=0; i < 4; i++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1362 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1363 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1364 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1365 if ( pParty->pPlayers[i].pConditions[Condition_Sleep] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1366 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1367 pParty->pPlayers[i].pConditions[Condition_Sleep] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1368 pParty->pPlayers[i].PlaySound(SPEECH_103, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1369 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1370 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1371 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1372 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1373 if ( pParty->pPlayers[i].DiscardConditionIfLastsLongerThan(Condition_Sleep, pParty->uTimePlayed -
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1374 (signed int)(signed __int64)((double)(amount << 7) * 0.033333335)) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1375 pParty->pPlayers[i].PlaySound(SPEECH_103, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1376 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1377 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1378 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1379 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1380 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1381 case SPELL_WATER_POISON_SPRAY://Ðàñïûëåíèå ÿäà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1382 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1383 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1384 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1385 case 1: amount = 1; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1386 case 2: amount = 3; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1387 case 3: amount = 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1388 case 4: amount = 7; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1389 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1390 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1391 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1392 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1393 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1394 signed int _v733 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1395 if ( amount == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1396 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1397 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1398 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1399 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1400 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1401 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1402 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1403 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1404 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1405 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1406 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1407 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1408 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1409 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1410 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1411 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1412 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1413 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1414 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1415 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1416 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1417 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1418 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1419 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1420 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1421 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1422 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1423 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1424 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1425 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1426 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1427 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1428 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1429 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1430 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1431 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1432 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1433 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1434 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1435 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1436 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1437 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1438 v188 = _v733 / -2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1439 v189 = _v733 / 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1440 if ( v188 <= v189 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1441 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1442 do
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1443 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1444 pSpellSprite.uFacing = v188 + v715.uYawAngle;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1445 if ( pSpellSprite.Create(pSpellSprite.uFacing, v715.uPitchAngle, pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1446 pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1447 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1448 v188 += _v733 / (amount - 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1449 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1450 while ( v188 <= v189 );
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1451 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1452 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1453 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1454 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1455 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1456 case SPELL_WATER_WATER_WALK://Õîæäåíèå ïî âîäå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1457 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1458 if ( !pPlayers[pCastSpell->uPlayerID + 1]->GetMaxMana() )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1459 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1460 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1461 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1462 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1463 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1464 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1465 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1466 case 1: //break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1467 case 2: duration = 600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1468 case 3:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1469 case 4: duration = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1470 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1471 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1472 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1473 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1474 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1475 v169 = pOtherOverlayList->_4418B1(10005, 201, 0, 65536);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1476 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1477 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1478 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1479 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1480 pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(duration << 7) * 0.033333335),
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1481 skill_level, amount, v169, pCastSpell->uPlayerID + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1482 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1483 pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1484 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1485 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1486 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1487 case SPELL_WATER_RECHARGE_ITEM://Ïåðåçàðÿäêà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1488 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1489 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1490 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1491 v730c = &pParty->pPlayers[pCastSpell->uPlayerID_2].pInventoryItemList[a2];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1492 if ( v730c->GetItemEquipType() != 12 || v730c->uAttributes & 2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1493 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1494 _50C9D0_AfterEnchClickEventId = 113;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1495 _50C9D4_AfterEnchClickEventSecondParam = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1496 _50C9D8_AfterEnchClickEventTimeout = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1497 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1498 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1499 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1500 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1501 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1502 if ( skill_level == 1 || skill_level == 2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1503 v241 = (double)v723 * 0.0099999998 + 0.5;//50 %
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1504 else if ( skill_level == 3 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1505 v241 = (double)v723 * 0.0099999998 + 0.69999999;//30 %
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1506 else if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1507 v241 = (double)v723 * 0.0099999998 + 0.80000001;//20 %
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1508 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1509 v241 = 0.0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1510 if ( v241 > 1.0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1511 v241 = 1.0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1512 int uNewCharges = v730c->uMaxCharges * v241;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1513 v730c->uMaxCharges = uNewCharges;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1514 v730c->uNumCharges = uNewCharges;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1515 if ( uNewCharges <= 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1516 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1517 v730c = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1518 _50C9D0_AfterEnchClickEventId = 113;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1519 _50C9D4_AfterEnchClickEventSecondParam = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1520 _50C9D8_AfterEnchClickEventTimeout = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1521 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2);//Íå ïîëó÷èëîñü!!!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1522 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1523 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1524 spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1525 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1526 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1527 v730c->uAttributes |= 0x40u;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1528 _50C9A8_item_enchantment_timer = 256;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1529 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1530 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1531 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1532 case SPELL_WATER_ENCHANT_ITEM://Òàëèñìàí
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1533 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1534 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1535 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1536 uRequiredMana = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1537 amount = 10 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1538 bool item_not_broken = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1539 int rnd = rand() % 100;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1540 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID_2];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1541 v245 = &pPlayer->pInventoryItemList[a2];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1542 ItemDesc *_v725 = &pItemsTable->pItems[v245->uItemID];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1543 if ((skill_level == 1 || skill_level == 2 /*&& _v725->uEquipType > EQUIP_BOW*/ || skill_level == 3 || skill_level == 4) &&
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1544 v245->uItemID <= 134 &&
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1545 v245->uSpecEnchantmentType == 0 && v245->uEnchantmentType == 0 &&
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1546 v245->m_enchantmentStrength== 0 && !v245->IsBroken() ) //òðåáîâàíèÿ ê ïðåäìåòó
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1547 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1548 if ( (v245->GetValue() < 450 && ( skill_level == 1 || skill_level == 2 ))
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1549 || (v245->GetValue() < 450 && (skill_level == 3|| skill_level == 4 ) && _v725->uEquipType >= EQUIP_SINGLE_HANDED && _v725->uEquipType <= EQUIP_BOW)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1550 || (v245->GetValue() < 250 && (skill_level == 3 || skill_level == 4 )&& _v725->uEquipType > EQUIP_BOW) )//Óñëîâèÿ ïîëîìêè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1551 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1552 if ( !(v245->uAttributes & 0x200) )// ïðåäìåò íå ñëîìàí
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1553 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1554 v245->uAttributes |= 2;//òåïåðü ñëîìàí
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1555 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1556 item_not_broken = false;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1557 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1558 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1559 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1560 if ( rnd >= 10 * spell_level )//øàíñ íà ñðàáàòûâàíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1561 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1562 if ( !(v245->uAttributes & 0x200) )// ïðåäìåò íå ñëîìàí
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1563 v245->uAttributes |= 2;//òåïåðü ñëîìàí
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1564 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1565 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1566 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1567 if ( (rnd < 80 && (skill_level == 3 || skill_level == 4 )) || v245->GetValue() < 450 || (v245->GetValue() < 250
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1568 && (skill_level == 3 || skill_level == 4) && _v725->uEquipType >= EQUIP_SINGLE_HANDED && _v725->uEquipType <= EQUIP_BOW))
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1569 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1570 v313 = _v725->uEquipType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1571 if ( _v725->uEquipType >= EQUIP_ARMOUR && _v725->uEquipType <= EQUIP_AMULET )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1572 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1573 v295 = rand() % 10;// pItemsTable->field_116D8[pItemsTable->pItems[_this->uItemID].uEquipType];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1574 /*v245->uEnchantmentType = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1575 __debugbreak(); // castspellinfo.cpp(1971): warning C4700: uninitialized local variable 'v294' used
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1576 for ( kk = pItemsTable->pEnchantments[0].to_item[v245->GetItemEquipType() + 1];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1577 ;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1578 kk += pItemsTable->pEnchantments[v294->uEnchantmentType].to_item[v245->GetItemEquipType() + 1] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1579 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1580 ++v245->uEnchantmentType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1581 if ( kk >= v295 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1582 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1583 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1584 v255 = 10;//pItemsTable->field_116D8[17];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1585 v256 = 10;//pItemsTable->field_116D8[16];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1586 v245->m_enchantmentStrength = v256 + rand() % (v255 - v256 + 1);*/
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1587 v245->uEnchantmentType = v295;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1588 v245->m_enchantmentStrength = pItemsTable->pEnchantments[v295].to_item[_v725->uEquipType - EQUIP_ARMOUR];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1589 v245->uAttributes |= 0x20u;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1590 _50C9A8_item_enchantment_timer = 256;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1591 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1592 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1593 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1594 else if ( skill_level == 3 || skill_level == 4)//for master & GM not refactored(äëÿ ìàñòåðà è ãðàíäà íå îòðåôàêòîðåíî)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1595 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1596 v258 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1597 v725 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1598 int _v733;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1599 if ( pItemsTable->pSpecialEnchantments_count > 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1600 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1601 v730 = (int)&v679;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1602 for ( _v733 = 0; _v733 < pItemsTable->pSpecialEnchantments_count; ++_v733 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1603 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1604 v259 = LOBYTE(pItemsTable->pSpecialEnchantments[v258 + 1].pBonusStatement);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1605 if ( !v259 || v259 == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1606 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1607 v260 = *(&pItemsTable->pSpecialEnchantments[0].to_item_apply[v245->GetItemEquipType() + 4] + v258 * 28);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1608 v725 += v260;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1609 if ( v260 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1610 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1611 v261 = v730;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1612 v730 += 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1613 *(int *)v261 = _v733;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1614 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1615 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1616 ++v258;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1617 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1618 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1619 v262 = rand() % v725;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1620 v263 = v679;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1621 v245->uSpecEnchantmentType = v679[0];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1622 v264 = pItemsTable->pSpecialEnchantments[*v263].to_item_apply[v245->GetItemEquipType() + 4];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1623 v265 = v262 + 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1624 if ( v264 < v265 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1625 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1626 for ( ii = v679; ; ii = (int *)v732 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1627 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1628 v267 = (int)(ii + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1629 v732 = v267;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1630 v268 = *(int *)v267;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1631 *(int *)(v245 + 12) = v268;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1632 v264 += pItemsTable->pSpecialEnchantments[v268].to_item_apply[v245->GetItemEquipType() + 4];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1633 if ( v264 >= v265 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1634 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1635 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1636 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1637 v278 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1638 v725 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1639 if ( pItemsTable->pSpecialEnchantments_count > 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1640 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1641 int *_v730 = v679;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1642 for ( _v733 = 0; _v733 < pItemsTable->pSpecialEnchantments_count; ++_v733 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1643 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1644 v279 = LOBYTE(pItemsTable->pSpecialEnchantments[v278].pBonusStatement);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1645 if ( !v279 || v279 == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1646 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1647 v280 = *(&pItemsTable->pSpecialEnchantments[v278].to_item_apply[v245->GetItemEquipType()]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1648 _v733 += v280;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1649 if ( v280 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1650 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1651 v281 = _v730;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1652 ++_v730;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1653 *v281 = _v733;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1654 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1655 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1656 ++v278;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1657 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1658 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1659 v282 = rand() % _v733;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1660 v283 = v679;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1661 v245->uSpecEnchantmentType = v679[0];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1662 v284 = pItemsTable->pSpecialEnchantments[*v283].to_item_apply[v245->GetItemEquipType() ];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1663 v285 = v282 + 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1664 for ( l = v679; v284 < v285; ++l )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1665 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1666 v245->uSpecEnchantmentType = *(l+1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1667 v284 += pItemsTable->pSpecialEnchantments[*(l+1)].to_item_apply[v245->GetItemEquipType()];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1668 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1669 ++v245->uSpecEnchantmentType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1670 v245->uAttributes |= 0x20u;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1671 _50C9A8_item_enchantment_timer = 256;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1672 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1673 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1674 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1675 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1676 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1677 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1678 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1679 if ( spell_sound_flag == 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1680 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1681 v317 = pGlobalTXT_LocalizationStrings[428];//Íå ïîëó÷èëîñü!!!
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1682 if ( item_not_broken == false )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1683 v317 = pGlobalTXT_LocalizationStrings[585];//Ïðåäìåò íåäîñòàòî÷íî âûñîêîãî êà÷åñòâà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1684 ShowStatusBarString(v317, 2);
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1685 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1686 //v318 = &pParty->pPlayers[pCastSpell->uPlayerID_2];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1687 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1688 pParty->pPlayers[pCastSpell->uPlayerID_2].PlaySound(SPEECH_43, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1689 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1690 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1691 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1692 case SPELL_WATER_TOWN_PORTAL://Ïîðòàë ãîðîäà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1693 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1694 amount = 10 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1695 if ( pPlayer->sMana < (signed int)uRequiredMana )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1696 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1697 if ( pParty->uFlags & (PARTY_FLAGS_1_ALERT_RED | PARTY_FLAGS_1_ALERT_YELLOW) && skill_level != 4
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1698 || rand() % 100 >= amount && skill_level != 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1699 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1700 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1701 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1702 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1703 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1704 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1705 town_portal_caster_id = pCastSpell->uPlayerID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1706 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_OnCastTownPortal, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1707 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1708 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1709 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1710 case SPELL_WATER_LLOYDS_BEACON://Ìàÿê Ëëîéäà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1711 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1712 if ( !_stricmp(pCurrentMapName, "d05.blv") ) // Arena
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1713 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1714 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1715 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1716 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1717 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1718 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1719 if ( pPlayer->sMana >= (signed int)uRequiredMana )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1720 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1721 pEventTimer->Pause();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1722 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_OnCastLloydsBeacon, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1723 lloyds_beacon_spell_level = (signed int)(604800 * spell_level);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1724 _506348_current_lloyd_playerid = pCastSpell->uPlayerID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1725 ::uRequiredMana = uRequiredMana;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1726 ::sRecoveryTime = sRecoveryTime;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1727 lloyds_beacon_sound_id = pCastSpell->sound_id;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1728 lloyds_beacon_spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1729 pCastSpell->uFlags |= 0x20u;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1730 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1731 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1732 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1733 case SPELL_EARTH_STONE_TO_FLESH:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1734 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1735 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1736 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1737 case 1: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1738 case 2: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1739 case 3: amount = 86400 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1740 case 4: break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1741 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1742 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1743 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1744 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1745 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1746 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Pertified] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1747 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1748 if ( skill_level == 4 )//for GM
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1749 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1750 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Pertified] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1751 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1752 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1753 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1754 v663 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1755 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Pertified, v663);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1756 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1757 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1758 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1759 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1760 case SPELL_EARTH_ROCK_BLAST://Âçðûâ êàìíÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1761 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1762 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1763 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1764 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1765 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1766 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1767 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1768 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1769 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1770 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1771 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1772 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1773 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1774 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1775 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1776 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1777 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1778 pSpellSprite.uFacing = LOWORD(pParty->sRotationY);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1779 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1780 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1781 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1782 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1783 if ( pSpellSprite.Create(pParty->sRotationY, pParty->sRotationX, v659, pCastSpell->uPlayerID + 1) != -1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1784 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1785 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1786 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1787 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1788 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1789 case SPELL_EARTH_DEATH_BLOSSOM: //Öâåòîê ñìåðòè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1790 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1791 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1792 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1793 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1794 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1795 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1796 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1797 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1798 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1799 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1800 pSpellSprite.uType = 4090;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1801 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1802 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1803 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1804 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1805 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1806 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1807 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1808 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1809 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1810 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1811 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1812 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1813 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1814 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1815 pSpellSprite.uFacing = LOWORD(pParty->sRotationY);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1816 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1817 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1818 pSpellSprite.uAttributes = 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1819 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1820 if ( pSpellSprite.Create(pParty->sRotationY, stru_5C6E00->uIntegerHalfPi / 2, v659, 0) != -1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1821 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1822 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1823 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1824 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1825 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1826 case SPELL_SPIRIT_DETECT_LIFE: // Äåòåêòîð æèçíè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1827 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1828 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1829 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1830 case 1: amount = 600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1831 case 2: amount = 1800 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1832 case 3:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1833 case 4: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1834 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1835 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1836 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1837 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1838 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1839 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1840 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1841 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1842 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1843 pParty->pPartyBuffs[PARTY_BUFF_DETECT_LIFE].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1844 (signed int)(signed __int64)((double)(signed int)((int)amount << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1845 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1846 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1847 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1848 case SPELL_SPIRIT_FATE:// Ñóäüáà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1849 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1850 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1851 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1852 case 1: amount = spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1853 case 2: amount = 2 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1854 case 3: amount = 4 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1855 case 4: amount = 6 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1856 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1857 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1858 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1859 //LODWORD(v733) = 300;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1860 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1861 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1862 if ( pCastSpell->spell_target_pid == 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1863 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1864 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1865 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_FATE].Apply(pParty->uTimePlayed + 1280, skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1866 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1867 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1868 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1869 if (PID_TYPE(pCastSpell->spell_target_pid) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1870 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1871 mon_id = PID_ID(pCastSpell->spell_target_pid);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1872 pActors[mon_id].pActorBuffs[ACTOR_BUFF_FATE].Apply(pParty->uTimePlayed + 1280, skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1873 pActors[mon_id].uAttributes |= ACTOR_AGGRESSOR;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1874 pEngine->GetStru6()->_4A7E89_sparkles_on_actor_after_it_casts_buff(&pActors[mon_id], 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1875 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1876 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1877 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1878 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1879 case SPELL_SPIRIT_REMOVE_CURSE:// Ñíÿòèå ïîð÷è
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1880 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1881 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1882 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1883 case 1: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1884 case 2: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1885 case 3: amount = 86400 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1886 case 4: amount = 0; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1887 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1888 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1889 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1890 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1891 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1892 if ( !pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Cursed] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1893 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1894 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1895 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1896 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1897 if ( skill_level == 4 )//GM
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1898 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Cursed] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1899 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1900 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1901 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(0,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1902 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1903 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Cursed] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1904 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1905 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1906 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1907 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1908 }
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1909 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1910 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1911 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1912 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1913 case SPELL_SPIRIT_PRESERVATION://Ñîõðàíåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1914 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1915 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1916 duration = 900 * (spell_level + 4);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1917 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1918 duration = 300 * (spell_level + 12);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1919 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1920 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1921 if ( skill_level == 1 || skill_level == 2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1922 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1923 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1924 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_PRESERVATION].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1925 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1926 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1927 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1928 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1929 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1930 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1931 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_id);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1932 pParty->pPlayers[pl_id].pPlayerBuffs[PLAYER_BUFF_PRESERVATION].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1933 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1934 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1935 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1936 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1937 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1938 case SPELL_SPIRIT_TURN_UNDEAD://Áåã ìåðòâåöîâ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1939 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1940 if ( skill_level == 1 || skill_level == 2)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1941 duration = 60 * (spell_level + 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1942 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1943 duration = 300 * spell_level + 180;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1944 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1945 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1946 int mon_num = pRenderer->_46À6ÀÑ_GetActorsInViewport(4096);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
1947 pEngine->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xFFFFFF, 192);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1948 ++pSpellSprite.uType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1949 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1950 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1951 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1952 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1953 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1954 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1955 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1956 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1957 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1958 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1959 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1960 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1961 for ( a2 = 0; a2 < mon_num; ++a2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1962 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1963 if ( MonsterStats::BelongsToSupertype(pActors[_50BF30_actors_in_viewport_ids[a2]].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1964 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1965 pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1966 pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1967 pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.z - (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[a2]].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1968 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[a2]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1969 pSpellSprite.Create(0, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1970 pActors[_50BF30_actors_in_viewport_ids[a2]].pActorBuffs[ACTOR_BUFF_AFRAID].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1971 (signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1972 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1973 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1974 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1975 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1976 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1977 case SPELL_SPIRIT_RAISE_DEAD://Îæèâëåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1978 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1979 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1980 amount = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1981 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1982 amount = 86400 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1983 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1984 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1985 pOtherOverlayList->_4418B1(5080, pCastSpell->uPlayerID_2 + 100, 0, 65536);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1986 if ( !pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Dead] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1987 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1988 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1989 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1990 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1991 pParty->pPlayers[pCastSpell->uPlayerID_2].sHealth = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1992 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1993 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1994 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Dead] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1995 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Unconcious] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1996 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1997 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1998 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
1999 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Dead,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2000 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2001 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Unconcious,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2002 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2003 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2004 pParty->pPlayers[pCastSpell->uPlayerID_2].SetCondition(Condition_Weak, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2005 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2006 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2007 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2008 case SPELL_SPIRIT_SHARED_LIFE://Îáùàÿ æèçíü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2009 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2010 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2011 amount = 4 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2012 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2013 amount = 3 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2014 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2015 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2016 int active_pl_num = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2017 signed int shared_life_count = amount;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2018 int mean_life = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2019 int pl_array[4];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2020 for ( uint pl_id = 1; pl_id <= 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2021 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2022 if ( !pPlayers[pl_id]->pConditions[Condition_Dead] && !pPlayers[pl_id]->pConditions[Condition_Pertified]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2023 && !pPlayers[pl_id]->pConditions[Condition_Eradicated] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2024 pl_array[active_pl_num++] = pl_id;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2025 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2026 for ( uint i = 0; i < active_pl_num; i++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2027 shared_life_count += pPlayers[pl_array[i]]->sHealth;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2028 mean_life = (signed __int64)((double)shared_life_count / (double)active_pl_num);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2029 for ( uint i = 0; i < active_pl_num; i++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2030 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2031 pPlayers[pl_array[i]]->sHealth = mean_life;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2032 if ( pPlayers[pl_array[i]]->sHealth > pPlayers[pl_array[i]]->GetMaxHealth())
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2033 pPlayers[pl_array[i]]->sHealth = pPlayers[pl_array[i]]->GetMaxHealth();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2034 if ( pPlayers[pl_array[i]]->sHealth > 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2035 pPlayers[pl_array[i]]->SetUnconcious(0);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2036 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_array[i] - 1);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2037 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2038 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2039 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2040 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2041 case SPELL_SPIRIT_RESSURECTION://Âîñêðåñåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2042 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2043 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2044 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2045 case 1: amount = 180 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2046 case 2: amount = 10800 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2047 case 3: amount = 259200 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2048 case 4: amount = 0; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2049 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2050 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2051 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2052 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2053 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2054 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Eradicated]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2055 || pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Dead] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2056 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2057 if ( !(pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Weak]) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2058 pParty->pPlayers[pCastSpell->uPlayerID_2].PlaySound(SPEECH_25, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2059 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2060 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2061 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Eradicated] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2062 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Dead] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2063 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Unconcious] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2064 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2065 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2066 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2067 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan( Condition_Eradicated,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2068 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2069 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan( Condition_Dead,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2070 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2071 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan( Condition_Unconcious,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2072 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2073 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2074 pParty->pPlayers[pCastSpell->uPlayerID_2].SetCondition(Condition_Weak, 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2075 pParty->pPlayers[pCastSpell->uPlayerID_2].sHealth = 1;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2076 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2077 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2078 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2079 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2080 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2081 case SPELL_MIND_CURE_PARALYSIS://ëå÷åíèå ïàðàëè÷à
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2082 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2083 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2084 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2085 case 1: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2086 case 2: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2087 case 3: amount = 86400 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2088 case 4: amount = 0; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2089 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2090 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2091 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2092 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2093 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2094 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2095 if ( !pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Paralyzed] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2096 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2097 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2098 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2099 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2100 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2101 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2102 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Paralyzed] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2103 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2104 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2105 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2106 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Paralyzed,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2107 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2108 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2109 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2110 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2111 case SPELL_MIND_REMOVE_FEAR://Ñíÿòü ñòðàõ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2112 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2113 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2114 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2115 case 1: amount = 180 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2116 case 2: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2117 case 3: amount = 86400 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2118 case 4: amount = 0; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2119 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2120 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2121 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2122 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2123 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2124 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2125 if ( !pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Fear] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2126 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2127 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2128 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2129 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2130 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2131 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2132 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Fear] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2133 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2134 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2135 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2136 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Fear,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2137 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2138 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2139 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2140 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2141 case SPELL_MIND_TELEPATHY://Òåëåïàòèÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2142 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2143 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2144 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2145 if (PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2146 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2147 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2148 if ( !pActors[mon_id].ActorHasItem() )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2149 pActors[mon_id].SetRandomGoldIfTheresNoItem();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2150 int gold_num = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2151 if ( pItemsTable->pItems[pActors[mon_id].ActorHasItems[3].uItemID].uEquipType == EQUIP_GOLD )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2152 gold_num = pActors[mon_id].ActorHasItems[3].uSpecEnchantmentType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2153 ItemGen item;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2154 item.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2155 if (pActors[mon_id].uCarriedItemID)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2156 item.uItemID = pActors[mon_id].uCarriedItemID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2157 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2158 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2159 for ( uint i = 0; i < 4; ++i )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2160 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2161 if ( pActors[mon_id].ActorHasItems[i].uItemID > 0 && pItemsTable->pItems[pActors[mon_id].ActorHasItems[i].uItemID].uEquipType != EQUIP_GOLD )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2162 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2163 memcpy(&item, &pActors[mon_id].ActorHasItems[i], sizeof(item));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2164 spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2165 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2166 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2167 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2168 if ( gold_num > 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2169 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2170 if (item.uItemID)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2171 sprintf(pTmpBuf2.data(), "(%s), and %d gold", item.GetDisplayName(), gold_num);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2172 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2173 sprintf(pTmpBuf2.data(), "%d gold", gold_num);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2174 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2175 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2176 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2177 if (item.uItemID)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2178 sprintf(pTmpBuf2.data(), "(%s)", item.GetDisplayName());
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2179 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2180 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2181 strcpy(pTmpBuf2.data(), "nothing");
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2182 ShowStatusBarString(pTmpBuf2.data(), 2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2183 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2184 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2185 ShowStatusBarString(pTmpBuf2.data(), 2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2186 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2187 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2188 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2189 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2190 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2191 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2192 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2193 pSpellSprite.vPosition.z = pActors[mon_id].uActorHeight;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2194 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2195 pSpellSprite.uSectorID = pIndoor->GetSector(pSpellSprite.vPosition.x, pSpellSprite.vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2196 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2197 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2198 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2199 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2200 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2201 LOBYTE(pSpellSprite.uAttributes) |= 0x80;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2202 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2203 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2204 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2205 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2206 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2207 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2208 case SPELL_MIND_BERSERK://Áåðñåðê
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2209 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2210 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2211 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2212 case 1: amount = 300 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2213 case 2: amount = 300 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2214 case 3: amount = 600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2215 case 4: amount = 3600; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2216 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2217 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2218 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2219 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2220 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2221 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2222 if (PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2223 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2224 //v730 = 836 * mon_id;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2225 if ( pActors[mon_id].DoesDmgTypeDoDamage((DAMAGE_TYPE)7) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2226 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2227 pActors[mon_id].pActorBuffs[ACTOR_BUFF_CHARM].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2228 pActors[mon_id].pActorBuffs[ACTOR_BUFF_ENSLAVED].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2229 pActors[mon_id].pActorBuffs[ACTOR_BUFF_BERSERK].Apply(pParty->uTimePlayed + (signed __int64)((double)(amount << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2230 pActors[mon_id].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2231 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2232 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2233 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2234 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2235 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2236 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2237 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2238 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2239 pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z + pActors[mon_id].uActorHeight;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2240 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2241 pSpellSprite.uSectorID = pIndoor->GetSector(pActors[mon_id].vPosition.x, pActors[mon_id].vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2242 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2243 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2244 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2245 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2246 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2247 LOBYTE(pSpellSprite.uAttributes) |= 0x80;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2248 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2249 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2250 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2251 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2252 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2253 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2254 case SPELL_MIND_ENSLAVE://Ïîðàáîùåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2255 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2256 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2257 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2258 amount = 600 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2259 if (PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2260 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2261 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2262 //v730 = 836 * mon_id;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2263 if ( MonsterStats::BelongsToSupertype(pActors[mon_id].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2264 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2265 if ( pActors[mon_id].DoesDmgTypeDoDamage((DAMAGE_TYPE)7) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2266 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2267 pActors[mon_id].pActorBuffs[ACTOR_BUFF_BERSERK].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2268 pActors[mon_id].pActorBuffs[ACTOR_BUFF_CHARM].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2269 pActors[mon_id].pActorBuffs[ACTOR_BUFF_ENSLAVED].Apply(pParty->uTimePlayed + (signed __int64)((double)(amount << 7) * 0.033333335),
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2270 skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2271 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2272 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2273 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2274 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2275 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2276 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2277 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2278 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2279 pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z + pActors[mon_id].uActorHeight;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2280 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2281 pSpellSprite.uSectorID = pIndoor->GetSector(pActors[mon_id].vPosition.x, pActors[mon_id].vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2282 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2283 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2284 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2285 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2286 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2287 LOBYTE(pSpellSprite.uAttributes) |= 0x80;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2288 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2289 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2290 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2291 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2292 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2293 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2294 case SPELL_MIND_MASS_FEAR://Ìàññîâûé ñòðàõ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2295 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2296 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2297 amount = 300 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2298 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2299 amount = 180 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2300 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2301 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2302 int mon_num = pRenderer->_46À6ÀÑ_GetActorsInViewport(4096);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2303 pEngine->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xA0A0A, 192);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2304 ++pSpellSprite.uType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2305 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2306 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2307 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2308 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2309 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2310 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2311 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2312 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2313 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2314 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2315 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2316 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2317 for ( a2 = 0; a2 < mon_num; ++a2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2318 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2319 if ( MonsterStats::BelongsToSupertype(pActors[_50BF30_actors_in_viewport_ids[a2]].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2320 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2321 pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2322 pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2323 pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.z - (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[a2]].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2324 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[a2]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2325 pSpellSprite.Create(0, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2326 if ( pActors[_50BF30_actors_in_viewport_ids[a2]].DoesDmgTypeDoDamage((DAMAGE_TYPE)7) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2327 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2328 pActors[_50BF30_actors_in_viewport_ids[a2]].pActorBuffs[ACTOR_BUFF_AFRAID].Apply(pParty->uTimePlayed + (signed __int64)((double)(amount << 7) * 0.033333335),
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2329 skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2330 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2331 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2332 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2333 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2334 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2335 case SPELL_MIND_CURE_INSANITY://Ëå÷åíèå Áåçóìèÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2336 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2337 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2338 amount = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2339 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2340 amount = 86400 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2341 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2342 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2343 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2344 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Insane] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2345 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2346 if ( !(pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Weak]) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2347 pParty->pPlayers[pCastSpell->uPlayerID_2].PlaySound(SPEECH_25, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2348 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2349 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Insane] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2350 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2351 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Insane,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2352 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2353 pParty->pPlayers[pCastSpell->uPlayerID_2].SetCondition(Condition_Weak, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2354 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2355 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2356 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2357 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2358 case SPELL_EARTH_TELEKINESIS://Òåëåêèíåç
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2359 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2360 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2361 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2362 case 1: amount = 2 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2363 case 2: amount = 2 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2364 case 3: amount = 3 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2365 case 4: amount = 4 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2366 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2367 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2368 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2369 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2370 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2371 int obj_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2372 if (PID_TYPE(a2) == OBJECT_Item)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2373 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2374 if ( pItemsTable->pItems[pSpriteObjects[obj_id].stru_24.uItemID].uEquipType == EQUIP_GOLD )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2375 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2376 pParty->PartyFindsGold(pSpriteObjects[obj_id].stru_24.uSpecEnchantmentType, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2377 viewparams->bRedrawGameUI = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2378 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2379 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2380 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2381 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], pItemsTable->pItems[pSpriteObjects[obj_id].stru_24.uItemID].pUnidentifiedName);//Âû íàøëè ^Pv[%s]!
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2382 ShowStatusBarString(pTmpBuf2.data(), 2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2383 if ( !pParty->AddItemToParty(&pSpriteObjects[obj_id].stru_24) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2384 pParty->SetHoldingItem(&pSpriteObjects[obj_id].stru_24);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2385 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2386 SpriteObject::OnInteraction(obj_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2387 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2388 if (PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2389 pActors[obj_id].LootActor();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2390 if (PID_TYPE(a2) == OBJECT_Decoration)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2391 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2392 OpenedTelekinesis = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2393 if ( pLevelDecorations[obj_id].uEventID )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2394 EventProcessor(pLevelDecorations[obj_id].uEventID, a2, 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2395 if ( pLevelDecorations[pSpriteObjects[obj_id].stru_24.uItemID].IsInteractive() )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2396 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2397 activeLevelDecoration = &pLevelDecorations[obj_id];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2398 EventProcessor(stru_5E4C90_MapPersistVars._decor_events[pLevelDecorations[obj_id]._idx_in_stru123 - 75] + 380, 0, 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2399 activeLevelDecoration = nullptr;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2400 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2401 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2402 if (PID_TYPE(a2) == OBJECT_BModel)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2403 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2404 OpenedTelekinesis = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2405 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2406 v448 = pIndoor->pFaceExtras[pIndoor->pFaces[obj_id].uFaceExtraID].uEventID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2407 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2408 v448 = pOutdoor->pBModels[a2 >> 9].pFaces[obj_id & 0x3F].sCogTriggeredID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2409 EventProcessor(v448, a2, 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2410 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2411 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2412 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2413 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2414 case SPELL_BODY_CURE_WEAKNESS://Ëå÷èòü Ñëàáîñòü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2415 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2416 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2417 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2418 case 1: amount = 180 * spell_level; break;//3 ìèíóòû * êîëè÷åñòâî î÷êîâ íàâûêà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2419 case 2: amount = 3600 * spell_level; break;//1 ÷àñ * êîëè÷åñòâî î÷êîâ íàâûêà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2420 case 3: amount = 86400 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2421 case 4: amount = 0; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2422 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2423 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2424 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2425 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2426 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2427 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2428 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Weak] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2429 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2430 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2431 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2432 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Weak] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2433 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2434 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2435 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2436 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Weak,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2437 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2438 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2439 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2440 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2441 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2442 case SPELL_BODY_FIRST_AID://Ïåðâàÿ ïîìîùü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2443 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2444 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2445 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2446 case 1: amount = 2 * spell_level + 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2447 case 2: amount = 3 * spell_level + 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2448 case 3: amount = 4 * spell_level + 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2449 case 4: amount = 5 * spell_level + 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2450 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2451 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2452 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2453 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2454 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2455 if ( !pCastSpell->spell_target_pid )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2456 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2457 pParty->pPlayers[pCastSpell->uPlayerID_2].Heal(amount);
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2458 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2459 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2460 if (PID_TYPE(pCastSpell->spell_target_pid) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2461 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2462 mon_id = PID_ID(pCastSpell->spell_target_pid);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2463 if ( pActors[mon_id].uAIState != Dead && pActors[mon_id].uAIState != Dying && pActors[mon_id].uAIState != Disabled
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2464 && pActors[mon_id].uAIState != Removed )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2465 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2466 pActors[mon_id].sCurrentHP += amount;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2467 if ( pActors[mon_id].sCurrentHP > pActors[mon_id].pMonsterInfo.uHP )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2468 pActors[mon_id].sCurrentHP = pActors[mon_id].pMonsterInfo.uHP;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2469 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2470 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2471 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2472 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2473 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2474 case SPELL_BODY_CURE_POISON://Ëå÷åíèå Îòðàâëåíèÿ(Ïðîòèâîÿäèå)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2475 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2476 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2477 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2478 case 1: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2479 case 2: amount = 3600 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2480 case 3: amount = 86400 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2481 case 4: amount = 0; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2482 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2483 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2484 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2485 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2486 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2487 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2488 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Poison_Weak]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2489 || pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Poison_Medium]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2490 || pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Poison_Severe] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2491 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2492 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2493 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2494 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Poison_Weak] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2495 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Poison_Medium] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2496 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Poison_Severe] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2497 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2498 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2499 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2500 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Poison_Weak, (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2501 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Poison_Medium, (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2502 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Poison_Severe, (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2503 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2504 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2505 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2506 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2507 case SPELL_BODY_PROTECTION_FROM_MAGIC://Çàùèòà îò ìàãèè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2508 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2509 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2510 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2511 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2512 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2513 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2514 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2515 pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2516 (signed __int64)((double)(signed int)((int)(3600 * spell_level) << 7) * 0.033333335), skill_level, spell_level, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2517 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2518 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2519 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2520 case SPELL_BODY_HAMMERHANDS://Ðóêè-Ìîëîòû
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2521 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2522 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2523 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2524 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2525 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2526 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2527 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2528 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2529 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2530 for ( uint pl_id = 0; pl_id < 4; pl_id++)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2531 pParty->pPlayers[pl_id].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2532 (signed int)(signed __int64)((double)(signed int)((int)(3600 * spell_level) << 7) * 0.033333335), 4, spell_level, spell_level, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2533 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2534 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2535 }
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2536 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2537 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2538 (signed int)(signed __int64)((double)(signed int)((int)(3600 * spell_level) << 7) * 0.033333335), skill_level, spell_level, spell_level, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2539 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2540 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2541 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2542 case SPELL_BODY_CURE_DISEASE://Ëå÷èòü Áîëåçíü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2543 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2544 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2545 amount = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2546 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2547 amount = 86400 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2548 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2549 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2550 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2551 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Disease_Weak]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2552 || pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Disease_Medium]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2553 || pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Disease_Severe] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2554 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2555 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2556 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2557 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Disease_Weak] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2558 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Disease_Medium] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2559 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Disease_Severe] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2560 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2561 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Disease_Weak,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2562 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2563 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Disease_Medium,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2564 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2565 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(Condition_Disease_Severe,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2566 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2567 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2568 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2569 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2570 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2571 case SPELL_BODY_POWER_CURE://Èñöåëåíèå
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2572 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2573 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2574 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2575 for ( uint pl_id = 0; pl_id < 4; ++pl_id )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2576 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2577 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_id);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2578 pParty->pPlayers[pl_id].Heal(5 * spell_level + 10);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2579 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2580 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2581 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2582 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2583 case SPELL_LIGHT_DISPEL_MAGIC://Ñíÿòèå ÷àð
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2584 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2585 sRecoveryTime -= spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2586 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2587 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2588 pEngine->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xAFF0A, 192);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2589 int mon_num = pRenderer->_46À6ÀÑ_GetActorsInViewport(4096);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2590 ++pSpellSprite.uType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2591 v688.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2592 v688.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2593 v688.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2594 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2595 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2596 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2597 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2598 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2599 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2600 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2601 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2602 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2603 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2604 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2605 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2606 for ( a2 = 0; a2 < mon_num; ++a2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2607 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2608 pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2609 pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2610 pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.z -
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2611 (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[a2]].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2612 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[a2]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2613 Actor::DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), _50BF30_actors_in_viewport_ids[a2], &v688);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2614 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2615 for ( a2 = 0; a2 < mon_num; ++a2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2616 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2617 pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2618 pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2619 pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[a2]].vPosition.z -
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2620 (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[a2]].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2621 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[a2]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2622 pSpellSprite.Create(0, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2623 for (int i = 0; i < 22; ++i)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2624 pActors[_50BF30_actors_in_viewport_ids[a2]].pActorBuffs[i].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2625 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2626 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2627 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2628 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2629 case SPELL_LIGHT_SUMMON_ELEMENTAL://Ýëåìåíòàë
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2630 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2631 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2632 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2633 case 1: v733 = 300 * spell_level; amount = 1; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2634 case 2: v733 = 300 * spell_level; amount = 1; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2635 case 3: v733 = 900 * spell_level; amount = 3; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2636 case 4: v733 = 900 * spell_level; amount = 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2637 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2638 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2639 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2640 int mon_num = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2641 for ( uint mon_id = 0; mon_id < uNumActors; mon_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2642 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2643 if ( pActors[mon_id].uAIState != Dead && pActors[mon_id].uAIState != Removed && pActors[mon_id].uAIState != Disabled
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2644 && PID(OBJECT_Player, pCastSpell->uPlayerID) == pActors[mon_id].uSummonerID )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2645 ++mon_num;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2646 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2647 if ( mon_num >= amount )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2648 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2649 ShowStatusBarString(pGlobalTXT_LocalizationStrings[648], 2); // This character can't summon any more monsters!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
2650 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2651 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2652 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2653 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2654 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2655 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2656 sub_44FA4C_spawn_light_elemental(pCastSpell->uPlayerID, skill_level, v733);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2657 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2658 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2659 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2660 case SPELL_LIGHT_DAY_OF_THE_GODS://Äåíü áîãîâ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2661 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2662 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2663 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2664 case 1: duration = 10800 * spell_level; amount = 3 * spell_level + 10; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2665 case 2: duration = 10800 * spell_level; amount = 3 * spell_level + 10; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2666 case 3: duration = 14400 * spell_level; amount = 4 * spell_level + 10; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2667 case 4: duration = 18000 * spell_level; amount = 5 * spell_level + 10; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2668 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2669 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2670 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2671 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2672 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2673 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2674 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2675 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2676 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2677 pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2678 (signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2679 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2680 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2681 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2682 case SPELL_LIGHT_PRISMATIC_LIGHT://Ñâåò ïðèçìû
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2683 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2684 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2685 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2686 ShowStatusBarString(pGlobalTXT_LocalizationStrings[497], 2); // Can't cast Prismatic Light outdoors!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
2687 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2688 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2689 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2690 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2691 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2692 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2693 int mon_num = pRenderer->_46À6ÀÑ_GetActorsInViewport(4096);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2694 ++pSpellSprite.uType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2695 v694.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2696 v694.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2697 v694.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2698 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2699 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2700 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2701 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2702 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2703 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2704 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2705 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2706 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2707 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2708 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2709 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2710 for ( uint mon_id = 0; mon_id < mon_num; mon_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2711 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2712 pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2713 pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2714 pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.z -
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2715 (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[mon_id]].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2716 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[mon_id]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2717 Actor::DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), _50BF30_actors_in_viewport_ids[mon_id], &v694);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2718 }
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2719 //v537 = pEngine->GetStru6();
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2720 pEngine->GetStru6()->_4A8BFC();
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2721 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2722 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2723 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2724 case SPELL_LIGHT_DAY_OF_PROTECTION://Äåíü çàùèòû
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2725 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2726 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2727 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2728 case 1: duration = 14400 * spell_level; amount = 4 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2729 case 2: duration = 14400 * spell_level; amount = 4 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2730 case 3: duration = 14400 * spell_level; amount = 4 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2731 case 4: duration = 18000 * spell_level; amount = 5 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2732 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2733 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2734 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2735 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2736 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2737 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2738 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2739 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2740 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2741 pParty->pPartyBuffs[PARTY_BUFF_RESIST_BODY].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2742 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2743 pParty->pPartyBuffs[PARTY_BUFF_RESIST_MIND].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2744 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2745 pParty->pPartyBuffs[PARTY_BUFF_RESIST_FIRE].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2746 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2747 pParty->pPartyBuffs[PARTY_BUFF_RESIST_WATER].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2748 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2749 pParty->pPartyBuffs[PARTY_BUFF_RESIST_AIR].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2750 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2751 pParty->pPartyBuffs[PARTY_BUFF_RESIST_EARTH].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2752 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2753 pParty->pPartyBuffs[PARTY_BUFF_FEATHER_FALL].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2754 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2755 pParty->pPartyBuffs[PARTY_BUFF_WIZARD_EYE].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2756 (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2757 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2758 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2759 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2760 case SPELL_LIGHT_HOUR_OF_POWER: //×àñ ìîãóùåñòâà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2761 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2762 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2763 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2764 case 1: duration = 4; amount = 4; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2765 case 2: duration = 4; amount = 4; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2766 case 3: duration = 12; amount = 12; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2767 case 4: duration = 20; amount = 15; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2768 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2769 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2770 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2771 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2772 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2773 bool player_weak = false;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2774 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2775 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2776 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2777 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2778 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2779 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2780 pParty->pPlayers[pl_id].pPlayerBuffs[PLAYER_BUFF_BLESS].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2781 (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2782 if ( pParty->pPlayers[pl_id].pConditions[Condition_Weak] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2783 player_weak = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2784 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2785 pParty->pPartyBuffs[PARTY_BUFF_HEROISM].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2786 (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2787 pParty->pPartyBuffs[PARTY_BUFF_SHIELD].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2788 (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2789 pParty->pPartyBuffs[PARTY_BUFF_STONE_SKIN].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2790 (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2791 if ( !player_weak )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2792 pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2793 (signed __int64)((double)((60 * (spell_level * duration + 60)) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2794 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2795 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2796 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2797 case SPELL_LIGHT_DIVINE_INTERVENTION://Áîæåñòâåííîå âìåøàòåëüñòâî
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2798 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2799 //amount = 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2800 if ( pPlayer->uNumDivineInterventionCastsThisDay >= 3 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2801 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2802 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
2803 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2804 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2805 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2806 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2807 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2808 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2809 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2810 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2811 for ( uint buff_id = 0; buff_id <= 19; buff_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2812 pParty->pPlayers[pl_id].pConditions[buff_id] = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2813 pParty->pPlayers[pl_id].sHealth = pParty->pPlayers[pl_id].GetMaxHealth();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2814 pParty->pPlayers[pl_id].sMana = pParty->pPlayers[pl_id].GetMaxMana();
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2815 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_id);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2816 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2817 if ( pPlayer->sAgeModifier + 10 >= 120 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2818 pPlayer->sAgeModifier = 120;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2819 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2820 pPlayer->sAgeModifier = pPlayer->sAgeModifier + 10;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2821 sRecoveryTime += -5 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2822 ++pPlayer->uNumDivineInterventionCastsThisDay;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2823 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2824 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2825 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2826 case SPELL_DARK_REANIMATE: //Ðåàíèìàöèÿ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2827 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2828 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2829 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2830 case 1: amount = 2 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2831 case 2: amount = 3 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2832 case 3: amount = 4 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2833 case 4: amount = 5 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2834 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2835 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2836 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2837 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2838 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2839 if (!pCastSpell->spell_target_pid)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2840 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
2841 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2842 if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Dead] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2843 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2844 pParty->pPlayers[pCastSpell->uPlayerID_2].SetCondition(Condition_Zombie, 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2845 ReloadPlayerPortraits(pCastSpell->uPlayerID_2, (pParty->pPlayers[pCastSpell->uPlayerID_2].GetSexByVoice() != 0) + 23);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2846 pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Zombie] = pParty->uTimePlayed;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2847 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2848 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2849 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2850 mon_id = PID_ID(pCastSpell->spell_target_pid);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2851 if ( mon_id == -1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2852 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2853 ShowStatusBarString(pGlobalTXT_LocalizationStrings[496], 2); // No valid target exists!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
2854 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2855 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2856 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2857 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2858 if ( pActors[mon_id].sCurrentHP > 0
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2859 || pActors[mon_id].uAIState != Dead && pActors[mon_id].uAIState != Dying )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2860 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2861 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
2862 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2863 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2864 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2865 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2866 ++pSpellSprite.uType;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2867 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2868 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2869 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2870 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2871 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2872 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2873 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2874 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2875 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2876 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2877 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2878 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2879 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2880 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2881 pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z -
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2882 (unsigned int)(signed __int64)((double)pActors[mon_id].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2883 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, mon_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2884 pSpellSprite.Create(0, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2885 if ( pActors[mon_id].pMonsterInfo.uLevel > amount )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2886 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2887 Actor::Resurrect(mon_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2888 pActors[mon_id].pMonsterInfo.uHostilityType = (MonsterInfo::HostilityRadius)0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2889 pActors[mon_id].pMonsterInfo.uTreasureDropChance = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2890 pActors[mon_id].pMonsterInfo.uTreasureDiceRolls = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2891 pActors[mon_id].pMonsterInfo.uTreasureDiceSides = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2892 pActors[mon_id].pMonsterInfo.uTreasureLevel = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2893 pActors[mon_id].pMonsterInfo.uTreasureType = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2894 pActors[mon_id].uAlly = 9999;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2895 pActors[mon_id].ResetAggressor();//~0x80000
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2896 pActors[mon_id].uGroup = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2897 pActors[mon_id].pActorBuffs[ACTOR_BUFF_BERSERK].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2898 pActors[mon_id].pActorBuffs[ACTOR_BUFF_CHARM].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2899 pActors[mon_id].pActorBuffs[ACTOR_BUFF_ENSLAVED].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2900 if ( pActors[mon_id].sCurrentHP > 10 * amount )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2901 pActors[mon_id].sCurrentHP = 10 * amount;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2902 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2903 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2904 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2905 case SPELL_DARK_VAMPIRIC_WEAPON:// Îðóæèå-âàìïèð
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2906 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2907 amount = 16;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2908 if ( skill_level == 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2909 duration = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2910 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2911 duration = 3600 * spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2912 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2913 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2914 ItemGen *item = &pParty->pPlayers[pCastSpell->uPlayerID_2].pInventoryItemList[a2];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2915 item->UpdateTempBonus(pParty->uTimePlayed);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2916 if ( item->uItemID >= 64 && item->uItemID <= 65//blasters
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2917 || LOBYTE(item->uAttributes) & 2
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2918 || item->uSpecEnchantmentType != 0
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2919 || item->uEnchantmentType != 0
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2920 || pItemsTable->pItems[item->uItemID].uEquipType != EQUIP_SINGLE_HANDED
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2921 && pItemsTable->pItems[item->uItemID].uEquipType != EQUIP_TWO_HANDED
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2922 && pItemsTable->pItems[item->uItemID].uEquipType != EQUIP_BOW
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2923 || pItemsTable->IsMaterialNonCommon(item) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2924 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2925 _50C9D0_AfterEnchClickEventId = 113;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2926 _50C9D4_AfterEnchClickEventSecondParam = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2927 _50C9D8_AfterEnchClickEventTimeout = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2928 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
2929 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2930 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2931 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2932 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2933 item->uSpecEnchantmentType = 16;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2934 if ( skill_level != 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2935 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2936 item->uExpireTime = pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2937 item->uAttributes |= 8;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2938 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2939 LOBYTE(item->uAttributes) |= 0x80;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2940 _50C9A8_item_enchantment_timer = 256;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2941 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2942 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2943 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2944 case SPELL_DARK_SHARPMETAL://Øðàïíåëü
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2945 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2946 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2947 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2948 case 1: amount = 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2949 case 2: amount = 5; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2950 case 3: amount = 7; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2951 case 4: amount = 9; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2952 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2953 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2954 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2955 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2956 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2957 signed int _v726 = ((signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2958 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2959 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2960 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2961 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2962 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2963 pSpellSprite.vPosition.x = pParty->vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2964 pSpellSprite.vPosition.y = pParty->vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2965 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2966 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2967 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2968 pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2969 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2970 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2971 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2972 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2973 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2974 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2975 LOBYTE(pSpellSprite.uAttributes) |= 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2976 v188 = (signed int)_v726 / -2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2977 v189 = (signed int)_v726 / 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2978 if ( v188 <= v189 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2979 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2980 do
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2981 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2982 pSpellSprite.uFacing = v188 + v715.uYawAngle;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2983 if ( pSpellSprite.Create(pSpellSprite.uFacing, v715.uPitchAngle,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2984 pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed, pCastSpell->uPlayerID + 1) != -1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2985 && pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2986 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2987 v188 += _v726 / (amount - 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2988 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2989 while ( v188 <= v189 );
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2990 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2991 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2992 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2993 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2994 case SPELL_DARK_CONTROL_UNDEAD://Ãëàâà íåæèòè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2995 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2996 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2997 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2998 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
2999 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3000 case 1: duration = 180 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3001 case 2: duration = 180 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3002 case 3: duration = 300 * spell_level; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3003 case 4: duration = 29030400; break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3004 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3005 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3006 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3007 if (PID_TYPE(a2) == OBJECT_Actor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3008 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3009 mon_id = PID_ID(a2);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3010 if ( !MonsterStats::BelongsToSupertype(pActors[mon_id].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3011 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3012 if ( !pActors[mon_id].DoesDmgTypeDoDamage((DAMAGE_TYPE)10) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3013 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3014 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
3015 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3016 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3017 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3018 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3019 pActors[mon_id].pActorBuffs[ACTOR_BUFF_BERSERK].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3020 pActors[mon_id].pActorBuffs[ACTOR_BUFF_CHARM].Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3021 pActors[mon_id].pActorBuffs[ACTOR_BUFF_ENSLAVED].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3022 (signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3023 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3024 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3025 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3026 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3027 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3028 pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3029 pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3030 pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z + pActors[mon_id].uActorHeight;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3031 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3032 pSpellSprite.uSectorID = pIndoor->GetSector(pActors[mon_id].vPosition.x, pActors[mon_id].vPosition.y, pSpellSprite.vPosition.z);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3033 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3034 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3035 pSpellSprite.spell_target_pid = a2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3036 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3037 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3038 LOBYTE(pSpellSprite.uAttributes) |= 0x80;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3039 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3040 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3041 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3042 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3043 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3044 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3045 case SPELL_DARK_SACRIFICE://Æåðòâà
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3046 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3047 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3048 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3049 int hired_npc = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3050 memset(&achieved_awards, 0, 4000);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3051 for ( uint npc_id = 0; npc_id < 2; npc_id++ ) //êîëè÷åñòâî íàíÿòûõ ÍÏÑ
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3052 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3053 if ( pParty->pHirelings[npc_id].pName != 0)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3054 achieved_awards[hired_npc++] = (AwardType)(npc_id + 1);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3055 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3056 /*if ( (signed int)pNPCStats->uNumNewNPCs > 0)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3057 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3058 //AwardType *_v734 = &achieved_awards[_v733];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3059 for ( int npc_id = 0; npc_id < pNPCStats->uNumNewNPCs; ++npc_id )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3060 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3061 if ( pNPCStats->pNewNPCData[npc_id].uFlags & 0x80//hired(íà¸ìíûé)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3062 && (!pParty->pHirelings[0].pName
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3063 || strcmp(pNPCStats->pNewNPCData[npc_id].pName, pParty->pHirelings[0].pName))
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3064 && (!pParty->pHirelings[1].pName
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3065 || strcmp(pNPCStats->pNewNPCData[npc_id].pName, pParty->pHirelings[1].pName)) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3066 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3067 //v607 = _v734;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3068 //++_v734;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3069 achieved_awards[hired_npc++] = (AwardType)(npc_id + 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3070 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3071 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3072 }*/
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3073 if ( pCastSpell->uPlayerID_2 != 4 && pCastSpell->uPlayerID_2 != 5
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3074 || achieved_awards[pCastSpell->uPlayerID_2 - 4] <= 0 || achieved_awards[pCastSpell->uPlayerID_2 - 4] >= 3 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3075 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3076 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
3077 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3078 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3079 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3080 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3081 pParty->pHirelings[achieved_awards[pCastSpell->uPlayerID_2 - 4] - 1].evt_A = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3082 pParty->pHirelings[achieved_awards[pCastSpell->uPlayerID_2 - 4] - 1].evt_B = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3083 pParty->pHirelings[achieved_awards[pCastSpell->uPlayerID_2 - 4] - 1].evt_C = pIconsFrameTable->GetIconAnimLength(pIconsFrameTable->FindIcon("spell96"));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3084 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3085 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3086 pParty->pPlayers[pl_id].sHealth = pParty->pPlayers[pl_id].GetMaxHealth();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3087 pParty->pPlayers[pl_id].sMana = pParty->pPlayers[pl_id].GetMaxMana();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3088 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3089 v613 = &pOutdoor->ddm;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3090 if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3091 v613 = &pIndoor->dlv;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3092 v613->uReputation += 15;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3093 if ( v613->uReputation > 10000 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3094 v613->uReputation = 10000;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3095 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3096 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3097 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3098 case SPELL_DARK_PAIN_REFLECTION://Îòðàæåíèå áîëè
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3099 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3100 switch (skill_level)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3101 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3102 case 1: duration = 300 * (spell_level + 12); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3103 case 2: duration = 300 * (spell_level + 12); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3104 case 3: duration = 300 * (spell_level + 12); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3105 case 4: duration = 900 * (spell_level + 4); break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3106 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3107 assert(false);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3108 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3109 amount = spell_level + 5;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3110 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3111 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3112 if ( skill_level != 3 && skill_level != 4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3113 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3114 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3115 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_PAIN_REFLECTION].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3116 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3117 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3118 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3119 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3120 for ( uint pl_id = 0; pl_id < 4; pl_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3121 {
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3122 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_id);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3123 pParty->pPlayers[pl_id].pPlayerBuffs[PLAYER_BUFF_PAIN_REFLECTION].Apply(pParty->uTimePlayed +
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3124 (signed int)(signed __int64)((double)(signed int)((int)duration << 7) * 0.033333335), skill_level, amount, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3125 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3126 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3127 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3128 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3129 case SPELL_DARK_SOULDRINKER://Èñïèòü äóøó
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3130 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3131 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3132 break;
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3133 pEngine->GetIndoorCamera();
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3134 int mon_num = pRenderer->_46À6ÀÑ_GetActorsInViewport((signed __int64)pEngine->pIndoorCameraD3D->GetPickDepth());
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3135 v707.x = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3136 v707.y = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3137 v707.z = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3138 pSpellSprite.stru_24.Reset();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3139 pSpellSprite.spell_id = pCastSpell->uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3140 pSpellSprite.spell_level = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3141 pSpellSprite.spell_skill = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3142 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3143 pSpellSprite.uAttributes = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3144 pSpellSprite.uSectorID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3145 pSpellSprite.uSpriteFrameID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3146 pSpellSprite.field_60_distance_related_prolly_lod = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3147 pSpellSprite.uFacing = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3148 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3149 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3150 amount = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3151 if ( mon_num > 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3152 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3153 amount = (mon_num * (7 * spell_level + 25));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3154 for ( uint mon_id = 0; mon_id < mon_num; mon_id++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3155 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3156 pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.x;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3157 pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.y;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3158 pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.z -
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3159 (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[mon_id]].uActorHeight * -0.8);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3160 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[mon_id]);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3161 Actor::DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), _50BF30_actors_in_viewport_ids[mon_id], &v707);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3162 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3163 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3164 int pl_num = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3165 int pl_array[4];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3166 for ( uint pl_id = 1; pl_id <= 4; ++pl_id )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3167 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3168 if ( !pPlayers[pl_id]->pConditions[Condition_Sleep] && !pPlayers[pl_id]->pConditions[Condition_Paralyzed]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3169 && !pPlayers[pl_id]->pConditions[Condition_Unconcious] && !pPlayers[pl_id]->pConditions[Condition_Dead]
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3170 && !pPlayers[pl_id]->pConditions[Condition_Pertified] && !pPlayers[pl_id]->pConditions[Condition_Eradicated] )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3171 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3172 pl_array[pl_num++] = pl_id;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3173 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3174 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3175 for ( uint j = 0; j < pl_num; j++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3176 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3177 pPlayers[pl_array[j]]->sHealth += (signed __int64)((double)(signed int)amount / (double)pl_num);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3178 if ( pPlayers[pl_array[j]]->sHealth > pPlayers[pl_array[j]]->GetMaxHealth())
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3179 pPlayers[pl_array[j]]->sHealth = pPlayers[pl_array[j]]->GetMaxHealth();
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3180 pEngine->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_array[j]);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3181 }
2541
a902abdfc7f2 1. Renamed class Game to class Engine.
a.parshin
parents: 2534
diff changeset
3182 pEngine->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0, 64);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3183 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3184 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3185 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3186 case SPELL_DARK_ARMAGEDDON://Àðìàãåääîí
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3187 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3188 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3189 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3190 ShowStatusBarString(pGlobalTXT_LocalizationStrings[499], 2); // Can't cast Armageddon indoors!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
3191 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3192 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3193 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3194 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3195 if ( skill_level == 4)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3196 amount = 4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3197 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3198 amount = 3;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3199 if ( pPlayer->uNumArmageddonCasts >= amount || pParty->armageddon_timer > 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3200 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3201 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
3202 pAudioPlayer->PlaySound(SOUND_spellfail0201, 0, 0, -1, 0, 0, 0, 0);
2499
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3203 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3204 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3205 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3206 if ( !pPlayer->CanCastSpell(uRequiredMana) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3207 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3208 pParty->armageddon_timer = 256;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3209 pParty->armageddonDamage = spell_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3210 ++pPlayer->uNumArmageddonCasts;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3211 if ( pParty->bTurnBasedModeOn == 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3212 ++pTurnEngine->pending_actions;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3213 for ( uint i = 0; i < 50; i++ )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3214 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3215 v642 = rand() % 4096 - 2048;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3216 v643 = rand();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3217 v732 = GetTerrainHeightsAroundParty2(v642 + pParty->vPosition.x, pParty->vPosition.y + (v643 % 4096 - 2048), &v710, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3218 SpriteObject::sub_42F7EB_DropItemAt(4070, v642 + pParty->vPosition.x, pParty->vPosition.y + (v643 % 4096 - 2048), v732 + 16, rand() % 500 + 500, 1, 0, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3219 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3220 spell_sound_flag = true;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3221 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3222 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3223 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3224 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3225 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3226 if ( pCastSpell->uFlags & 0x20 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3227 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3228 if ( spell_sound_flag )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3229 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[pCastSpell->uSpellID], 0, 0, -1, 0, pCastSpell->sound_id, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3230 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3231 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3232 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3233 if ( sRecoveryTime < 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3234 sRecoveryTime = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3235 if ( pParty->bTurnBasedModeOn )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3236 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3237 //v645 = sRecoveryTime;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3238 pParty->pTurnBasedPlayerRecoveryTimes[pCastSpell->uPlayerID] = sRecoveryTime;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3239 pPlayer->SetRecoveryTime(sRecoveryTime);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3240 if ( !some_active_character )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3241 pTurnEngine->ApplyPlayerAction();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3242 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3243 else
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3244 pPlayer->SetRecoveryTime((signed __int64)(flt_6BE3A4_debug_recmod1 * (double)sRecoveryTime * 2.133333333333333));
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3245 if ( spell_sound_flag )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3246 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3247 pPlayer->PlaySound(SPEECH_49, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3248 //if ( spell_sound_flag )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3249 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[pCastSpell->uSpellID], 0, 0, -1, 0, pCastSpell->sound_id, 0, 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3250 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3251 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3252 pCastSpell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3253 spell_level = v723;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3254 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3255 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3256
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3257 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3258 //----- (00427DA0) --------------------------------------------------------
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3259 size_t PushCastSpellInfo(uint16_t uSpellID, uint16_t uPlayerID, __int16 skill_level, uint16_t uFlags, int spell_sound_id)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3260 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3261 for (size_t i = 0; i < CastSpellInfoCount; i++)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3262 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3263 if (!pCastSpellInfo[i].uSpellID)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3264 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3265 pCastSpellInfo[i].uSpellID = uSpellID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3266 pCastSpellInfo[i].uPlayerID = uPlayerID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3267 if (uFlags & 0x10)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3268 pCastSpellInfo[i].uPlayerID_2 = uPlayerID;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3269 pCastSpellInfo[i].field_6 = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3270 pCastSpellInfo[i].spell_target_pid = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3271 pCastSpellInfo[i].uFlags = uFlags;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3272 pCastSpellInfo[i].forced_spell_skill_level = skill_level;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3273 pCastSpellInfo[i].sound_id = spell_sound_id;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3274 return i;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3275 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3276 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3277 return -1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3278 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3279 //----- (00427D48) --------------------------------------------------------
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3280 void CastSpellInfoHelpers::_427D48()
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3281 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3282 for (size_t i = 0; i < CastSpellInfoCount; i++)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3283 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3284 if (pCastSpellInfo[i].uSpellID && pCastSpellInfo[i].uFlags & 0x3CA)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3285 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3286 pCastSpellInfo[i].uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3287 pGUIWindow_Settings->Release();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3288 pGUIWindow_Settings = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3289 pMouse->SetCursorBitmap("MICON1");
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3290 GameUI_Footer_TimeLeft = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3291 _50C9A0_IsEnchantingInProgress = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3292 back_to_game();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3293 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3294 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3295 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3296 //----- (0042777D) --------------------------------------------------------
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3297 void _42777D_CastSpell_UseWand_ShootArrow(int a1, unsigned int uPlayerID, unsigned int a4, __int16 a5, int a6)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3298 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3299 unsigned __int16 v9; // cx@16
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3300 unsigned int v10; // eax@18
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3301 unsigned __int8 v11; // sf@18
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3302 unsigned __int8 v12; // of@18
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3303 unsigned __int16 v13; // cx@21
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3304 unsigned int v14; // eax@23
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3305
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3306 //if ( pParty->bTurnBasedModeOn != 1
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3307 // || (result = pTurnEngine->field_4, pTurnEngine->field_4 != 1) && pTurnEngine->field_4 != 3 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3308 if (pParty->bTurnBasedModeOn)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3309 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3310 if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_MOVEMENT )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3311 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3312 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3313
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3314
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3315 //v6 = a5;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3316 //v7 = &pParty->pPlayers[uPlayerID];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3317 assert(uPlayerID < 4);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3318 Player* player = &pParty->pPlayers[uPlayerID];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3319 if ( !(a5 & 0x10) )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3320 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3321 switch ( a1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3322 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3323 case SPELL_SPIRIT_FATE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3324 case SPELL_BODY_FIRST_AID:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3325 case SPELL_DARK_REANIMATE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3326 //HIBYTE(v6) = HIBYTE(a5) | 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3327 a5 |= 0x0100;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3328 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3329
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3330 case SPELL_FIRE_FIRE_AURA:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3331 case SPELL_WATER_RECHARGE_ITEM:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3332 case SPELL_WATER_ENCHANT_ITEM:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3333 case SPELL_DARK_VAMPIRIC_WEAPON:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3334 //LOBYTE(v6) = a5 | 0x80;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3335 a5 |= 0x0080;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3336 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3337
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3338 case SPELL_FIRE_FIRE_BOLT:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3339 case SPELL_FIRE_FIREBALL:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3340 case SPELL_FIRE_INCINERATE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3341 case SPELL_AIR_LIGHNING_BOLT:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3342 case SPELL_AIR_IMPLOSION:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3343 case SPELL_WATER_POISON_SPRAY:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3344 case SPELL_WATER_ICE_BOLT:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3345 case SPELL_WATER_ACID_BURST:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3346 case SPELL_WATER_ICE_BLAST:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3347 case SPELL_EARTH_STUN:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3348 case SPELL_EARTH_SLOW:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3349 case SPELL_EARTH_DEADLY_SWARM:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3350 case SPELL_EARTH_BLADES:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3351 case SPELL_EARTH_MASS_DISTORTION:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3352 case SPELL_SPIRIT_SPIRIT_LASH:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3353 case SPELL_MIND_MIND_BLAST:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3354 case SPELL_MIND_CHARM:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3355 case SPELL_MIND_PSYCHIC_SHOCK:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3356 case SPELL_BODY_HARM:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3357 case SPELL_BODY_FLYING_FIST:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3358 case SPELL_LIGHT_LIGHT_BOLT:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3359 case SPELL_LIGHT_DESTROY_UNDEAD:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3360 case SPELL_LIGHT_SUNRAY:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3361 case SPELL_DARK_TOXIC_CLOUD:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3362 case SPELL_DARK_SHRINKING_RAY:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3363 case SPELL_DARK_SHARPMETAL:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3364 case SPELL_DARK_DRAGON_BREATH:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3365 if ( !a6 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3366 a5 |= 0x0008;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3367 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3368 case SPELL_MIND_TELEPATHY:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3369 case SPELL_MIND_BERSERK:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3370 case SPELL_MIND_ENSLAVE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3371 case SPELL_LIGHT_PARALYZE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3372 case SPELL_DARK_CONTROL_UNDEAD:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3373 //LABEL_9:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3374 //v6 = a5 | 8;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3375 a5 |= 0x0008;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3376 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3377
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3378 case SPELL_EARTH_TELEKINESIS:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3379 a5 |= 0x0040;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3380 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3381
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3382 case SPELL_SPIRIT_BLESS:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3383 if (a4 && ~a4 & 0x01C0)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3384 //goto LABEL_25;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3385 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3386 a5 |= 0x0002;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3387 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3388 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3389 else if ((player->pActiveSkills[PLAYER_SKILL_SPIRIT] & 0x1C0) == 0)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3390 //goto LABEL_25;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3391 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3392 a5 |= 0x0002;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3393 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3394 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3395 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3396
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3397 case SPELL_SPIRIT_PRESERVATION:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3398 v9 = a4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3399 if ( !a4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3400 v9 = player->pActiveSkills[PLAYER_SKILL_SPIRIT];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3401 //goto LABEL_18;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3402 v10 = SkillToMastery(v9);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3403 v12 = __OFSUB__(v10, 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3404 v11 = ((v10 - 3) & 0x80000000u) != 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3405 //goto LABEL_24;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3406 if ( v11 ^ v12 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3407 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3408 a5 |= 0x0002;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3409 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3410 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3411 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3412
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3413 case SPELL_DARK_PAIN_REFLECTION:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3414 v9 = a4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3415 if ( !a4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3416 v9 = player->pActiveSkills[PLAYER_SKILL_DARK];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3417 //LABEL_18:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3418 v10 = SkillToMastery(v9);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3419 v12 = __OFSUB__(v10, 3);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3420 v11 = ((v10 - 3) & 0x80000000u) != 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3421 //goto LABEL_24;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3422 if ( v11 ^ v12 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3423 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3424 a5 |= 0x0002;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3425 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3426 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3427 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3428
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3429 case SPELL_BODY_HAMMERHANDS:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3430 v13 = a4;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3431 if ( !a4 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3432 v13 = player->pActiveSkills[PLAYER_SKILL_BODY];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3433 v14 = SkillToMastery(v13);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3434 v12 = __OFSUB__(v14, 4);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3435 v11 = ((v14 - 4) & 0x80000000u) != 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3436 //LABEL_24:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3437 if ( v11 ^ v12 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3438 //goto LABEL_25;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3439 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3440 a5 |= 0x0002;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3441 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3442 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3443 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3444
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3445 case SPELL_EARTH_STONE_TO_FLESH:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3446 case SPELL_SPIRIT_REMOVE_CURSE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3447 case SPELL_SPIRIT_RAISE_DEAD:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3448 case SPELL_SPIRIT_RESSURECTION:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3449 case SPELL_MIND_REMOVE_FEAR:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3450 case SPELL_MIND_CURE_PARALYSIS:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3451 case SPELL_MIND_CURE_INSANITY:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3452 case SPELL_BODY_CURE_WEAKNESS:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3453 case SPELL_BODY_REGENERATION:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3454 case SPELL_BODY_CURE_POISON:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3455 case SPELL_BODY_CURE_DISEASE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3456 //LABEL_25:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3457 //v6 = a5 | 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3458 a5 |= 0x0002;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3459 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3460
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3461 case SPELL_DARK_SACRIFICE:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3462 //HIBYTE(v6) = HIBYTE(a5) | 2;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3463 a5 |= 0x0200;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3464 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3465 default:
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3466 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3467 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3468 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3469
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3470
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3471 if (a5 & 0x3CA)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3472 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3473 for (uint i = 0; i < CastSpellInfoCount; ++i)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3474 if (pCastSpellInfo[i].uFlags & 0x3CA)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3475 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3476 pCastSpellInfo[i].uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3477 break;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3478 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3479 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3480
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3481 for (uint i = 0; i < CastSpellInfoCount; ++i)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3482 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3483 CastSpellInfo* spell = &pCastSpellInfo[i];
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3484 if (!spell->uSpellID)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3485 continue;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3486
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3487 spell->uSpellID = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3488 if (spell->uFlags & 0x3CA)
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3489 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3490 pGUIWindow_Settings->Release();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3491 pGUIWindow_Settings = nullptr;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3492 pMouse->SetCursorBitmap("MICON1");
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3493 GameUI_Footer_TimeLeft = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3494 _50C9A0_IsEnchantingInProgress = 0;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3495 back_to_game();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3496 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3497 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3498
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3499 int result = PushCastSpellInfo(a1, uPlayerID, a4, a5, a6);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3500 if ( result != -1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3501 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3502 if ( a5 & 2 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3503 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3504 if ( pGUIWindow_Settings )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3505 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3506 pGUIWindow_Settings = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3507 pGUIWindow_Settings->CreateButton(52, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 0, 49, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3508 pGUIWindow_Settings->CreateButton(165, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 1, 50, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3509 pGUIWindow_Settings->CreateButton(280, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 2, 51, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3510 pGUIWindow_Settings->CreateButton(390, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 3, 52, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3511 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3512 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3513 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3514 if ( a5 & 8 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3515 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3516 if ( pGUIWindow_Settings )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3517 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3518
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3519 pGUIWindow_Settings = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3520 pGUIWindow_Settings->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Shoot_Monster, 0, 0, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3521 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3522 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3523 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3524 if ( a5 & 0x40 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3525 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3526 if ( pGUIWindow_Settings )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3527 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3528
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3529 pGUIWindow_Settings = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3530 pGUIWindow_Settings->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Telekinesis, 0, 0, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3531 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3532 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3533 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3534 if ( (char)a5 < 0 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3535 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3536 if ( pGUIWindow_Settings )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3537 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3538 ++pIcons_LOD->uTexturePacksCount;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3539 if ( !pIcons_LOD->uNumPrevLoadedFiles )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3540 pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3541 pGUIWindow_Settings = pCastSpellInfo[result].GetCastSpellInInventoryWindow();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3542 _50C9A0_IsEnchantingInProgress = 1;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3543 some_active_character = uActiveCharacter;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3544 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3545 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3546 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3547 if ( HIBYTE(a5) & 1 )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3548 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3549 if ( pGUIWindow_Settings )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3550 return;
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3551 pGUIWindow_Settings = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3552 pGUIWindow_Settings->CreateButton(0x34u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 0, 0x31u, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3553 pGUIWindow_Settings->CreateButton(0xA5u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 1, 0x32u, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3554 pGUIWindow_Settings->CreateButton(0x118u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 2, 0x33u, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3555 pGUIWindow_Settings->CreateButton(0x186u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 3, 0x34u, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3556 pGUIWindow_Settings->CreateButton(8, 8, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Monster_Improvement, 0, 0, "", NULL);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3557 pParty->sub_421B2C_PlaceInInventory_or_DropPickedItem();
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3558 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3559 if ( HIBYTE(a5) & 2 && !pGUIWindow_Settings )
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3560 {
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3561 pGUIWindow_Settings = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3562 pBtn_NPCLeft = pGUIWindow_Settings->CreateButton(469, 178,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3563 pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft)->uTextureWidth,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3564 pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft)->uTextureHeight,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3565 1, 0, UIMSG_ScrollNPCPanel, 0, 0, "",
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3566 pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft), 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3567 pBtn_NPCRight = pGUIWindow_Settings->CreateButton(626, 178,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3568 pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight)->uTextureWidth,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3569 pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight)->uTextureHeight,
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3570 1, 0, UIMSG_ScrollNPCPanel, 1, 0, "",
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3571 pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight), 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3572 pGUIWindow_Settings->CreateButton(491, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 4, 0x35u, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3573 pGUIWindow_Settings->CreateButton(561, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 5, 0x36u, "", 0);
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3574 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3575 }
68cdef6879a0 engine folder
Ritor1
parents:
diff changeset
3576 }