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

#include <Actor.h>

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

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

 stru319 ()
 
int which_player_to_attack (struct Actor *pActor)
 
int _427546 (int a2)
 
int FindClosestActor (int a2, int a3, int a4)
 

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

char field_0
 
Visvis = nullptr
 

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

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

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

◆ stru319()

stru319::stru319 ( )
inline

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

14  {
15  this->vis = EngineIoc::ResolveVis();
16  }

Перекрестные ссылки Engine_::IocContainer::ResolveVis() и vis.

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

Методы

◆ which_player_to_attack()

int stru319::which_player_to_attack ( struct Actor pActor)

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

3754  {
3755  signed int v2; // ebx@1
3756  bool flag; // edi@37
3757  int v22; // [sp+8h] [bp-140h]@3
3758  int Victims_list[60]; // [sp+48h] [bp-100h]@48
3759  int for_sex; // [sp+13Ch] [bp-Ch]@1
3760  int for_race; // [sp+140h] [bp-8h]@1
3761  int for_class; // [sp+144h] [bp-4h]@1
3762 
3763  for_class = -1;
3764  for_race = -1;
3765  for_sex = -1;
3766  v2 = 0;
3767  if (pActor->pMonsterInfo.uAttackPreference) {
3768  for (uint i = 0; i < 16; i++) {
3769  v22 = pActor->pMonsterInfo.uAttackPreference & (1 << i);
3770  if (v22) {
3771  switch (v22) {
3772  case 1:
3773  for_class = 0;
3774  break;
3775  case 2:
3776  for_class = 12;
3777  break;
3778  case 4:
3779  for_class = 16;
3780  break;
3781  case 8:
3782  for_class = 28;
3783  break;
3784  case 16:
3785  for_class = 24;
3786  break;
3787  case 32:
3788  for_class = 32;
3789  break;
3790  case 64:
3791  for_class = 20;
3792  break;
3793  case 128:
3794  for_class = 4;
3795  break;
3796  case 256:
3797  for_class = 8;
3798  break;
3799  case 512:
3800  for_sex = 0;
3801  break;
3802  case 1024:
3803  for_sex = 1;
3804  break;
3805  case 2048:
3806  for_race = 0;
3807  break;
3808  case 4096:
3809  for_race = 1;
3810  break;
3811  case 8192:
3812  for_race = 3;
3813  break;
3814  case 16384:
3815  for_race = 2;
3816  break;
3817  }
3818  v2 = 0;
3819  for (uint j = 0; j < 4; ++j) {
3820  flag = 0;
3821  if (for_class != -1 &&
3822  for_class == pPlayers[j + 1]->classType)
3823  flag = true;
3824  if (for_sex != -1 && for_sex == pPlayers[j + 1]->uSex)
3825  flag = true;
3826  if (for_race != -1 &&
3827  for_race == pPlayers[j + 1]->GetRace())
3828  flag = true;
3829  if (flag == true) {
3830  if (!(pPlayers[j + 1]
3831  ->conditions_times[Condition_Paralyzed] ||
3832  pPlayers[j + 1]
3833  ->conditions_times[Condition_Unconcious] ||
3834  pPlayers[j + 1]
3835  ->conditions_times[Condition_Dead] ||
3836  pPlayers[j + 1]
3837  ->conditions_times[Condition_Pertified] ||
3838  pPlayers[j + 1]
3839  ->conditions_times[Condition_Eradicated]))
3840  Victims_list[v2++] = j;
3841  }
3842  }
3843  }
3844  }
3845  if (v2) return Victims_list[rand() % v2];
3846  }
3847  for (uint i = 0; i < 4; ++i) {
3848  if (!(pPlayers[i + 1]->conditions_times[Condition_Paralyzed] ||
3849  pPlayers[i + 1]->conditions_times[Condition_Unconcious] ||
3850  pPlayers[i + 1]->conditions_times[Condition_Dead] ||
3851  pPlayers[i + 1]->conditions_times[Condition_Pertified] ||
3852  pPlayers[i + 1]->conditions_times[Condition_Eradicated]))
3853  Victims_list[v2++] = i;
3854  }
3855  if (v2)
3856  return Victims_list[rand() % v2];
3857  else
3858  return 0;
3859 }

Перекрестные ссылки Condition_Dead, Condition_Eradicated, Condition_Paralyzed, Condition_Pertified, Condition_Unconcious, Actor::pMonsterInfo, pPlayers и MonsterInfo::uAttackPreference.

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

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

