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

#include <Monsters.h>

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

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

void Initialize ()
 
void InitializePlacements ()
 
signed int FindMonsterByTextureName (const char *Str2)
 

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

static bool BelongsToSupertype (unsigned int uMonsterInfoID, enum MONSTER_SUPERTYPE eSupertype)
 

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

MonsterInfo pInfos [265]
 
char * pPlaceStrings [31]
 
unsigned int uNumMonsters
 
unsigned int uNumPlacements
 
int field_5B9C
 

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

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

Методы

◆ Initialize()

void MonsterStats::Initialize ( )

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

491  {
492  int i; // ,j;
493  char *test_string;
494  unsigned char c;
495  bool break_loop;
496  unsigned int temp_str_len;
497  char *tmp_pos;
498  int decode_step;
499  // int item_counter;
500  int curr_rec_num;
501  char parse_str[64];
502  // char Src[120];
503  FrameTableTxtLine parsed_field;
504  String str;
505 
506  free(pMonstersTXT_Raw);
507  pMonstersTXT_Raw = (char *)pEvents_LOD->LoadCompressedTexture("monsters.txt");
508  strtok(pMonstersTXT_Raw, "\r");
509  strtok(NULL, "\r");
510  strtok(NULL, "\r");
511  strtok(NULL, "\r");
512  uNumMonsters = 265;
513  curr_rec_num = 0;
514  for (i = 0; i < uNumMonsters - 1; ++i) {
515  test_string = strtok(NULL, "\r") + 1;
516  break_loop = false;
517  decode_step = 0;
518  do {
519  c = *(unsigned char *)test_string;
520  temp_str_len = 0;
521  while ((c != '\t') && (c > 0)) {
522  ++temp_str_len;
523  c = test_string[temp_str_len];
524  }
525  tmp_pos = test_string + temp_str_len;
526  if (*tmp_pos == 0) break_loop = true;
527  *tmp_pos = 0;
528  if (temp_str_len) {
529  switch (decode_step) {
530  case 0:
531  curr_rec_num = atoi(test_string);
532  pInfos[curr_rec_num].uID = curr_rec_num;
533  break;
534  case 1:
535  pInfos[curr_rec_num].pName = RemoveQuotes(test_string);
536  break;
537  case 2:
538  pInfos[curr_rec_num].pPictureName =
539  RemoveQuotes(test_string);
540  break;
541  case 3:
542  pInfos[curr_rec_num].uLevel = atoi(test_string);
543  break;
544  case 4: {
545  int str_len = 0;
546  int str_pos = 0;
547  pInfos[curr_rec_num].uHP = 0;
548  if (test_string[0] == '"') test_string[0] = ' ';
549  str_len = strlen(test_string);
550  if (str_len == 0) break;
551  while ((test_string[str_pos] != ',') &&
552  (str_pos < str_len))
553  ++str_pos;
554  if (str_len == str_pos) {
555  pInfos[curr_rec_num].uHP = atoi(test_string);
556  } else {
557  test_string[str_pos] = '\0';
558  pInfos[curr_rec_num].uHP = 1000 * atoi(test_string);
559  pInfos[curr_rec_num].uHP +=
560  atoi(&test_string[str_pos + 1]);
561  test_string[str_pos] = ',';
562  }
563  } break;
564  case 5:
565  pInfos[curr_rec_num].uAC = atoi(test_string);
566  break;
567  case 6: {
568  int str_len = 0;
569  int str_pos = 0;
570  pInfos[curr_rec_num].uExp = 0;
571  if (test_string[0] == '"') test_string[0] = ' ';
572  str_len = strlen(test_string);
573  if (str_len == 0) break;
574  while ((test_string[str_pos] != ',') &&
575  (str_pos < str_len))
576  ++str_pos;
577  if (str_len == str_pos) {
578  pInfos[curr_rec_num].uExp = atoi(test_string);
579  } else {
580  test_string[str_pos] = '\0';
581  pInfos[curr_rec_num].uExp =
582  1000 * atoi(test_string);
583  pInfos[curr_rec_num].uExp +=
584  atoi(&test_string[str_pos + 1]);
585  test_string[str_pos] = ',';
586  }
587  } break;
588  case 7: {
589  int str_len = 0;
590  int str_pos = 0;
591  bool chance_flag = false;
592  bool dice_flag = false;
593  bool item_type_flag = false;
594  char *item_name;
595  pInfos[curr_rec_num].uTreasureDropChance = 0;
596  pInfos[curr_rec_num].uTreasureDiceRolls = 0;
597  pInfos[curr_rec_num].uTreasureDiceSides = 0;
598  pInfos[curr_rec_num].uTreasureType = 0;
599  pInfos[curr_rec_num].uTreasureLevel = 0;
600  if (test_string[0] == '"') test_string[0] = ' ';
601  str_len = strlen(test_string);
602  do {
603  switch (tolower(test_string[str_pos])) {
604  case '%':
605  chance_flag = true;
606  break;
607  case 'd':
608  dice_flag = true;
609  break;
610  case 'l':
611  item_type_flag = true;
612  break;
613  }
614  ++str_pos;
615  } while (str_pos < str_len);
616  if (chance_flag) {
617  pInfos[curr_rec_num].uTreasureDropChance =
618  atoi(test_string);
619  } else {
620  if ((!dice_flag) && (!item_type_flag)) break;
621  pInfos[curr_rec_num].uTreasureDropChance = 100;
622  }
623  if (dice_flag) {
624  str_pos = 0;
625  dice_flag = false;
626  do {
627  switch (tolower(test_string[str_pos])) {
628  case '%':
629  pInfos[curr_rec_num]
631  atoi(&test_string[str_pos + 1]);
632  dice_flag = true;
633  break;
634  case 'd':
635  if (!dice_flag)
636  pInfos[curr_rec_num]
638  atoi(test_string);
639  pInfos[curr_rec_num]
641  atoi(&test_string[str_pos + 1]);
642  str_pos = str_len;
643  break;
644  }
645  ++str_pos;
646  } while (str_pos < str_len);
647  }
648  if (item_type_flag) {
649  str_pos = 0;
650  do {
651  if (tolower(test_string[str_pos]) == 'l') break;
652  ++str_pos;
653  } while (str_pos < str_len);
654 
655  pInfos[curr_rec_num].uTreasureLevel =
656  test_string[str_pos + 1] - '0';
657  item_name = &test_string[str_pos + 2];
658  if (*item_name) {
659  if (!_stricmp(item_name, "WEAPON"))
660  pInfos[curr_rec_num].uTreasureType = 20;
661  else if (!_stricmp(item_name, "ARMOR"))
662  pInfos[curr_rec_num].uTreasureType = 21;
663  else if (!_stricmp(item_name, "MISC"))
664  pInfos[curr_rec_num].uTreasureType = 22;
665  else if (!_stricmp(item_name, "SWORD"))
666  pInfos[curr_rec_num].uTreasureType = 23;
667  else if (!_stricmp(item_name, "DAGGER"))
668  pInfos[curr_rec_num].uTreasureType = 24;
669  else if (!_stricmp(item_name, "AXE"))
670  pInfos[curr_rec_num].uTreasureType = 25;
671  else if (!_stricmp(item_name, "SPEAR"))
672  pInfos[curr_rec_num].uTreasureType = 26;
673  else if (!_stricmp(item_name, "BOW"))
674  pInfos[curr_rec_num].uTreasureType = 27;
675  else if (!_stricmp(item_name, "MACE"))
676  pInfos[curr_rec_num].uTreasureType = 28;
677  else if (!_stricmp(item_name, "CLUB"))
678  pInfos[curr_rec_num].uTreasureType = 29;
679  else if (!_stricmp(item_name, "STAFF"))
680  pInfos[curr_rec_num].uTreasureType = 30;
681  else if (!_stricmp(item_name, "LEATHER"))
682  pInfos[curr_rec_num].uTreasureType = 31;
683  else if (!_stricmp(item_name, "CHAIN"))
684  pInfos[curr_rec_num].uTreasureType = 32;
685  else if (!_stricmp(item_name, "PLATE"))
686  pInfos[curr_rec_num].uTreasureType = 33;
687  else if (!_stricmp(item_name, "SHIELD"))
688  pInfos[curr_rec_num].uTreasureType = 34;
689  else if (!_stricmp(item_name, "HELM"))
690  pInfos[curr_rec_num].uTreasureType = 35;
691  else if (!_stricmp(item_name, "BELT"))
692  pInfos[curr_rec_num].uTreasureType = 36;
693  else if (!_stricmp(item_name, "CAPE"))
694  pInfos[curr_rec_num].uTreasureType = 37;
695  else if (!_stricmp(item_name, "GAUNTLETS"))
696  pInfos[curr_rec_num].uTreasureType = 38;
697  else if (!_stricmp(item_name, "BOOTS"))
698  pInfos[curr_rec_num].uTreasureType = 39;
699  else if (!_stricmp(item_name, "RING"))
700  pInfos[curr_rec_num].uTreasureType = 40;
701  else if (!_stricmp(item_name, "AMULET"))
702  pInfos[curr_rec_num].uTreasureType = 41;
703  else if (!_stricmp(item_name, "WAND"))
704  pInfos[curr_rec_num].uTreasureType = 42;
705  else if (!_stricmp(item_name, "SCROLL"))
706  pInfos[curr_rec_num].uTreasureType = 43;
707  else if (!_stricmp(item_name, "GEM"))
708  pInfos[curr_rec_num].uTreasureType = 46;
709  }
710  }
711  } break;
712  case 8: {
713  pInfos[curr_rec_num].bQuestMonster = 0;
714  if (atoi(test_string))
715  pInfos[curr_rec_num].bQuestMonster = 1;
716  } break;
717  case 9: {
718  pInfos[curr_rec_num].uFlying = false;
719  if (_strnicmp(test_string, "n", 1))
720  pInfos[curr_rec_num].uFlying = true;
721  } break;
722  case 10: {
723  switch (tolower(test_string[0])) {
724  case 's':
725  pInfos[curr_rec_num].uMovementType =
727  if (tolower(test_string[1]) != 'h')
728  pInfos[curr_rec_num].uMovementType =
729  MONSTER_MOVEMENT_TYPE_STAIONARY; // stationary
730  break; // short
731  case 'l':
732  pInfos[curr_rec_num].uMovementType =
734  break; // long
735  case 'm':
736  pInfos[curr_rec_num].uMovementType =
738  break; // med
739  case 'g':
740  pInfos[curr_rec_num].uMovementType =
742  break; // global?
743  default:
744  pInfos[curr_rec_num].uMovementType =
746  }
747  } break;
748  case 11: {
749  switch (tolower(test_string[0])) {
750  case 's':
751  pInfos[curr_rec_num].uAIType = 0;
752  break; // suicide
753  case 'w':
754  pInfos[curr_rec_num].uAIType = 1;
755  break; // wimp
756  case 'n':
757  pInfos[curr_rec_num].uAIType = 2;
758  break; // normal
759  default:
760  pInfos[curr_rec_num].uAIType = 3; // Agress
761  }
762  } break;
763  case 12:
764  pInfos[curr_rec_num].uHostilityType =
765  (MonsterInfo::HostilityRadius)atoi(test_string);
766  break;
767  case 13:
768  pInfos[curr_rec_num].uBaseSpeed = atoi(test_string);
769  break;
770  case 14:
771  pInfos[curr_rec_num].uRecoveryTime = atoi(test_string);
772  break;
773  case 15: {
774  int str_len = 0;
775  int str_pos = 0;
776  pInfos[curr_rec_num].uAttackPreference = 0;
777  pInfos[curr_rec_num]
779  str_len = strlen(test_string);
780  for (str_pos = 0; str_pos < str_len; ++str_pos) {
781  switch (tolower(test_string[str_pos])) {
782  case '0':
783  pInfos[curr_rec_num].uAttackPreference |=
784  0x0004;
785  break;
786  case '2':
787  pInfos[curr_rec_num]
789  2;
790  break;
791  case '3':
792  pInfos[curr_rec_num]
794  3;
795  break;
796  case '4':
797  pInfos[curr_rec_num]
799  4;
800  break;
801  case 'c':
802  pInfos[curr_rec_num].uAttackPreference |=
803  0x0010;
804  break;
805  case 'd':
806  pInfos[curr_rec_num].uAttackPreference |=
807  0x0008;
808  break;
809  case 'e':
810  pInfos[curr_rec_num].uAttackPreference |=
811  0x1000;
812  break;
813  case 'f':
814  pInfos[curr_rec_num].uAttackPreference |=
815  0x0400;
816  break;
817  case 'h':
818  pInfos[curr_rec_num].uAttackPreference |=
819  0x0800;
820  break;
821  case 'k':
822  pInfos[curr_rec_num].uAttackPreference |=
823  0x0001;
824  break;
825  case 'm':
826  pInfos[curr_rec_num].uAttackPreference |=
827  0x0100;
828  break;
829  case 'o':
830  pInfos[curr_rec_num].uAttackPreference |=
831  0x0400;
832  break;
833  case 'p':
834  pInfos[curr_rec_num].uAttackPreference |=
835  0x0002;
836  break;
837  case 'r':
838  pInfos[curr_rec_num].uAttackPreference |=
839  0x0040;
840  break;
841  case 's':
842  pInfos[curr_rec_num].uAttackPreference |=
843  0x0020;
844  break;
845  case 't':
846  pInfos[curr_rec_num].uAttackPreference |=
847  0x0080;
848  break;
849  case 'w':
850  pInfos[curr_rec_num].uAttackPreference |=
851  0x2000;
852  break;
853  case 'x':
854  pInfos[curr_rec_num].uAttackPreference |=
855  0x0200;
856  break;
857  }
858  }
859  } break;
860  case 16: {
861  int str_len = 0;
862  int str_pos = 0;
863  pInfos[curr_rec_num].uSpecialAttackLevel = 1;
864  pInfos[curr_rec_num].uSpecialAttackType =
866  str_len = strlen(test_string);
867  if (str_len > 1) {
868  for (str_pos = 0; str_pos < str_len; ++str_pos) {
869  if (tolower(test_string[str_pos]) == 'x') {
870  test_string[str_pos] = '\0';
871  pInfos[curr_rec_num].uSpecialAttackLevel =
872  atoi(&test_string[str_pos + 1]);
873  test_string[str_pos] = 'x';
874  break;
875  }
876  }
877  pInfos[curr_rec_num].uSpecialAttackType =
879  test_string);
880  }
881  } break;
882  case 17:
883  pInfos[curr_rec_num].uAttack1Type =
884  ParseAttackType(test_string);
885  break;
886  case 18: {
887  ParseDamage(
888  test_string,
889  &pInfos[curr_rec_num].uAttack1DamageDiceRolls,
890  &pInfos[curr_rec_num].uAttack1DamageDiceSides,
891  &pInfos[curr_rec_num].uAttack1DamageBonus);
892  } break;
893  case 19:
894  pInfos[curr_rec_num].uMissleAttack1Type =
895  ParseMissleAttackType(test_string);
896  break;
897  case 20:
898  pInfos[curr_rec_num].uAttack2Chance = atoi(test_string);
899  break;
900  case 21:
901  pInfos[curr_rec_num].uAttack2Type =
902  ParseAttackType(test_string);
903  break;
904  case 22: {
905  ParseDamage(
906  test_string,
907  &pInfos[curr_rec_num].uAttack2DamageDiceRolls,
908  &pInfos[curr_rec_num].uAttack2DamageDiceSides,
909  &pInfos[curr_rec_num].uAttack2DamageBonus);
910  } break;
911  case 23:
912  pInfos[curr_rec_num].uMissleAttack2Type =
913  ParseMissleAttackType(test_string);
914  break;
915  case 24:
916  pInfos[curr_rec_num].uSpell1UseChance =
917  atoi(test_string);
918  break;
919  case 25: {
920  int param_num;
921  char type_flag;
922  strcpy(parse_str, test_string);
923  parse_str[0] = ' ';
924  parse_str[strlen(parse_str) - 1] = ' ';
925  frame_table_txt_parser(parse_str, &parsed_field);
926  if (parsed_field.uPropCount > 2) {
927  param_num = 1;
928  pInfos[curr_rec_num].uSpell1ID =
929  ParseSpellType(&parsed_field, &param_num);
930  type_flag = *parsed_field.pProperties[param_num];
931  pInfos[curr_rec_num].uSpellSkillAndMastery1 =
932  atoi(parsed_field.pProperties[param_num + 1]) &
933  0x003F;
934  switch (type_flag) {
935  case 'E':
936  pInfos[curr_rec_num]
937  .uSpellSkillAndMastery1 |= 0x0040;
938  break;
939  case 'M':
940  pInfos[curr_rec_num]
941  .uSpellSkillAndMastery1 |= 0x0080;
942  break;
943  case 'G':
944  pInfos[curr_rec_num]
945  .uSpellSkillAndMastery1 |= 0x0100;
946  break;
947  }
948  } else {
949  pInfos[curr_rec_num].uSpell1ID = 0;
950  pInfos[curr_rec_num].uSpellSkillAndMastery1 = 0;
951  }
952  } break;
953  case 26:
954  pInfos[curr_rec_num].uSpell2UseChance =
955  atoi(test_string);
956  break;
957  case 27: {
958  int param_num;
959  char type_flag;
960  strcpy(parse_str, test_string);
961  parse_str[0] = ' ';
962  parse_str[strlen(parse_str) - 1] = ' ';
963  frame_table_txt_parser(parse_str, &parsed_field);
964  if (parsed_field.uPropCount > 2) {
965  param_num = 1;
966  pInfos[curr_rec_num].uSpell2ID =
967  ParseSpellType(&parsed_field, &param_num);
968  type_flag = *parsed_field.pProperties[param_num];
969  pInfos[curr_rec_num].uSpellSkillAndMastery2 =
970  atoi(parsed_field.pProperties[param_num + 1]) &
971  0x003F;
972  switch (type_flag) {
973  case 'E':
974  pInfos[curr_rec_num]
975  .uSpellSkillAndMastery2 |= 0x0040;
976  break;
977  case 'M':
978  pInfos[curr_rec_num]
979  .uSpellSkillAndMastery2 |= 0x0080;
980  break;
981  case 'G':
982  pInfos[curr_rec_num]
983  .uSpellSkillAndMastery2 |= 0x0100;
984  break;
985  }
986  } else {
987  pInfos[curr_rec_num].uSpell2ID = 0;
988  pInfos[curr_rec_num].uSpellSkillAndMastery2 = 0;
989  }
990  } break;
991  case 28: {
992  if (tolower(test_string[0]) == 'i')
993  pInfos[curr_rec_num].uResFire = 200;
994  else
995  pInfos[curr_rec_num].uResFire = atoi(test_string);
996  } break;
997  case 29: {
998  if (tolower(test_string[0]) == 'i')
999  pInfos[curr_rec_num].uResAir = 200;
1000  else
1001  pInfos[curr_rec_num].uResAir = atoi(test_string);
1002  } break;
1003  case 30: {
1004  if (tolower(test_string[0]) == 'i')
1005  pInfos[curr_rec_num].uResWater = 200;
1006  else
1007  pInfos[curr_rec_num].uResWater = atoi(test_string);
1008  } break;
1009  case 31: {
1010  if (tolower(test_string[0]) == 'i')
1011  pInfos[curr_rec_num].uResEarth = 200;
1012  else
1013  pInfos[curr_rec_num].uResEarth = atoi(test_string);
1014  } break;
1015  case 32: {
1016  if (tolower(test_string[0]) == 'i')
1017  pInfos[curr_rec_num].uResMind = 200;
1018  else
1019  pInfos[curr_rec_num].uResMind = atoi(test_string);
1020  } break;
1021  case 33: {
1022  if (tolower(test_string[0]) == 'i')
1023  pInfos[curr_rec_num].uResSpirit = 200;
1024  else
1025  pInfos[curr_rec_num].uResSpirit = atoi(test_string);
1026  } break;
1027  case 34: {
1028  if (tolower(test_string[0]) == 'i')
1029  pInfos[curr_rec_num].uResBody = 200;
1030  else
1031  pInfos[curr_rec_num].uResBody = atoi(test_string);
1032  } break;
1033  case 35: {
1034  if (tolower(test_string[0]) == 'i')
1035  pInfos[curr_rec_num].uResLight = 200;
1036  else
1037  pInfos[curr_rec_num].uResLight = atoi(test_string);
1038  } break;
1039  case 36: {
1040  if (tolower(test_string[0]) == 'i')
1041  pInfos[curr_rec_num].uResDark = 200;
1042  else
1043  pInfos[curr_rec_num].uResDark = atoi(test_string);
1044  } break;
1045  case 37: {
1046  if (tolower(test_string[0]) == 'i')
1047  pInfos[curr_rec_num].uResPhysical = 200;
1048  else
1049  pInfos[curr_rec_num].uResPhysical =
1050  atoi(test_string);
1051  } break;
1052  case 38: {
1053  // int param_num;
1054  // char type_flag;
1055  pInfos[curr_rec_num].uSpecialAbilityType = 0;
1056  pInfos[curr_rec_num].uSpecialAbilityDamageDiceBonus = 0;
1057  strcpy(parse_str, test_string);
1058  parse_str[0] = ' ';
1059  parse_str[strlen(parse_str) - 1] = ' ';
1060  frame_table_txt_parser(parse_str, &parsed_field);
1061  if (parsed_field.uPropCount) {
1062  // v74 = v94.field_0;
1063  if (parsed_field.uPropCount < 10) {
1064  if (!_stricmp(parsed_field.pProperties[0],
1065  "shot")) {
1066  pInfos[curr_rec_num].uSpecialAbilityType =
1067  1;
1068  pInfos[curr_rec_num]
1070  (char *)(parsed_field.pProperties[1] +
1071  1));
1072  } else if (!_stricmp(
1073  parsed_field.pProperties[0],
1074  "summon")) {
1075  pInfos[curr_rec_num].uSpecialAbilityType =
1076  2;
1077  if (parsed_field.uPropCount > 1) {
1078  str = parsed_field.pProperties[2];
1079  if (parsed_field.uPropCount > 2) {
1080  int prop_cnt = 3;
1081  if (parsed_field.uPropCount > 3) {
1082  do {
1083  str += " ";
1084  char test_char =
1085  parsed_field.pProperties
1086  [prop_cnt][0];
1087  str +=
1088  parsed_field.pProperties
1089  [prop_cnt];
1090  if (prop_cnt ==
1091  (parsed_field
1092  .uPropCount -
1093  1)) {
1094  switch (tolower(
1095  test_char)) {
1096  case 'a':
1097  pInfos[curr_rec_num]
1099  1;
1100  break;
1101  case 'b':
1102  pInfos[curr_rec_num]
1104  2;
1105  break;
1106  case 'c':
1107  pInfos[curr_rec_num]
1109  3;
1110  break;
1111  default:
1112  pInfos[curr_rec_num]
1114  0;
1115  }
1116  }
1117  ++prop_cnt;
1118  } while (
1119  prop_cnt <
1120  parsed_field.uPropCount);
1121  }
1122  } else {
1123  pInfos[curr_rec_num]
1125  0;
1126  }
1127  if (pMonsterList->uNumMonsters) {
1128  pInfos[curr_rec_num]
1130  pMonsterList
1132  str.c_str()) +
1133  1;
1134  if (pInfos[curr_rec_num]
1135  .field_3C_some_special_attack ==
1136  -1) {
1137  logger->Warning(
1138  L"%S",
1139  StringPrintf(
1140  "Can't create random "
1141  "monster: '%s' See "
1142  "MapStats!",
1143  str.c_str()));
1144  }
1145  }
1146  pInfos[curr_rec_num]
1148  if (!_stricmp(
1149  parsed_field.pProperties[1],
1150  "ground"))
1151  pInfos[curr_rec_num]
1153  1;
1154  if (pInfos[curr_rec_num]
1155  .field_3C_some_special_attack ==
1156  -1)
1157  pInfos[curr_rec_num]
1158  .uSpecialAbilityType = 0;
1159  }
1160  } else if (!_stricmp(
1161  parsed_field.pProperties[0],
1162  "explode")) {
1163  pInfos[curr_rec_num].uSpecialAbilityType =
1164  3;
1165  ParseDamage(
1166  (char *)parsed_field.pProperties[1],
1167  &pInfos[curr_rec_num]
1169  &pInfos[curr_rec_num]
1171  &pInfos[curr_rec_num]
1173  pInfos[curr_rec_num]
1175  ParseAttackType(test_string);
1176  }
1177  }
1178  }
1179  } break;
1180  }
1181  } else {
1182  break_loop = true;
1183  }
1184  ++decode_step;
1185  test_string = tmp_pos + 1;
1186  } while ((decode_step < 39) && !break_loop);
1187  }
1188  uNumMonsters = i;
1189 }

