World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
SpellFxRenderer.cpp
См. документацию.
2 
3 #include <algorithm>
4 
5 #include "Engine/Engine.h"
6 #include "Engine/LOD.h"
7 #include "Engine/OurMath.h"
8 #include "Engine/Random.h"
9 #include "Engine/Time.h"
10 #include "Engine/stru160.h"
11 
12 #include "Engine/Graphics/Indoor.h"
14 #include "Engine/Graphics/Lights.h"
20 
21 #include "Engine/Objects/Actor.h"
24 
26 
27 //----- (004A7063) --------------------------------------------------------
28 unsigned int ModulateColor(unsigned int diffuse, float multiplier) {
29  float alpha = multiplier * ((diffuse >> 24) & 0xFF);
30  int a = (int)floorf(alpha + 0.5f);
31  a = std::max(0, std::min(255, a));
32 
33  float red = multiplier * ((diffuse >> 16) & 0xFF);
34  int r = (int)floorf(red + 0.5f);
35  r = std::max(0, std::min(255, r));
36 
37  float green = multiplier * ((diffuse >> 8) & 0xFF);
38  int g = (int)floorf(green + 0.5f);
39  g = std::max(0, std::min(255, g));
40 
41  float blue = multiplier * ((diffuse >> 0) & 0xFF);
42  int b = (int)floorf(blue + 0.5f);
43  b = std::max(0, std::min(255, b));
44 
45  return (a << 24) | (r << 16) | (g << 8) | b;
46 }
47 
48 //----- (0042620A) --------------------------------------------------------
50  // __int16 v1; // fps@1
51  unsigned __int8 v2; // c0@2
52  char v3; // c2@2
53  unsigned __int8 v4; // c3@2
54  // bool result; // eax@2
55  unsigned __int8 v6; // c0@4
56  char v7; // c2@4
57  unsigned __int8 v8; // c3@4
58  unsigned __int8 v9; // c0@6
59  char v10; // c2@6
60  unsigned __int8 v11; // c3@6
61  float v13; // ST04_4@7
62  float v14; // ST00_4@7
63  float v17; // ST04_4@8
64  float v18; // ST00_4@8
65 
66  if (p->vWorldViewPosition.x < 300.0 ||
67  (v2 = 300.0 < p[1].vWorldViewPosition.x, v3 = 0,
68  v4 = 300.0 == p[1].vWorldViewPosition.x,
69 
70  !(v2 | v4))) {
71  if (p->vWorldViewPosition.x < 300.0) {
72  v6 = 300.0 < p[1].vWorldViewPosition.x;
73  v7 = 0;
74  v8 = 300.0 == p[1].vWorldViewPosition.x;
75 
76  if (!(v6 | v8)) {
77  return false;
78  }
79  }
80  v9 = 300.0 < p->vWorldViewPosition.x;
81  v10 = 0;
82  v11 = 300.0 == p->vWorldViewPosition.x;
83 
84  if (v9 | v11) {
85  float v16 =
86  1.0f / (p->vWorldViewPosition.x - p[1].vWorldViewPosition.x);
87  v17 = (p->vWorldViewPosition.y - p[1].vWorldViewPosition.y) * v16;
88  v18 = (p->vWorldViewPosition.z - p[1].vWorldViewPosition.z) * v16;
89  float v19 = 300.0 - p[1].vWorldViewPosition.x;
90  p[1].vWorldViewPosition.x = v19 + p[1].vWorldViewPosition.x;
91  p[1].vWorldViewPosition.y = v17 * v19 + p[1].vWorldViewPosition.y;
92  p[1].vWorldViewPosition.z = v19 * v18 + p[1].vWorldViewPosition.z;
93  } else {
94  float v12 =
95  1.0f / (p[1].vWorldViewPosition.x - p->vWorldViewPosition.x);
96  v13 = (p[1].vWorldViewPosition.y - p->vWorldViewPosition.y) * v12;
97  v14 = (p[1].vWorldViewPosition.z - p->vWorldViewPosition.z) * v12;
98  float v15 = 300.0 - p->vWorldViewPosition.x;
99  p->vWorldViewPosition.x = v15 + p->vWorldViewPosition.x;
100  p->vWorldViewPosition.y = v13 * v15 + p->vWorldViewPosition.y;
101  p->vWorldViewPosition.z = v15 * v14 + p->vWorldViewPosition.z;
102  }
103  }
104 
105  return true;
106 }
107 
108 //----- (004775C4) --------------------------------------------------------
110  delete[] pArray1;
111  pArray1 = nullptr;
112 
113  delete[] pArray2;
114  pArray2 = nullptr;
115 }
116 
117 //----- (00478211) --------------------------------------------------------
119  uNumVec4sInArray1 = 66;
120  pArray1 = new stru16x[66];
121 
122  uNumVec3sInArray2 = 128;
123  pArray2 = new stru160[128];
124 
125  for (uint i = 0; i < uNumVec4sInArray1; ++i) {
126  pArray1[i].field_0 = array_4EB8B8[i].field_0;
127  pArray1[i].field_4 = array_4EB8B8[i].field_4;
128  pArray1[i].field_8 = array_4EB8B8[i].field_8;
129  pArray1[i].field_C = a2;
130  }
131 
132  for (uint i = 0; i < uNumVec3sInArray2; ++i) {
133  pArray2[i].field_0 = array_4EBBD0_x[3 * i];
134  pArray2[i].field_4 = array_4EBBD0_x[(3 * i)+1];
135  pArray2[i].field_8 = array_4EBBD0_x[(3 * i)+2];
136  }
137 
138  // doesnt copy over properly
139  // memcpy(pArray2, array_4EBBD0_x.data() /*array_4EBBD0*/,
140  // uNumVec3sInArray2 * sizeof(stru160));
141 }
142 
143 //----- (0047829F) --------------------------------------------------------
145  float x_offset, float y_offset, float z_offset, float scale, int diffuse) {
146  int v7 = 0;
147 
148  // offsets are centrepoints
149 
150  // 66 total verts points - held in array1
151  // 128 triangles using 66 diff verts
152 
153 
154  for (unsigned int i = 0; i < uNumVec3sInArray2; ++i) { // indicies for triangle in sphere
155  // for (unsigned int j = 0; j < 3; ++j) {
156  // field_14[j].x =
157  // x_offset +
158  // scale * *(&pArray1->field_0 +
159  // 4 * *(int *)((char *)&pArray2->field_0 + v7));
160  // field_14[j].y =
161  // y_offset +
162  // scale * *(&pArray1->field_4 +
163  // 4 * *(int *)((char *)&pArray2->field_0 + v7));
164  // field_14[j].z =
165  // z_offset +
166  // scale * *(&pArray1->field_8 +
167  // 4 * *(int *)((char *)&pArray2->field_0 + v7));
168  // // int v10 = *(int *)((char *)&pArray2->field_0 + v7);
169 
170  // field_14[j].diffuse =
171  // *((int *)&pArray1[1].field_0 +
172  // 4 * (*(int *)((char *)&pArray2->field_0 + v7)));
173  // v7 += 4;
174  //}
175 
176 
177  field_14[0].x = x_offset + scale * pArray1[int(pArray2[i].field_0)].field_0;
178  field_14[0].y = y_offset + scale * pArray1[int(pArray2[i].field_0)].field_4;
179  field_14[0].z = z_offset + scale * pArray1[int(pArray2[i].field_0)].field_8;
180  field_14[0].diffuse = diffuse;
181 
182  field_14[1].x = x_offset + scale * pArray1[int(pArray2[i].field_4)].field_0;
183  field_14[1].y = y_offset + scale * pArray1[int(pArray2[i].field_4)].field_4;
184  field_14[1].z = z_offset + scale * pArray1[int(pArray2[i].field_4)].field_8;
185  field_14[1].diffuse = diffuse;
186 
187  field_14[2].x = x_offset + scale * pArray1[int(pArray2[i].field_8)].field_0;
188  field_14[2].y = y_offset + scale * pArray1[int(pArray2[i].field_8)].field_4;
189  field_14[2].z = z_offset + scale * pArray1[int(pArray2[i].field_8)].field_8;
190  field_14[2].diffuse = diffuse;
191 
192 
193 
194  uNumVertices = 3;
196  if (SpellFXProject()) render->_4A4CC9_AddSomeBillboard(this, diffuse);
197  }
198  }
199 }
200 
201 //----- (004A71FE) --------------------------------------------------------
203  float dstX, float dstY, float dstZ,
204  Texture *texture) {
205  // int v8; // eax@1
206 
207  // v8 = uNumProjectiles;
208  if (uNumProjectiles < 32) {
216  uNumProjectiles++;
217  }
218 }
219 
220 //----- (004A7298) --------------------------------------------------------
222  float v10; // ST1C_4@8
223  float v11; // ST0C_4@8
224  RenderVertexSoft v[2]; // [sp+30h] [bp-68h]@1
225 
226  for (int i = 0; i < uNumProjectiles; ++i) {
228 
229  v[0].vWorldPosition.x = p->srcX;
230  v[0].vWorldPosition.y = p->srcY;
231  v[0].vWorldPosition.z = p->srcZ;
232  v[1].vWorldPosition.x = p->dstX;
233  v[1].vWorldPosition.y = p->dstY;
234  v[1].vWorldPosition.z = p->dstZ;
236 
237  sr_42620A(v);
238 
239  pIndoorCameraD3D->Project(v, 2, 0);
240 
241  v10 = pIndoorCameraD3D->fov_x / v[1].vWorldViewPosition.x * 20.0f;
242  v11 = pIndoorCameraD3D->fov_x / v[0].vWorldViewPosition.x * 20.0f;
243  render->DrawProjectile(v[0].vWorldViewProjX, v[0].vWorldViewProjY,
244  v[0].vWorldViewPosition.x, v11,
245  v[1].vWorldViewProjX, v[1].vWorldViewProjY,
246  v[1].vWorldViewPosition.x, v10, p->texture);
247  }
248 }
249 
250 //----- (004A73AA) --------------------------------------------------------
253  SpriteObject *a2, unsigned int uDiffuse, Texture *texture) {
254  SpellFxRenderer *thisspellfxrend; // edi@1
255  SpriteObject *v5; // esi@1
256  int v6; // eax@1
257  stru6_stru2 *v7; // eax@2
258  double y; // st7@2
259  double z; // st6@2
260  double v10; // st7@3
261  Particle_sw local_0; // [sp+8h] [bp-68h]@1
262  float x; // [sp+78h] [bp+8h]@2
263 
264  thisspellfxrend = this;
265  memset(&local_0, 0, 0x68u);
266  v5 = a2;
267  v6 = a2->field_54;
268  if (v6) {
269  v7 = &thisspellfxrend->array_4[v6 & 0x1F]; // v7 particle origin?
270  x = ((float)a2->vPosition.x - v7->flt_0_x) * 0.5f + v7->flt_0_x;
271  y = ((float)v5->vPosition.y - v7->flt_4_y) * 0.5f + v7->flt_4_y;
272  z = ((float)v5->vPosition.z - v7->flt_8_z) * 0.5f + v7->flt_8_z;
273  local_0.type =
275  local_0.uDiffuse = uDiffuse;
276  local_0.x = x + 4.0;
277  local_0.y = y;
278  local_0.z = z;
279  local_0.r = 0.0;
280  local_0.g = 0.0;
281  local_0.b = 0.0;
282  local_0.timeToLive = (rand() & 0x40) + 96;
283  local_0.texture = texture;
284  local_0.particle_size = 1.0f;
285  particle_engine->AddParticle(&local_0);
286  local_0.x = x - 4.0f;
287  particle_engine->AddParticle(&local_0);
288  local_0.x = (float)v5->vPosition.x + 4.0f;
289  local_0.y = (float)v5->vPosition.y;
290  local_0.z = (float)v5->vPosition.z;
291  particle_engine->AddParticle(&local_0);
292  local_0.x = (float)v5->vPosition.x - 4.0f;
293  particle_engine->AddParticle(&local_0);
294  thisspellfxrend->array_4[v5->field_54 & 0x1F].flt_0_x = (float)v5->vPosition.x;
295  thisspellfxrend->array_4[v5->field_54 & 0x1F].flt_4_y = (float)v5->vPosition.y;
296  thisspellfxrend->array_4[v5->field_54 & 0x1F].flt_8_z = (float)v5->vPosition.z;
297  } else {
298  a2->field_54 = thisspellfxrend->field_0++;
299  thisspellfxrend->array_4[a2->field_54 & 0x1F].flt_0_x = (float)a2->vPosition.x;
300  thisspellfxrend->array_4[a2->field_54 & 0x1F].flt_4_y = (float)a2->vPosition.y;
301  thisspellfxrend->array_4[a2->field_54 & 0x1F].flt_8_z = (float)a2->vPosition.z;
302  v10 = (float)a2->vPosition.x;
303  local_0.type =
305  local_0.uDiffuse = uDiffuse;
306  local_0.x = v10 + 4.0f;
307  local_0.y = (float)a2->vPosition.y;
308  local_0.z = (float)a2->vPosition.z;
309  local_0.r = 0.0f;
310  local_0.g = 0.0f;
311  local_0.b = 0.0f;
312  local_0.particle_size = 1.0f;
313  local_0.timeToLive = (rand() & 0x7F) + 128;
314  local_0.texture = texture;
315  particle_engine->AddParticle(&local_0);
316  local_0.x = (float)a2->vPosition.x - 4.0f;
317  particle_engine->AddParticle(&local_0);
318  }
319 }
320 
321 //----- (004A75CC) --------------------------------------------------------
323  SpriteObject *a1, unsigned int uDiffuse, Texture *texture) {
324  double v4; // st7@1
325  signed int v5; // edi@1
326  Particle_sw local_0; // [sp+8h] [bp-68h]@1
327 
328  memset(&local_0, 0, 0x68u);
330  local_0.x = (float)a1->vPosition.x;
331  local_0.y = (float)a1->vPosition.y;
332  v4 = (float)a1->vPosition.z;
333  local_0.uDiffuse = uDiffuse;
334  local_0.z = v4;
335  v5 = 10;
336  local_0.timeToLive = (rand() & 0x7F) + 128;
337  local_0.texture = texture;
338  local_0.particle_size = 1.0f;
339  do {
340  local_0.r = (float)(rand() & 0x1FF) - 255.0f;
341  local_0.g = (float)(rand() & 0x1FF) - 255.0f;
342  local_0.b = (float)(rand() & 0x1FF) - 255.0f;
343  particle_engine->AddParticle(&local_0);
344  --v5;
345  } while (v5);
346 }
347 
349  double v3 = (double)a2->uSpriteFrameID / (double)a2->GetLifetime();
350  double v4;
351  if (v3 >= 0.75)
352  v4 = (1.0 - v3) * 4.0;
353  else
354  v4 = v3 * 1.333333333333333;
355 
356  Particle_sw local_0 = { 0 };
358  local_0.uDiffuse = 0xFF3C1E;
359  local_0.x = (float)a2->vPosition.x;
360  local_0.y = (float)a2->vPosition.y;
361  local_0.z = (float)a2->vPosition.z;
362  local_0.timeToLive = (rand() & 0x7F) + 128;
363  local_0.texture = this->effpar01;
364  local_0.particle_size = 1.0;
365 
366  // 10 fireball sparks
367  for (unsigned int i = 0; i < 10; ++i) {
368  local_0.r = (rand() & 0x1FF) - 255;
369  local_0.g = (rand() & 0x1FF) - 255;
370  local_0.b = (rand() & 0x1FF) - 255;
371  particle_engine->AddParticle(&local_0);
372  }
373 
375  (float)a2->vPosition.y,
376  (float)a2->vPosition.z,
377  floorf(0.5f + (512.0 * v3)),
378  ModulateColor(0xFF3C1E, v4));
379 }
380 
382  double v4 = (double)a1->uSpriteFrameID / (double)a1->GetLifetime();
383  double v5;
384  if (v4 >= 0.75) {
385  v5 = v4 * 4.0;
386  } else {
387  v5 = v4 * 1.333333333333333;
388  }
389 
391  a1->vPosition.y,
392  a1->vPosition.z,
393  floorf(0.5f + (512.f - v4 * 512.f)),
394  ModulateColor(0x7E7E7E, v5));
395 }
396 
398  Particle_sw local_0 = { 0 };
399  local_0.x = (float)a1->vPosition.x;
400  local_0.y = (float)a1->vPosition.y;
401  local_0.z = (float)a1->vPosition.z;
402  local_0.type = ParticleType_Sprite;
403  local_0.uDiffuse = 0x7F7F7F;
404  local_0.timeToLive = 1;
405  local_0.r = 0.0f;
406  local_0.g = 0.0f;
407  local_0.b = 0.0f;
408  local_0.texture = a1->GetSpriteFrame()->hw_sprites[0]->texture;
409  local_0.particle_size = 2.0f;
410  particle_engine->AddParticle(&local_0);
411 }
412 
413 //----- (004A7948) --------------------------------------------------------
415  Particle_sw Dst = { 0 };
417  Dst.uDiffuse = 0x7F7F7F;
418  Dst.x = (float)a1->vPosition.x;
419  Dst.y = (float)a1->vPosition.y;
420  Dst.z = (float)a1->vPosition.z;
421  Dst.texture = a1->GetSpriteFrame()->hw_sprites[0]->texture;
422  Dst.particle_size = 1.0;
423  Dst.timeToLive = (rand() & 0x7F) + 128;
424  for (int i = 0; i < 10; i++) {
425  Dst.r = (float)(rand() & 0x1FF) - 255.0f;
426  Dst.g = (float)(rand() & 0x1FF) - 255.0f;
427  Dst.b = (float)(rand() & 0x1FF) - 255.0f;
429  }
430 }
431 
432 //----- (004A7A27) --------------------------------------------------------
433 bool SpellFxRenderer::AddMobileLight(SpriteObject *a1, unsigned int uDiffuse,
434  int uRadius) {
436  a1->vPosition.x, a1->vPosition.y, a1->vPosition.z, a1->uSectorID,
437  uRadius, (uDiffuse & 0x00FF0000) >> 16, (uDiffuse & 0x0000FF00) >> 8,
438  uDiffuse & 0x000000FF, _4E94D3_light_type);
439 }
440 
441 //----- (004A7A66) --------------------------------------------------------
444  SpriteObject *a1, unsigned int uDiffuse, Texture *texture, float a4) {
445  int v5; // eax@1
446  char v6; // al@1
447  double v7; // st6@1
448  double v8; // st6@1
449  double v9; // st7@1
450  double v10; // st6@1
451  Particle_sw local_0; // [sp+0h] [bp-6Ch]@1
452  float v12; // [sp+68h] [bp-4h]@1
453  float a1a; // [sp+74h] [bp+8h]@1
454  float uDiffusea; // [sp+78h] [bp+Ch]@1
455  float uTextureIDa; // [sp+7Ch] [bp+10h]@1
456 
457  memset(&local_0, 0, 0x68u);
459  local_0.x = (float)a1->vPosition.x;
460  v5 = a1->vPosition.z;
461  local_0.y = (float)a1->vPosition.y;
462  local_0.uDiffuse = uDiffuse;
463  local_0.z = (float)(v5 + 32);
464  v6 = rand();
465  local_0.particle_size = 1.0;
466  v7 = 0.0 * a4;
467  local_0.timeToLive = (v6 & 0x7F) + 128;
468  local_0.texture = texture;
469  a1a = v7;
470  local_0.r = v7;
471  local_0.g = a4;
472  local_0.b = a4;
473  particle_engine->AddParticle(&local_0);
474  v8 = 0.70710677 * a4;
475  uDiffusea = v8;
476  local_0.r = v8;
477  local_0.g = v8;
478  local_0.b = a4;
479  particle_engine->AddParticle(&local_0);
480  local_0.g = a1a;
481  local_0.r = a4;
482  local_0.b = a4;
483  particle_engine->AddParticle(&local_0);
484  local_0.r = uDiffusea;
485  local_0.b = a4;
486  v9 = -uDiffusea;
487  uTextureIDa = v9;
488  local_0.g = v9;
489  particle_engine->AddParticle(&local_0);
490  v10 = -1.0 * a4;
491  local_0.r = a1a;
492  v12 = v10;
493  local_0.g = v10;
494  local_0.b = a4;
495  particle_engine->AddParticle(&local_0);
496  local_0.b = a4;
497  local_0.r = uTextureIDa;
498  local_0.g = uTextureIDa;
499  particle_engine->AddParticle(&local_0);
500  local_0.r = v12;
501  local_0.g = a1a;
502  local_0.b = a4;
503  particle_engine->AddParticle(&local_0);
504  local_0.r = uTextureIDa;
505  local_0.g = uDiffusea;
506  local_0.b = a4;
507  particle_engine->AddParticle(&local_0);
508 }
509 
511  Particle_sw local_0 = { 0 };
512 
513  if (a2->field_54 != 0) {
514  stru6_stru2 *v6 = &array_4[a2->field_54 & 0x1F];
515  local_0.type = ParticleType_Sprite;
516  local_0.uDiffuse = 0xFFFFFF;
517  local_0.x = ((float)a2->vPosition.x - v6->flt_0_x) * 0.5f + v6->flt_0_x;
518  local_0.y = ((float)a2->vPosition.y - v6->flt_4_y) * 0.5f + v6->flt_4_y;
519  local_0.z = ((float)a2->vPosition.z - v6->flt_8_z) * 0.5f + v6->flt_8_z;
520  local_0.r = 0.0f;
521  local_0.g = 0.0f;
522  local_0.b = 0.0f;
523 
524  __debugbreak(); // fix float values
525  HEXRAYS_LODWORD(local_0.particle_size) = 0x40400000u;
526  local_0.timeToLive = (rand() & 0x3F) + 64;
527  local_0.texture = a2->GetSpriteFrame()->hw_sprites[0]->texture;
528  particle_engine->AddParticle(&local_0);
529  HEXRAYS_LODWORD(local_0.particle_size) = 0x40800000u;
530  local_0.x = (float)a2->vPosition.x;
531  local_0.y = (float)a2->vPosition.y;
532  local_0.z = (float)a2->vPosition.z;
533  local_0.timeToLive = (rand() & 0x3F) + 64;
534  particle_engine->AddParticle(&local_0);
535  v6->flt_0_x = (float)a2->vPosition.x;
536  v6->flt_4_y = (float)a2->vPosition.y;
537  v6->flt_8_z = (float)a2->vPosition.z;
538  } else {
539  a2->field_54 = field_0++;
540  array_4[a2->field_54 & 0x1F].flt_0_x = (float)a2->vPosition.x;
541  array_4[a2->field_54 & 0x1F].flt_4_y = (float)a2->vPosition.y;
542  array_4[a2->field_54 & 0x1F].flt_8_z = (float)a2->vPosition.z;
543  local_0.type = ParticleType_Sprite;
544  local_0.uDiffuse = 0xFFFFFF;
545  __debugbreak(); // fix float values
546  HEXRAYS_LODWORD(local_0.particle_size) = 0x40000000u;
547  local_0.x = (float)a2->vPosition.x;
548  local_0.y = (float)a2->vPosition.y;
549  local_0.z = (float)a2->vPosition.z;
550  local_0.r = 0.0f;
551  local_0.g = 0.0f;
552  local_0.b = 0.0f;
553  local_0.timeToLive = (rand() & 0x3F) + 64;
554  local_0.texture = a2->GetSpriteFrame()->hw_sprites[0]->texture;
555  particle_engine->AddParticle(&local_0);
556  }
557 }
558 
559 //----- (004A7E05) --------------------------------------------------------
561  Texture *texture) {
562  if (a2->field_54) {
564  array_4[a2->field_54 & 0x1F].flt_4_y,
565  array_4[a2->field_54 & 0x1F].flt_8_z, a2->vPosition.x,
566  a2->vPosition.y, a2->vPosition.z, texture);
567  } else {
568  a2->field_54 = field_0++;
569  array_4[a2->field_54 & 0x1F].flt_0_x = (float)a2->vPosition.x;
570  array_4[a2->field_54 & 0x1F].flt_4_y = (float)a2->vPosition.y;
571  array_4[a2->field_54 & 0x1F].flt_8_z = (float)a2->vPosition.z;
572  }
573 }
574 
575 //----- (004A7E89) --------------------------------------------------------
577  Actor *pActor, unsigned int uDiffuse) {
578  Actor *v3; // edi@1
579  int v4; // ebx@3
580  // int result; // eax@5
581  Particle_sw Dst; // [sp+Ch] [bp-6Ch]@1
582  int v7; // [sp+74h] [bp-4h]@2
583  signed int pActora; // [sp+80h] [bp+8h]@1
584 
585  memset(&Dst, 0, 0x68u);
587  Dst.timeToLive = (rand() & 0x7F) + 128;
588  v3 = pActor;
589  Dst.texture = this->effpar02;
590  pActora = 50;
591  Dst.particle_size = 1.0;
592  do {
593  v7 = (unsigned __int8)rand() + v3->vPosition.x - 127;
594  Dst.x = (float)v7;
595  v7 = (unsigned __int8)rand() + v3->vPosition.y - 127;
596  Dst.y = (float)v7;
597  v7 = v3->vPosition.z + (unsigned __int8)rand();
598  Dst.z = (float)v7;
599  if (uDiffuse) {
600  Dst.uDiffuse = uDiffuse;
601  } else {
602  v4 = rand() << 16;
603  Dst.uDiffuse = rand() | v4;
604  }
606  --pActora;
607  } while (pActora);
608 }
609 
610 //----- (004A7F74) --------------------------------------------------------
611 void SpellFxRenderer::_4A7F74(int x, int y, int z) {
612  char v5; // al@1
613  signed int v6; // edi@1
614  double v8; // st7@2
615  double v9; // st7@2
616  Particle_sw local_0; // [sp+8h] [bp-78h]@1
617  double v11; // [sp+70h] [bp-10h]@1
618  double v12; // [sp+78h] [bp-8h]@1
619  float z1; // [sp+88h] [bp+8h]@2
620 
621  memset(&local_0, 0, sizeof(local_0));
623  local_0.uDiffuse = 0x7E7E7E;
624  v5 = rand();
625  local_0.particle_size = 1.0;
626  v6 = 8;
627  local_0.timeToLive = (v5 & 0x7F) + 128;
628 
629  v12 = (float)x;
630  local_0.texture = this->effpar01;
631  v11 = (float)y;
632  do {
633  v8 = pRnd->GetRandom();
634  local_0.x = v8 * 40.0f - 20.0f + v12;
635  v9 = pRnd->GetRandom();
636  z1 = (float)z;
637  local_0.z = z1;
638  local_0.y = v9 * 40.0f - 20.0f + v11;
639  local_0.r = pRnd->GetRandom() * 400.0f - 200.0f;
640  local_0.g = pRnd->GetRandom() * 400.0f - 200.0f;
641  local_0.b = pRnd->GetRandom() * 150.0f + 50.0f;
642  particle_engine->AddParticle(&local_0);
643  --v6;
644  } while (v6);
645 }
646 
647 //----- (004A806F) --------------------------------------------------------
649  int v2; // ecx@1
650  int v3; // eax@1
651  double v4; // st7@2
652 
653  v3 = *(int *)&pActor->pActorBuffs[ACTOR_BUFF_MASS_DISTORTION]
654  .expire_time.value -
656  if (v3 > 64) {
657  v2 = (v3 - 64) * (v3 - 64);
658  v4 = (double)v2 / 5120.0 + 0.2;
659  } else if (v3 > 0) {
660  v2 = v3 * v3;
661  v4 = 1.0 - (double)(signed int)(v3 * v3) / 5120.0;
662  } else {
664  v4 = 1.0;
665  }
666 
667  return v4;
668 }
669 
670 //----- (004A81CA) --------------------------------------------------------
672  // SpellFxRenderer *v2; // ebx@1
673  int result; // eax@1
674  // int v4; // eax@27
675  // unsigned int diffuse; // esi@41
676  // int v6; // ecx@49
677  // int v7; // eax@54
678  // int v8; // eax@55
679  // char v9; // zf@56
680  // int v10; // eax@59
681  // int v11; // eax@61
682  // int v12; // eax@85
683  // int v13; // eax@86
684  // int v14; // eax@96
685  // int v15; // eax@111
686  // int v16; // eax@118
687  // int v17; // eax@139
688  // int v18; // eax@140
689  // int v19; // eax@141
690  // int v20; // eax@151
691  char pContainer[7]; // [sp+10h] [bp-8h]@81
692 
693  // __debugbreak(); // need to refactor carefully & collect data
694  // v2 = this;
695  result = a2->uType;
696 
697  switch (a2->uType) {
701  a2, 0x00AAAFF, effpar01);
702  return false;
706  return true;
707 
710  a2, 0x5C310E, effpar01);
711  return false;
714  return false;
715 
718  a2, 0xFF3C1E, effpar01);
719  return false;
722  return false;
723 
726  a2, 0x0062D0, effpar01);
727  return false;
730  return false;
731 
734  a2, 0x0AB450, effpar01);
735  return false;
738  return false;
739 
742  a2, 0xC8C805, effpar01);
743  return false;
746  return false;
747 
750  a2, 0xFFFFFF, effpar01);
751  return false;
754  return false;
755 
758  a2, 0x7E7E7E, effpar01);
759  return false;
762  return false;
763 
767  return true;
768 
770  AddMobileLight(a2, 0xFF0000, 256);
771  return false;
772 
773  case 601: // SPRITE_OBJECT_EXPLODE:
774  // __debugbreak(); // what kind of effect is this?
775  AddMobileLight(a2, 0xFF3C1E, 256);
776  return true;
777 
778  case 546:
779  case 547:
780  case 548:
781  case 549:
782  case 551:
783  case 552:
784  case 553:
785  case 554:
786  case 557:
787  case 558:
788  case 559:
789  case 560:
790  case 561:
791  case 562:
792  case 563:
793  case 564:
794  case 565:
795  case 566:
796  case 567:
797  case 568:
798  case 569:
799  case 570:
800  case 571:
801  case 572:
802  case 573:
803  case 574:
804  case 575:
805  case 576:
806  case 577:
807  case 578:
808  case 579:
809  case 580:
810  case 581:
811  case 582:
812  case 583:
813  case 584:
814  case 585:
815  case 586:
816  case 587:
817  case 588:
818  case 589:
819  case 590:
820  case 591:
821  case 592:
822  case 593:
823  case 594:
824  case 595:
825  case 596:
826  case 597:
827  case 598:
828  case 599:
830  return false;
831 
832  case SPRITE_811:
833  case SPRITE_812:
834  case SPRITE_813:
835  case SPRITE_814:
836  return true;
837 
840  a2, 0xFF3C1E, effpar01);
841  AddMobileLight(a2, 0xFF3C1E, 256);
842  return false;
843 
846  AddMobileLight(a2, 0xFF3C1E, 256);
847  return false;
848 
851  a2, 0xFF3C1E, effpar01);
852  AddMobileLight(a2, 0xFF3C1E, 256);
853  return false;
854 
856  AddMobileLight(a2, 0xFF3C1E, 256);
857  // if (render->pRenderD3D)
858  {
859  if (/*PID_TYPE(a2->spell_caster_pid) != OBJECT_Actor &&*/
860  PID_TYPE(a2->spell_caster_pid) != OBJECT_Item) {
861  if (field_204 != 4) {
862  field_204++;
864  }
865  return true; // sphere and sprite
866  }
867  }
868  return true;
869 
871  return true;
874  a2, 0xFF3C1E, effpar01, 250.0);
875  AddMobileLight(a2, 0xFF3C1E, 256);
876  return false;
877 
880  return false;
881 
883  return true;
886  a2, 0xFF3C1E, effpar01, 300.0);
888  a2, 0xFF3C1E, effpar01, 250.0);
890  a2, 0xFF3C1E, effpar01, 200.0);
891  AddMobileLight(a2, 0xFF3C1E, 256);
892  return false;
893 
896  a2, 0xFF3C1Eu, effpar01, 250.0);
897  return false;
898 
900  return true;
904  AddMobileLight(a2, 0xFF3C1E, 256);
905  return false;
906 
908  // if ( !render->pRenderD3D )
909  // return true;
911  AddMobileLight(a2, 0x2F3351, 128); // 0x64640F
912  return false;
913 
915  // if ( !render->pRenderD3D )
916  // return true;
917  memcpy(pContainer, "sp18h1", 7);
918  pRnd->SetRange(1, 6);
919  pContainer[5] = pRnd->GetInRange() + '0';
920  AddProjectile(a2, 100, assets->GetBitmap(pContainer));
921  return false;
924  a2, 0xC8C814, effpar02, 200.0);
925  AddMobileLight(a2, 0xC8C814, 256);
926  return false;
927 
931  return false;
932 
934  return true;
937  a2, 0xC8C814, effpar01, 200.0);
938  AddMobileLight(a2, 0xC8C814, 256);
939  return false;
940 
943  a2, 0xAB450, effpar01);
944  AddMobileLight(a2, 0xAB450, 256);
945  return false;
948  AddMobileLight(a2, 0xAB450, 256);
949  return false;
950 
952  return true;
955  AddMobileLight(a2, 0x9EB9F1, 256);
956  return false;
957 
960  a2, 0x0AB450, effpar01);
961  AddMobileLight(a2, 0x0AB450, 256);
962  return false;
964  return true;
965 
967  return true;
970  AddMobileLight(a2, 0x9EB9F1, 256);
971  return false;
974  a2, 0x9EB9F1, effpar01);
975  return false;
976 
978  // if ( !render->pRenderD3D )
979  // return true;
981  return false;
982 
985  return true;
986 
988  return true;
991  return false;
992 
994  return true;
995 
997  return true;
1000  return false;
1001 
1004  a2, 0x7E7E7E, effpar01);
1005  return true;
1008  a2, 0x7E7E7E, effpar01, 200.0);
1009  return false;
1012  a2, 0x7E7E7E, effpar01);
1013  return false;
1014 
1016  return false;
1017 
1025  return true;
1026 
1029  return false;
1030 
1032  // if ( !render->pRenderD3D )
1033  // return true;
1035  AddMobileLight(a2, 0x64640F, 128);
1036  return false;
1039  return false;
1040 
1042  return true;
1045  AddMobileLight(a2, 0xF00000, 256);
1046  return false;
1047 
1050  a2, 0xFFFFFF, effpar03);
1051  AddMobileLight(a2, 0xFFFFFF, 128);
1052  return false;
1055  AddMobileLight(a2, 0xFFFFFF, 256);
1056  return false;
1057 
1059  AddMobileLight(a2, 0xFFFFFF, 64);
1060  return false;
1061 
1063  return true;
1064 
1067  return true;
1068 
1070  AddMobileLight(a2, 0xFFFFFFu, 128);
1071  // if ( !render->pRenderD3D )
1072  // return true;
1073  AddProjectile(a2, 100, nullptr);
1074  return false;
1077  return false;
1078 
1080  return true;
1081 
1085  return true;
1086 
1088  return true;
1091  return false;
1092 
1096  return true;
1097  }
1098 
1099  return false;
1100 }
1101 
1102 //----- (004A89BD) --------------------------------------------------------
1103 void SpellFxRenderer::SetPlayerBuffAnim(unsigned __int16 uSpellID,
1104  unsigned __int16 uPlayerID) {
1105  // SpellFxRenderer *v3; // edi@1
1106  PlayerBuffAnim *v4; // esi@1
1107  const char *v6; // [sp-4h] [bp-10h]@2
1108 
1109  v4 = &pPlayerBuffs[uPlayerID];
1110  v4->uSpellAnimTimeElapsed = 0;
1111  v4->bRender = uSpellID != 0;
1112 
1113  switch (uSpellID) {
1114  case SPELL_DISEASE:
1115  v6 = "zapp";
1116  break;
1117 
1121  case SPELL_SPIRIT_FATE:
1122  v6 = "spboost1";
1123  break;
1124 
1125  case SPELL_QUEST_COMPLETED:
1129  v6 = "spboost2";
1130  break;
1131 
1132  case SPELL_152:
1133  __debugbreak(); // spell id == 152 wtf
1138  v6 = "spboost3";
1139  break;
1140 
1144  v6 = "spheal1";
1145  break;
1146 
1150  case SPELL_BODY_FIRST_AID:
1153  case SPELL_DARK_SACRIFICE:
1154  v6 = "spheal2";
1155  break;
1156 
1157  case SPELL_BODY_POWER_CURE:
1159  v6 = "spheal3";
1160  break;
1161 
1163  case SPELL_FIRE_IMMOLATION:
1164  v6 = "spell03";
1165  break;
1166 
1167  case SPELL_FIRE_HASTE:
1168  v6 = "spell05";
1169  break;
1171  v6 = "spell14";
1172  break;
1173  case SPELL_AIR_SHIELD:
1174  v6 = "spell17";
1175  break;
1177  v6 = "spell25";
1178  break;
1180  v6 = "spell36";
1181  break;
1182  case SPELL_EARTH_STONESKIN:
1183  v6 = "spell38";
1184  break;
1185  case SPELL_SPIRIT_BLESS:
1186  v6 = "spell46";
1187  break;
1188  case SPELL_SPIRIT_HEROISM:
1189  v6 = "spell51";
1190  break;
1192  v6 = "spell55";
1193  break;
1195  v6 = "spell58";
1196  break;
1198  v6 = "spell69";
1199  break;
1201  v6 = "spell71";
1202  break;
1204  v6 = "spell73";
1205  break;
1207  v6 = "spell75";
1208  break;
1209 
1210  default:
1211  v4->bRender = false;
1212  return;
1213  }
1214 
1216  if (v4->bRender)
1217  v4->uSpellAnimTime =
1219 }
1220 
1221 //----- (004A8BDF) --------------------------------------------------------
1223  unsigned int uDiffuseColor, unsigned int uFadeTime) {
1224  this->uFadeTime = uFadeTime;
1225  this->uFadeLength = uFadeTime;
1226  this->uFadeColor = uDiffuseColor;
1227 }
1228 
1229 //----- (004A8BFC) --------------------------------------------------------
1230 int SpellFxRenderer::_4A8BFC() { // for SPELL_LIGHT_PRISMATIC_LIGHT
1231  uAnimLength =
1232  8 * pSpriteFrameTable
1234  .uAnimLength;
1235  return uAnimLength;
1236 }
1237 
1238 //----- (004A8C27) --------------------------------------------------------
1240  double v4; // st7@4
1241  double v5; // st6@4
1242  float v7; // ST14_4@6
1243  unsigned int v8; // ST14_4@8
1244  SpriteFrame *v10; // eax@8
1245  // int v11; // edi@8
1246  RenderVertexD3D3 vd3d[4]; // [sp+60h] [bp-8Ch]@9
1247 
1248  if (uNumProjectiles) {
1249  DrawProjectiles();
1250  uNumProjectiles = 0;
1251  }
1252 
1253  field_204 = 0;
1254  if (uFadeTime > 0) {
1255  v4 = (double)uFadeTime / (double)uFadeLength;
1256  v5 = 1.0 - v4 * v4;
1257  // v6 = v5;
1258  if (v5 > 0.9) v5 = 1.0 - (v5 - 0.9) * 10.0;
1259  v7 = v5;
1260  render->ScreenFade(uFadeColor, v7);
1262  }
1263 
1264  if (uAnimLength > 0) {
1265  v8 = 8 * pSpriteFrameTable
1267  "spell84")]
1268  .uAnimLength -
1269  uAnimLength;
1270  v10 = pSpriteFrameTable->GetFrame(
1271  pSpriteFrameTable->FastFindSprite("spell84"), v8);
1272 
1274  // if ( render->pRenderD3D )
1275  //{
1276  vd3d[0].pos.x = (double)(signed int)pViewport->uViewportTL_X;
1277  vd3d[0].pos.y = (double)(signed int)pViewport->uViewportTL_Y;
1278  vd3d[0].pos.z = 0.0;
1279  vd3d[0].diffuse = 0x7F7F7Fu;
1280  vd3d[0].specular = 0;
1281  vd3d[0].rhw = 1.0;
1282  vd3d[0].texcoord.x = 0.0;
1283  vd3d[0].texcoord.y = 0.0;
1284 
1285  vd3d[1].pos.x = (double)(signed int)pViewport->uViewportTL_X;
1286  vd3d[1].pos.y = (double)(pViewport->uViewportBR_Y + 1);
1287  vd3d[1].pos.z = 0.0;
1288  vd3d[1].diffuse = 0x7F7F7Fu;
1289  vd3d[1].specular = 0;
1290  vd3d[1].rhw = 1.0;
1291  vd3d[1].texcoord.x = 0.0;
1292  vd3d[1].texcoord.y = 1.0;
1293 
1294  vd3d[2].pos.x = (double)(signed int)pViewport->uViewportBR_X;
1295  vd3d[2].pos.y = (double)(pViewport->uViewportBR_Y + 1);
1296  vd3d[2].pos.z = 0.0;
1297  vd3d[2].diffuse = 0x7F7F7Fu;
1298  vd3d[2].specular = 0;
1299  vd3d[2].rhw = 1.0;
1300  vd3d[2].texcoord.x = 1.0;
1301  vd3d[2].texcoord.y = 1.0;
1302 
1303  vd3d[3].pos.x = (double)(signed int)pViewport->uViewportBR_X;
1304  vd3d[3].pos.y = (double)(signed int)pViewport->uViewportTL_Y;
1305  vd3d[3].pos.z = 0.0;
1306  vd3d[3].diffuse = 0x7F7F7Fu;
1307  vd3d[3].specular = 0;
1308  vd3d[3].rhw = 1.0;
1309  vd3d[3].texcoord.x = 1.0;
1310  vd3d[3].texcoord.y = 0.0;
1311 
1312  render->DrawSpecialEffectsQuad(vd3d, v10->hw_sprites[0]->texture);
1313  }
1314 }
1315 
1316 //----- (004A902A) --------------------------------------------------------
1318  for (uint i = 0; i < 4; ++i) {
1319  PlayerBuffAnim *buff = &pPlayerBuffs[i];
1320  if (!buff->bRender) continue;
1321 
1323  if (buff->uSpellAnimTimeElapsed >= buff->uSpellAnimTime) {
1324  buff->bRender = false;
1325  continue;
1326  }
1327 
1328  Icon *icon = pIconsFrameTable->GetFrame(buff->uSpellIconID,
1329  buff->uSpellAnimTimeElapsed);
1330  render->DrawTextureAlphaNew(
1332  385 / 480.0f, icon->GetTexture());
1333 
1334  pOtherOverlayList->bRedraw = true;
1335  }
1336 }
1337 
1338 //----- (004A90A0) --------------------------------------------------------
1341  "effpar01"); // pBitmaps_LOD->LoadTexture("effpar01");
1343  "effpar02"); // pBitmaps_LOD->LoadTexture("effpar02");
1345  "effpar03"); // pBitmaps_LOD->LoadTexture("effpar03");
1346 
1347  // spell not implemented in the game
1348  // uSpriteID_sp57c = pSprites_LOD->LoadSprite("sp57c", 6);
1349 
1352  pIconsFrameTable->FindIcon("spheal1"));
1354  pIconsFrameTable->FindIcon("spheal2"));
1356  pIconsFrameTable->FindIcon("spheal3"));
1358  pIconsFrameTable->FindIcon("spboost1"));
1360  pIconsFrameTable->FindIcon("spboost2"));
1362  pIconsFrameTable->FindIcon("spboost3"));
1364  pIconsFrameTable->FindIcon("spell03"));
1366  pIconsFrameTable->FindIcon("spell05"));
1368  pIconsFrameTable->FindIcon("spell14"));
1370  pIconsFrameTable->FindIcon("spell17"));
1372  pIconsFrameTable->FindIcon("spell21"));
1374  pIconsFrameTable->FindIcon("spell25"));
1376  pIconsFrameTable->FindIcon("spell27"));
1378  pIconsFrameTable->FindIcon("spell36"));
1380  pIconsFrameTable->FindIcon("spell38"));
1382  pIconsFrameTable->FindIcon("spell46"));
1384  pIconsFrameTable->FindIcon("spell51"));
1386  pIconsFrameTable->FindIcon("spell55"));
1388  pIconsFrameTable->FindIcon("spell58"));
1390  pIconsFrameTable->FindIcon("spell69"));
1392  pIconsFrameTable->FindIcon("spell71"));
1394  pIconsFrameTable->FindIcon("spell73"));
1396  pIconsFrameTable->FindIcon("spell75"));
1398  pIconsFrameTable->FindIcon("spell96"));
1399 
1401  pSpriteFrameTable->FastFindSprite("spell01"));
1403  pSpriteFrameTable->FastFindSprite("spell02"));
1405  pSpriteFrameTable->FastFindSprite("spell03"));
1407  pSpriteFrameTable->FastFindSprite("spell09"));
1409  pSpriteFrameTable->FastFindSprite("spell11"));
1411  pSpriteFrameTable->FastFindSprite("spell18"));
1413  pSpriteFrameTable->FastFindSprite("spell22"));
1415  pSpriteFrameTable->FastFindSprite("spell26"));
1417  pSpriteFrameTable->FastFindSprite("spell29"));
1419  pSpriteFrameTable->FastFindSprite("spell39"));
1421  pSpriteFrameTable->FastFindSprite("spell39c"));
1423  pSpriteFrameTable->FastFindSprite("spell41"));
1425  pSpriteFrameTable->FastFindSprite("spell57c"));
1427  pSpriteFrameTable->FastFindSprite("spell62"));
1429  pSpriteFrameTable->FastFindSprite("spell65"));
1431  pSpriteFrameTable->FastFindSprite("spell66"));
1433  pSpriteFrameTable->FastFindSprite("spell70"));
1435  pSpriteFrameTable->FastFindSprite("spell76"));
1437  pSpriteFrameTable->FastFindSprite("spell84"));
1439  pSpriteFrameTable->FastFindSprite("spell90"));
1441  pSpriteFrameTable->FastFindSprite("spell92"));
1443  pSpriteFrameTable->FastFindSprite("spell93"));
1445  pSpriteFrameTable->FastFindSprite("spell97"));
1447  pSpriteFrameTable->FastFindSprite("spell97c"));
1449  pSpriteFrameTable->FastFindSprite("spell97c"));
1450 }
1451 
1452 //----- (004775ED) --------------------------------------------------------
1453 int SpellFX_Billboard::SpellFXNearClipAdjust(float NearClip) { // near clip adjust - needs diffuse sorting properly??
1454  if (!uNumVertices) return 0;
1455 
1456  // copies first vert to position 4
1457  field_64[4 * uNumVertices] = field_64[0];
1458  field_64[4 * uNumVertices + 1] = field_64[1];
1459  field_64[4 * uNumVertices + 2] = field_64[2];
1460  field_64[4 * uNumVertices + 3] = field_64[3];
1461 
1462  bool currvert = (field_64[0] <= NearClip);
1463  bool nextvert = false;
1464  int ProducedVerts = 0;
1465  double Tmult;
1466 
1467  for (int i = 0; i < uNumVertices; ++i) { // cycle through
1468  nextvert = (field_64[(i+1) * 4] <= NearClip);
1469 
1470  if (currvert ^ nextvert) { // XOR
1471  if (nextvert) { // adjust verts and copy out
1472  Tmult = (NearClip - field_64[i * 4]) / (field_64[(i+1) * 4] - field_64[i * 4]);
1473 
1474  // x view = nearclip
1475  field_B4[ProducedVerts * 4] = NearClip;
1476  // y view
1477  field_B4[ProducedVerts * 4 + 1] = (field_64[(i+1) * 4 + 1] - field_64[i * 4 + 1]) * Tmult + field_64[i * 4 + 1];
1478  // z view
1479  field_B4[ProducedVerts * 4 + 2] = (field_64[(i+1) * 4 + 2] - field_64[i * 4 + 2]) * Tmult + field_64[i * 4 + 2];
1480  // diffuse
1481  field_B4[ProducedVerts * 4 + 3] = field_64[i * 4 + 3]; // (field_64[(i+1) * 4 + 3] - field_64[i * 4 + 3]) * Tmult + field_64[i * 4 + 3];
1482 
1483  } else { // currvert
1484  Tmult = (NearClip - field_64[i * 4]) / (field_64[i * 4] - field_64[(i+1) * 4]);
1485 
1486  // x view = nearclip
1487  field_B4[ProducedVerts * 4] = NearClip;
1488  // y view
1489  field_B4[ProducedVerts * 4 + 1] = (field_64[i * 4 + 1] - field_64[(i + 1) * 4 + 1]) * Tmult + field_64[i * 4 + 1];
1490  // z view
1491  field_B4[ProducedVerts * 4 + 2] = (field_64[i * 4 + 2] - field_64[(i + 1) * 4 + 2]) * Tmult + field_64[i * 4 + 2];
1492  // diffuse
1493  field_B4[ProducedVerts * 4 + 3] = field_64[i * 4 + 3]; // (field_64[i * 4 + 3] - field_64[(i+1) * 4 + 3]) * Tmult + field_64[i * 4 + 3];
1494  }
1495  ++ProducedVerts;
1496  }
1497 
1498  if (!nextvert) {
1499  // copy out - vert doesnt need adjusting
1500 
1501  // x view
1502  field_B4[ProducedVerts * 4] = field_64[(i + 1) * 4];
1503  // y view
1504  field_B4[ProducedVerts * 4 + 1] = field_64[(i + 1) * 4 + 1];
1505  // z view
1506  field_B4[ProducedVerts * 4 + 2] = field_64[(i + 1) * 4 + 2];
1507  // diffuse
1508  field_B4[ProducedVerts * 4 + 3] = field_64[(i + 1) * 4 + 3];
1509 
1510  ++ProducedVerts;
1511  }
1512  currvert = nextvert;
1513  }
1514 
1515  return this->uNumVertices = ProducedVerts;
1516 }
1517 
1518 //----- (00477927) --------------------------------------------------------
1519 int SpellFX_Billboard::SpellFXFarClipAdjust(float farclip) { // far clip adjust - needs diffuse sorting properly??
1520  // refactored but not tested
1521  // __debugbreak();
1522 
1523  if (!uNumVertices) return 0;
1524 
1525  // copies first vert to position 4
1526  field_64[4 * uNumVertices] = field_64[0];
1527  field_64[4 * uNumVertices + 1] = field_64[1];
1528  field_64[4 * uNumVertices + 2] = field_64[2];
1529  field_64[4 * uNumVertices + 3] = field_64[3];
1530 
1531  bool currvert = (field_64[0] >= farclip);
1532  bool nextvert = false;
1533  int ProducedVerts = 0;
1534  double Tmult;
1535 
1536  for (int i = 0; i < uNumVertices; ++i) { // cycle through
1537  nextvert = (field_64[(i + 1) * 4] >= farclip);
1538 
1539  if (currvert ^ nextvert) { // XOR
1540  if (nextvert) { // adjust verts and copy out
1541  Tmult = (farclip - field_64[i * 4]) / (field_64[(i + 1) * 4] - field_64[i * 4]);
1542 
1543  // x view = nearclip
1544  field_B4[ProducedVerts * 4] = farclip;
1545  // y view
1546  field_B4[ProducedVerts * 4 + 1] = (field_64[(i + 1) * 4 + 1] - field_64[i * 4 + 1]) * Tmult + field_64[i * 4 + 1];
1547  // z view
1548  field_B4[ProducedVerts * 4 + 2] = (field_64[(i + 1) * 4 + 2] - field_64[i * 4 + 2]) * Tmult + field_64[i * 4 + 2];
1549  // diffuse
1550  field_B4[ProducedVerts * 4 + 3] = field_64[i * 4 + 3]; // (field_64[(i+1) * 4 + 3] - field_64[i * 4 + 3]) * Tmult + field_64[i * 4 + 3];
1551  } else { // currvert
1552  Tmult = (farclip - field_64[i * 4]) / (field_64[i * 4] - field_64[(i + 1) * 4]);
1553 
1554  // x view = nearclip
1555  field_B4[ProducedVerts * 4] = farclip;
1556  // y view
1557  field_B4[ProducedVerts * 4 + 1] = (field_64[i * 4 + 1] - field_64[(i + 1) * 4 + 1]) * Tmult + field_64[i * 4 + 1];
1558  // z view
1559  field_B4[ProducedVerts * 4 + 2] = (field_64[i * 4 + 2] - field_64[(i + 1) * 4 + 2]) * Tmult + field_64[i * 4 + 2];
1560  // diffuse
1561  field_B4[ProducedVerts * 4 + 3] = field_64[i * 4 + 3]; // (field_64[i * 4 + 3] - field_64[(i+1) * 4 + 3]) * Tmult + field_64[i * 4 + 3];
1562  }
1563  ++ProducedVerts;
1564  }
1565 
1566  if (!nextvert) {
1567  // copy out - vert doesnt need adjusting
1568 
1569  // x view
1570  field_B4[ProducedVerts * 4] = field_64[(i + 1) * 4];
1571  // y view
1572  field_B4[ProducedVerts * 4 + 1] = field_64[(i + 1) * 4 + 1];
1573  // z view
1574  field_B4[ProducedVerts * 4 + 2] = field_64[(i + 1) * 4 + 2];
1575  // diffuse
1576  field_B4[ProducedVerts * 4 + 3] = field_64[(i + 1) * 4 + 3];
1577 
1578  ++ProducedVerts;
1579  }
1580  currvert = nextvert;
1581  }
1582 
1583  return this->uNumVertices = ProducedVerts;
1584 }
1585 
1586 //----- (00477C61) --------------------------------------------------------
1588  int ViewPosX;
1589  int ViewPosY;
1590  int ViewPosZ;
1591 
1592  if (this->uNumVertices > 0) {
1593  for (int v2 = 0; v2 < this->uNumVertices; ++v2) {
1594  // view tranfrom
1595  pIndoorCameraD3D->ViewTransform(field_14[v2].x, field_14[v2].y, field_14[v2].z, &ViewPosX, &ViewPosY, &ViewPosZ);
1596 
1597  // load into field 64
1598  field_64[v2 * 4] = ViewPosX;
1599  field_64[(v2 * 4) + 1] = ViewPosY;
1600  field_64[(v2 * 4) + 2] = ViewPosZ;
1601  field_64[(v2 * 4) + 3] = field_14[v2].diffuse;
1602  }
1603  }
1604 
1605  this->uNumVertices = 3;
1606  return 1;
1607 }
1608 
1609 //----- (00477F63) --------------------------------------------------------
1611  bool NeedNearClip = 0;
1612  bool NeedFarClip = 0;
1613  double NearClip = pIndoorCameraD3D->GetNearClip();
1614  double FarClip = pIndoorCameraD3D->GetFarClip();
1615 
1616  if (this->uNumVertices <= 0) { // what?? behaviour needs investigating
1617  memcpy(&this->field_B4[0]/*&this->field_14[40]*/, &this->field_64[0]/*&this->field_14[20]*/, 16 * this->uNumVertices);
1618  return this->uNumVertices != 0;
1619  }
1620 
1621  for (int v6 = 0; v6 < this->uNumVertices; v6++) {
1622  if (NearClip >= field_64[v6 * 4] || field_64[v6 * 4] >= FarClip) {
1623  if (NearClip < field_64[v6 * 4])
1624  NeedFarClip = 1;
1625  else
1626  NeedNearClip = 1;
1627  }
1628  }
1629 
1630  if (!NeedNearClip) {
1631  if (NeedFarClip) {
1632  // far clip
1633  this->SpellFXFarClipAdjust(FarClip);
1634  return this->uNumVertices != 0;
1635  }
1636 
1637  // no clipping required- copy out
1638  for (int i = 0; i < uNumVertices; ++i) {
1639  field_B4[i * 4] = field_64[i * 4];
1640  field_B4[i * 4 + 1] = field_64[i * 4 + 1];
1641  field_B4[i * 4 + 2] = field_64[i * 4 + 2];
1642  field_B4[i * 4 + 3] = field_64[i * 4 + 3];
1643  }
1644  return this->uNumVertices != 0;
1645  }
1646 
1647  // near clip
1648  SpellFXNearClipAdjust(NearClip);
1649  return this->uNumVertices != 0;
1650 }
1651 
1652 //----- (0047802A) --------------------------------------------------------
1653 int SpellFX_Billboard::SpellFXProject() { // project to billboard coords
1654  int Result = 0;
1655  int Xproj, Yproj;
1656 
1657  for (int i = 0; i < this->uNumVertices; i++) {
1659  round_to_int(this->field_B4[i * 4]),
1660  round_to_int(this->field_B4[i * 4 + 1]),
1661  round_to_int(this->field_B4[i * 4 + 2]), &Yproj, &Xproj);
1662 
1663  field_104[i].x = (double)Yproj;
1664  field_104[i].y = (double)Xproj;
1665  field_104[i].z = field_B4[i * 4];
1666  field_104[i].diffuse = field_B4[i * 4 + 3];
1667 
1668  if (true)
1669  /*(double)(signed int)pViewport->uViewportTL_X <=
1670  field_104[i].x &&
1671  (double)(signed int)pViewport->uViewportBR_X >
1672  field_104[i].x &&
1673  (double)(signed int)pViewport->uViewportTL_Y <=
1674  field_104[i].y &&
1675  (double)(signed int)pViewport->uViewportBR_Y >
1676  field_104[i].y*/
1677  Result = 1;
1678  }
1679 
1680  return Result;
1681 }
SPRITE_PROJECTILE_530
@ SPRITE_PROJECTILE_530
Definition: SpriteObject.h:22
stru160.h
SpriteObject
Definition: SpriteObject.h:189
array_4EBBD0_x
std::array< __int32, 128 *3 > array_4EBBD0_x
Definition: mm7_data.cpp:98
SPRITE_SPELL_MIND_BERSERK
@ SPRITE_SPELL_MIND_BERSERK
Definition: SpriteObject.h:128
SpellFxRenderer::AddProjectile
void AddProjectile(struct SpriteObject *a2, int a3, Texture *)
Definition: SpellFxRenderer.cpp:560
Particle_sw::z
float z
Definition: ParticleEngine.h:22
IconFrameTable.h
ParticleEngine.h
SPELL_EARTH_STONESKIN
@ SPELL_EARTH_STONESKIN
Definition: Spells.h:53
SpellFxRenderer::uAnimLength
int uAnimLength
Definition: SpellFxRenderer.h:162
SPELL_SPIRIT_RESSURECTION
@ SPELL_SPIRIT_RESSURECTION
Definition: Spells.h:71
SPRITE_SPELL_MIND_PSYCHIC_SHOCK
@ SPRITE_SPELL_MIND_PSYCHIC_SHOCK
Definition: SpriteObject.h:132
SPELL_SPIRIT_SHARED_LIFE
@ SPELL_SPIRIT_SHARED_LIFE
Definition: Spells.h:70
SpriteFrame::hw_sprites
Sprite * hw_sprites[8]
Definition: Sprites.h:46
SPRITE_SPELL_BODY_FLYING_FIST
@ SPRITE_SPELL_BODY_FLYING_FIST
Definition: SpriteObject.h:145
SPRITE_SPELL_AIR_LIGHNING_BOLT
@ SPRITE_SPELL_AIR_LIGHNING_BOLT
Definition: SpriteObject.h:65
SPRITE_BLASTER_PROJECTILE
@ SPRITE_BLASTER_PROJECTILE
Definition: SpriteObject.h:30
Viewport.h
Particle_sw::b
float b
Definition: ParticleEngine.h:25
Timer::uTimeElapsed
unsigned int uTimeElapsed
Definition: Time.h:133
v
const GLdouble * v
Definition: SDL_opengl.h:2064
stru6_stru2::flt_0_x
float flt_0_x
Definition: SpellFxRenderer.h:88
SPRITE_SPELL_AIR_SPARKS
@ SPRITE_SPELL_AIR_SPARKS
Definition: SpriteObject.h:62
LOD.h
SPRITE_PROJECTILE_535
@ SPRITE_PROJECTILE_535
Definition: SpriteObject.h:24
scale
GLenum GLenum GLenum GLenum GLenum scale
Definition: SDL_opengl_glext.h:9378
SPELL_SPIRIT_PRESERVATION
@ SPELL_SPIRIT_PRESERVATION
Definition: Spells.h:66
pRnd
struct Random * pRnd
Definition: Random.cpp:5
SpellFX_Billboard::uNumVec4sInArray1
unsigned int uNumVec4sInArray1
Definition: SpellFxRenderer.h:43
IconFrameTable::InitializeAnimation
void InitializeAnimation(unsigned int uIconID)
Definition: IconFrameTable.cpp:59
SPRITE_PROJECTILE_530_IMPACT
@ SPRITE_PROJECTILE_530_IMPACT
Definition: SpriteObject.h:23
dstX
GLenum GLint GLint GLint GLint GLuint GLenum GLint GLint dstX
Definition: SDL_opengl_glext.h:2453
pSpriteFrameTable
struct SpriteFrameTable * pSpriteFrameTable
Definition: Sprites.cpp:22
SpellFxRenderer::uFadeTime
int uFadeTime
Definition: SpellFxRenderer.h:163
Viewport::uViewportTL_Y
int uViewportTL_Y
Definition: Viewport.h:23
OBJECT_Item
@ OBJECT_Item
Definition: Actor.h:66
SpellFX_Billboard::field_14
local_01 field_14[5]
Definition: SpellFxRenderer.h:50
Vec3_float_::x
float x
Definition: VectorTypes.h:89
SPRITE_SPELL_FIRE_INCINERATE_IMPACT
@ SPRITE_SPELL_FIRE_INCINERATE_IMPACT
Definition: SpriteObject.h:57
SpellFxRenderer::pStru1
SpellFX_Billboard * pStru1
Definition: SpellFxRenderer.h:160
RenderVertexD3D3::pos
Vec3_float_ pos
Definition: IRender.h:130
SpellFxRenderer::pPlayerBuffs
PlayerBuffAnim pPlayerBuffs[4]
Definition: SpellFxRenderer.h:157
_4E94D3_light_type
char _4E94D3_light_type
Definition: mm7_data.cpp:307
array_4EB8B8
std::array< stru160, 66 > array_4EB8B8
Definition: mm7_data.cpp:30
z
GLdouble GLdouble z
Definition: SDL_opengl_glext.h:407
pIconsFrameTable
struct IconFrameTable * pIconsFrameTable
Definition: mm7_data.cpp:168
SPELL_LIGHT_HOUR_OF_POWER
@ SPELL_LIGHT_HOUR_OF_POWER
Definition: Spells.h:105
SPRITE_SPELL_MIND_ENSLAVE
@ SPRITE_SPELL_MIND_ENSLAVE
Definition: SpriteObject.h:133
OtherOverlayList::bRedraw
int bRedraw
Definition: Overlays.h:38
SpellFX_Billboard::SpellFXFarClipAdjust
int SpellFXFarClipAdjust(float a2)
Definition: SpellFxRenderer.cpp:1519
SPELL_LIGHT_DAY_OF_PROTECTION
@ SPELL_LIGHT_DAY_OF_PROTECTION
Definition: Spells.h:104
SpellFxRenderer::_4A75CC_single_spell_collision_particle
void _4A75CC_single_spell_collision_particle(struct SpriteObject *a1, unsigned int uDiffuse, Texture *texture)
Definition: SpellFxRenderer.cpp:322
Actor
Definition: Actor.h:151
SPELL_WATER_WATER_WALK
@ SPELL_WATER_WATER_WALK
Definition: Spells.h:41
SpriteObject::uSectorID
__int16 uSectorID
Definition: SpriteObject.h:223
SPRITE_PROJECTILE_540_IMPACT
@ SPRITE_PROJECTILE_540_IMPACT
Definition: SpriteObject.h:27
SpriteObject.h
Icon::GetAnimLength
unsigned int GetAnimLength() const
Definition: IconFrameTable.h:20
SPRITE_PROJECTILE_510_IMPACT
@ SPRITE_PROJECTILE_510_IMPACT
Definition: SpriteObject.h:15
SPRITE_SPELL_DARK_DRAGON_BREATH
@ SPRITE_SPELL_DARK_DRAGON_BREATH
Definition: SpriteObject.h:176
sr_42620A
bool sr_42620A(RenderVertexSoft *p)
Definition: SpellFxRenderer.cpp:49
SpellFxRenderer::_4A8BFC
int _4A8BFC()
Definition: SpellFxRenderer.cpp:1230
Texture
Definition: Texture.h:4
SPRITE_BLASTER_IMPACT
@ SPRITE_BLASTER_IMPACT
Definition: SpriteObject.h:31
SPRITE_SPELL_EARTH_MASS_DISTORTION
@ SPRITE_SPELL_EARTH_MASS_DISTORTION
Definition: SpriteObject.h:106
SpellFX_Billboard::local_01::x
float x
Definition: SpellFxRenderer.h:36
round_to_int
int round_to_int(float x)
Definition: OurMath.h:18
SPRITE_SPELL_WATER_ICE_BOLT_IMPACT
@ SPRITE_SPELL_WATER_ICE_BOLT_IMPACT
Definition: SpriteObject.h:79
SpellFxRenderer::uFadeColor
int uFadeColor
Definition: SpellFxRenderer.h:165
srcX
GLenum GLint GLint srcX
Definition: SDL_opengl_glext.h:2453
ProjectileAnim::dstX
float dstX
Definition: SpellFxRenderer.h:77
ProjectileAnim
Definition: SpellFxRenderer.h:73
SPRITE_SPELL_LIGHT_SUMMON_ELEMENTAL
@ SPRITE_SPELL_LIGHT_SUMMON_ELEMENTAL
Definition: SpriteObject.h:156
SPRITE_SPELL_DARK_SHARPMETAL_IMPACT
@ SPRITE_SPELL_DARK_SHARPMETAL_IMPACT
Definition: SpriteObject.h:172
SPRITE_SPELL_DARK_SACRIFICE
@ SPRITE_SPELL_DARK_SACRIFICE
Definition: SpriteObject.h:175
Overlays.h
SpellFX_Billboard::_47829F_sphere_particle
void _47829F_sphere_particle(float x_offset, float y_offset, float z_offset, float scale, int diffuse)
Definition: SpellFxRenderer.cpp:144
RenderVertexD3D3
Definition: IRender.h:129
SPRITE_SPELL_AIR_STARBURST
@ SPRITE_SPELL_AIR_STARBURST
Definition: SpriteObject.h:71
LightmapBuilder.h
SPELL_EARTH_PROTECTION_FROM_EARTH
@ SPELL_EARTH_PROTECTION_FROM_EARTH
Definition: Spells.h:51
SPRITE_SPELL_DARK_DRAGON_BREATH_1
@ SPRITE_SPELL_DARK_DRAGON_BREATH_1
Definition: SpriteObject.h:177
Random::GetRandom
double GetRandom()
Definition: Random.cpp:14
SPRITE_SPELL_FIRE_FIRE_BOLT
@ SPRITE_SPELL_FIRE_FIRE_BOLT
Definition: SpriteObject.h:43
SpriteObject::uType
SPRITE_OBJECT_TYPE uType
Definition: SpriteObject.h:215
Icon::GetTexture
Texture * GetTexture()
Definition: IconFrameTable.cpp:9
SpellFxRenderer::_4A7F74
void _4A7F74(int x, int y, int z)
Definition: SpellFxRenderer.cpp:611
texture
GLenum GLenum GLuint texture
Definition: SDL_opengl_glext.h:1181
SpellFxRenderer.h
SPELL_FIRE_PROTECTION_FROM_FIRE
@ SPELL_FIRE_PROTECTION_FROM_FIRE
Definition: Spells.h:15
Particle_sw::r
float r
Definition: ParticleEngine.h:23
SPELL_MIND_PROTECTION_FROM_MIND
@ SPELL_MIND_PROTECTION_FROM_MIND
Definition: Spells.h:75
SPRITE_PROJECTILE_500
@ SPRITE_PROJECTILE_500
Definition: SpriteObject.h:10
Sprite::texture
Texture * texture
Definition: Sprites.h:28
SpellFX_Billboard::field_104
local_01 field_104[5]
Definition: SpellFxRenderer.h:53
SPRITE_SPELL_FIRE_INFERNO
@ SPRITE_SPELL_FIRE_INFERNO
Definition: SpriteObject.h:55
SpellFxRenderer::LoadAnimations
void LoadAnimations()
Definition: SpellFxRenderer.cpp:1339
Vec3_float_::y
float y
Definition: VectorTypes.h:90
SPRITE_SPELL_EARTH_ROCK_BLAST
@ SPRITE_SPELL_EARTH_ROCK_BLAST
Definition: SpriteObject.h:100
Vec3_float_::z
float z
Definition: VectorTypes.h:91
GameTime::value
int64_t value
Definition: Time.h:99
SpriteObject::uSpriteFrameID
unsigned __int16 uSpriteFrameID
Definition: SpriteObject.h:224
SPELL_AIR_PROTECTION_FROM_AIR
@ SPELL_AIR_PROTECTION_FROM_AIR
Definition: Spells.h:27
SPRITE_SPELL_MIND_MIND_BLAST
@ SPRITE_SPELL_MIND_MIND_BLAST
Definition: SpriteObject.h:122
PlayerBuffAnim::uSpellAnimTime
int uSpellAnimTime
Definition: SpellFxRenderer.h:66
Engine.h
SpellFxRenderer::_4A7C07_stun_spell_fx
void _4A7C07_stun_spell_fx(struct SpriteObject *a2)
Definition: SpellFxRenderer.cpp:510
Lights.h
stru6_stru2
Definition: SpellFxRenderer.h:86
SpellFX_Billboard::SpellFXProject
int SpellFXProject()
Definition: SpellFxRenderer.cpp:1653
SPELL_152
@ SPELL_152
Definition: Spells.h:127
SPRITE_SPELL_DARK_SHARPMETAL
@ SPRITE_SPELL_DARK_SHARPMETAL
Definition: SpriteObject.h:171
result
GLuint64EXT * result
Definition: SDL_opengl_glext.h:9435
SPRITE_PROJECTILE_535_IMPACT
@ SPRITE_PROJECTILE_535_IMPACT
Definition: SpriteObject.h:25
SpellFxRenderer::particle_engine
ParticleEngine * particle_engine
Definition: SpellFxRenderer.h:172
RenderVertexD3D3::texcoord
Vec2_float_ texcoord
Definition: IRender.h:134
SPRITE_SPELL_EARTH_TELEKINESIS
@ SPRITE_SPELL_EARTH_TELEKINESIS
Definition: SpriteObject.h:102
SPRITE_SPELL_WATER_ACID_BURST_IMPACT
@ SPRITE_SPELL_WATER_ACID_BURST_IMPACT
Definition: SpriteObject.h:83
SpellBuff::Reset
void Reset()
Definition: Spells.cpp:337
stru160
Definition: stru160.h:5
Actor.h
SpellFxRenderer::_4A7948_mind_blast_after_effect
void _4A7948_mind_blast_after_effect(struct SpriteObject *a1)
Definition: SpellFxRenderer.cpp:414
SpellFX_Billboard::local_01::z
float z
Definition: SpellFxRenderer.h:38
SPELL_DISEASE
@ SPELL_DISEASE
Definition: Spells.h:128
Particle_sw::type
unsigned int type
Definition: ParticleEngine.h:19
SPRITE_PROJECTILE_525
@ SPRITE_PROJECTILE_525
Definition: SpriteObject.h:20
stru160::field_4
float field_4
Definition: stru160.h:11
alpha
GLfloat GLfloat GLfloat alpha
Definition: SDL_opengl_glext.h:415
y
EGLSurface EGLint EGLint y
Definition: SDL_egl.h:1596
RenderVertexD3D3::rhw
float rhw
Definition: IRender.h:131
IconFrameTable::GetIcon
Icon * GetIcon(unsigned int idx)
Definition: IconFrameTable.cpp:17
SPELL_BODY_FIRST_AID
@ SPELL_BODY_FIRST_AID
Definition: Spells.h:86
SPELL_DARK_SOULDRINKER
@ SPELL_DARK_SOULDRINKER
Definition: Spells.h:119
SPRITE_SPELL_EARTH_DEATH_BLOSSOM
@ SPRITE_SPELL_EARTH_DEATH_BLOSSOM
Definition: SpriteObject.h:103
srcY
GLenum GLint GLint GLint srcY
Definition: SDL_opengl_glext.h:2453
SPELL_AIR_FEATHER_FALL
@ SPELL_AIR_FEATHER_FALL
Definition: Spells.h:26
SpriteObject::vPosition
struct Vec3_int_ vPosition
Definition: SpriteObject.h:218
SPELL_BODY_CURE_POISON
@ SPELL_BODY_CURE_POISON
Definition: Spells.h:90
ParticleType_1
@ ParticleType_1
Definition: ParticleEngine.h:7
SPRITE_SPELL_AIR_IMPLOSION_IMPACT
@ SPRITE_SPELL_AIR_IMPLOSION_IMPACT
Definition: SpriteObject.h:69
SPRITE_PROJECTILE_525_IMPACT
@ SPRITE_PROJECTILE_525_IMPACT
Definition: SpriteObject.h:21
ProjectileAnim::srcZ
float srcZ
Definition: SpellFxRenderer.h:76
SpriteObject::field_54
int field_54
Definition: SpriteObject.h:231
SPRITE_PROJECTILE_510
@ SPRITE_PROJECTILE_510
Definition: SpriteObject.h:14
p
GLfloat GLfloat p
Definition: SDL_opengl_glext.h:11093
SPRITE_SPELL_EARTH_ROCK_BLAST_IMPACT
@ SPRITE_SPELL_EARTH_ROCK_BLAST_IMPACT
Definition: SpriteObject.h:101
ACTOR_BUFF_MASS_DISTORTION
@ ACTOR_BUFF_MASS_DISTORTION
Definition: Actor.h:48
SPRITE_PROJECTILE_515
@ SPRITE_PROJECTILE_515
Definition: SpriteObject.h:16
SPRITE_SPELL_BODY_HARM
@ SPRITE_SPELL_BODY_HARM
Definition: SpriteObject.h:138
x
EGLSurface EGLint x
Definition: SDL_egl.h:1596
SPRITE_PROJECTILE_520_IMPACT
@ SPRITE_PROJECTILE_520_IMPACT
Definition: SpriteObject.h:19
SPRITE_SPELL_EARTH_DEADLY_SWARM
@ SPRITE_SPELL_EARTH_DEADLY_SWARM
Definition: SpriteObject.h:94
Particle_sw::timeToLive
int timeToLive
Definition: ParticleEngine.h:27
SpriteFrameTable::GetFrame
SpriteFrame * GetFrame(unsigned int uSpriteID, unsigned int uTime)
Definition: Sprites.cpp:277
SPRITE_PROJECTILE_520
@ SPRITE_PROJECTILE_520
Definition: SpriteObject.h:18
ProjectileAnim::dstZ
float dstZ
Definition: SpellFxRenderer.h:79
SpellFX_Billboard::field_64
int field_64[20]
Definition: SpellFxRenderer.h:51
Random::GetInRange
int GetInRange()
Definition: Random.cpp:28
SPRITE_SPELL_FIRE_IMMOLATION
@ SPRITE_SPELL_FIRE_IMMOLATION
Definition: SpriteObject.h:52
dstZ
GLenum GLint GLint GLint GLint GLuint GLenum GLint GLint GLint GLint dstZ
Definition: SDL_opengl_glext.h:2453
SPELL_FIRE_IMMOLATION
@ SPELL_FIRE_IMMOLATION
Definition: Spells.h:20
Indoor.h
SPRITE_SPELL_MIND_MASS_FEAR
@ SPRITE_SPELL_MIND_MASS_FEAR
Definition: SpriteObject.h:129
PlayerBuffAnim::bRender
int16_t bRender
Definition: SpellFxRenderer.h:63
SPELL_BODY_REGENERATION
@ SPELL_BODY_REGENERATION
Definition: Spells.h:89
SpellFxRenderer::uFadeLength
int uFadeLength
Definition: SpellFxRenderer.h:164
SPELL_BODY_HAMMERHANDS
@ SPELL_BODY_HAMMERHANDS
Definition: Spells.h:91
SpellFX_Billboard::Initialize
void Initialize(int a2)
Definition: SpellFxRenderer.cpp:118
pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing
std::array< int16_t, 4 > pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing
Definition: mm7_data.cpp:424
RenderVertexD3D3::diffuse
unsigned int diffuse
Definition: IRender.h:132
SPRITE_813
@ SPRITE_813
Definition: SpriteObject.h:39
IndoorCameraD3D::Project
void Project(int x, int y, int z, int *screenspace_x, int *screenspace_y)
Definition: IndoorCameraD3D.cpp:1137
SPRITE_SPELL_WATER_ACID_BURST
@ SPRITE_SPELL_WATER_ACID_BURST
Definition: SpriteObject.h:82
SPRITE_SPELL_LIGHT_LIGHT_BOLT_IMPACT
@ SPRITE_SPELL_LIGHT_LIGHT_BOLT_IMPACT
Definition: SpriteObject.h:150
SPRITE_SPELL_FIRE_FIRE_BOLT_IMPACT
@ SPRITE_SPELL_FIRE_FIRE_BOLT_IMPACT
Definition: SpriteObject.h:44
SpriteFrameTable::pSpriteSFrames
SpriteFrame * pSpriteSFrames
Definition: Sprites.h:77
SpellFX_Billboard::pArray1
struct stru16x * pArray1
Definition: SpellFxRenderer.h:44
SPRITE_SPELL_FIRE_FIRE_SPIKE_IMPACT
@ SPRITE_SPELL_FIRE_FIRE_SPIKE_IMPACT
Definition: SpriteObject.h:51
SpellFxRenderer::AddMobileLight
bool AddMobileLight(struct SpriteObject *a1, unsigned int uDiffuse, int uRadius)
Definition: SpellFxRenderer.cpp:433
SpellFxRenderer::_4A73AA_hanging_trace_particles___like_fire_strike_ice_blast_etc
void _4A73AA_hanging_trace_particles___like_fire_strike_ice_blast_etc(struct SpriteObject *a2, unsigned int uDiffuse, Texture *texture)
Definition: SpellFxRenderer.cpp:252
Particle_sw
Definition: ParticleEngine.h:18
Viewport::uViewportBR_X
int uViewportBR_X
Definition: Viewport.h:24
SpellFxRenderer::_4A7688_fireball_collision_particle
void _4A7688_fireball_collision_particle(struct SpriteObject *a2)
Definition: SpellFxRenderer.cpp:348
SPELL_AIR_SHIELD
@ SPELL_AIR_SHIELD
Definition: Spells.h:30
f
GLfloat f
Definition: SDL_opengl_glext.h:1873
SpellFxRenderer::DrawPlayerBuffAnims
void DrawPlayerBuffAnims()
Definition: SpellFxRenderer.cpp:1317
SpellFX_Billboard::SpellFXNearClipAdjust
int SpellFXNearClipAdjust(float a2)
Definition: SpellFxRenderer.cpp:1453
SPELL_DARK_SACRIFICE
@ SPELL_DARK_SACRIFICE
Definition: Spells.h:116
SpellFxRenderer::_4A806F_get_mass_distortion_value
float _4A806F_get_mass_distortion_value(struct Actor *pActor)
Definition: SpellFxRenderer.cpp:648
SPELL_BODY_POWER_CURE
@ SPELL_BODY_POWER_CURE
Definition: Spells.h:95
SPRITE_SPELL_AIR_STARBURST_1
@ SPRITE_SPELL_AIR_STARBURST_1
Definition: SpriteObject.h:72
SPRITE_SPELL_DARK_TOXIC_CLOUD
@ SPRITE_SPELL_DARK_TOXIC_CLOUD
Definition: SpriteObject.h:168
SpellFxRenderer::DoAddProjectile
void DoAddProjectile(float srcX, float srcY, float srcZ, float dstX, float dstY, float dstZ, Texture *)
Definition: SpellFxRenderer.cpp:202
SPRITE_SPELL_FIRE_METEOR_SHOWER
@ SPRITE_SPELL_FIRE_METEOR_SHOWER
Definition: SpriteObject.h:53
Particle_sw::y
float y
Definition: ParticleEngine.h:21
Particle_sw::g
float g
Definition: ParticleEngine.h:24
SpellFX_Billboard::uNumVertices
int uNumVertices
Definition: SpellFxRenderer.h:49
AssetsManager::GetBitmap
Texture * GetBitmap(const String &name)
Definition: AssetsManager.cpp:126
SPRITE_SPELL_FIRE_METEOR_SHOWER_1
@ SPRITE_SPELL_FIRE_METEOR_SHOWER_1
Definition: SpriteObject.h:54
SPRITE_SPELL_EARTH_BLADES_IMPACT
@ SPRITE_SPELL_EARTH_BLADES_IMPACT
Definition: SpriteObject.h:98
blue
GLbyte GLbyte blue
Definition: SDL_opengl_glext.h:382
green
GLbyte green
Definition: SDL_opengl_glext.h:382
SPRITE_SPELL_EARTH_DEADLY_SWARM_IMPACT
@ SPRITE_SPELL_EARTH_DEADLY_SWARM_IMPACT
Definition: SpriteObject.h:95
SpellBuff::expire_time
GameTime expire_time
Definition: Spells.h:165
SPRITE_PROJECTILE_500_IMPACT
@ SPRITE_PROJECTILE_500_IMPACT
Definition: SpriteObject.h:11
SPELL_MIND_CURE_INSANITY
@ SPELL_MIND_CURE_INSANITY
Definition: Spells.h:81
stru6_stru2::flt_4_y
float flt_4_y
Definition: SpellFxRenderer.h:89
IconFrameTable::FindIcon
unsigned int FindIcon(const char *pIconName)
Definition: IconFrameTable.cpp:31
SPRITE_811
@ SPRITE_811
Definition: SpriteObject.h:37
SpellFxRenderer::field_0
int field_0
Definition: SpellFxRenderer.h:150
ParticleEngine::AddParticle
void AddParticle(Particle_sw *a2)
Definition: ParticleEngine.cpp:65
SpellFX_Billboard::pArray2
struct stru160 * pArray2
Definition: SpellFxRenderer.h:46
SPELL_QUEST_COMPLETED
@ SPELL_QUEST_COMPLETED
Definition: Spells.h:126
Viewport::uViewportBR_Y
int uViewportBR_Y
Definition: Viewport.h:25
pMiscTimer
Timer * pMiscTimer
Definition: Time.cpp:7
SpellFX_Billboard::local_01::y
float y
Definition: SpellFxRenderer.h:37
SpellFxRenderer::effpar03
Texture * effpar03
Definition: SpellFxRenderer.h:168
SpriteFrameTable::InitializeSprite
void InitializeSprite(signed int uSpriteID)
Definition: Sprites.cpp:46
SpellFxRenderer::pProjectiles
ProjectileAnim pProjectiles[32]
Definition: SpellFxRenderer.h:158
SpellFxRenderer::RenderAsSprite
bool RenderAsSprite(struct SpriteObject *a2)
Definition: SpellFxRenderer.cpp:671
SPRITE_PROJECTILE_505
@ SPRITE_PROJECTILE_505
Definition: SpriteObject.h:12
stru160::field_8
float field_8
Definition: stru160.h:12
SPRITE_SPELL_AIR_IMPLOSION
@ SPRITE_SPELL_AIR_IMPLOSION
Definition: SpriteObject.h:68
SPRITE_SPELL_LIGHT_SUNRAY_IMPACT
@ SPRITE_SPELL_LIGHT_SUNRAY_IMPACT
Definition: SpriteObject.h:163
ParticleType_Sprite
@ ParticleType_Sprite
Definition: ParticleEngine.h:13
SPRITE_SPELL_BODY_FLYING_FIST_IMPACT
@ SPRITE_SPELL_BODY_FLYING_FIST_IMPACT
Definition: SpriteObject.h:146
PlayerBuffAnim
Definition: SpellFxRenderer.h:59
SpellFxRenderer::_4A78AE_sparks_spell
void _4A78AE_sparks_spell(struct SpriteObject *a1)
Definition: SpellFxRenderer.cpp:397
pViewport
struct Viewport * pViewport
Definition: mm7_data.cpp:21
SPELL_SPIRIT_BLESS
@ SPELL_SPIRIT_BLESS
Definition: Spells.h:62
IconFrameTable::GetFrame
Icon * GetFrame(unsigned int uIconID, unsigned int frame_time)
Definition: IconFrameTable.cpp:39
SPRITE_SPELL_AIR_LIGHNING_BOLT_IMPACT
@ SPRITE_SPELL_AIR_LIGHNING_BOLT_IMPACT
Definition: SpriteObject.h:66
SPRITE_SPELL_EARTH_DEATH_BLOSSOM_IMPACT
@ SPRITE_SPELL_EARTH_DEATH_BLOSSOM_IMPACT
Definition: SpriteObject.h:104
SpriteFrameTable::FastFindSprite
int FastFindSprite(const char *pSpriteName)
Definition: Sprites.cpp:243
SpellFX_Billboard::field_B4
float field_B4[20]
Definition: SpellFxRenderer.h:52
srcZ
GLenum GLint GLint GLint GLint srcZ
Definition: SDL_opengl_glext.h:2453
SPELL_BODY_PROTECTION_FROM_BODY
@ SPELL_BODY_PROTECTION_FROM_BODY
Definition: Spells.h:87
SpellFxRenderer
Definition: SpellFxRenderer.h:97
SPRITE_SPELL_WATER_POISON_SPRAY
@ SPRITE_SPELL_WATER_POISON_SPRAY
Definition: SpriteObject.h:75
SPRITE_SPELL_FIRE_INCINERATE
@ SPRITE_SPELL_FIRE_INCINERATE
Definition: SpriteObject.h:56
SPELL_SPIRIT_REMOVE_CURSE
@ SPELL_SPIRIT_REMOVE_CURSE
Definition: Spells.h:65
b
GLboolean GLboolean GLboolean b
Definition: SDL_opengl_glext.h:1112
SpriteFrame::uAnimLength
int uAnimLength
Definition: Sprites.h:53
SPRITE_SPELL_LIGHT_DESTROY_UNDEAD
@ SPRITE_SPELL_LIGHT_DESTROY_UNDEAD
Definition: SpriteObject.h:151
dstY
GLenum GLint GLint GLint GLint GLuint GLenum GLint GLint GLint dstY
Definition: SDL_opengl_glext.h:2453
ProjectileAnim::srcX
float srcX
Definition: SpellFxRenderer.h:74
pOtherOverlayList
struct OtherOverlayList * pOtherOverlayList
Definition: Overlays.cpp:19
SPRITE_SPELL_DARK_REANIMATE
@ SPRITE_SPELL_DARK_REANIMATE
Definition: SpriteObject.h:166
SPRITE_SPELL_EARTH_DEATH_BLOSSOM_FALLOUT
@ SPRITE_SPELL_EARTH_DEATH_BLOSSOM_FALLOUT
Definition: SpriteObject.h:105
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
SpellFX_Billboard::~SpellFX_Billboard
virtual ~SpellFX_Billboard()
Definition: SpellFxRenderer.cpp:109
SPRITE_SPELL_LIGHT_PRISMATIC_LIGHT
@ SPRITE_SPELL_LIGHT_PRISMATIC_LIGHT
Definition: SpriteObject.h:158
SPRITE_814
@ SPRITE_814
Definition: SpriteObject.h:40
ParticleType_8
@ ParticleType_8
Definition: ParticleEngine.h:9
SPRITE_SPELL_EARTH_STUN
@ SPRITE_SPELL_EARTH_STUN
Definition: SpriteObject.h:91
Particle_sw::texture
Texture * texture
Definition: ParticleEngine.h:28
Texture.h
Icon
Definition: IconFrameTable.h:8
SPELL_BODY_CURE_WEAKNESS
@ SPELL_BODY_CURE_WEAKNESS
Definition: Spells.h:85
SPELL_SPIRIT_FATE
@ SPELL_SPIRIT_FATE
Definition: Spells.h:63
v2
GLfloat GLfloat GLfloat v2
Definition: SDL_opengl_glext.h:695
SpriteFrame
Definition: Sprites.h:39
SPRITE_ARROW_PROJECTILE
@ SPRITE_ARROW_PROJECTILE
Definition: SpriteObject.h:28
SPRITE_SPELL_WATER_ICE_BLAST_FALLOUT
@ SPRITE_SPELL_WATER_ICE_BLAST_FALLOUT
Definition: SpriteObject.h:88
assets
AssetsManager * assets
Definition: AssetsManager.cpp:12
ProjectileAnim::dstY
float dstY
Definition: SpellFxRenderer.h:78
uint
unsigned int uint
Definition: MM7.h:4
v3
GLfloat GLfloat GLfloat GLfloat v3
Definition: SDL_opengl_glext.h:696
__debugbreak
void __cdecl __debugbreak(void)
SpellFX_Billboard::uNumVec3sInArray2
unsigned int uNumVec3sInArray2
Definition: SpellFxRenderer.h:45
SPELL_WATER_PROTECTION_FROM_WATER
@ SPELL_WATER_PROTECTION_FROM_WATER
Definition: Spells.h:39
SPRITE_SPELL_WATER_POISON_SPRAY_IMPACT
@ SPRITE_SPELL_WATER_POISON_SPRAY_IMPACT
Definition: SpriteObject.h:76
SPRITE_SPELL_LIGHT_SUNRAY
@ SPRITE_SPELL_LIGHT_SUNRAY
Definition: SpriteObject.h:162
SPRITE_SPELL_WATER_ICE_BLAST_IMPACT
@ SPRITE_SPELL_WATER_ICE_BLAST_IMPACT
Definition: SpriteObject.h:87
SPELL_BODY_CURE_DISEASE
@ SPELL_BODY_CURE_DISEASE
Definition: Spells.h:92
stru6_stru2::flt_8_z
float flt_8_z
Definition: SpellFxRenderer.h:90
stru16x
Definition: stru160.h:17
SPRITE_SPELL_WATER_ICE_BOLT
@ SPRITE_SPELL_WATER_ICE_BOLT
Definition: SpriteObject.h:78
Particle_sw::particle_size
float particle_size
Definition: ParticleEngine.h:30
ParticleType_Rotating
@ ParticleType_Rotating
Definition: ParticleEngine.h:8
SPELL_LIGHT_DIVINE_INTERVENTION
@ SPELL_LIGHT_DIVINE_INTERVENTION
Definition: Spells.h:107
SPRITE_812
@ SPRITE_812
Definition: SpriteObject.h:38
Random::SetRange
void SetRange(int min, int max)
Definition: Random.cpp:8
SPRITE_SPELL_LIGHT_PARALYZE
@ SPRITE_SPELL_LIGHT_PARALYZE
Definition: SpriteObject.h:155
SpellFX_Billboard::local_01::diffuse
int diffuse
Definition: SpellFxRenderer.h:39
Particle_sw::x
float x
Definition: ParticleEngine.h:20
SPELL_SPIRIT_DETECT_LIFE
@ SPELL_SPIRIT_DETECT_LIFE
Definition: Spells.h:61
SpellFxRenderer::effpar02
Texture * effpar02
Definition: SpellFxRenderer.h:167
OurMath.h
a
GLboolean GLboolean GLboolean GLboolean a
Definition: SDL_opengl_glext.h:1112
SPRITE_SPELL_MIND_TELEPATHY
@ SPRITE_SPELL_MIND_TELEPATHY
Definition: SpriteObject.h:125
IndoorCameraD3D::fov_x
float fov_x
Definition: IndoorCameraD3D.h:192
SpellFxRenderer::field_204
int field_204
Definition: SpellFxRenderer.h:156
stru16x::field_C
float field_C
Definition: stru160.h:18
Random.h
ModulateColor
unsigned int ModulateColor(unsigned int diffuse, float multiplier)
Definition: SpellFxRenderer.cpp:28
IndoorCameraD3D::GetFarClip
float GetFarClip() const
Definition: IndoorCameraD3D.cpp:159
SPRITE_SPELL_DARK_CONTROL_UNDEAD
@ SPRITE_SPELL_DARK_CONTROL_UNDEAD
Definition: SpriteObject.h:173
SPRITE_PROJECTILE_515_IMPACT
@ SPRITE_PROJECTILE_515_IMPACT
Definition: SpriteObject.h:17
BECOME_MAGIC_GUILD_MEMBER
@ BECOME_MAGIC_GUILD_MEMBER
Definition: Spells.h:125
ProjectileAnim::texture
Texture * texture
Definition: SpellFxRenderer.h:80
SpellFxRenderer::array_4
stru6_stru2 array_4[31]
Definition: SpellFxRenderer.h:151
IndoorCameraD3D::ViewTransform
void ViewTransform(int x, int y, int z, int *transformed_x, int *transformed_y, int *transformed_z)
Definition: IndoorCameraD3D.cpp:184
SpellFxRenderer::FadeScreen__like_Turn_Undead_and_mb_Armageddon
void FadeScreen__like_Turn_Undead_and_mb_Armageddon(unsigned int uDiffuseColor, unsigned int uFadeTime)
Definition: SpellFxRenderer.cpp:1222
SPRITE_SPELL_MIND_CHARM
@ SPRITE_SPELL_MIND_CHARM
Definition: SpriteObject.h:126
RenderVertexSoft
Definition: IRender.h:113
ParticleType_Bitmap
@ ParticleType_Bitmap
Definition: ParticleEngine.h:12
SPELL_MIND_REMOVE_FEAR
@ SPELL_MIND_REMOVE_FEAR
Definition: Spells.h:73
SPRITE_SPELL_FIRE_FIREBALL
@ SPRITE_SPELL_FIRE_FIREBALL
Definition: SpriteObject.h:48
ObjectList.h
SPRITE_PROJECTILE_540
@ SPRITE_PROJECTILE_540
Definition: SpriteObject.h:26
IndoorCameraD3D::GetNearClip
float GetNearClip() const
Definition: IndoorCameraD3D.cpp:146
SPELL_AIR_INVISIBILITY
@ SPELL_AIR_INVISIBILITY
Definition: Spells.h:32
pMobileLightsStack
LightsStack_MobileLight_ * pMobileLightsStack
Definition: LightmapBuilder.cpp:14
SPRITE_SPELL_WATER_ICE_BLAST
@ SPRITE_SPELL_WATER_ICE_BLAST
Definition: SpriteObject.h:86
SpellFxRenderer::SetPlayerBuffAnim
void SetPlayerBuffAnim(uint16_t uSpellID, uint16_t uPlayerID)
Definition: SpellFxRenderer.cpp:1103
SPRITE_SPELL_FIRE_FIREBALL_IMPACT
@ SPRITE_SPELL_FIRE_FIREBALL_IMPACT
Definition: SpriteObject.h:49
SPRITE_SPELL_MIND_MIND_BLAST_IMPACT
@ SPRITE_SPELL_MIND_MIND_BLAST_IMPACT
Definition: SpriteObject.h:123
SpriteObject::GetLifetime
unsigned int GetLifetime()
Definition: SpriteObject.cpp:837
SPRITE_PROJECTILE_550
@ SPRITE_PROJECTILE_550
Definition: SpriteObject.h:29
SpellFxRenderer::RenderSpecialEffects
void RenderSpecialEffects()
Definition: SpellFxRenderer.cpp:1239
RenderVertexD3D3::specular
unsigned int specular
Definition: IRender.h:133
SpellFX_Billboard::SpellFXViewClip
bool SpellFXViewClip()
Definition: SpellFxRenderer.cpp:1610
stru160::field_0
float field_0
Definition: stru160.h:10
SpellFxRenderer::_4A77FD_implosion_particle_d3d
void _4A77FD_implosion_particle_d3d(struct SpriteObject *a1)
Definition: SpellFxRenderer.cpp:381
pIndoorCameraD3D
IndoorCameraD3D * pIndoorCameraD3D
Definition: IndoorCameraD3D.cpp:21
g
GLboolean GLboolean g
Definition: SDL_opengl_glext.h:1112
Viewport::uViewportTL_X
int uViewportTL_X
Definition: Viewport.h:22
SPELL_FIRE_HASTE
@ SPELL_FIRE_HASTE
Definition: Spells.h:17
SpellFxRenderer::_4A7A66_miltiple_spell_collision_partifles___like_after_sparks_or_lightning
void _4A7A66_miltiple_spell_collision_partifles___like_after_sparks_or_lightning(SpriteObject *a1, unsigned int uDiffuse, Texture *texture, float a4)
Definition: SpellFxRenderer.cpp:443
SPELL_MIND_CURE_PARALYSIS
@ SPELL_MIND_CURE_PARALYSIS
Definition: Spells.h:78
SpellFxRenderer::_4A7E89_sparkles_on_actor_after_it_casts_buff
void _4A7E89_sparkles_on_actor_after_it_casts_buff(struct Actor *pActor, unsigned int uDiffuse)
Definition: SpellFxRenderer.cpp:576
PlayerBuffAnim::uSpellAnimTimeElapsed
int uSpellAnimTimeElapsed
Definition: SpellFxRenderer.h:65
PlayerBuffAnim::uSpellIconID
int uSpellIconID
Definition: SpellFxRenderer.h:67
Timer::uTotalGameTimeElapsed
unsigned int uTotalGameTimeElapsed
Definition: Time.h:135
ProjectileAnim::srcY
float srcY
Definition: SpellFxRenderer.h:75
LightsStack_MobileLight_::AddLight
bool AddLight(int16_t x, int16_t y, int16_t z, int16_t uSectorID, int uRadius, uint8_t r, uint8_t g, uint8_t b, char a10)
Definition: LightsStack.cpp:6
SPRITE_SPELL_DARK_SHRINKING_RAY
@ SPRITE_SPELL_DARK_SHRINKING_RAY
Definition: SpriteObject.h:170
SPRITE_SPELL_LIGHT_LIGHT_BOLT
@ SPRITE_SPELL_LIGHT_LIGHT_BOLT
Definition: SpriteObject.h:149
pEventTimer
Timer * pEventTimer
Definition: Time.cpp:8
Sprites.h
SPRITE_PROJECTILE_505_IMPACT
@ SPRITE_PROJECTILE_505_IMPACT
Definition: SpriteObject.h:13
SpellFxRenderer::uNumProjectiles
int uNumProjectiles
Definition: SpellFxRenderer.h:159
SpriteObject::GetSpriteFrame
SpriteFrame * GetSpriteFrame()
Definition: SpriteObject.cpp:842
SPRITE_SPELL_EARTH_BLADES
@ SPRITE_SPELL_EARTH_BLADES
Definition: SpriteObject.h:97
SPELL_SPIRIT_HEROISM
@ SPELL_SPIRIT_HEROISM
Definition: Spells.h:67
SpellFX_Billboard::SpellFXViewTransform
int SpellFXViewTransform()
Definition: SpellFxRenderer.cpp:1587
SPELL_BODY_PROTECTION_FROM_MAGIC
@ SPELL_BODY_PROTECTION_FROM_MAGIC
Definition: Spells.h:93
SpriteObject::spell_caster_pid
int spell_caster_pid
Definition: SpriteObject.h:232
SPELL_LIGHT_DAY_OF_THE_GODS
@ SPELL_LIGHT_DAY_OF_THE_GODS
Definition: Spells.h:102
SPRITE_SPELL_BODY_HARM_IMPACT
@ SPRITE_SPELL_BODY_HARM_IMPACT
Definition: SpriteObject.h:139
Time.h
SpellFxRenderer::DrawProjectiles
void DrawProjectiles()
Definition: SpellFxRenderer.cpp:221
SpellFxRenderer::effpar01
Texture * effpar01
Definition: SpellFxRenderer.h:166
Actor::pActorBuffs
struct SpellBuff pActorBuffs[22]
Definition: Actor.h:315
Particle_sw::uDiffuse
unsigned int uDiffuse
Definition: ParticleEngine.h:26
render
std::shared_ptr< IRender > render
Definition: RenderOpenGL.cpp:52
SPRITE_SPELL_FIRE_FIRE_SPIKE
@ SPRITE_SPELL_FIRE_FIRE_SPIKE
Definition: SpriteObject.h:50