◆ _427546()

int stru319::_427546 ( int  a2)

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

3862  {
3863  int result; // eax@2
3864 
3865  if (a2 >= 0) {
3866  if (a2 >= 1)
3867  result = (a2 >= 2) + 2;
3868  else
3869  result = 1;
3870  } else {
3871  result = 0;
3872  }
3873  return result;
3874 }

Используется в CastSpellInfoHelpers::_427E01_cast_spell() и Actor::AI_SpellAttack().

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

◆ FindClosestActor()

int stru319::FindClosestActor ( int  a2,
int  a3,
int  a4 
)

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

3876  {
3877  int v4; // edi@1
3878  stru319 *v5; // esi@1
3879  int v6; // eax@2
3880  int v7; // eax@4
3881  // int result; // eax@5
3882  // int *v9; // edx@8
3883  // signed int v10; // ebx@10
3884  // int v11; // edi@11
3885  // Actor *v12; // esi@12
3886  // unsigned __int16 v13; // ax@12
3887  // int v14; // eax@22
3888  // char v15; // zf@30
3889  // int v16; // esi@32
3890  // int v17; // ecx@34
3891  // stru319 *v18; // eax@39
3892  // int v19; // edx@39
3893  // int v20; // ecx@41
3894  // unsigned __int16 v21; // ax@42
3895  // unsigned int v22; // [sp+8h] [bp-24h]@11
3896  // unsigned int v23; // [sp+Ch] [bp-20h]@7
3897  stru319 *v24; // [sp+10h] [bp-1Ch]@1
3898  // unsigned int v25; // [sp+14h] [bp-18h]@8
3899  // int *v26; // [sp+18h] [bp-14h]@8
3900  // int v27; // [sp+1Ch] [bp-10h]@10
3901  // int *v28; // [sp+20h] [bp-Ch]@10
3902  // unsigned int v29; // [sp+24h] [bp-8h]@7
3903  // int v30; // [sp+28h] [bp-4h]@6
3904  // int i; // [sp+38h] [bp+Ch]@33
3905  // signed int v32; // [sp+3Ch] [bp+10h]@32
3906 
3907  v4 = 0;
3908  v5 = this;
3909  v24 = this;
3910  // if ( render->pRenderD3D )
3911  {
3912  v6 = a3 != 0;
3913  if (a4) v6 |= 8;
3914  v7 = vis->PickClosestActor(OBJECT_Actor, pick_depth, v6, 657456, -1);
3915  if (v7 != -1)
3916  return (unsigned __int16)v7;
3917  else
3918  return 0;
3919  }
3920  /*else // software impl
3921  {
3922  v30 = 0;
3923  if ( render->pActiveZBuffer )
3924  {
3925  if ( (signed int)viewparams->uScreen_topL_Y < (signed
3926  int)viewparams->uScreen_BttmR_Y )
3927  {
3928  v9 = &render->pActiveZBuffer[viewparams->uScreen_topL_X + 640 *
3929  viewparams->uScreen_topL_Y]; v26 =
3930  &render->pActiveZBuffer[viewparams->uScreen_topL_X + 640 *
3931  viewparams->uScreen_topL_Y]; for ( v25 = viewparams->uScreen_BttmR_Y -
3932  viewparams->uScreen_topL_Y; v25; --v25 )
3933  {
3934  if ( (signed int)viewparams->uScreen_topL_X < (signed
3935  int)viewparams->uScreen_BttmR_X )
3936  {
3937  v28 = v9;
3938  v10 = v4;
3939  for ( v27 = viewparams->uScreen_BttmR_X - viewparams->uScreen_topL_X; v27;
3940  --v27 )
3941  {
3942  v22 = *v28;
3943  v11 = *v28 & 0xFFFF;
3944  if (PID_TYPE(v11) == OBJECT_Actor)
3945  {
3946  if ( pActors[PID_ID(v11)].uAIState != Dead )
3947  {
3948  if ( pActors[PID_ID(v11)].uAIState != Dying && pActors[PID_ID(v11)].uAIState
3949  != Removed
3950  && pActors[PID_ID(v11)].uAIState != Summoned &&
3951  pActors[PID_ID(v11)].uAIState != Disabled
3952  && (!a3 || pActors[PID_ID(v11)].GetActorsRelation(0)) )
3953  {
3954  if ( (!a4 ||
3955  MonsterStats::BelongsToSupertype(pActors[PID_ID(v11)].pMonsterInfo.uID,
3956  MONSTER_SUPERTYPE_UNDEAD))
3957  && v22 <= pick_depth << 16 )
3958  {
3959  v14 = 0;
3960  if ( v10 > 0 )
3961  {
3962  for ( v14; v14 < v30; ++v14 )
3963  {
3964  if ( dword_50BDA0[v14] == v11 )
3965  break;
3966  }
3967  }
3968  if ( v14 == v30 && v10 < 100 )
3969  {
3970  ++v30;
3971  dword_50BC10[v10] = v22;
3972  dword_50BDA0[v10] = v11;
3973  ++v10;
3974  }
3975  }
3976  }
3977  }
3978  }
3979  ++v28;
3980  }
3981  v4 = v30;
3982  v5 = v24;
3983  }
3984  v9 = v26 + 640;
3985  v26 += 640;
3986  }
3987  }
3988  if ( v4 > 0 )
3989  {
3990  v16 = (int)dword_50BC10.data();
3991  for ( v32 = 1; v32 - 1 < v4; ++v32 )
3992  {
3993  for ( i = v32; i < v4; ++i )
3994  {
3995  v17 = dword_50BC10[i];
3996  if ( dword_50BC10[i] < *(int *)v16 )
3997  {
3998  dword_50BC10[i] = *(int *)v16;
3999  *(int *)v16 = v17;
4000  }
4001  }
4002  v16 += 4;
4003  }
4004  v5 = v24;
4005  if ( v4 > 0 )
4006  {
4007  v18 = v24;
4008  for ( v19 = v4; v19; --v19 )
4009  {
4010  *(int *)&v18->field_0 = (*(int *)&v18[(char *)dword_50BC10.data() - (char
4011  *)v24].field_0 >> 3) & 0x1FFF; v18 += 4;
4012  }
4013  }
4014  }
4015  v20 = 0;
4016  for ( *(int *)&v5[2000].field_0 = v4; v20 < v4; ++v20 )
4017  {
4018  v21 = pActors[*(int *)&v5[4 * v20].field_0].uAIState;
4019  if ( v21 != 4 && v21 != 5 )
4020  break;
4021  }
4022  if ( v20 != v4 )
4023  {
4024  result = 8 * *(int *)&v5[4 * v20].field_0;
4025  LOBYTE(result) = result | 3;
4026  return result;
4027  }
4028  }
4029  }
4030  return 0;*/
4031 }

