World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
Структура SpriteObject

#include <SpriteObject.h>

+ Граф связей класса SpriteObject:

Открытые члены

bool AttachedToActor () const
 
 SpriteObject ()
 
int Create (int yaw, int pitch, int a4, int a5)
 
void _46BEF1_apply_spells_aoe ()
 
void ExplosionTraps ()
 
unsigned int GetLifetime ()
 
SpriteFrameGetSpriteFrame ()
 
bool IsUnpickable ()
 
bool HasSprite ()
 
uint8_t GetParticleTrailColorR ()
 
uint8_t GetParticleTrailColorG ()
 
uint8_t GetParticleTrailColorB ()
 

Открытые статические члены

static void UpdateObject_fn0_BLV (unsigned int uLayingItemID)
 
static void UpdateObject_fn0_ODM (unsigned int uLayingItemID)
 
static void OnInteraction (unsigned int uLayingItemID)
 
static bool sub_42F7EB_DropItemAt (SPRITE_OBJECT_TYPE sprite, int x, int y, int z, int a4, int count, int a7, unsigned __int16 attributes, ItemGen *a9)
 
static void Create_Splash_Object (int x, int y, int z)
 
static void InitializeSpriteObjects ()
 

Открытые атрибуты

SPRITE_OBJECT_TYPE uType
 
unsigned __int16 uObjectDescID
 
struct Vec3_int_ vPosition
 
struct Vec3_short_ vVelocity
 
unsigned __int16 uFacing
 
unsigned __int16 uSoundID
 
unsigned __int16 uAttributes
 
__int16 uSectorID
 
unsigned __int16 uSpriteFrameID
 
__int16 field_20
 
__int16 field_22_glow_radius_multiplier
 
struct ItemGen containing_item
 
int spell_id
 
int spell_level
 
int spell_skill
 
int field_54
 
int spell_caster_pid
 
int spell_target_pid
 
char field_60_distance_related_prolly_lod
 
char field_61
 
char field_62 [2]
 
Vec3_int_ field_64
 

Подробное описание

См. определение в файле SpriteObject.h строка 189

Конструктор(ы)

◆ SpriteObject()

SpriteObject::SpriteObject ( )

См. определение в файле SpriteObject.cpp строка 37

37  {
39  uSoundID = 0;
40  uFacing = 0;
41  vVelocity.z = 0;
42  vVelocity.y = 0;
43  vVelocity.x = 0;
45  uObjectDescID = 0;
46  field_61 = 0;
48  field_20 = 0;
49  uSpriteFrameID = 0;
50  spell_skill = 0;
51  spell_level = 0;
52  spell_id = 0;
53  field_54 = 0;
54 }

Перекрестные ссылки field_20, field_22_glow_radius_multiplier, field_54, field_60_distance_related_prolly_lod, field_61, spell_id, spell_level, spell_skill, SPRITE_NULL, uFacing, uObjectDescID, uSoundID, uSpriteFrameID, uType и vVelocity.

Методы

◆ AttachedToActor()

bool SpriteObject::AttachedToActor ( ) const
inline

См. определение в файле SpriteObject.h строка 190

190  {
191  return (uAttributes & OBJECT_ATTACHED_TO_ACTOR) != 0;
192  }

Перекрестные ссылки OBJECT_ATTACHED_TO_ACTOR и uAttributes.

◆ Create()

int SpriteObject::Create ( int  yaw,
int  pitch,
int  a4,
int  a5 
)

См. определение в файле SpriteObject.cpp строка 56

56  {
57  // check for valid sprite object
58  if (!uObjectDescID) {
59  return -1;
60  }
61 
62  // find free sprite slot
63  int sprite_slot = 1000;
64  for (unsigned int i = 0; i < MAX_SPRITE_OBJECTS; ++i) {
65  if (!pSpriteObjects[i].uObjectDescID) {
66  sprite_slot = i;
67  break;
68  }
69  }
70 
71  // return if too many sprties already
72  if (sprite_slot >= MAX_SPRITE_OBJECTS) {
73  return -1;
74  }
75 
76  // set initial position
77  field_64.x = vPosition.x;
78  field_64.y = vPosition.y;
79  field_64.z = vPosition.z;
80 
81  assert(sizeof(SpriteObject) == 0x70);
82 
83  // move sprite so it looks like it originates from char portrait
84  switch (which_char) {
85  case 0:
86  break; // do nothing
87  case 1:
88  Vec3_int_::Rotate((24<<16), 2048 - uFacing, 0, vPosition, &vPosition.x, &vPosition.y, &vPosition.z);
89  break;
90  case 2:
91  Vec3_int_::Rotate((8<<16), 2048 - uFacing, 0, vPosition, &vPosition.x, &vPosition.y, &vPosition.z);
92  break;
93  case 3:
94  Vec3_int_::Rotate((8<<16), 1024 - uFacing, 0, vPosition, &vPosition.x, &vPosition.y, &vPosition.z);
95  break;
96  case 4:
97  Vec3_int_::Rotate((24<<16), 1024 - uFacing, 0, vPosition, &vPosition.x, &vPosition.y, &vPosition.z);
98  break;
99  default:
100  assert(false);
101  return 0;
102  break;
103  }
104 
105  // set blank velocity
106  vVelocity.y = 0;
107  vVelocity.x = 0;
108  vVelocity.z = 0;
109 
110  // calcualte angle velocity - could use rotate func here as above
111  if (speed) {
112  long long v13 =
113  fixpoint_mul(stru_5C6E00->Cos(yaw), stru_5C6E00->Cos(pitch));
114  long long a5a =
115  fixpoint_mul(stru_5C6E00->Sin(yaw), stru_5C6E00->Cos(pitch));
116  vVelocity.x = fixpoint_mul(v13, speed);
117  vVelocity.y = fixpoint_mul(a5a, speed);
118  vVelocity.z = fixpoint_mul(stru_5C6E00->Sin(pitch), speed);
119  }
120 
121  // copy sprite object into slot
122  memcpy(&pSpriteObjects[sprite_slot], this, sizeof(*this));
123  if (sprite_slot >= (int)uNumSpriteObjects) {
124  uNumSpriteObjects = sprite_slot + 1;
125  }
126  return sprite_slot;
127 }

Перекрестные ссылки stru193_math::Cos(), field_64, fixpoint_mul(), pSpriteObjects, stru193_math::Sin(), stru_5C6E00, uFacing, uNumSpriteObjects, uObjectDescID, vPosition и vVelocity.

Используется в CastSpellInfoHelpers::_427E01_cast_spell(), Player::_42FA66_do_explosive_impact(), _493938_regenerate(), Actor::AI_RangedAttack(), Actor::AI_SpellAttack(), Create_Splash_Object(), Engine::DropHeldItem(), EventCastSpell(), Actor::Explode(), Chest::Open(), MapInfo::SpawnRandomTreasure(), sub_42F7EB_DropItemAt() и sub_450521_ProllyDropItemAt().

+ Граф вызовов:
+ Граф вызова функции:

◆ _46BEF1_apply_spells_aoe()

void SpriteObject::_46BEF1_apply_spells_aoe ( )

См. определение в файле SpriteObject.cpp строка 909

909  {
910  __debugbreak(); // Ritor1
911 
912  if (uNumActors > 0) {
913  for (size_t i = 0; i < uNumActors; ++i) {
914  if (pActors[i].CanAct()) {
915  int v7 = pActors[i].vPosition.x - this->vPosition.x;
916  int v9 = pActors[i].vPosition.y - this->vPosition.y;
917  int v10 = pActors[i].uActorHeight / 2 + pActors[i].vPosition.z -
918  this->vVelocity.y;
919 
920  int v11 = this->vVelocity.x * this->vVelocity.x;
921 
922  if (v11 >= v7 * v7 + v9 * v9 + v10 * v10) {
923  if (pActors[i].DoesDmgTypeDoDamage(DMGT_DARK)) {
924  pActors[i].pActorBuffs[this->spell_id].Apply(
926  GameTime::FromSeconds(this->spell_level)),
927  this->spell_skill, 4, 0, 0);
928  pActors[i].uAttributes |= 0x80000;
929  }
930  }
931  }
932  }
933  }
934 }

Перекрестные ссылки __debugbreak(), DMGT_DARK, GameTime::FromSeconds(), Party::GetPlayingTime(), pActors, pParty, spell_id, uNumActors, vPosition и vVelocity.

+ Граф вызовов:

◆ ExplosionTraps()

void SpriteObject::ExplosionTraps ( )

См. определение в файле SpriteObject.cpp строка 788

788  {
790  int dir_x = abs(pParty->vPosition.x - this->vPosition.x);
791  int dir_y = abs(pParty->vPosition.y - this->vPosition.y);
792  int dir_z = abs(pParty->vPosition.z + pParty->sEyelevel - this->vPosition.z);
793  if (dir_x < dir_y) {
794  std::swap(dir_x, dir_y);
795  }
796  if (dir_x < dir_z) {
797  std::swap(dir_x, dir_z);
798  }
799  if (dir_y < dir_z) {
800  std::swap(dir_y, dir_z);
801  }
802  unsigned int v10 = ((unsigned int)(11 * dir_y) >> 5) + (dir_z / 4) + dir_x;
803  if (v10 <= 768) {
804  int v11 = 5;
805  if (pMapInfo->Trap_D20) {
806  for (uint i = 0; i < pMapInfo->Trap_D20; ++i) {
807  v11 += rand() % 20 + 1;
808  }
809  }
810  DAMAGE_TYPE pDamageType;
811  switch (this->uType) {
812  case 811:
813  pDamageType = DMGT_FIRE;
814  break;
815  case 812:
816  pDamageType = DMGT_ELECTR;
817  break;
818  case 813:
819  pDamageType = DMGT_COLD;
820  break;
821  case 814:
822  pDamageType = DMGT_BODY;
823  break;
824  default:
825  return;
826  }
827  for (unsigned int i = 1; i <= 4; ++i) {
828  int v13 = pPlayers[i]->GetPerception() + 20;
829  if (pPlayers[i]->CanAct() && (rand() % v13 > 20))
830  pPlayers[i]->PlaySound(SPEECH_6, 0);
831  else
832  pPlayers[i]->ReceiveDamage(v11, pDamageType);
833  }
834  }
835 }