Перекрестные ссылки MonsterInfo::bQuestMonster, MonsterInfo::field_3C_some_special_attack, frame_table_txt_parser(), MonsterList::GetMonsterIDByName(), LOD::File::LoadCompressedTexture(), logger, MONSTER_MOVEMENT_TYPE_FREE, MONSTER_MOVEMENT_TYPE_GLOBAL, MONSTER_MOVEMENT_TYPE_LONG, MONSTER_MOVEMENT_TYPE_MEDIUM, MONSTER_MOVEMENT_TYPE_SHORT, MONSTER_MOVEMENT_TYPE_STAIONARY, ParseAttackType(), ParseDamage(), ParseMissleAttackType(), ParseSpecialAttack(), ParseSpellType(), pEvents_LOD, pInfos, pMonsterList, pMonstersTXT_Raw, MonsterInfo::pName, MonsterInfo::pPictureName, FrameTableTxtLine::pProperties, RemoveQuotes(), StringPrintf(), MonsterInfo::uAC, MonsterInfo::uAIType, MonsterInfo::uAttack1Type, MonsterInfo::uAttack2Chance, MonsterInfo::uAttack2Type, MonsterInfo::uAttackPreference, MonsterInfo::uBaseSpeed, MonsterInfo::uExp, MonsterInfo::uFlying, MonsterInfo::uHostilityType, MonsterInfo::uHP, MonsterInfo::uID, MonsterInfo::uLevel, MonsterInfo::uMissleAttack1Type, MonsterInfo::uMissleAttack2Type, MonsterInfo::uMovementType, MonsterInfo::uNumCharactersAttackedPerSpecialAbility, uNumMonsters, MonsterList::uNumMonsters, FrameTableTxtLine::uPropCount, MonsterInfo::uRecoveryTime, MonsterInfo::uResAir, MonsterInfo::uResBody, MonsterInfo::uResDark, MonsterInfo::uResEarth, MonsterInfo::uResFire, MonsterInfo::uResLight, MonsterInfo::uResMind, MonsterInfo::uResPhysical, MonsterInfo::uResSpirit, MonsterInfo::uResWater, MonsterInfo::uSpecialAbilityDamageDiceBonus, MonsterInfo::uSpecialAbilityDamageDiceRolls, MonsterInfo::uSpecialAbilityDamageDiceSides, MonsterInfo::uSpecialAbilityType, MonsterInfo::uSpecialAttackLevel, MonsterInfo::uSpecialAttackType, MonsterInfo::uSpell1ID, MonsterInfo::uSpell1UseChance, MonsterInfo::uSpell2ID, MonsterInfo::uSpell2UseChance, MonsterInfo::uSpellSkillAndMastery1, MonsterInfo::uSpellSkillAndMastery2, MonsterInfo::uTreasureDiceRolls, MonsterInfo::uTreasureDiceSides, MonsterInfo::uTreasureDropChance, MonsterInfo::uTreasureLevel, MonsterInfo::uTreasureType и Log::Warning().

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

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

