# HG changeset patch # User Gloval # Date 1363530714 -14400 # Node ID b097497f07e263ad4b4e8a38484ee357a338f089 # Parent 52329962fcdbc657137413007e5bc4bb0d78cdcc monster table continue fixinf diff -r 52329962fcdb -r b097497f07e2 Monsters.cpp --- a/Monsters.cpp Sun Mar 17 12:47:19 2013 +0400 +++ b/Monsters.cpp Sun Mar 17 18:31:54 2013 +0400 @@ -16,6 +16,388 @@ struct MonsterStats *pMonsterStats; struct MonsterList *pMonsterList; +unsigned int __fastcall ParseSpellType(struct FrameTableTxtLine *, int a2); + +int ParseAttackType(const char *damage_type_str); +void ParseDamage( char *damage_str, unsigned __int8* dice_rolls, unsigned __int8* dice_sides, unsigned __int8* dmg_bonus ); +int ParseMissleAttackType(const char *missle_attack_str); +int ParseSpecialAttack(const char *spec_att_str); + +//----- (004548E2) -------------------------------------------------------- + unsigned int __fastcall ParseSpellType(FrameTableTxtLine *a1, int a2) + { + int v2; // edi@1 + int v3; // esi@1 + unsigned int result; // eax@1 + std::string v5; // [sp-18h] [bp-28h]@75 + const char *v6; // [sp-8h] [bp-18h]@75 + signed int v7; // [sp-4h] [bp-14h]@3 + std::string *v8; // [sp+8h] [bp-8h]@75 + int a3; // [sp+Fh] [bp-1h]@75 + + v2 = (int)a1; + v3 = a2; + result = (int)a1->pProperties[0]; + if ( result ) + { + if ( !_strcmpi((const char *)result, "Dispel") ) + { + v7 = 80; +LABEL_71: + result = v7; +LABEL_76: + ++*(int *)v3; + return result; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Day") ) + { + if ( _strcmpi(*(const char **)(v2 + 4), "Hour") ) + { + if ( _strcmpi(*(const char **)(v2 + 4), "Shield") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Spirit") ) + { + v7 = 52; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Power") ) + { + v7 = 77; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Meteor") ) + { + v7 = 9; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Lightning") ) + { + v7 = 18; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Implosion") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Stone") ) + { + v7 = 38; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Haste") ) + { + if ( _strcmpi(*(const char **)(v2 + 4), "Heroism") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Pain") ) + { + v7 = 95; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Sparks") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Light") ) + { + v7 = 78; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Toxic") ) + { + v7 = 90; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "ShrapMetal") ) + { + if ( _strcmpi(*(const char **)(v2 + 4), "Paralyze") ) + { + if ( _strcmpi(*(const char **)(v2 + 4), "Fireball") ) + { + if ( _strcmpi(*(const char **)(v2 + 4), "Incinerate") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Fire") ) + { + v7 = 2; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Rock") ) + { + v7 = 41; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Mass") ) + { + v7 = 44; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Ice") ) + { + v7 = 26; + goto LABEL_71; + } + if ( !_strcmpi(*(const char **)(v2 + 4), "Acid") ) + { + v7 = 29; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Bless") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Dragon") ) + { + v7 = 97; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Reanimate") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Summon") ) + { + v7 = 82; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Fate") ) + { + if ( _strcmpi(*(const char **)(v2 + 4), "Harm") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Mind") ) + { + v7 = 57; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Blades") ) + { + if ( !_strcmpi(*(const char **)(v2 + 4), "Psychic") ) + { + v7 = 65; + goto LABEL_71; + } + if ( _strcmpi(*(const char **)(v2 + 4), "Hammerhands") ) + { + sprintf(pTmpBuf, "Unknown monster spell %s", *(int *)(v2 + 4)); + MessageBoxA(nullptr, pTmpBuf, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Itemdata.cpp:1562", 0); + result = 0; + goto LABEL_76; + } + v7 = 73; + } + else + { + v7 = 39; + } + } + else + { + v7 = 70; + } + } + else + { + v7 = 47; + } + } + else + { + v7 = 89; + } + } + else + { + v7 = 46; + } + } + else + { + v7 = 11; + } + } + else + { + v7 = 6; + } + } + else + { + v7 = 81; + } + } + else + { + v7 = 93; + } + } + else + { + v7 = 15; + } + } + else + { + v7 = 51; + } + } + else + { + v7 = 5; + } + } + else + { + v7 = 20; + } + } + else + { + v7 = 17; + } + return v7; + } + v7 = 86; + } + else + { + v7 = 85; + } + *(int *)v3 += 2; + result = v7; + } + return result; + } + +//----- (00454CB4) -------------------------------------------------------- +int ParseAttackType( const char *damage_type_str ) + { + + switch (tolower(*damage_type_str)) + { + case 'f': return 0; //fire + case 'a': return 1; //air + case 'w': return 2; //water + case 'e': return 3; //earth + + case 's': return 6; //spirit + case 'm': return 7; //mind + //m ?? 8 + case 'l': return 9; //light + case 'd': return 10; //dark + // d?? 11 + } + return 4; //phis + + } + +//----- (00454D7D) -------------------------------------------------------- +void ParseDamage( char *damage_str, unsigned __int8* dice_rolls, unsigned __int8* dice_sides, unsigned __int8* dmg_bonus ) + { + int str_len=0; + int str_pos=0; + bool dice_flag=false; + + *dice_rolls = 0; + *dice_sides = 1; + *dmg_bonus = 0; + + str_len = strlen(damage_str); + if (str_len<=0) + return; + for (str_pos=0;str_pos='0')&&(*damage_str<='9')) + { + *dice_rolls =atoi(damage_str); + *dice_sides = 1; + } + } + } + +//----- (00454E3A) -------------------------------------------------------- +int ParseMissleAttackType(const char *missle_attack_str) + { + if ( !_strcmpi(missle_attack_str, "ARROW") ) + return 1; + else if ( !_strcmpi(missle_attack_str, "ARROWF") ) + return 2; + else if ( !_strcmpi(missle_attack_str, "FIRE") ) + return 3; + else if ( !_strcmpi(missle_attack_str, "AIR") ) + return 4; + else if ( !_strcmpi(missle_attack_str, "WATER") ) + return 5; + else if ( !_strcmpi(missle_attack_str, "EARTH") ) + return 6; + else if ( !_strcmpi(missle_attack_str, "SPIRIT") ) + return 7; + else if ( !_strcmpi(missle_attack_str, "MIND") ) + return 8; + else if ( !_strcmpi(missle_attack_str, "BODY") ) + return 9; + else if ( !_strcmpi(missle_attack_str, "LIGHT") ) + return 10; + else if ( !_strcmpi(missle_attack_str, "DARK") ) + return 11; + else if ( !_strcmpi(missle_attack_str, "ENER") ) + return 13; + else return 0; + } + + +int ParseSpecialAttack(const char *spec_att_str) + { + if ( strstr(spec_att_str, "curse") ) + return 1; + else if ( strstr(spec_att_str, "weak") ) + return 2; + else if ( strstr(spec_att_str, "asleep") ) + return 3; + else if ( strstr(spec_att_str, "afraid") ) + return 23; + else if ( strstr(spec_att_str, "drunk") ) + return 4; + else if ( strstr(spec_att_str, "insane") ) + return 5; + else if ( strstr(spec_att_str, "poison1") ) + return 6; + else if ( strstr(spec_att_str, "poison2") ) + return 7; + else if ( strstr(spec_att_str, "poison3") ) + return 8; + else if ( strstr(spec_att_str, "disease1") ) + return 9; + else if ( strstr(spec_att_str, "disease2") ) + return 10; + else if ( strstr(spec_att_str, "disease3") ) + return 11; + else if ( strstr(spec_att_str, "paralyze") ) + return 12; + else if ( strstr(spec_att_str, "uncon") ) + return 13; + else if ( strstr(spec_att_str, "dead") ) + return 14; + else if ( strstr(spec_att_str, "stone") ) + return 15; + else if ( strstr(spec_att_str, "errad") ) + return 16; + else if ( strstr(spec_att_str, "brkitem") ) + return 17; + else if ( strstr(spec_att_str, "brkarmor") ) + return 18; + else if ( strstr(spec_att_str, "brkweapon") ) + return 19; + else if ( strstr(spec_att_str, "steal") ) + return 20; + else if ( strstr(spec_att_str, "age") ) + return 21; + else if ( strstr(spec_att_str, "drainsp") ) + return 22; + else return 0; + } //----- (004598FC) -------------------------------------------------------- bool MonsterList::FromFileTxt(const char *Args) @@ -159,8 +541,8 @@ void MonsterList::FromFile(void *pSerialized) { uNumMonsters = *(int *)pSerialized; - pMonsters = (MonsterDesc *)pAllocator->AllocNamedChunk(pMonsters, 152 * uNumMonsters, "Mon Race"); - memcpy(pMonsters, (char *)pSerialized + 4, 152 * uNumMonsters); + pMonsters = (MonsterDesc *)pAllocator->AllocNamedChunk(pMonsters, sizeof(MonsterDesc) * uNumMonsters, "Mon Race"); + memcpy(pMonsters, (char *)pSerialized + 4, sizeof(MonsterDesc) * uNumMonsters); } //----- (00459860) -------------------------------------------------------- @@ -429,9 +811,7 @@ pInfos[curr_rec_num].pPictureName=RemoveQuotes(test_string); break; case 3: - { pInfos[curr_rec_num].uLevel=atoi(test_string); - } break; case 4: { @@ -457,9 +837,7 @@ } break; case 5: - { pInfos[curr_rec_num].uAC=atoi(test_string); - } break; case 6: { @@ -495,6 +873,8 @@ pInfos[curr_rec_num].uTreasureDropChance=0; pInfos[curr_rec_num].uTreasureDiceRolls=0; pInfos[curr_rec_num].uTreasureDiceSides=0; + pInfos[curr_rec_num].uTreasureType=0; + pInfos[curr_rec_num].uTreasureLevel=0; if (test_string[0]=='"') test_string[0]=' '; str_len=strlen(test_string); @@ -553,7 +933,7 @@ ++str_pos; } while(str_pospMonsterInfo.uID; v28->field_1E = v62 | 0x200; v28->pSpriteFrame = v15; - v28->uTintColor = *((int *)&v35[v36] - 36); + v28->uTintColor = pMonsterList->pMonsters[actor->pMonsterInfo.uID-1].uTintColor;//*((int *)&v35[v36] - 36); if (actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime) v28->field_1E = v62 | 0x200; } diff -r 52329962fcdb -r b097497f07e2 mm7_2.cpp --- a/mm7_2.cpp Sun Mar 17 12:47:19 2013 +0400 +++ b/mm7_2.cpp Sun Mar 17 18:31:54 2013 +0400 @@ -7002,436 +7002,6 @@ } } -//----- (004548E2) -------------------------------------------------------- -unsigned int __fastcall ParseSpellType(FrameTableTxtLine *a1, int a2) -{ - int v2; // edi@1 - int v3; // esi@1 - unsigned int result; // eax@1 - std::string v5; // [sp-18h] [bp-28h]@75 - const char *v6; // [sp-8h] [bp-18h]@75 - signed int v7; // [sp-4h] [bp-14h]@3 - std::string *v8; // [sp+8h] [bp-8h]@75 - int a3; // [sp+Fh] [bp-1h]@75 - - v2 = (int)a1; - v3 = a2; - result = (int)a1->pProperties[0]; - if ( result ) - { - if ( !_strcmpi((const char *)result, "Dispel") ) - { - v7 = 80; -LABEL_71: - result = v7; -LABEL_76: - ++*(int *)v3; - return result; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Day") ) - { - if ( _strcmpi(*(const char **)(v2 + 4), "Hour") ) - { - if ( _strcmpi(*(const char **)(v2 + 4), "Shield") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Spirit") ) - { - v7 = 52; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Power") ) - { - v7 = 77; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Meteor") ) - { - v7 = 9; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Lightning") ) - { - v7 = 18; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Implosion") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Stone") ) - { - v7 = 38; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Haste") ) - { - if ( _strcmpi(*(const char **)(v2 + 4), "Heroism") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Pain") ) - { - v7 = 95; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Sparks") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Light") ) - { - v7 = 78; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Toxic") ) - { - v7 = 90; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "ShrapMetal") ) - { - if ( _strcmpi(*(const char **)(v2 + 4), "Paralyze") ) - { - if ( _strcmpi(*(const char **)(v2 + 4), "Fireball") ) - { - if ( _strcmpi(*(const char **)(v2 + 4), "Incinerate") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Fire") ) - { - v7 = 2; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Rock") ) - { - v7 = 41; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Mass") ) - { - v7 = 44; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Ice") ) - { - v7 = 26; - goto LABEL_71; - } - if ( !_strcmpi(*(const char **)(v2 + 4), "Acid") ) - { - v7 = 29; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Bless") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Dragon") ) - { - v7 = 97; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Reanimate") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Summon") ) - { - v7 = 82; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Fate") ) - { - if ( _strcmpi(*(const char **)(v2 + 4), "Harm") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Mind") ) - { - v7 = 57; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Blades") ) - { - if ( !_strcmpi(*(const char **)(v2 + 4), "Psychic") ) - { - v7 = 65; - goto LABEL_71; - } - if ( _strcmpi(*(const char **)(v2 + 4), "Hammerhands") ) - { - sprintf(pTmpBuf, "Unknown monster spell %s", *(int *)(v2 + 4)); - MessageBoxA(nullptr, pTmpBuf, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Itemdata.cpp:1562", 0); - result = 0; - goto LABEL_76; - } - v7 = 73; - } - else - { - v7 = 39; - } - } - else - { - v7 = 70; - } - } - else - { - v7 = 47; - } - } - else - { - v7 = 89; - } - } - else - { - v7 = 46; - } - } - else - { - v7 = 11; - } - } - else - { - v7 = 6; - } - } - else - { - v7 = 81; - } - } - else - { - v7 = 93; - } - } - else - { - v7 = 15; - } - } - else - { - v7 = 51; - } - } - else - { - v7 = 5; - } - } - else - { - v7 = 20; - } - } - else - { - v7 = 17; - } - return v7; - } - v7 = 86; - } - else - { - v7 = 85; - } - *(int *)v3 += 2; - result = v7; - } - return result; -} - -//----- (00454CB4) -------------------------------------------------------- -int __thiscall ParseAttackType(unsigned __int8 *a1) -{ - unsigned __int8 *v1; // esi@1 - int result; // eax@4 - int v3; // eax@15 - int v4; // eax@18 - - v1 = a1; - if ( !a1 ) - return 4; - if ( tolower(*a1) == 'f' ) - return 0; - if ( tolower(*v1) == 'a' ) - return 1; - if ( tolower(*v1) == 'w' ) - return 2; - if ( tolower(*v1) == 'e' ) - { - tolower(v1[1]); - return 3; - } - if ( tolower(*v1) == 's' ) - return 6; - if ( tolower(*v1) == 'm' ) - { - v3 = -(tolower(v1[1]) != 'i'); - LOBYTE(v3) = v3 & 0xFE; - result = v3 + 7; - } - else - { - if ( tolower(*v1) == 'l' ) - return 9; - v4 = -(tolower(*v1) != 'd'); - LOBYTE(v4) = v4 & 0xFA; - result = v4 + 10; - } - return result; -} - -//----- (00454D7D) -------------------------------------------------------- -char __fastcall ParseDamage(const char *Str, int a2, int a3, int a4) -{ - int v4; // esi@1 - const char *v5; // edi@1 - signed int v6; // ebx@1 - int *v7; // esi@2 - int v8; // eax@3 - size_t v10; // [sp+Ch] [bp-Ch]@1 - int v11; // [sp+10h] [bp-8h]@1 - signed int v12; // [sp+14h] [bp-4h]@1 - - v4 = a2; - v5 = Str; - *(char *)a2 = 0; - *(char *)a3 = 1; - v11 = a2; - *(char *)a4 = 0; - v6 = 0; - v10 = strlen(Str); - v12 = 0; - if ( (signed int)v10 <= 0 ) - { -LABEL_9: - LOBYTE(v8) = *v5; - if ( (unsigned __int8)*v5 >= 0x30u && (unsigned __int8)v8 <= 0x39u ) - { - *(char *)v4 = atoi(v5); - LOBYTE(v8) = a3; - *(char *)a3 = 1; - } - return v8; - } - do - { - v7 = (int *)&v5[v6]; - if ( tolower((unsigned __int8)v5[v6]) == 100 ) - { - *(char *)v7 = 0; - *(char *)v11 = atoi(v5); - LOBYTE(v8) = atoi(&v5[v6 + 1]); - v12 = 1; - *(char *)a3 = v8; - *(char *)v7 = 100; - } - else - { - v8 = tolower(*(char *)v7); - if ( v8 == 43 ) - { - LOBYTE(v8) = atoi(&v5[v6 + 1]); - *(char *)a4 = v8; - } - } - ++v6; - } - while ( v6 < (signed int)v10 ); - if ( !v12 ) - { - v4 = v11; - goto LABEL_9; - } - return v8; -} - -//----- (00454E3A) -------------------------------------------------------- -int __fastcall ParseMissleAttackType(const char *Str1) -{ - const char *v1; // esi@1 - int v2; // edi@1 - int v4; // [sp-4h] [bp-Ch]@4 - - v1 = Str1; - v2 = 0; - if ( _strcmpi(Str1, "ARROW") ) - { - if ( _strcmpi(v1, "ARROWF") ) - { - if ( _strcmpi(v1, "FIRE") ) - { - if ( _strcmpi(v1, "AIR") ) - { - if ( _strcmpi(v1, "WATER") ) - { - if ( _strcmpi(v1, "EARTH") ) - { - if ( _strcmpi(v1, "SPIRIT") ) - { - if ( _strcmpi(v1, "MIND") ) - { - if ( _strcmpi(v1, "BODY") ) - { - if ( _strcmpi(v1, "LIGHT") ) - { - if ( _strcmpi(v1, "DARK") ) - { - if ( _strcmpi(v1, "ENER") ) - return v2; - v4 = 13; - } - else - { - v4 = 11; - } - } - else - { - v4 = 10; - } - } - else - { - v4 = 9; - } - } - else - { - v4 = 8; - } - } - else - { - v4 = 7; - } - } - else - { - v4 = 6; - } - } - else - { - v4 = 5; - } - } - else - { - v4 = 4; - } - } - else - { - v4 = 3; - } - } - else - { - v4 = 2; - } - return v4; - } - return 1; -} - diff -r 52329962fcdb -r b097497f07e2 mm7_data.h --- a/mm7_data.h Sun Mar 17 12:47:19 2013 +0400 +++ b/mm7_data.h Sun Mar 17 18:31:54 2013 +0400 @@ -2073,10 +2073,7 @@ // int __cdecl crt_452B74(); int __cdecl j_SetSomeItemsNames(); -unsigned int __fastcall ParseSpellType(struct FrameTableTxtLine *, int a2); -int __thiscall ParseAttackType(unsigned __int8 *_this); -char __fastcall ParseDamage(const char *Str, int a2, int a3, int a4); -int __fastcall ParseMissleAttackType(const char *Str1); + unsigned int __fastcall SkillToMastery(unsigned __int16 a1); unsigned int __fastcall GetSpellColor(signed int a1); void *__thiscall unknown_vdtor_6(void *_this, bool a2);