Перекрестные ссылки DMGT_BODY, DMGT_COLD, DMGT_ELECTR, DMGT_FIRE, MapStats::GetMapInfo(), pCurrentMapName, MapStats::pInfos, pMapStats, pParty, pPlayers, Party::sEyelevel, SPEECH_6, MapInfo::Trap_D20, uType и Party::vPosition.

Используется в Chest::Open().

+ Граф вызовов:
+ Граф вызова функции:

◆ GetLifetime()

unsigned int SpriteObject::GetLifetime ( )

См. определение в файле SpriteObject.cpp строка 837

837  {
838  ObjectDesc *pObjectDesc = &pObjectList->pObjects[uObjectDescID];
839  return pObjectDesc->uLifetime;
840 }

Перекрестные ссылки pObjectList, ObjectList::pObjects, ObjectDesc::uLifetime и uObjectDescID.

Используется в SpellFxRenderer::_4A7688_fireball_collision_particle() и SpellFxRenderer::_4A77FD_implosion_particle_d3d().

+ Граф вызова функции:

◆ GetSpriteFrame()

SpriteFrame * SpriteObject::GetSpriteFrame ( )

См. определение в файле SpriteObject.cpp строка 842

842  {
843  ObjectDesc *pObjectDesc = &pObjectList->pObjects[uObjectDescID];
844  return pSpriteFrameTable->GetFrame(pObjectDesc->uSpriteID, uSpriteFrameID);
845 }

Перекрестные ссылки SpriteFrameTable::GetFrame(), pObjectList, ObjectList::pObjects, pSpriteFrameTable, uObjectDescID, uSpriteFrameID и ObjectDesc::uSpriteID.

Используется в SpellFxRenderer::_4A78AE_sparks_spell(), SpellFxRenderer::_4A7948_mind_blast_after_effect() и SpellFxRenderer::_4A7C07_stun_spell_fx().

+ Граф вызовов:
+ Граф вызова функции:

◆ IsUnpickable()

bool SpriteObject::IsUnpickable ( )

См. определение в файле SpriteObject.cpp строка 847

847  {
848  ObjectDesc *pObjectDesc = &pObjectList->pObjects[uObjectDescID];
849  return ((pObjectDesc->uFlags & OBJECT_DESC_UNPICKABLE) == OBJECT_DESC_UNPICKABLE);
850 }

Перекрестные ссылки OBJECT_DESC_UNPICKABLE, pObjectList, ObjectList::pObjects, ObjectDesc::uFlags и uObjectDescID.

◆ HasSprite()

bool SpriteObject::HasSprite ( )

См. определение в файле SpriteObject.cpp строка 852

852  {
853  ObjectDesc *pObjectDesc = &pObjectList->pObjects[uObjectDescID];
854  return !pObjectDesc->NoSprite();
855 }

Перекрестные ссылки ObjectDesc::NoSprite(), pObjectList, ObjectList::pObjects и uObjectDescID.

+ Граф вызовов:

◆ GetParticleTrailColorR()

uint8_t SpriteObject::GetParticleTrailColorR ( )

См. определение в файле SpriteObject.cpp строка 857

857  {
858  ObjectDesc *pObjectDesc = &pObjectList->pObjects[uObjectDescID];
859  return pObjectDesc->uParticleTrailColorR;
860 }

Перекрестные ссылки pObjectList, ObjectList::pObjects, uObjectDescID и ObjectDesc::uParticleTrailColorR.

◆ GetParticleTrailColorG()

uint8_t SpriteObject::GetParticleTrailColorG ( )

См. определение в файле SpriteObject.cpp строка 862

862  {
863  ObjectDesc *pObjectDesc = &pObjectList->pObjects[uObjectDescID];
864  return pObjectDesc->uParticleTrailColorG;
865 }

Перекрестные ссылки pObjectList, ObjectList::pObjects, uObjectDescID и ObjectDesc::uParticleTrailColorG.

◆ GetParticleTrailColorB()

uint8_t SpriteObject::GetParticleTrailColorB ( )

См. определение в файле SpriteObject.cpp строка 867

867  {
868  ObjectDesc *pObjectDesc = &pObjectList->pObjects[uObjectDescID];
869  return pObjectDesc->uParticleTrailColorB;
870 }

Перекрестные ссылки pObjectList, ObjectList::pObjects, uObjectDescID и ObjectDesc::uParticleTrailColorB.

◆ UpdateObject_fn0_BLV()

void SpriteObject::UpdateObject_fn0_BLV ( unsigned int  uLayingItemID)
static

См. определение в файле SpriteObject.cpp строка 463