◆ InitializePlacements()

void MonsterStats::InitializePlacements ( )

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

451  {
452  int i;
453  char *test_string;
454  unsigned char c;
455  bool break_loop;
456  unsigned int temp_str_len;
457  char *tmp_pos;
458  int decode_step;
459  // int item_counter;
460 
462  strtok(pMonsterPlacementTXT_Raw, "\r");
463  for (i = 1; i < 31; ++i) {
464  test_string = strtok(NULL, "\r") + 1;
465  break_loop = false;
466  decode_step = 0;
467  do {
468  c = *(unsigned char *)test_string;
469  temp_str_len = 0;
470  while ((c != '\t') && (c > 0)) {
471  ++temp_str_len;
472  c = test_string[temp_str_len];
473  }
474  tmp_pos = test_string + temp_str_len;
475  if (*tmp_pos == 0) break_loop = true;
476  *tmp_pos = 0;
477  if (temp_str_len) {
478  if (decode_step == 1)
479  pPlaceStrings[i] = RemoveQuotes(test_string);
480  } else {
481  break_loop = true;
482  }
483  ++decode_step;
484  test_string = tmp_pos + 1;
485  } while ((decode_step < 3) && !break_loop);
486  }
487  uNumPlacements = 31;
488 }

Перекрестные ссылки LOD::File::LoadCompressedTexture(), pEvents_LOD, pMonsterPlacementTXT_Raw, pPlaceStrings, RemoveQuotes() и uNumPlacements.

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

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