Перекрестные ссылки OBJECT_Actor, Vis::PickClosestActor() и vis.

Используется в CastSpellInfoHelpers::_427E01_cast_spell() и Player::_42ECB5_PlayerAttacksActor().

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

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

◆ field_0

char stru319::field_0

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

◆ vis

Vis* stru319::vis = nullptr

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

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


Объявления и описания членов структур находятся в файлах:
MonsterInfo::uAttackPreference
unsigned int uAttackPreference
Definition: Monsters.h:180
Condition_Paralyzed
@ Condition_Paralyzed
Definition: Conditions.h:20
pPlayers
NZIArray< struct Player *, 5 > pPlayers
Definition: Player.cpp:46
result
GLuint64EXT * result
Definition: SDL_opengl_glext.h:9435
OBJECT_Actor
@ OBJECT_Actor
Definition: Actor.h:67
Engine_::IocContainer::ResolveVis
static Vis * ResolveVis()
Definition: IocContainer.cpp:110
stru319::vis
Vis * vis
Definition: Actor.h:24
Condition_Dead
@ Condition_Dead
Definition: Conditions.h:22
Vis::PickClosestActor
unsigned short PickClosestActor(int object_id, unsigned int pick_depth, int a4, int a5, int a6)
Definition: Vis.cpp:403
stru319
Definition: Actor.h:13
v2
GLfloat GLfloat GLfloat v2
Definition: SDL_opengl_glext.h:695
uint
unsigned int uint
Definition: MM7.h:4
Condition_Unconcious
@ Condition_Unconcious
Definition: Conditions.h:21
Condition_Eradicated
@ Condition_Eradicated
Definition: Conditions.h:24
Condition_Pertified
@ Condition_Pertified
Definition: Conditions.h:23
Actor::pMonsterInfo
struct MonsterInfo pMonsterInfo
Definition: Actor.h:292