463  {
464  SpriteObject *pSpriteObject = &pSpriteObjects[uLayingItemID];
465  ObjectDesc *pObject = &pObjectList->pObjects[pSpriteObject->uObjectDescID];
466 
467  pSpriteObject->uSectorID = pIndoor->GetSector(pSpriteObject->vPosition.x,
468  pSpriteObject->vPosition.y,
469  pSpriteObject->vPosition.z);
470 
471  unsigned int uFaceID;
472 
473  int floor_lvl = BLV_GetFloorLevel(
474  pSpriteObject->vPosition.x, pSpriteObject->vPosition.y,
475  pSpriteObject->vPosition.z, pSpriteObject->uSectorID, &uFaceID);
476 
477  // object out of bounds
478  if (abs(pSpriteObject->vPosition.x) > 32767 ||
479  abs(pSpriteObject->vPosition.y) > 32767 ||
480  abs(pSpriteObject->vPosition.z) > 20000 ||
481  floor_lvl <= -30000 && (pSpriteObject->uSectorID == 0)) {
482  SpriteObject::OnInteraction(uLayingItemID);
483  return;
484  }
485 
486  int v15; // ebx@46
487  int v17; // eax@50
488  __int16 v22; // ax@57
489  int v23; // edi@62
490  Particle_sw Dst; // [sp+Ch] [bp-84h]@18
491 
492  int v39; // [sp+80h] [bp-10h]@33
493  int v40; // [sp+84h] [bp-Ch]@28
494 
495 
496  if (pObject->uFlags & OBJECT_DESC_NO_GRAVITY) { //не падающие объекты
497 LABEL_25:
498  stru_721530.field_0 = 0;
500  stru_721530.field_84 = -1;
501  stru_721530.height = pObject->uHeight;
503  stru_721530.field_70 = 0;
504  for (int loop = 0; loop < 100; loop++) {
505  stru_721530.position.x = pSpriteObject->vPosition.x;
506  stru_721530.position.y = pSpriteObject->vPosition.y;
508  stru_721530.prolly_normal_d + pSpriteObject->vPosition.z + 1;
509 
513 
514  stru_721530.velocity.x = pSpriteObject->vVelocity.x;
515  stru_721530.velocity.y = pSpriteObject->vVelocity.y;
516  stru_721530.velocity.z = pSpriteObject->vVelocity.z;
517 
518  stru_721530.uSectorID = pSpriteObject->uSectorID;
519  if (stru_721530.CalcMovementExtents(0)) return;
520 
521  for (int loop2 = 0; loop2 < 100; ++loop2) {
524 
525  if (PID_TYPE(pSpriteObject->spell_caster_pid) != OBJECT_Player)
527 
528  for (int actloop = 0; actloop < (signed int)uNumActors; ++actloop) {
529  // dont collide against self
530  if (PID_TYPE(pSpriteObject->spell_caster_pid) == OBJECT_Actor) {
531  if (PID_ID(pSpriteObject->spell_caster_pid) == actloop) continue;
532  }
533 
534  // not sure:
535  // pMonsterList->pMonsters[v39b->word_000086_some_monster_id-1].uToHitRadius
536  int radius = 0;
537  if (pActors[actloop].word_000086_some_monster_id) { // not always filled in from scripted monsters
538  radius = pMonsterList->pMonsters[pActors[actloop].word_000086_some_monster_id - 1].uToHitRadius;
539  }
540  Actor::_46DF1A_collide_against_actor(actloop, radius);
541  }
542 
543  if (_46F04E_collide_against_portals()) break;
544  }
545  // end loop2
546 
548  pSpriteObject->vPosition.x = stru_721530.normal2.x;
549  pSpriteObject->vPosition.y = stru_721530.normal2.y;
550  pSpriteObject->vPosition.z =
552  pSpriteObject->uSectorID = (short)stru_721530.uSectorID;
553  if (!(pObject->uFlags & 0x100)) return;
554  memset(&Dst, 0, 0x68u);
555  Dst.x = (double)pSpriteObject->vPosition.x;
556  Dst.y = (double)pSpriteObject->vPosition.y;
557  Dst.z = (double)pSpriteObject->vPosition.z;
558  Dst.r = 0.0;
559  Dst.g = 0.0;
560  Dst.b = 0.0;
561  if (pObject->uFlags & OBJECT_DESC_TRIAL_FIRE) {
564  Dst.uDiffuse = 0xFF3C1E;
565  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
567  Dst.particle_size = 1.0f;
569  return;
570  } else if (pObject->uFlags & OBJECT_DESC_TRIAL_LINE) {
571  Dst.type = ParticleType_Line;
572  Dst.uDiffuse = rand();
573  Dst.timeToLive = 64;
574  Dst.texture = 0;
575  Dst.particle_size = 1.0f;
577  return;
578  } else if (pObject->uFlags & OBJECT_DESC_TRIAL_PARTICLE) {
580  Dst.uDiffuse = rand();
581  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
583  Dst.particle_size = 1.0f;
585  }
586  return;
587  }
588  // v40 = (unsigned __int64)(stru_721530.field_7C * (signed
589  // __int64)stru_721530.direction.x) >> 16;
590 
591  pSpriteObject->vPosition.x +=
593 
594  // v40 = (unsigned __int64)(stru_721530.field_7C * (signed
595  // __int64)stru_721530.direction.y) >> 16;
596 
597  pSpriteObject->vPosition.y +=
599 
600  // v40 = (unsigned __int64)(stru_721530.field_7C * (signed
601  // __int64)stru_721530.direction.z) >> 16;
602 
603  pSpriteObject->vPosition.z +=
605 
606  pSpriteObject->uSectorID = stru_721530.uSectorID;
608 
609  // if weve collided but dont need to react return
610  if (pObject->uFlags & OBJECT_DESC_INTERACTABLE &&
611  !_46BFFA_update_spell_fx(uLayingItemID, stru_721530.pid))
612  return;
613 
614  v15 = (signed int)stru_721530.pid >> 3;
615  if (PID_TYPE(stru_721530.pid) == OBJECT_Decoration) {
616  v40 = integer_sqrt(
617  pSpriteObject->vVelocity.x * pSpriteObject->vVelocity.x +
618  pSpriteObject->vVelocity.y * pSpriteObject->vVelocity.y);
619  v23 =
620  stru_5C6E00->Atan2(pSpriteObject->vPosition.x -
621  pLevelDecorations[v15].vPosition.x,
622  pSpriteObject->vPosition.y -
623  pLevelDecorations[v15].vPosition.y);
624  pSpriteObject->vVelocity.x =
625  fixpoint_mul(stru_5C6E00->Cos(v23), v40);
626  pSpriteObject->vVelocity.y =
627  fixpoint_mul(stru_5C6E00->Sin(v23), v40);
628  }
629  if (PID_TYPE(stru_721530.pid) == OBJECT_BModel) {
630  stru_721530.field_84 = (signed int)PID_ID(stru_721530.pid);
631  if (pIndoor->pFaces[v15].uPolygonType != POLYGON_Floor) {
632  floor_lvl = abs(pIndoor->pFaces[v15].pFacePlane_old.vNormal.x *
633  pSpriteObject->vVelocity.x +
635  pSpriteObject->vVelocity.y +
637  pSpriteObject->vVelocity.z) >>
638  16;
639  if ((stru_721530.speed >> 3) > floor_lvl)
640  floor_lvl = stru_721530.speed >> 3;
641  pSpriteObject->vVelocity.x +=
642  2 *
643  fixpoint_mul(
644  floor_lvl, pIndoor->pFaces[v15].pFacePlane_old.vNormal.x);
645  pSpriteObject->vVelocity.y +=
646  2 *
647  fixpoint_mul(
648  floor_lvl, pIndoor->pFaces[v15].pFacePlane_old.vNormal.y);
649  v39 = fixpoint_mul(
650  floor_lvl, pIndoor->pFaces[v15].pFacePlane_old.vNormal.z);
651  if (pIndoor->pFaces[v15].pFacePlane_old.vNormal.z <= 32000) {
652  v22 = 2 * v39;
653  } else {
654  pSpriteObject->vVelocity.z += v39;
655  v22 = fixpoint_mul(32000, v39);
656  }
657  pSpriteObject->vVelocity.z += v22;
658  if (pIndoor->pFaces[v15].uAttributes & FACE_UNKNOW2)
660  pIndoor
661  ->pFaceExtras[pIndoor->pFaces[v15].uFaceExtraID]
662  .uEventID,
663  0, 1);
664  pSpriteObject->vVelocity.x =
665  fixpoint_mul(58500, pSpriteObject->vVelocity.x);
666  pSpriteObject->vVelocity.y =
667  fixpoint_mul(58500, pSpriteObject->vVelocity.y);
668  pSpriteObject->vVelocity.z =
669  fixpoint_mul(58500, pSpriteObject->vVelocity.z);
670  continue;
671  }
672  if (pObject->uFlags & OBJECT_DESC_BOUNCE) {
673  v17 = -pSpriteObject->vVelocity.z / 2;
674  pSpriteObject->vVelocity.z = v17;
675  if ((signed __int16)v17 < 10)
676  pSpriteObject->vVelocity.z = 0;
677  if (pIndoor->pFaces[v15].uAttributes & FACE_UNKNOW2)
679  pIndoor
680  ->pFaceExtras[pIndoor->pFaces[v15].uFaceExtraID]
681  .uEventID,
682  0, 1);
683  pSpriteObject->vVelocity.x =
684  fixpoint_mul(58500, pSpriteObject->vVelocity.x);
685  pSpriteObject->vVelocity.y =
686  fixpoint_mul(58500, pSpriteObject->vVelocity.y);
687  pSpriteObject->vVelocity.z =
688  fixpoint_mul(58500, pSpriteObject->vVelocity.z);
689  continue;
690  }
691  pSpriteObject->vVelocity.z = 0;
692  if (pSpriteObject->vVelocity.x * pSpriteObject->vVelocity.x +
693  pSpriteObject->vVelocity.y *
694  pSpriteObject->vVelocity.y >=
695  400) {
696  if (pIndoor->pFaces[v15].uAttributes & FACE_UNKNOW2)
698  pIndoor
699  ->pFaceExtras[pIndoor->pFaces[v15].uFaceExtraID]
700  .uEventID,
701  0, 1);
702  pSpriteObject->vVelocity.x =
703  fixpoint_mul(58500, pSpriteObject->vVelocity.x);
704  pSpriteObject->vVelocity.y =
705  fixpoint_mul(58500, pSpriteObject->vVelocity.y);
706  pSpriteObject->vVelocity.z =
707  fixpoint_mul(58500, pSpriteObject->vVelocity.z);
708  continue;
709  }
710  pSpriteObject->vVelocity.z = 0;
711  pSpriteObject->vVelocity.y = 0;
712  pSpriteObject->vVelocity.x = 0;
713  pSpriteObject->vPosition.z =
714  pIndoor->pVertices[*pIndoor->pFaces[v15].pVertexIDs].z + 1;
715  }
716  pSpriteObject->vVelocity.x = fixpoint_mul(58500, pSpriteObject->vVelocity.x);
717  pSpriteObject->vVelocity.y = fixpoint_mul(58500, pSpriteObject->vVelocity.y);
718  pSpriteObject->vVelocity.z = fixpoint_mul(58500, pSpriteObject->vVelocity.z);
719  }
720  // end loop
721  }
722  //для падающих объектов(для примера выброс вещи из инвентаря)
723  // fallen objects, eg thrown out of inventory
724  if (floor_lvl <= pSpriteObject->vPosition.z - 3) {
725  pSpriteObject->vVelocity.z -=
727  goto LABEL_25;
728  }
729 
730  if (!(pObject->uFlags & OBJECT_DESC_INTERACTABLE) ||
731  _46BFFA_update_spell_fx(uLayingItemID, 0)) {
732  pSpriteObject->vPosition.z = floor_lvl + 1;
733  if (pIndoor->pFaces[uFaceID].uPolygonType == POLYGON_Floor) {
734  pSpriteObject->vVelocity.z = 0;
735  } else {
736  if (pIndoor->pFaces[uFaceID].pFacePlane_old.vNormal.z < 45000)
737  pSpriteObject->vVelocity.z -=
739  }
740  pSpriteObject->vVelocity.x = fixpoint_mul(58500, pSpriteObject->vVelocity.x);
741  pSpriteObject->vVelocity.y = fixpoint_mul(58500, pSpriteObject->vVelocity.y);
742  pSpriteObject->vVelocity.z = fixpoint_mul(58500, pSpriteObject->vVelocity.z);
743  if (pSpriteObject->vVelocity.x * pSpriteObject->vVelocity.x +
744  pSpriteObject->vVelocity.y * pSpriteObject->vVelocity.y <
745  400) {
746  pSpriteObject->vVelocity.x = 0;
747  pSpriteObject->vVelocity.y = 0;
748  pSpriteObject->vVelocity.z = 0;
749  if (!(pObject->uFlags & OBJECT_DESC_NO_SPRITE)) return;
750  memset(&Dst, 0, 0x68u);
751  Dst.x = (double)pSpriteObject->vPosition.x;
752  Dst.y = (double)pSpriteObject->vPosition.y;
753  Dst.z = (double)pSpriteObject->vPosition.z;
754  Dst.r = 0.0;
755  Dst.g = 0.0;
756  Dst.b = 0.0;
757  if (pObject->uFlags & OBJECT_DESC_TRIAL_FIRE) {
760  Dst.uDiffuse = 0xFF3C1E;
761  Dst.particle_size = 1.0f;
762  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
765  return;
766  } else if (pObject->uFlags & OBJECT_DESC_TRIAL_LINE) {
767  Dst.type = ParticleType_Line;
768  Dst.uDiffuse = rand();
769  Dst.timeToLive = 64;
770  Dst.texture = nullptr;
771  Dst.particle_size = 1.0f;
773  return;
774  } else if (pObject->uFlags & OBJECT_DESC_TRIAL_PARTICLE) {
776  Dst.uDiffuse = rand();
777  Dst.particle_size = 1.0f;
778  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
781  }
782  return;
783  }
784  goto LABEL_25;
785  }
786 }