◆ FindMonsterByTextureName()

signed int MonsterStats::FindMonsterByTextureName ( const char *  Str2)

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

441  {
442  for (int i = 1; i < uNumMonsters; ++i) {
443  if ((pInfos[i].pName) &&
444  (!_stricmp(pInfos[i].pPictureName, monster_textr_name)))
445  return i;
446  }
447  return -1;
448 }

Перекрестные ссылки pInfos и uNumMonsters.

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

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

◆ BelongsToSupertype()

bool MonsterStats::BelongsToSupertype ( unsigned int  uMonsterInfoID,
enum MONSTER_SUPERTYPE  eSupertype 
)
static

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

1201  {
1202  switch (eSupertype) {
1204  if ((signed int)uMonsterInfoID >= MONSTER_GHOST_1 &&
1205  (signed int)uMonsterInfoID <= MONSTER_GHOST_3 // 70<=id<=72
1206  || (signed int)uMonsterInfoID >= MONSTER_LICH_1 &&
1207  (signed int)uMonsterInfoID <= MONSTER_LICH_3 // 91-93
1208  ||
1209  (signed int)uMonsterInfoID >= MONSTER_SKELETON_1 &&
1210  (signed int)uMonsterInfoID <= MONSTER_SKELETON_3 // 199-201
1211  ||
1212  (signed int)uMonsterInfoID >= MONSTER_VAMPIRE_1 &&
1213  (signed int)uMonsterInfoID <= MONSTER_VAMPIRE_3 // 217-219
1214  || (signed int)uMonsterInfoID >= MONSTER_WIGHT_1 &&
1215  (signed int)uMonsterInfoID <= MONSTER_WIGHT_3 // 223-225
1216  ||
1217  (signed int)uMonsterInfoID >= MONSTER_ZOMBIE_1 &&
1218  (signed int)uMonsterInfoID <= MONSTER_ZOMBIE_3 // 229-231
1219  ||
1220  (signed int)uMonsterInfoID >= MONSTER_GHOUL_1 &&
1221  (signed int)uMonsterInfoID <= MONSTER_GHOUL_3) // 256-258
1222  return true;
1223  return false;
1225  if ((signed int)uMonsterInfoID >= MONSTER_DEVIL_1 &&
1226  (signed int)uMonsterInfoID <= MONSTER_DEVIL_3) // 22-24
1227  return true;
1228  return false;
1229  case MONSTER_SUPERTYPE_ELF:
1230  if ((signed int)uMonsterInfoID >= MONSTER_PEASANT_ELF_FEMALE_1_1 &&
1231  (signed int)uMonsterInfoID <=
1232  MONSTER_PEASANT_ELF_MALE_3_3 // 133 - 150
1233  ||
1234  (signed int)uMonsterInfoID >= MONSTER_ELF_ARCHER_1 &&
1235  (signed int)uMonsterInfoID <= MONSTER_ELF_ARCHER_3 // 49-51
1236  || (signed int)uMonsterInfoID >= MONSTER_ELF_SPEARMAN_1 &&
1237  (signed int)uMonsterInfoID <=
1238  MONSTER_ELF_SPEARMAN_3) // 52-54
1239  return true;
1240  return false;
1242  if ((signed int)uMonsterInfoID >= MONSTER_DRAGON_1 &&
1243  (signed int)uMonsterInfoID <= MONSTER_DRAGON_3) // 25-27
1244  return true;
1245  return false;
1247  if ((signed int)uMonsterInfoID >= MONSTER_ELEMENTAL_WATER_1 &&
1248  (signed int)uMonsterInfoID <=
1249  MONSTER_ELEMENTAL_WATER_3) // 46-48
1250  return true;
1251  return false;
1253  if ((signed int)uMonsterInfoID >= MONSTER_TREANT_1 &&
1254  (signed int)uMonsterInfoID <= MONSTER_TREANT_3) // 253-255
1255  return true;
1256  return false;
1258  if ((signed int)uMonsterInfoID >= MONSTER_TITAN_1 &&
1259  (signed int)uMonsterInfoID <= MONSTER_TITAN_3) // 211-213
1260  return true;
1261  return false;
1262  default:
1263  return false;
1264  }
1265  return false;
1266 }