Перекрестные ссылки _46BFFA_update_spell_fx(), Actor::_46DF1A_collide_against_actor(), _46E0B2_collide_against_decorations(), _46E44E_collide_against_faces_and_portals(), _46EF01_collision_chech_player(), _46F04E_collide_against_portals(), ParticleEngine::AddParticle(), stru193_math::Atan2(), Particle_sw::b, BLV_GetFloorLevel(), stru141_actor_collision_object::CalcMovementExtents(), stru193_math::Cos(), stru141_actor_collision_object::direction, SpellFxRenderer::effpar01, SpellFxRenderer::effpar03, EventProcessor(), stru141_actor_collision_object::field_0, stru141_actor_collision_object::field_6C, stru141_actor_collision_object::field_70, stru141_actor_collision_object::field_7C, stru141_actor_collision_object::field_84, stru141_actor_collision_object::field_8_radius, fixpoint_mul(), Particle_sw::g, GetGravityStrength(), IndoorLocation::GetSector(), stru141_actor_collision_object::height, integer_sqrt(), stru141_actor_collision_object::normal, stru141_actor_collision_object::normal2, OBJECT_Actor, OBJECT_BModel, OBJECT_Decoration, OBJECT_DESC_BOUNCE, OBJECT_DESC_INTERACTABLE, OBJECT_DESC_NO_GRAVITY, OBJECT_DESC_NO_SPRITE, OBJECT_DESC_TRIAL_FIRE, OBJECT_DESC_TRIAL_LINE, OBJECT_DESC_TRIAL_PARTICLE, OBJECT_Player, OnInteraction(), pActors, particle_engine, Particle_sw::particle_size, ParticleType_8, ParticleType_Bitmap, ParticleType_Line, ParticleType_Rotating, pEventTimer, BLVFace::pFacePlane_old, IndoorLocation::pFaces, stru141_actor_collision_object::pid, pIndoor, pLevelDecorations, pMonsterList, MonsterList::pMonsters, pObjectList, ObjectList::pObjects, POLYGON_Floor, stru141_actor_collision_object::position, stru141_actor_collision_object::prolly_normal_d, pSpriteObjects, BLVFace::pVertexIDs, IndoorLocation::pVertices, Particle_sw::r, stru193_math::Sin(), stru141_actor_collision_object::speed, spell_caster_pid, spell_fx_renderer, stru_5C6E00, stru_721530, Particle_sw::texture, Particle_sw::timeToLive, Particle_sw::type, BLVFace::uAttributes, Particle_sw::uDiffuse, BLVFace::uFaceExtraID, ObjectDesc::uFlags, ObjectDesc::uHeight, uNumActors, uObjectDescID, BLVFace::uPolygonType, ObjectDesc::uRadius, stru141_actor_collision_object::uSectorID, uSectorID, Timer::uTimeElapsed, MonsterDesc::uToHitRadius, stru141_actor_collision_object::velocity, Plane_int_::vNormal, vPosition, vVelocity, Particle_sw::x, Particle_sw::y и Particle_sw::z.

Используется в UpdateObjects().

+ Граф вызовов:
+ Граф вызова функции:

◆ UpdateObject_fn0_ODM()

void SpriteObject::UpdateObject_fn0_ODM ( unsigned int  uLayingItemID)
static

См. определение в файле SpriteObject.cpp строка 130