Перекрестные ссылки MONSTER_DEVIL_1, MONSTER_DEVIL_3, MONSTER_DRAGON_1, MONSTER_DRAGON_3, MONSTER_ELEMENTAL_WATER_1, MONSTER_ELEMENTAL_WATER_3, MONSTER_ELF_ARCHER_1, MONSTER_ELF_ARCHER_3, MONSTER_ELF_SPEARMAN_1, MONSTER_ELF_SPEARMAN_3, MONSTER_GHOST_1, MONSTER_GHOST_3, MONSTER_GHOUL_1, MONSTER_GHOUL_3, MONSTER_LICH_1, MONSTER_LICH_3, MONSTER_PEASANT_ELF_FEMALE_1_1, MONSTER_PEASANT_ELF_MALE_3_3, MONSTER_SKELETON_1, MONSTER_SKELETON_3, MONSTER_SUPERTYPE_DRAGON, MONSTER_SUPERTYPE_ELF, MONSTER_SUPERTYPE_KREEGAN, MONSTER_SUPERTYPE_TITAN, MONSTER_SUPERTYPE_TREANT, MONSTER_SUPERTYPE_UNDEAD, MONSTER_SUPERTYPE_WATER_ELEMENTAL, MONSTER_TITAN_1, MONSTER_TITAN_3, MONSTER_TREANT_1, MONSTER_TREANT_3, MONSTER_VAMPIRE_1, MONSTER_VAMPIRE_3, MONSTER_WIGHT_1, MONSTER_WIGHT_3, MONSTER_ZOMBIE_1 и MONSTER_ZOMBIE_3.