130  {
131  int v6; // eax@1
132  int v7; // ecx@1
133  int v8; // edi@1
134  int v9; // eax@4
135  int v21; // eax@41
136  int i; // edi@50
137  int v26; // edi@52
138  int v27; // eax@52
139  __int16 v28; // cx@55
140  int v29; // eax@55
141  // signed int v30; // edi@59
142  BSPModel *bmodel; // ecx@61
143  ODMFace *face; // edi@61
144  int v36; // ecx@67
145  __int16 v37; // ax@67
146  int v38; // eax@72
147  int v44; // eax@77
148  int v50; // [sp+10h] [bp-98h]@52
149  Vec3_int_ v51; // [sp+14h] [bp-94h]@11
150  Particle_sw Dst; // [sp+20h] [bp-88h]@45
151  int v54; // [sp+8Ch] [bp-1Ch]@1
152  int v55; // [sp+90h] [bp-18h]@1
153  int v56; // [sp+94h] [bp-14h]@11
154  int v57; // [sp+98h] [bp-10h]@1
155  int v58; // [sp+9Ch] [bp-Ch]@1
156  int v60; // [sp+A4h] [bp-4h]@11
157 
158  v58 = 0;
159  ObjectDesc *object = &pObjectList->pObjects[pSpriteObjects[uLayingItemID].uObjectDescID];
160  v57 = IsTerrainSlopeTooHigh(pSpriteObjects[uLayingItemID].vPosition.x,
161  pSpriteObjects[uLayingItemID].vPosition.y);
162  v55 = 0;
163  bool on_water = false;
164  v6 = ODM_GetFloorLevel(pSpriteObjects[uLayingItemID].vPosition.x,
165  pSpriteObjects[uLayingItemID].vPosition.y,
166  pSpriteObjects[uLayingItemID].vPosition.z,
167  object->uHeight, &on_water, &v55, 0);
168  v7 = v6;
169  v54 = v6;
170  v8 = v6 + 1;
171  if (pSpriteObjects[uLayingItemID].vPosition.z <= v6 + 1) {
172  if (on_water) {
173  v9 = v6 + 60;
174  if (v55) v9 = v6 + 30;
176  pSpriteObjects[uLayingItemID].vPosition.y,
177  v9);
178  SpriteObject::OnInteraction(uLayingItemID);
179  }
180  } else {
181  v58 = 1;
182  }
183  if (!(object->uFlags & OBJECT_DESC_NO_GRAVITY)) {
184  if (v58) {
185  pSpriteObjects[uLayingItemID].vVelocity.z -=
187  goto LABEL_13;
188  }
189  if (v57) {
190  pSpriteObjects[uLayingItemID].vPosition.z = v8;
192  pSpriteObjects[uLayingItemID].vPosition.y,
193  &v51);
194  pSpriteObjects[uLayingItemID].vVelocity.z -=
196  v56 = abs(v51.y * pSpriteObjects[uLayingItemID].vVelocity.y +
197  v51.z * pSpriteObjects[uLayingItemID].vVelocity.z +
198  v51.x * pSpriteObjects[uLayingItemID].vVelocity.x) >>
199  16;
200  // v60 = ((unsigned __int64)(v56 * (signed __int64)v51.x) >> 16);
201  pSpriteObjects[uLayingItemID].vVelocity.x +=
202  fixpoint_mul(v56, v51.x);
203  // v60 = ((unsigned __int64)(v56 * (signed __int64)v51.y) >> 16);
204  pSpriteObjects[uLayingItemID].vVelocity.y +=
205  fixpoint_mul(v56, v51.y);
206  // v60 = ((unsigned __int64)(v56 * (signed __int64)v51.z) >> 16);
207  pSpriteObjects[uLayingItemID].vVelocity.z +=
208  fixpoint_mul(v56, v51.z);
209  v7 = v54;
210  goto LABEL_13;
211  }
212  if (object->uFlags & OBJECT_DESC_INTERACTABLE) {
213  if (pSpriteObjects[uLayingItemID].vPosition.z < v7)
214  pSpriteObjects[uLayingItemID].vPosition.z = v8;
215  if (!_46BFFA_update_spell_fx(uLayingItemID, 0)) return;
216  }
217  pSpriteObjects[uLayingItemID].vPosition.z = v8;
218  if (!(object->uFlags & OBJECT_DESC_BOUNCE) ||
219  (v21 = -pSpriteObjects[uLayingItemID].vVelocity.z >> 1,
220  pSpriteObjects[uLayingItemID].vVelocity.z = v21,
221  (signed __int16)v21 < 10))
222  pSpriteObjects[uLayingItemID].vVelocity.z = 0;
223 
224  pSpriteObjects[uLayingItemID].vVelocity.x =
225  fixpoint_mul(58500, pSpriteObjects[uLayingItemID].vVelocity.x);
226  pSpriteObjects[uLayingItemID].vVelocity.y =
227  fixpoint_mul(58500, pSpriteObjects[uLayingItemID].vVelocity.y);
228  pSpriteObjects[uLayingItemID].vVelocity.z =
229  fixpoint_mul(58500, pSpriteObjects[uLayingItemID].vVelocity.z);
230  if ((pSpriteObjects[uLayingItemID].vVelocity.y *
231  pSpriteObjects[uLayingItemID].vVelocity.y +
232  pSpriteObjects[uLayingItemID].vVelocity.x *
233  pSpriteObjects[uLayingItemID].vVelocity.x) < 400) {
234  pSpriteObjects[uLayingItemID].vVelocity.y = 0;
235  pSpriteObjects[uLayingItemID].vVelocity.x = 0;
236  memset(&Dst, 0, 0x68u);
237  Dst.x = (double)pSpriteObjects[uLayingItemID].vPosition.x;
238  Dst.y = (double)pSpriteObjects[uLayingItemID].vPosition.y;
239  Dst.z = (double)pSpriteObjects[uLayingItemID].vPosition.z;
240  Dst.r = 0.0;
241  Dst.g = 0.0;
242  Dst.b = 0.0;
243  if (object->uFlags & OBJECT_DESC_TRIAL_FIRE) {
246  Dst.uDiffuse = 0xFF3C1E;
247  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
249  Dst.particle_size = 1.0f;
251  } else if (object->uFlags & OBJECT_DESC_TRIAL_LINE) {
252  Dst.type = ParticleType_Line;
253  Dst.uDiffuse = rand();
254  Dst.timeToLive = 64;
255  Dst.texture = nullptr;
256  Dst.particle_size = 1.0f;
258  } else if (object->uFlags & OBJECT_DESC_TRIAL_PARTICLE) {
260  Dst.uDiffuse = rand();
261  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
263  Dst.particle_size = 1.0f;
265  }
266  return;
267  }
268  }
269 LABEL_13:
270  if (pSpriteObjects[uLayingItemID].vPosition.x >= -0x8000 &&
271  pSpriteObjects[uLayingItemID].vPosition.x <= 0x8000 &&
272  pSpriteObjects[uLayingItemID].vPosition.y >= -0x8000 &&
273  pSpriteObjects[uLayingItemID].vPosition.y <= 0x8000 &&
274  pSpriteObjects[uLayingItemID].vPosition.z > v7 &&
275  pSpriteObjects[uLayingItemID].vPosition.z <= 13000 ||
276  !(object->uFlags & OBJECT_DESC_INTERACTABLE))
277  goto LABEL_92;
278  if (pSpriteObjects[uLayingItemID].vPosition.z < v7)
279  pSpriteObjects[uLayingItemID].vPosition.z = v8;
280  if (_46BFFA_update_spell_fx(uLayingItemID, 0)) {
281  LABEL_92:
282  stru_721530.field_0 = 0;
283  stru_721530.prolly_normal_d = object->uRadius;
284  stru_721530.height = object->uHeight;
286  stru_721530.field_70 = 0;
287  for (v55 = 0; v55 < 100; ++v55) {
288  stru_721530.position.x = pSpriteObjects[uLayingItemID].vPosition.x;
291  stru_721530.position.y = pSpriteObjects[uLayingItemID].vPosition.y;
292  stru_721530.normal.y = pSpriteObjects[uLayingItemID].vPosition.y;
293  stru_721530.position.z = pSpriteObjects[uLayingItemID].vPosition.z +
296  stru_721530.velocity.x = pSpriteObjects[uLayingItemID].vVelocity.x;
297  stru_721530.velocity.y = pSpriteObjects[uLayingItemID].vVelocity.y;
298  stru_721530.velocity.z = pSpriteObjects[uLayingItemID].vVelocity.z;
299  if (stru_721530.CalcMovementExtents(0)) return;
302  WorldPosToGridCellX(pSpriteObjects[uLayingItemID].vPosition.x),
303  WorldPosToGridCellZ(pSpriteObjects[uLayingItemID].vPosition.y));
304  if (PID_TYPE(pSpriteObjects[uLayingItemID].spell_caster_pid) !=
307  if (PID_TYPE(pSpriteObjects[uLayingItemID].spell_caster_pid) ==
308  OBJECT_Actor) {
309  if ((PID_ID(pSpriteObjects[uLayingItemID].spell_caster_pid) >=
310  0) &&
311  (PID_ID(pSpriteObjects[uLayingItemID].spell_caster_pid) <
312  (signed int)(uNumActors - 1))) {
313  for (v56 = 0; v56 < uNumActors; ++v56) {
314  if (pActors[PID_ID(pSpriteObjects[uLayingItemID]
316  .GetActorsRelation(&pActors[v56]))
318  }
319  }
320  } else {
321  for (i = 0; i < (signed int)uNumActors; ++i)
323  }
325  bool v49 = false;
326  v27 = ODM_GetFloorLevel(
329  object->uHeight, &v49, &v50, 0);
330  if (on_water && v26 < v27 + 60) {
331  if (v50)
332  v44 = v27 + 30;
333  else
334  v44 = v54 + 60;
335  Create_Splash_Object( // splash
336  pSpriteObjects[uLayingItemID].vPosition.x,
337  pSpriteObjects[uLayingItemID].vPosition.y, v44);
338  SpriteObject::OnInteraction(uLayingItemID);
339  return;
340  }
342  pSpriteObjects[uLayingItemID].vPosition.x =
344  pSpriteObjects[uLayingItemID].vPosition.y =
346  pSpriteObjects[uLayingItemID].vPosition.z =
348  pSpriteObjects[uLayingItemID].uSectorID =
349  (short)stru_721530.uSectorID;
350  memset(&Dst, 0, 0x68u);
351  Dst.x = (double)pSpriteObjects[uLayingItemID].vPosition.x;
352  Dst.y = (double)pSpriteObjects[uLayingItemID].vPosition.y;
353  Dst.z = (double)pSpriteObjects[uLayingItemID].vPosition.z;
354  Dst.r = 0.0;
355  Dst.g = 0.0;
356  Dst.b = 0.0;
357  if (object->uFlags & OBJECT_DESC_TRIAL_FIRE) {
360  Dst.uDiffuse = 0xFF3C1E;
361  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
363  Dst.particle_size = 1.0f;
365  return;
366  } else if (object->uFlags & OBJECT_DESC_TRIAL_LINE) {
367  Dst.type = ParticleType_Line;
368  Dst.texture = nullptr;
369  Dst.uDiffuse = rand();
370  Dst.timeToLive = 64;
371  Dst.particle_size = 1.0f;
373  return;
374  } else if (object->uFlags & OBJECT_DESC_TRIAL_PARTICLE) {
376  Dst.uDiffuse = rand();
377  Dst.timeToLive = (unsigned __int8)(rand() & 0x80) + 128;
379  Dst.particle_size = 1.0f;
381  }
382  return;
383  }
384  // v60 = ((unsigned __int64)(stru_721530.field_7C * (signed
385  // __int64)stru_721530.direction.x) >> 16);
386  pSpriteObjects[uLayingItemID].vPosition.x += fixpoint_mul(stru_721530.field_7C, stru_721530.direction.x);
387  // v60 = ((unsigned __int64)(stru_721530.field_7C * (signed
388  // __int64)stru_721530.direction.y) >> 16);
389  pSpriteObjects[uLayingItemID].vPosition.y += fixpoint_mul(stru_721530.field_7C, stru_721530.direction.y);
390  // v60 = ((unsigned __int64)(stru_721530.field_7C * (signed
391  // __int64)stru_721530.direction.z) >> 16);
392  v28 = (short)stru_721530.uSectorID;
393  pSpriteObjects[uLayingItemID].vPosition.z += fixpoint_mul(stru_721530.field_7C, stru_721530.direction.z);
394  v29 = pSpriteObjects[uLayingItemID].vPosition.z;
395  pSpriteObjects[uLayingItemID].uSectorID = v28;
397  if (object->uFlags & OBJECT_DESC_INTERACTABLE) {
398  if (v29 < v54)
399  pSpriteObjects[uLayingItemID].vPosition.z = v54 + 1;
400  if (!_46BFFA_update_spell_fx(uLayingItemID, stru_721530.pid))
401  return;
402  }
403  if (PID_TYPE(stru_721530.pid) == OBJECT_Decoration) break;
404  if (PID_TYPE(stru_721530.pid) == OBJECT_BModel) {
405  bmodel = &pOutdoor->pBModels[(signed int)stru_721530.pid >> 9];
406  face = &bmodel->pFaces[PID_ID(stru_721530.pid) & 0x3F];
407  if (face->uPolygonType == POLYGON_Floor) {
408  pSpriteObjects[uLayingItemID].vPosition.z =
409  bmodel->pVertices.pVertices[face->pVertexIDs[0]].z + 1;
410  if (pSpriteObjects[uLayingItemID].vVelocity.x * pSpriteObjects[uLayingItemID].vVelocity.x +
411  pSpriteObjects[uLayingItemID].vVelocity.y * pSpriteObjects[uLayingItemID].vVelocity.y >= 400) {
412  if (face->uAttributes & FACE_UNKNOW2)
413  EventProcessor(face->sCogTriggeredID, 0, 1);
414  } else {
415  pSpriteObjects[uLayingItemID].vVelocity.z = 0;
416  pSpriteObjects[uLayingItemID].vVelocity.x = 0;
417  pSpriteObjects[uLayingItemID].vVelocity.y = 0;
418  }
419  } else {
420  v56 = abs(face->pFacePlane.vNormal.x * pSpriteObjects[uLayingItemID].vVelocity.x +
421  face->pFacePlane.vNormal.y * pSpriteObjects[uLayingItemID].vVelocity.y +
422  face->pFacePlane.vNormal.z * pSpriteObjects[uLayingItemID].vVelocity.z) >>
423  16;
424  if ((stru_721530.speed >> 3) > v56)
425  v56 = stru_721530.speed >> 3;
426  // v57 = fixpoint_mul(v56, face->pFacePlane.vNormal.x);
427  // v58 = fixpoint_mul(v56, face->pFacePlane.vNormal.y);
428  v60 = fixpoint_mul(v56, face->pFacePlane.vNormal.z);
429  pSpriteObjects[uLayingItemID].vVelocity.x += 2 * fixpoint_mul(v56, face->pFacePlane.vNormal.x);
430  pSpriteObjects[uLayingItemID].vVelocity.y += 2 * fixpoint_mul(v56, face->pFacePlane.vNormal.y);
431  if (face->pFacePlane.vNormal.z <= 32000) {
432  v37 = 2 * (short)v60;
433  } else {
434  v36 = v60;
435  pSpriteObjects[uLayingItemID].vVelocity.z += (signed __int16)v60;
436  v58 = fixpoint_mul(0x7D00, v36);
437  v37 = fixpoint_mul(32000, v36);
438  }
439  pSpriteObjects[uLayingItemID].vVelocity.z += v37;
440  if (face->uAttributes & FACE_UNKNOW2)
441  EventProcessor(face->sCogTriggeredID, 0, 1);
442  }
443  }
444  LABEL_74:
445  pSpriteObjects[uLayingItemID].vVelocity.x = fixpoint_mul(58500, pSpriteObjects[uLayingItemID].vVelocity.x);
446  pSpriteObjects[uLayingItemID].vVelocity.y = fixpoint_mul(58500, pSpriteObjects[uLayingItemID].vVelocity.y);
447  pSpriteObjects[uLayingItemID].vVelocity.z = fixpoint_mul(58500, pSpriteObjects[uLayingItemID].vVelocity.z);
448  }
449  v57 = integer_sqrt(pSpriteObjects[uLayingItemID].vVelocity.x * pSpriteObjects[uLayingItemID].vVelocity.x +
450  pSpriteObjects[uLayingItemID].vVelocity.y * pSpriteObjects[uLayingItemID].vVelocity.y);
451  v38 = stru_5C6E00->Atan2(
452  pSpriteObjects[uLayingItemID].vPosition.x - pLevelDecorations[PID_ID(stru_721530.pid)].vPosition.x,
453  pSpriteObjects[uLayingItemID].vPosition.y - pLevelDecorations[PID_ID(stru_721530.pid)].vPosition.y);
454  pSpriteObjects[uLayingItemID].vVelocity.x =
455  fixpoint_mul(stru_5C6E00->Cos(v38), v57);
456  pSpriteObjects[uLayingItemID].vVelocity.y = fixpoint_mul(
457  stru_5C6E00->Sin(v38 - stru_5C6E00->uIntegerHalfPi), v57);
458  goto LABEL_74;
459  }
460 }

Перекрестные ссылки _46BFFA_update_spell_fx(), Actor::_46DF1A_collide_against_actor(), _46E26D_collide_against_sprites(), _46E889_collide_against_bmodels(), _46EF01_collision_chech_player(), ParticleEngine::AddParticle(), stru193_math::Atan2(), Particle_sw::b, stru141_actor_collision_object::CalcMovementExtents(), stru193_math::Cos(), Create_Splash_Object(), stru141_actor_collision_object::direction, SpellFxRenderer::effpar01, SpellFxRenderer::effpar03, EventProcessor(), stru141_actor_collision_object::field_0, stru141_actor_collision_object::field_6C, stru141_actor_collision_object::field_70, stru141_actor_collision_object::field_7C, stru141_actor_collision_object::field_8_radius, fixpoint_mul(), Particle_sw::g, GetGravityStrength(), stru141_actor_collision_object::height, integer_sqrt(), IsTerrainSlopeTooHigh(), stru141_actor_collision_object::normal, stru141_actor_collision_object::normal2, OBJECT_Actor, OBJECT_BModel, OBJECT_Decoration, OBJECT_DESC_BOUNCE, OBJECT_DESC_INTERACTABLE, OBJECT_DESC_NO_GRAVITY, OBJECT_DESC_TRIAL_FIRE, OBJECT_DESC_TRIAL_LINE, OBJECT_DESC_TRIAL_PARTICLE, OBJECT_Player, ODM_GetFloorLevel(), ODM_GetTerrainNormalAt(), OnInteraction(), pActors, particle_engine, Particle_sw::particle_size, ParticleType_8, ParticleType_Bitmap, ParticleType_Line, ParticleType_Rotating, OutdoorLocation::pBModels, pEventTimer, BSPModel::pFaces, stru141_actor_collision_object::pid, pLevelDecorations, pObjectList, ObjectList::pObjects, POLYGON_Floor, stru141_actor_collision_object::position, pOutdoor, stru141_actor_collision_object::prolly_normal_d, pSpriteObjects, BSPVertexBuffer::pVertices, BSPModel::pVertices, Particle_sw::r, stru193_math::Sin(), stru141_actor_collision_object::speed, spell_caster_pid, spell_fx_renderer, stru_5C6E00, stru_721530, Particle_sw::texture, Particle_sw::timeToLive, Particle_sw::type, Particle_sw::uDiffuse, stru193_math::uIntegerHalfPi, uNumActors, stru141_actor_collision_object::uSectorID, Timer::uTimeElapsed, stru141_actor_collision_object::velocity, vPosition, vVelocity, WorldPosToGridCellX(), WorldPosToGridCellZ(), Particle_sw::x, Particle_sw::y и Particle_sw::z.

Используется в UpdateObjects().

+ Граф вызовов:
+ Граф вызова функции:

◆ OnInteraction()

void SpriteObject::OnInteraction ( unsigned int  uLayingItemID)
static

См. определение в файле SpriteObject.cpp строка 872

872  {
873  pSpriteObjects[uLayingItemID].uObjectDescID = 0;
874  if (pParty->bTurnBasedModeOn) {
875  if (pSpriteObjects[uLayingItemID].uAttributes & 4) {
876  pSpriteObjects[uLayingItemID].uAttributes &= 0xFFFB; // ~0x00000004
878  }
879  }
880 }

Перекрестные ссылки Party::bTurnBasedModeOn, stru262_TurnBased::pending_actions, pParty, pSpriteObjects, pTurnEngine и uAttributes.

Используется в CastSpellInfoHelpers::_427E01_cast_spell(), _46BFFA_update_spell_fx(), InitializeSpriteObjects(), ItemInteraction(), UpdateObject_fn0_BLV(), UpdateObject_fn0_ODM() и UpdateObjects().

+ Граф вызова функции:

◆ sub_42F7EB_DropItemAt()

bool SpriteObject::sub_42F7EB_DropItemAt ( SPRITE_OBJECT_TYPE  sprite,
int  x,
int  y,
int  z,
int  a4,
int  count,
int  a7,
unsigned __int16  attributes,
ItemGen a9 
)
static

См. определение в файле SpriteObject.cpp строка 937

940  {
941  SpriteObject pSpellObject; // [sp+Ch] [bp-78h]@1
942 
943  pSpellObject.containing_item.Reset();
944  if (a9)
945  memcpy(&pSpellObject.containing_item, a9,
946  sizeof(pSpellObject.containing_item));
947  pSpellObject.spell_skill = 0;
948  pSpellObject.spell_level = 0;
949  pSpellObject.spell_id = 0;
950  pSpellObject.field_54 = 0;
951  pSpellObject.uType = sprite;
952  pSpellObject.uObjectDescID = pObjectList->ObjectIDByItemID(sprite);
953  pSpellObject.vPosition.x = x;
954  pSpellObject.vPosition.y = y;
955  pSpellObject.vPosition.z = z;
956  pSpellObject.uSoundID = 0;
957  pSpellObject.uAttributes = attributes;
958  pSpellObject.uSectorID = pIndoor->GetSector(x, y, z);
959  pSpellObject.uSpriteFrameID = 0;
960  pSpellObject.spell_caster_pid = 0;
961  pSpellObject.spell_target_pid = 0;
962  if (!(pSpellObject.uAttributes & 0x10)) {
964  for (uint i = 1; i < pItemsTable->uAllItemsCount; ++i) {
965  if (pItemsTable->pItems[i].uSpriteID == sprite)
966  pSpellObject.containing_item.uItemID = i;
967  }
968  }
969  }
970  if (a7) {
971  if (count > 0) {
972  for (uint i = count; i; --i) {
973  pSpellObject.uFacing = rand() % (int)stru_5C6E00->uIntegerDoublePi;
974  pSpellObject.Create(
975  (int16_t)pSpellObject.uFacing,
976  ((int)stru_5C6E00->uIntegerHalfPi / 2) +
977  (rand() % ((signed int)stru_5C6E00->uIntegerHalfPi / 2)),
978  a4, 0);
979  }
980  }
981  } else {
982  pSpellObject.uFacing = 0;
983  if (count > 0) {
984  for (uint i = count; i; --i) {
985  pSpellObject.Create((int16_t)pSpellObject.uFacing,
986  stru_5C6E00->uIntegerHalfPi, a4, 0);
987  }
988  }
989  }
990  return true;
991 }

Перекрестные ссылки containing_item, Create(), field_54, IndoorLocation::GetSector(), ObjectList::ObjectIDByItemID(), pIndoor, ItemsTable::pItems, pItemsTable, pObjectList, ItemGen::Reset(), spell_caster_pid, spell_id, spell_level, spell_skill, spell_target_pid, stru_5C6E00, ItemsTable::uAllItemsCount, uAttributes, uFacing, stru193_math::uIntegerDoublePi, stru193_math::uIntegerHalfPi, ItemGen::uItemID, uObjectDescID, uSectorID, uSoundID, uSpriteFrameID, uType и vPosition.

Используется в CastSpellInfoHelpers::_427E01_cast_spell(), Actor::Die(), EventProcessor(), Inventory_ItemPopupAndAlchemy() и Chest::Open().

+ Граф вызовов:
+ Граф вызова функции:

◆ Create_Splash_Object()

void SpriteObject::Create_Splash_Object ( int  x,
int  y,
int  z 
)
static

См. определение в файле SpriteObject.cpp строка 993

993  { // splash on water
994  SpriteObject a1;
995  a1.containing_item.Reset();
996  a1.spell_skill = 0;
997  a1.spell_level = 0;
998  a1.spell_id = 0;
999  a1.field_54 = 0;
1002  a1.vPosition.x = x;
1003  a1.vPosition.y = y;
1004  a1.vPosition.z = z;
1005  a1.uSoundID = 0;
1006  a1.uAttributes = 0;
1007  a1.uSectorID = pIndoor->GetSector(x, y, z);
1008  a1.uSpriteFrameID = 0;
1009  a1.spell_caster_pid = 0;
1010  a1.spell_target_pid = 0;
1011  int objID = a1.Create(0, 0, 0, 0);
1012  if (objID != -1) {
1013  pAudioPlayer->PlaySound((SoundID)SOUND_splash, PID(OBJECT_Item, objID), 0, 0, 0, 0);
1014  }
1015 }

Перекрестные ссылки containing_item, Create(), field_54, IndoorLocation::GetSector(), OBJECT_Item, ObjectList::ObjectIDByItemID(), pAudioPlayer, pIndoor, AudioPlayer::PlaySound(), pObjectList, ItemGen::Reset(), SOUND_splash, spell_caster_pid, spell_id, spell_level, spell_skill, spell_target_pid, SPRITE_WATER_SPLASH, uAttributes, uObjectDescID, uSectorID, uSoundID, uSpriteFrameID, uType и vPosition.

Используется в ODM_ProcessPartyActions(), UpdateActors_ODM() и UpdateObject_fn0_ODM().

+ Граф вызовов:
+ Граф вызова функции:

◆ InitializeSpriteObjects()

void SpriteObject::InitializeSpriteObjects ( )
static

См. определение в файле SpriteObject.cpp строка 898