Используется в CastSpellInfoHelpers::_427E01_cast_spell(), _46BFFA_update_spell_fx(), Actor::ActorDamageFromMonster(), Actor::AI_Flee(), Actor::AI_Pursue1(), Actor::AI_Pursue2(), Actor::AI_Pursue3(), Actor::AI_RandomMove(), ArenaFight(), Player::CalculateMeleeDmgToEnemyWithWeapon(), Player::CalculateRangedDamageTo(), Actor::DamageMonsterFromParty(), Vis::is_part_of_selection(), ItemDamageFromActor() и UpdateActors_ODM().

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

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

◆ pInfos

◆ pPlaceStrings

char* MonsterStats::pPlaceStrings[31]

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

Используется в GameUI_WritePointedObjectStatusString(), InitializePlacements() и MonsterPopup_Draw().

◆ uNumMonsters

unsigned int MonsterStats::uNumMonsters

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

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

◆ uNumPlacements

unsigned int MonsterStats::uNumPlacements

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

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

◆ field_5B9C

int MonsterStats::field_5B9C

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


Объявления и описания членов структур находятся в файлах:
MonsterInfo::uMissleAttack1Type
uint8_t uMissleAttack1Type
Definition: Monsters.h:139
MONSTER_SUPERTYPE_UNDEAD
@ MONSTER_SUPERTYPE_UNDEAD
Definition: Monsters.h:70
FrameTableTxtLine::uPropCount
int uPropCount
Definition: FrameTableInc.h:12
MONSTER_DEVIL_3
@ MONSTER_DEVIL_3
Definition: Monsters.h:9
FrameTableTxtLine::pProperties
const char * pProperties[30]
Definition: FrameTableInc.h:13
MONSTER_PEASANT_ELF_MALE_3_3
@ MONSTER_PEASANT_ELF_MALE_3_3
Definition: Monsters.h:30
MONSTER_VAMPIRE_3
@ MONSTER_VAMPIRE_3
Definition: Monsters.h:36
MONSTER_GHOST_3
@ MONSTER_GHOST_3
Definition: Monsters.h:20
MONSTER_DEVIL_1
@ MONSTER_DEVIL_1
Definition: Monsters.h:7
MonsterInfo::uSpell2UseChance
uint8_t uSpell2UseChance
Definition: Monsters.h:148
MonsterInfo::uResBody
uint8_t uResBody
Definition: Monsters.h:156
MonsterInfo::uAttackPreference
unsigned int uAttackPreference
Definition: Monsters.h:180
RemoveQuotes
char * RemoveQuotes(char *str)
Definition: Strings.h:17
MONSTER_ELF_SPEARMAN_3
@ MONSTER_ELF_SPEARMAN_3
Definition: Monsters.h:18
MonsterInfo::uBaseSpeed
unsigned int uBaseSpeed
Definition: Monsters.h:178
MONSTER_VAMPIRE_1
@ MONSTER_VAMPIRE_1
Definition: Monsters.h:35
pMonsterPlacementTXT_Raw
char * pMonsterPlacementTXT_Raw
Definition: mm7_data.cpp:678
MONSTER_LICH_1
@ MONSTER_LICH_1
Definition: Monsters.h:24
MonsterInfo::uHostilityType
HostilityRadius uHostilityType
Definition: Monsters.h:131
LOD::File::LoadCompressedTexture
void * LoadCompressedTexture(const String &pContainer, size_t *data_size=nullptr)
Definition: LOD.cpp:921
MonsterInfo::uSpell1ID
uint8_t uSpell1ID
Definition: Monsters.h:147
MONSTER_WIGHT_3
@ MONSTER_WIGHT_3
Definition: Monsters.h:38
MONSTER_SUPERTYPE_KREEGAN
@ MONSTER_SUPERTYPE_KREEGAN
Definition: Monsters.h:71
MonsterInfo::uResDark
uint8_t uResDark
Definition: Monsters.h:158
MonsterInfo::uAC
unsigned int uAC
Definition: Monsters.h:176
MonsterInfo::uResLight
uint8_t uResLight
Definition: Monsters.h:157
MonsterInfo::field_3C_some_special_attack
int16_t field_3C_some_special_attack
Definition: Monsters.h:173
MonsterInfo::uResFire
uint8_t uResFire
Definition: Monsters.h:150
ParseMissleAttackType
int ParseMissleAttackType(const char *missle_attack_str)
Definition: Monsters.cpp:183
MonsterInfo::uAttack2Chance
uint8_t uAttack2Chance
Definition: Monsters.h:140
ParseSpellType
unsigned int ParseSpellType(struct FrameTableTxtLine *tbl, int *next_token)
Definition: Monsters.cpp:20
MonsterInfo::uTreasureType
uint8_t uTreasureType
Definition: Monsters.h:127
MONSTER_MOVEMENT_TYPE_FREE
@ MONSTER_MOVEMENT_TYPE_FREE
Definition: Monsters.h:64
MonsterStats::uNumPlacements
unsigned int uNumPlacements
Definition: Monsters.h:197
MonsterInfo::uSpecialAbilityDamageDiceBonus
uint8_t uSpecialAbilityDamageDiceBonus
Definition: Monsters.h:166
MONSTER_ELF_SPEARMAN_1
@ MONSTER_ELF_SPEARMAN_1
Definition: Monsters.h:17
MonsterInfo::uTreasureDropChance
uint8_t uTreasureDropChance
Definition: Monsters.h:123
MonsterInfo::uSpecialAbilityDamageDiceSides
uint8_t uSpecialAbilityDamageDiceSides
Definition: Monsters.h:165
MONSTER_SUPERTYPE_ELF
@ MONSTER_SUPERTYPE_ELF
Definition: Monsters.h:73
MonsterInfo::uSpecialAbilityDamageDiceRolls
uint8_t uSpecialAbilityDamageDiceRolls
Definition: Monsters.h:164
MonsterInfo::pPictureName
char * pPictureName
Definition: Monsters.h:121
MONSTER_MOVEMENT_TYPE_GLOBAL
@ MONSTER_MOVEMENT_TYPE_GLOBAL
Definition: Monsters.h:63
MonsterStats::uNumMonsters
unsigned int uNumMonsters
Definition: Monsters.h:196
MonsterInfo::uTreasureDiceRolls
uint8_t uTreasureDiceRolls
Definition: Monsters.h:124
MONSTER_GHOUL_3
@ MONSTER_GHOUL_3
Definition: Monsters.h:48
MonsterInfo::HostilityRadius
HostilityRadius
Definition: Monsters.h:110
MONSTER_MOVEMENT_TYPE_MEDIUM
@ MONSTER_MOVEMENT_TYPE_MEDIUM
Definition: Monsters.h:61
MONSTER_SUPERTYPE_TITAN
@ MONSTER_SUPERTYPE_TITAN
Definition: Monsters.h:76
MONSTER_TREANT_1
@ MONSTER_TREANT_1
Definition: Monsters.h:45
MonsterInfo::uSpecialAbilityType
uint8_t uSpecialAbilityType
Definition: Monsters.h:160
frame_table_txt_parser
FrameTableTxtLine * frame_table_txt_parser(const char *str_to_parse, FrameTableTxtLine *tokens_table)
Definition: FrameTableInc.cpp:69
MonsterInfo::uAIType
uint8_t uAIType
Definition: Monsters.h:130
MonsterInfo::uResEarth
uint8_t uResEarth
Definition: Monsters.h:153
MonsterInfo::uMissleAttack2Type
uint8_t uMissleAttack2Type
Definition: Monsters.h:145
MONSTER_MOVEMENT_TYPE_LONG
@ MONSTER_MOVEMENT_TYPE_LONG
Definition: Monsters.h:62
MONSTER_TITAN_3
@ MONSTER_TITAN_3
Definition: Monsters.h:34
MonsterInfo::uResSpirit
uint8_t uResSpirit
Definition: Monsters.h:155
MonsterInfo::uSpell1UseChance
uint8_t uSpell1UseChance
Definition: Monsters.h:146
MONSTER_ELF_ARCHER_3
@ MONSTER_ELF_ARCHER_3
Definition: Monsters.h:16
MONSTER_ZOMBIE_3
@ MONSTER_ZOMBIE_3
Definition: Monsters.h:40
SPECIAL_ATTACK_TYPE
SPECIAL_ATTACK_TYPE
Definition: Monsters.h:80
MonsterInfo::uResPhysical
uint8_t uResPhysical
Definition: Monsters.h:159
MonsterInfo::uSpellSkillAndMastery1
uint16_t uSpellSkillAndMastery1
Definition: Monsters.h:171
MONSTER_MOVEMENT_TYPE_SHORT
@ MONSTER_MOVEMENT_TYPE_SHORT
Definition: Monsters.h:60
ParseSpecialAttack
int ParseSpecialAttack(const char *spec_att_str)
MonsterInfo::uID
uint16_t uID
Definition: Monsters.h:169
MonsterStats::pPlaceStrings
char * pPlaceStrings[31]
Definition: Monsters.h:195
MonsterInfo::uExp
unsigned int uExp
Definition: Monsters.h:177
MonsterList::GetMonsterIDByName
int16_t GetMonsterIDByName(const char *pMonsterName)
Definition: Monsters.cpp:1192
Log::Warning
void Warning(const wchar_t *pFormat,...)
Definition: Log.cpp:28
MonsterInfo::bQuestMonster
uint16_t bQuestMonster
Definition: Monsters.h:170
MONSTER_ELF_ARCHER_1
@ MONSTER_ELF_ARCHER_1
Definition: Monsters.h:15
MONSTER_SUPERTYPE_DRAGON
@ MONSTER_SUPERTYPE_DRAGON
Definition: Monsters.h:72
MONSTER_ZOMBIE_1
@ MONSTER_ZOMBIE_1
Definition: Monsters.h:39
MonsterStats::pInfos
MonsterInfo pInfos[265]
Definition: Monsters.h:194
MonsterInfo::uSpecialAttackType
SPECIAL_ATTACK_TYPE uSpecialAttackType
Definition: Monsters.h:133
MonsterInfo::uSpecialAttackLevel
uint8_t uSpecialAttackLevel
Definition: Monsters.h:134
ParseAttackType
int ParseAttackType(const char *damage_type_str)
Definition: Monsters.cpp:125
MonsterInfo::uMovementType
uint8_t uMovementType
Definition: Monsters.h:129
MonsterInfo::uNumCharactersAttackedPerSpecialAbility
uint8_t uNumCharactersAttackedPerSpecialAbility
Definition: Monsters.h:167
ParseDamage
void ParseDamage(char *damage_str, unsigned __int8 *dice_rolls, unsigned __int8 *dice_sides, unsigned __int8 *dmg_bonus)
Definition: Monsters.cpp:151
MONSTER_TREANT_3
@ MONSTER_TREANT_3
Definition: Monsters.h:46
MONSTER_ELEMENTAL_WATER_3
@ MONSTER_ELEMENTAL_WATER_3
Definition: Monsters.h:14
pEvents_LOD
LODFile_IconsBitmaps * pEvents_LOD
Definition: LOD.cpp:10
MonsterInfo::uResMind
uint8_t uResMind
Definition: Monsters.h:154
MONSTER_SKELETON_1
@ MONSTER_SKELETON_1
Definition: Monsters.h:31
MONSTER_SUPERTYPE_TREANT
@ MONSTER_SUPERTYPE_TREANT
Definition: Monsters.h:75
MonsterInfo::uResAir
uint8_t uResAir
Definition: Monsters.h:151
MONSTER_SKELETON_3
@ MONSTER_SKELETON_3
Definition: Monsters.h:32
MonsterInfo::uHP
unsigned int uHP
Definition: Monsters.h:175
pMonsterList
struct MonsterList * pMonsterList
Definition: Monsters.cpp:9
c
const GLubyte * c
Definition: SDL_opengl_glext.h:11096
MONSTER_MOVEMENT_TYPE_STAIONARY
@ MONSTER_MOVEMENT_TYPE_STAIONARY
Definition: Monsters.h:65
MonsterInfo::uSpell2ID
uint8_t uSpell2ID
Definition: Monsters.h:149
MONSTER_GHOST_1
@ MONSTER_GHOST_1
Definition: Monsters.h:19
MonsterInfo::uTreasureDiceSides
uint8_t uTreasureDiceSides
Definition: Monsters.h:125
pMonstersTXT_Raw
char * pMonstersTXT_Raw
Definition: mm7_data.cpp:677
MonsterInfo::pName
char * pName
Definition: Monsters.h:120
MonsterInfo::uSpellSkillAndMastery2
uint16_t uSpellSkillAndMastery2
Definition: Monsters.h:172
MONSTER_DRAGON_1
@ MONSTER_DRAGON_1
Definition: Monsters.h:10
MonsterInfo::uAttack1Type
uint8_t uAttack1Type
Definition: Monsters.h:135
MONSTER_SUPERTYPE_WATER_ELEMENTAL
@ MONSTER_SUPERTYPE_WATER_ELEMENTAL
Definition: Monsters.h:74
logger
Log * logger
Definition: IocContainer.cpp:47
MonsterList::uNumMonsters
signed int uNumMonsters
Definition: Monsters.h:236
MonsterInfo::uResWater
uint8_t uResWater
Definition: Monsters.h:152
MONSTER_TITAN_1
@ MONSTER_TITAN_1
Definition: Monsters.h:33
MONSTER_WIGHT_1
@ MONSTER_WIGHT_1
Definition: Monsters.h:37
MonsterInfo::uTreasureLevel
uint8_t uTreasureLevel
Definition: Monsters.h:126
StringPrintf
String StringPrintf(const char *fmt,...)
Definition: Strings.cpp:9
MonsterInfo::uAttack2Type
uint8_t uAttack2Type
Definition: Monsters.h:141
MONSTER_GHOUL_1
@ MONSTER_GHOUL_1
Definition: Monsters.h:47
MONSTER_DRAGON_3
@ MONSTER_DRAGON_3
Definition: Monsters.h:12
MONSTER_ELEMENTAL_WATER_1
@ MONSTER_ELEMENTAL_WATER_1
Definition: Monsters.h:13
MonsterInfo::uFlying
uint8_t uFlying
Definition: Monsters.h:128
String
std::string String
Definition: Strings.h:10
MonsterInfo::uRecoveryTime
signed int uRecoveryTime
Definition: Monsters.h:179
MonsterInfo::uLevel
uint8_t uLevel
Definition: Monsters.h:122
FrameTableTxtLine
Definition: FrameTableInc.h:11
MONSTER_PEASANT_ELF_FEMALE_1_1
@ MONSTER_PEASANT_ELF_FEMALE_1_1
Definition: Monsters.h:29
MONSTER_LICH_3
@ MONSTER_LICH_3
Definition: Monsters.h:25