898  {
899  for (size_t i = 0; i < uNumSpriteObjects; ++i) {
900  SpriteObject *item = &pSpriteObjects[i];
901  if (item->uType &&
902  (item->uSoundID & 8 || pObjectList->pObjects[item->uType].uFlags &
905  }
906  }
907 }

Перекрестные ссылки OBJECT_DESC_UNPICKABLE, OnInteraction(), pObjectList, ObjectList::pObjects, pSpriteObjects, ObjectDesc::uFlags, uNumSpriteObjects, uSoundID и uType.

Используется в ODM_LoadAndInitialize() и PrepareToLoadBLV().

+ Граф вызовов:
+ Граф вызова функции:

Данные класса

◆ uType

◆ uObjectDescID

◆ vPosition

◆ vVelocity

struct Vec3_short_ SpriteObject::vVelocity

См. определение в файле SpriteObject.h строка 219

Используется в _46BEF1_apply_spells_aoe(), Create(), SpriteObject(), UpdateObject_fn0_BLV() и UpdateObject_fn0_ODM().

◆ uFacing

◆ uSoundID

◆ uAttributes

◆ uSectorID

◆ uSpriteFrameID

◆ field_20

__int16 SpriteObject::field_20

См. определение в файле SpriteObject.h строка 225

Используется в SpriteObject().

◆ field_22_glow_radius_multiplier

__int16 SpriteObject::field_22_glow_radius_multiplier

См. определение в файле SpriteObject.h строка 226

Используется в SpriteObject().

◆ containing_item

◆ spell_id

◆ spell_level

◆ spell_skill

◆ field_54

◆ spell_caster_pid

◆ spell_target_pid

◆ field_60_distance_related_prolly_lod

char SpriteObject::field_60_distance_related_prolly_lod

◆ field_61

char SpriteObject::field_61

См. определение в файле SpriteObject.h строка 235

Используется в Actor::AI_RangedAttack(), Actor::AI_SpellAttack(), area_of_effect__damage_evaluate(), Actor::Explode() и SpriteObject().

◆ field_62

char SpriteObject::field_62[2]

См. определение в файле SpriteObject.h строка 236

◆ field_64

Vec3_int_ SpriteObject::field_64

См. определение в файле SpriteObject.h строка 237

Используется в Create().


Объявления и описания членов структур находятся в файлах:
BLVFace::uPolygonType
PolygonType uPolygonType
Definition: Indoor.h:487
SpriteObject::vVelocity
struct Vec3_short_ vVelocity
Definition: SpriteObject.h:219
SpriteObject
Definition: SpriteObject.h:189
Particle_sw::z
float z
Definition: ParticleEngine.h:22
OBJECT_DESC_BOUNCE
@ OBJECT_DESC_BOUNCE
Definition: ObjectList.h:13
uNumActors
size_t uNumActors
Definition: Actor.cpp:39
Party::vPosition
Vec3_int_ vPosition
Definition: Party.h:250
BSPModel::pVertices
struct BSPVertexBuffer pVertices
Definition: BSPModel.h:189
face
GLenum GLuint GLint GLenum face
Definition: SDL_opengl_glext.h:3022
pLevelDecorations
std::array< LevelDecoration, 3000 > pLevelDecorations
Definition: Decoration.cpp:8
stru193_math::uIntegerDoublePi
static const unsigned int uIntegerDoublePi
Definition: OurMath.h:90
DMGT_DARK
@ DMGT_DARK
Definition: Items.h:21
SpriteObject::field_20
__int16 field_20
Definition: SpriteObject.h:225
int16_t
signed __int16 int16_t
Definition: SDL_config.h:36
Particle_sw::b
float b
Definition: ParticleEngine.h:25
Timer::uTimeElapsed
unsigned int uTimeElapsed
Definition: Time.h:133
SpriteObject::uFacing
unsigned __int16 uFacing
Definition: SpriteObject.h:220
MapStats::pInfos
MapInfo pInfos[77]
Definition: MapInfo.h:79
stru141_actor_collision_object::field_6C
int field_6C
Definition: Indoor.h:168
Party::GetPlayingTime
GameTime & GetPlayingTime()
Definition: Party.h:230
BLVFace::pFacePlane_old
struct Plane_int_ pFacePlane_old
Definition: Indoor.h:471
pSpriteFrameTable
struct SpriteFrameTable * pSpriteFrameTable
Definition: Sprites.cpp:22
OutdoorLocation::pBModels
BSPModelList pBModels
Definition: Outdoor.h:119
pSpriteObjects
std::array< SpriteObject, MAX_SPRITE_OBJECTS > pSpriteObjects
Definition: SpriteObject.cpp:34
stru141_actor_collision_object::speed
int speed
Definition: Indoor.h:166
BLVFace::pVertexIDs
uint16_t * pVertexIDs
Definition: Indoor.h:476
SpriteObject::field_60_distance_related_prolly_lod
char field_60_distance_related_prolly_lod
Definition: SpriteObject.h:234
OBJECT_Item
@ OBJECT_Item
Definition: Actor.h:66
stru141_actor_collision_object::uSectorID
unsigned int uSectorID
Definition: Indoor.h:170
z
GLdouble GLdouble z
Definition: SDL_opengl_glext.h:407
DMGT_FIRE
@ DMGT_FIRE
Definition: Items.h:11
MapStats::GetMapInfo
MAP_TYPE GetMapInfo(const String &Str2)
Definition: MapInfo.cpp:225
Party::sEyelevel
int sEyelevel
Definition: Party.h:239
SpriteObject::uSectorID
__int16 uSectorID
Definition: SpriteObject.h:223
AudioPlayer::PlaySound
void PlaySound(SoundID eSoundID, int pid, unsigned int uNumRepeats, int x, int y, int a7)
Definition: AudioPlayer.cpp:195
WorldPosToGridCellX
unsigned int WorldPosToGridCellX(int sWorldPosX)
Definition: Outdoor.cpp:3955
count
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
stru193_math::uIntegerHalfPi
static const unsigned int uIntegerHalfPi
Definition: OurMath.h:89
ObjectDesc
Definition: ObjectList.h:20
MapInfo::Trap_D20
char Trap_D20
Definition: MapInfo.h:51
ObjectList::ObjectIDByItemID
unsigned int ObjectIDByItemID(unsigned int uItemID)
Definition: ObjectList.cpp:7
stru141_actor_collision_object::normal
Vec3_int_ normal
Definition: Indoor.h:159
SpriteObject::uType
SPRITE_OBJECT_TYPE uType
Definition: SpriteObject.h:215
Particle_sw::r
float r
Definition: ParticleEngine.h:23
POLYGON_Floor
@ POLYGON_Floor
Definition: Indoor.h:220
OBJECT_Decoration
@ OBJECT_Decoration
Definition: Actor.h:69
WorldPosToGridCellZ
unsigned int WorldPosToGridCellZ(int sWorldPosZ)
Definition: Outdoor.cpp:3962
ItemGen::Reset
void Reset()
Definition: Items.cpp:133
pPlayers
NZIArray< struct Player *, 5 > pPlayers
Definition: Player.cpp:46
SpriteObject::uSpriteFrameID
unsigned __int16 uSpriteFrameID
Definition: SpriteObject.h:224
particle_engine
static ParticleEngine * particle_engine
Definition: SpriteObject.cpp:31
ObjectDesc::uRadius
int16_t uRadius
Definition: ObjectList.h:25
OBJECT_DESC_NO_GRAVITY
@ OBJECT_DESC_NO_GRAVITY
Definition: ObjectList.h:11
pIndoor
IndoorLocation * pIndoor
Definition: Indoor.cpp:49
Actor::_46DF1A_collide_against_actor
static bool _46DF1A_collide_against_actor(int a1, int a2)
Definition: Actor.cpp:2699
SPRITE_WATER_SPLASH
@ SPRITE_WATER_SPLASH
Definition: SpriteObject.h:35
Plane_int_::vNormal
Vec3_int_ vNormal
Definition: VectorTypes.h:107
pTurnEngine
struct stru262_TurnBased * pTurnEngine
Definition: TurnEngine.cpp:21
OBJECT_DESC_INTERACTABLE
@ OBJECT_DESC_INTERACTABLE
Definition: ObjectList.h:12
pMapStats
struct MapStats * pMapStats
Definition: mm7_data.cpp:20
SpriteObject::uObjectDescID
unsigned __int16 uObjectDescID
Definition: SpriteObject.h:217
OBJECT_Actor
@ OBJECT_Actor
Definition: Actor.h:67
SpriteObject::field_61
char field_61
Definition: SpriteObject.h:235
ObjectDesc::uLifetime
int16_t uLifetime
Definition: ObjectList.h:29
pItemsTable
struct ItemsTable * pItemsTable
Definition: Items.cpp:37
Particle_sw::type
unsigned int type
Definition: ParticleEngine.h:19
y
EGLSurface EGLint EGLint y
Definition: SDL_egl.h:1596
OBJECT_ATTACHED_TO_ACTOR
@ OBJECT_ATTACHED_TO_ACTOR
Definition: SpriteObject.h:182
stru141_actor_collision_object::field_0
int field_0
Definition: Indoor.h:151
DAMAGE_TYPE
DAMAGE_TYPE
Definition: Items.h:10
SpriteObject::vPosition
struct Vec3_int_ vPosition
Definition: SpriteObject.h:218
pParty
Party * pParty
Definition: Party.cpp:30
object
GLuint object
Definition: SDL_opengl_glext.h:6060
stru141_actor_collision_object::field_8_radius
int field_8_radius
Definition: Indoor.h:153
SpriteObject::field_54
int field_54
Definition: SpriteObject.h:231
GetGravityStrength
unsigned int GetGravityStrength()
Definition: Engine.cpp:1500
stru141_actor_collision_object::normal2
Vec3_int_ normal2
Definition: Indoor.h:161
OBJECT_BModel
@ OBJECT_BModel
Definition: Actor.h:70
x
EGLSurface EGLint x
Definition: SDL_egl.h:1596
ODM_GetTerrainNormalAt
void ODM_GetTerrainNormalAt(int pos_x, int pos_z, Vec3_int_ *out)
Definition: Outdoor.cpp:2052
Particle_sw::timeToLive
int timeToLive
Definition: ParticleEngine.h:27
stru141_actor_collision_object::field_7C
int field_7C
Definition: Indoor.h:172
SpriteFrameTable::GetFrame
SpriteFrame * GetFrame(unsigned int uSpriteID, unsigned int uTime)
Definition: Sprites.cpp:277
OBJECT_DESC_UNPICKABLE
@ OBJECT_DESC_UNPICKABLE
Definition: ObjectList.h:10
ObjectDesc::uSpriteID
uint16_t uSpriteID
Definition: ObjectList.h:28
_46BFFA_update_spell_fx
bool _46BFFA_update_spell_fx(unsigned int uLayingItemID, int a2)
Definition: SpriteObject.cpp:1017
_46E889_collide_against_bmodels
void _46E889_collide_against_bmodels(unsigned int ecx0)
Definition: Render.cpp:4516
ItemGen::uItemID
int uItemID
Definition: Items.h:326
DMGT_COLD
@ DMGT_COLD
Definition: Items.h:13
ObjectDesc::uFlags
int16_t uFlags
Definition: ObjectList.h:27
SpriteObject::spell_id
int spell_id
Definition: SpriteObject.h:228
ObjectDesc::uHeight
int16_t uHeight
Definition: ObjectList.h:26
stru141_actor_collision_object::field_70
int field_70
Definition: Indoor.h:169
ParticleType_Line
@ ParticleType_Line
Definition: ParticleEngine.h:11
fixpoint_mul
__int64 fixpoint_mul(int a1, int a2)
Definition: OurMath.cpp:138
stru141_actor_collision_object::height
int height
Definition: Indoor.h:154
pActors
std::array< Actor, 500 > pActors
Definition: Actor.cpp:38
Particle_sw
Definition: ParticleEngine.h:18
_46EF01_collision_chech_player
int _46EF01_collision_chech_player(int a1)
Definition: Render.cpp:4790
OBJECT_DESC_TRIAL_LINE
@ OBJECT_DESC_TRIAL_LINE
Definition: ObjectList.h:16
ObjectDesc::NoSprite
bool NoSprite() const
Definition: ObjectList.h:21
Particle_sw::y
float y
Definition: ParticleEngine.h:21
Particle_sw::g
float g
Definition: ParticleEngine.h:24
OBJECT_DESC_NO_SPRITE
@ OBJECT_DESC_NO_SPRITE
Definition: ObjectList.h:6
_46E26D_collide_against_sprites
void _46E26D_collide_against_sprites(int a1, int a2)
Definition: Sprites.cpp:447
MonsterDesc::uToHitRadius
int16_t uToHitRadius
Definition: Monsters.h:217
MapInfo
Definition: MapInfo.h:35
pCurrentMapName
String pCurrentMapName
Definition: mm7_data.cpp:712
SPEECH_6
@ SPEECH_6
Definition: Player.h:52
ParticleEngine::AddParticle
void AddParticle(Particle_sw *a2)
Definition: ParticleEngine.cpp:65
DMGT_ELECTR
@ DMGT_ELECTR
Definition: Items.h:12
OBJECT_DESC_TRIAL_PARTICLE
@ OBJECT_DESC_TRIAL_PARTICLE
Definition: ObjectList.h:14
DMGT_BODY
@ DMGT_BODY
Definition: Items.h:19
SpellFxRenderer::effpar03
Texture * effpar03
Definition: SpellFxRenderer.h:168
_46E44E_collide_against_faces_and_portals
int _46E44E_collide_against_faces_and_portals(unsigned int b1)
Definition: Render.cpp:4350
SpriteObject::Create
int Create(int yaw, int pitch, int a4, int a5)
Definition: SpriteObject.cpp:56
SpriteObject::containing_item
struct ItemGen containing_item
Definition: SpriteObject.h:227
OBJECT_Player
@ OBJECT_Player
Definition: Actor.h:68
SpriteObject::field_64
Vec3_int_ field_64
Definition: SpriteObject.h:237
Party::bTurnBasedModeOn
bool bTurnBasedModeOn
Definition: Party.h:305
SpriteObject::uSoundID
unsigned __int16 uSoundID
Definition: SpriteObject.h:221
MonsterList::pMonsters
struct MonsterDesc * pMonsters
Definition: Monsters.h:237
ObjectDesc::uParticleTrailColorB
uint8_t uParticleTrailColorB
Definition: ObjectList.h:34
uNumSpriteObjects
size_t uNumSpriteObjects
Definition: SpriteObject.cpp:33
stru193_math::Atan2
unsigned int Atan2(int x, int y)
Definition: OurMath.cpp:46
SPRITE_NULL
@ SPRITE_NULL
Definition: SpriteObject.h:6
stru141_actor_collision_object::field_84
int field_84
Definition: Indoor.h:174
ObjectDesc::uParticleTrailColorG
uint8_t uParticleTrailColorG
Definition: ObjectList.h:33
SpriteObject::spell_level
int spell_level
Definition: SpriteObject.h:229
ParticleType_8
@ ParticleType_8
Definition: ParticleEngine.h:9
stru141_actor_collision_object::prolly_normal_d
int prolly_normal_d
Definition: Indoor.h:152
Particle_sw::texture
Texture * texture
Definition: ParticleEngine.h:28
pMonsterList
struct MonsterList * pMonsterList
Definition: Monsters.cpp:9
SpriteObject::spell_target_pid
int spell_target_pid
Definition: SpriteObject.h:233
integer_sqrt
int integer_sqrt(int val)
Definition: OurMath.cpp:164
spell_fx_renderer
static SpellFxRenderer * spell_fx_renderer
Definition: SpriteObject.cpp:30
uint
unsigned int uint
Definition: MM7.h:4
__debugbreak
void __cdecl __debugbreak(void)
BSPModel::pFaces
std::vector< ODMFace > pFaces
Definition: BSPModel.h:190
ODMFace
Definition: BSPModel.h:93
stru141_actor_collision_object::direction
Vec3_int_ direction
Definition: Indoor.h:165
SpriteObject::spell_skill
int spell_skill
Definition: SpriteObject.h:230
Particle_sw::particle_size
float particle_size
Definition: ParticleEngine.h:30
ParticleType_Rotating
@ ParticleType_Rotating
Definition: ParticleEngine.h:8
stru193_math::Cos
int Cos(int angle)
Definition: OurMath.cpp:28
stru_5C6E00
struct stru193_math * stru_5C6E00
Definition: mm7_data.cpp:19
ODM_GetFloorLevel
int ODM_GetFloorLevel(int X, signed int Y, int Z, int __unused, bool *pIsOnWater, int *bmodel_pid, int bWaterWalk)
Definition: Outdoor.cpp:1877
BSPVertexBuffer::pVertices
Vec3_int_ * pVertices
Definition: BSPModel.h:53
IndoorLocation::pVertices
struct Vec3_short_ * pVertices
Definition: Indoor.h:628
Particle_sw::x
float x
Definition: ParticleEngine.h:20
SoundID
SoundID
Definition: AudioPlayer.h:10
EventProcessor
void EventProcessor(int uEventID, int targetObj, int canShowMessages, int entry_line)
Definition: Events.cpp:260
stru_721530
stru141_actor_collision_object stru_721530
Definition: Indoor.cpp:58
SpriteObject::Create_Splash_Object
static void Create_Splash_Object(int x, int y, int z)
Definition: SpriteObject.cpp:993
IndoorLocation::GetSector
int GetSector(int sX, int sY, int sZ)
Definition: Indoor.cpp:1279
IndoorLocation::pFaces
struct BLVFace * pFaces
Definition: Indoor.h:630
OBJECT_DESC_TRIAL_FIRE
@ OBJECT_DESC_TRIAL_FIRE
Definition: ObjectList.h:15
ObjectList::pObjects
struct ObjectDesc * pObjects
Definition: ObjectList.h:54
stru193_math::Sin
int Sin(int angle)
Definition: OurMath.cpp:133
pAudioPlayer
AudioPlayer * pAudioPlayer
Definition: AudioPlayer.cpp:20
SpriteObject::OnInteraction
static void OnInteraction(unsigned int uLayingItemID)
Definition: SpriteObject.cpp:872
stru141_actor_collision_object::CalcMovementExtents
int CalcMovementExtents(int a2)
Definition: Indoor.cpp:5697
BSPModel
Definition: BSPModel.h:163
ParticleType_Bitmap
@ ParticleType_Bitmap
Definition: ParticleEngine.h:12
ObjectDesc::uParticleTrailColorR
uint8_t uParticleTrailColorR
Definition: ObjectList.h:32
pOutdoor
OutdoorLocation * pOutdoor
Definition: Outdoor.cpp:48
SpriteObject::uAttributes
unsigned __int16 uAttributes
Definition: SpriteObject.h:222
_46E0B2_collide_against_decorations
void _46E0B2_collide_against_decorations()
Definition: Render.cpp:4855
IsTerrainSlopeTooHigh
bool IsTerrainSlopeTooHigh(int pos_x, int pos_z)
Definition: Outdoor.cpp:3976
stru141_actor_collision_object::position
Vec3_int_ position
Definition: Indoor.h:160
_46F04E_collide_against_portals
int _46F04E_collide_against_portals()
Definition: Render.cpp:4895
stru262_TurnBased::pending_actions
int pending_actions
Definition: TurnEngine.h:81
stru141_actor_collision_object::velocity
Vec3_int_ velocity
Definition: Indoor.h:158
BLV_GetFloorLevel
int BLV_GetFloorLevel(int x, int y, int z, unsigned int uSectorID, unsigned int *pFaceID)
Definition: Indoor.cpp:2530
pEventTimer
Timer * pEventTimer
Definition: Time.cpp:8
BLVFace::uAttributes
unsigned int uAttributes
Definition: Indoor.h:475
GameTime
Definition: Time.h:14
ItemsTable::uAllItemsCount
int uAllItemsCount
Definition: Items.h:459
pObjectList
struct ObjectList * pObjectList
Definition: ObjectList.cpp:5
GameTime::FromSeconds
static GameTime FromSeconds(int seconds)
Definition: Time.h:83
ItemsTable::pItems
NZIArray< ItemDesc, 800 > pItems
Definition: Items.h:460
SpriteObject::field_22_glow_radius_multiplier
__int16 field_22_glow_radius_multiplier
Definition: SpriteObject.h:226
SpriteObject::spell_caster_pid
int spell_caster_pid
Definition: SpriteObject.h:232
stru141_actor_collision_object::pid
unsigned int pid
Definition: Indoor.h:171
BLVFace::uFaceExtraID
uint16_t uFaceExtraID
Definition: Indoor.h:482
SpellFxRenderer::effpar01
Texture * effpar01
Definition: SpellFxRenderer.h:166
SOUND_splash
@ SOUND_splash
Definition: AudioPlayer.h:86
Particle_sw::uDiffuse
unsigned int uDiffuse
Definition: ParticleEngine.h:26