Mercurial > mm7
changeset 1529:61458df2cb4f
bountyHunting fix
author | Ritor1 |
---|---|
date | Fri, 06 Sep 2013 16:42:23 +0600 |
parents | f47eab1a70d8 |
children | dec48a151390 |
files | Actor.cpp NPC.cpp Party.h UI/UIGuilds.cpp UI/UIHouses.cpp UI/UIHouses.h UI/UIShops.cpp mm7_2.cpp mm7_4.cpp mm7_data.cpp mm7_data.h |
diffstat | 11 files changed, 404 insertions(+), 530 deletions(-) [+] |
line wrap: on
line diff
--- a/Actor.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/Actor.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -2985,8 +2985,8 @@ actor->UpdateAnimation(); for (uint i = 0; i < 5; ++i) - if (pParty->field_750[i] == actor->pMonsterInfo.uID) - pParty->field_75A[i] = true; + if (pParty->monster_id_for_hunting[i] == actor->pMonsterInfo.uID) + pParty->monster_for_hunting_killed[i] = true; for (uint i = 0; i < 22; ++i) actor->pActorBuffs[i].Reset();
--- a/NPC.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/NPC.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -1343,7 +1343,7 @@ OracleDialogue(); goto _return; case 311: - sub_4BBA85_bounties(); + CheckBountyRespawnAndAward(); goto _return; }*/ if ( pEventNumber < 200 || pEventNumber > 310 ) @@ -1358,7 +1358,7 @@ { if ( pEventNumber == 311 ) { - sub_4BBA85_bounties(); + CheckBountyRespawnAndAward(); } else {
--- a/Party.h Thu Sep 05 18:05:50 2013 +0600 +++ b/Party.h Fri Sep 06 16:42:23 2013 +0600 @@ -150,9 +150,10 @@ #pragma pack(push, 1) struct Party_stru0 { - int field_0[20]; + //__int64 field_0[10]; + __int64 bountyHunting_next_generation_time[10]; // int field_50[170]; - __int64 field_50[85]; + __int64 Shops_next_generation_time[85];//field_50 __int64 _shop_ban_times[53]; int field_4A0[20]; int field_4F0[38]; @@ -265,8 +266,8 @@ int uNumPrisonTerms; unsigned int uNumBountiesCollected; int field_74C; - __int16 field_750[5]; - __int16 field_75A[5]; + __int16 monster_id_for_hunting[5]; + __int16 monster_for_hunting_killed[5]; unsigned char days_played_without_rest; unsigned __int8 _quest_bits[64]; unsigned __int8 pArcomageWins[16];
--- a/UI/UIGuilds.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/UI/UIGuilds.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -160,7 +160,7 @@ DrawTextAtStatusBar(statusbar_string, 0); if ( !v8 ) { - working_window.DrawCurrentTime(pParty->field_3C.field_50[window_SpeakInHouse->par1C] - pParty->uTimePlayed);//"Приходите через 14 дней" + working_window.DrawCurrentTime(pParty->field_3C.Shops_next_generation_time[window_SpeakInHouse->par1C] - pParty->uTimePlayed);//"Приходите через 14 дней" return; } v12 = pMouse->GetCursorPos(&v51);
--- a/UI/UIHouses.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/UI/UIHouses.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -989,12 +989,7 @@ { int experience_for_next_level; // eax@5 GUIWindow *v8; // esi@10 - int v10; // esi@31 - int v11; // edi@31 - int v12; // esi@32 - __int16 v13; // bp@32 - int v14; // edx@32 - GUIWindow *v15; // eax@32 + //int v11; // edi@31 int v16; // eax@32 int v17; // eax@33 int v18; // eax@34 @@ -1004,15 +999,6 @@ __int16 v22; // ax@107 __int16 v23; // ax@132 __int16 v24; // ax@163 - int v25; // esi@190 - __int16 v26; // ax@190 - char v27; // zf@190 - Player *v28; // edi@192 - int v29; // eax@204 - //void *v30; // esi@208 - //unsigned __int64 v31; // qax@208 - //signed int v32; // edi@209 - //int v33; // eax@210 unsigned int v34; // eax@211 signed int v36; // esi@227 int v37; // ecx@227 @@ -1032,7 +1018,6 @@ void *v52; // eax@260 signed int v53; // edi@260 int v54; // eax@262 - int v56; // [sp+14h] [bp-Ch]@31 if ( !pDialogueWindow->pNumPresenceButton ) return; @@ -1041,54 +1026,54 @@ v8 = window_SpeakInHouse; if (dialog_menu_id == HOUSE_DIALOGUE_MAIN) { - if ( in_current_building_type == BuildingType_Training ) - { - if ( uMessageParam == HOUSE_DIALOGUE_TRAININGHALL_TRAIN ) - { - experience_for_next_level = 0; - if ( pPlayers[uActiveCharacter]->uLevel > 0 ) - { - for( uint i = 0; i < pPlayers[uActiveCharacter]->uLevel; i++ ) - experience_for_next_level += i + 1; - } - if (pPlayers[uActiveCharacter]->uLevel < pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - 89] && - (signed __int64)pPlayers[uActiveCharacter]->uExperience < 1000 * experience_for_next_level) - return; - } - pDialogueWindow->Release(); - pDialogueWindow = GUIWindow::Create(0, 0, 640, 345, WINDOW_MainMenu, 0, 0); - pBtn_ExitCancel = pDialogueWindow->CreateButton(526, 445, 75, 33, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[74],// "End Conversation" - pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0); - pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", nullptr); - v8 = window_SpeakInHouse; - } - if ( in_current_building_type != BuildingType_Training ) - { - v8 = window_SpeakInHouse; - if ((in_current_building_type == BuildingType_Stables || in_current_building_type == BuildingType_Boats) && - transport_schedule[transport_routes[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_STABLES_HARMONDALE][uMessageParam - HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_1]].pSchedule[pParty->uDaysPlayed % 7] - || in_current_building_type != BuildingType_Temple || uMessageParam != BuildingType_MindGuild ) - { - pDialogueWindow->Release(); - pDialogueWindow = GUIWindow::Create(0, 0, 640, 345, WINDOW_MainMenu, 0, 0); - pBtn_ExitCancel = pDialogueWindow->CreateButton(526, 445, 75, 33, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[74],// "End Conversation" - pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0); - pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", nullptr); - v8 = window_SpeakInHouse; - } - else if (uActiveCharacter) - { - if ( !pPlayers[uActiveCharacter]->IsPlayerHealableByTemple() ) - return; - v8 = window_SpeakInHouse; - } - } - dialog_menu_id = (HOUSE_DIALOGUE_MENU)uMessageParam; - if ( in_current_building_type < BuildingType_19 ) - { - ShopTexture = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(off_4F03B8[(int)in_current_building_type], TEXTURE_16BIT_PALETTE)]; - v8 = window_SpeakInHouse; - } + if ( in_current_building_type == BuildingType_Training ) + { + if ( uMessageParam == HOUSE_DIALOGUE_TRAININGHALL_TRAIN ) + { + experience_for_next_level = 0; + if ( pPlayers[uActiveCharacter]->uLevel > 0 ) + { + for( uint i = 0; i < pPlayers[uActiveCharacter]->uLevel; i++ ) + experience_for_next_level += i + 1; + } + if (pPlayers[uActiveCharacter]->uLevel < pMaxLevelPerTrainingHallType[(unsigned int)window_SpeakInHouse->ptr_1C - 89] && + (signed __int64)pPlayers[uActiveCharacter]->uExperience < 1000 * experience_for_next_level)//test experience + return; + } + pDialogueWindow->Release(); + pDialogueWindow = GUIWindow::Create(0, 0, 640, 345, WINDOW_MainMenu, 0, 0); + pBtn_ExitCancel = pDialogueWindow->CreateButton(526, 445, 75, 33, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[74],// "End Conversation" + pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0); + pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", nullptr); + v8 = window_SpeakInHouse; + } + if ( in_current_building_type != BuildingType_Training ) + { + v8 = window_SpeakInHouse; + if ((in_current_building_type == BuildingType_Stables || in_current_building_type == BuildingType_Boats) && + transport_schedule[transport_routes[(unsigned int)window_SpeakInHouse->ptr_1C - HOUSE_STABLES_HARMONDALE][uMessageParam - HOUSE_DIALOGUE_TRANSPORT_SCHEDULE_1]].pSchedule[pParty->uDaysPlayed % 7] + || in_current_building_type != BuildingType_Temple || uMessageParam != BuildingType_MindGuild ) + { + pDialogueWindow->Release(); + pDialogueWindow = GUIWindow::Create(0, 0, 640, 345, WINDOW_MainMenu, 0, 0); + pBtn_ExitCancel = pDialogueWindow->CreateButton(526, 445, 75, 33, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[74],// "End Conversation" + pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0); + pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", nullptr); + v8 = window_SpeakInHouse; + } + else if (uActiveCharacter) + { + if ( !pPlayers[uActiveCharacter]->IsPlayerHealableByTemple() ) + return; + v8 = window_SpeakInHouse; + } + } + dialog_menu_id = (HOUSE_DIALOGUE_MENU)uMessageParam; + if ( in_current_building_type < BuildingType_19 ) + { + ShopTexture = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(off_4F03B8[(int)in_current_building_type], TEXTURE_16BIT_PALETTE)]; + v8 = window_SpeakInHouse; + } } //NEW @@ -1107,7 +1092,7 @@ case BuildingType_15: case BuildingType_16: { - if ( pParty->field_3C.field_50[window_SpeakInHouse->par1C] >= (signed __int64)pParty->uTimePlayed ) + if ( pParty->field_3C.Shops_next_generation_time[window_SpeakInHouse->par1C] >= (signed __int64)pParty->uTimePlayed ) { for ( uint i = 0; i < 12; ++i ) { @@ -1119,221 +1104,178 @@ } } } - else + else//generation new books { SpellBookGenerator(); - pParty->field_3C.field_50[window_SpeakInHouse->par1C] = pParty->uTimePlayed + (signed __int64)((double)(0xA8C000 + pParty->field_3C.Shops_next_generation_time[window_SpeakInHouse->par1C] = pParty->uTimePlayed + (signed __int64)((double)(0xA8C000 * (signed int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].field_1C) * 0.033333335); } - //return; break; } case BuildingType_TownHall: { - if ( uMessageParam == 99 ) + if ( uMessageParam == HOUSE_DIALOGUE_TOWNHALL_MESSAGE ) { - v10 = (int)((char *)v8->ptr_1C - 102); - v56 = v10; - v11 = 8 * v10 + 11325428; - if ( pParty->field_3C.field_0[2 * v10 + 1] >= (signed __int64)pParty->uTimePlayed - && pParty->field_3C.field_0[2 * v10] >= (signed __int64)pParty->uTimePlayed ) + if ( pParty->field_3C.bountyHunting_next_generation_time[(int)((char *)v8->ptr_1C - 102)] < (signed __int64)pParty->uTimePlayed )//new generation { - v13 = 0; + pParty->monster_for_hunting_killed[(int)((char *)v8->ptr_1C - 102)] = false; + pParty->field_3C.bountyHunting_next_generation_time[(int)((char *)v8->ptr_1C - 102)] = (signed __int64)((double)(309657600 * (pParty->uCurrentMonth + 12i64 * pParty->uCurrentYear - 14015)) * 0.033333335); + pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] = rand() % 258 + 1; + v16 = (int)((char *)window_SpeakInHouse->ptr_1C - 102); + if ( !v16 ) + { + while ( 1 ) + { + v24 = pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]; + if ( (unsigned __int16)v24 < 115 || (unsigned __int16)v24 > 132 ) + { + if ( ((unsigned __int16)v24 < 235 || (unsigned __int16)v24 > 252) + && ((unsigned __int16)v24 < 133 || (unsigned __int16)v24 > 150) + && ((unsigned __int16)v24 < 0x97u || (unsigned __int16)v24 > 0xBAu) + && ((unsigned __int16)v24 < 0xBEu || (unsigned __int16)v24 > 0xC0u) + && ((unsigned __int16)v24 < 0xC4u || (unsigned __int16)v24 > 0xC6u) + && ((unsigned __int16)v24 < 0x2Bu || (unsigned __int16)v24 > 0x2Du) + && ((unsigned __int16)v24 < 0xCDu || (unsigned __int16)v24 > 0xCFu) + && ((unsigned __int16)v24 < 0x5Eu || (unsigned __int16)v24 > 0x60u) + && ((unsigned __int16)v24 < 0xFDu || (unsigned __int16)v24 > 0xFFu) + && ((unsigned __int16)v24 < 0x6Du || (unsigned __int16)v24 > 0x6Fu) + && ((unsigned __int16)v24 < 0x61u || (unsigned __int16)v24 > 0x63u) ) + break; + } + pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] = rand() % 258 + 1; + } + } + if ( v16 == 1 ) + { + while ( 1 ) + { + v23 = pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]; + if ( (unsigned __int16)v23 < 115 || (unsigned __int16)v23 > 132 ) + { + if ( ((unsigned __int16)v23 < 0xE8u || (unsigned __int16)v23 > 0xF9u) + && ((unsigned __int16)v23 < 0x85u || (unsigned __int16)v23 > 0x96u) + && ((unsigned __int16)v23 < 0x97u || (unsigned __int16)v23 > 0xBAu) + && ((unsigned __int16)v23 < 0xBEu || (unsigned __int16)v23 > 0xC0u) + && ((unsigned __int16)v23 < 0xC4u || (unsigned __int16)v23 > 0xC6u) + && ((unsigned __int16)v23 < 0x2Bu || (unsigned __int16)v23 > 0x2Du) + && ((unsigned __int16)v23 < 0x52u || (unsigned __int16)v23 > 0x54u) + && ((unsigned __int16)v23 < 4 || (unsigned __int16)v23 > 6) + && ((unsigned __int16)v23 < 0x37u || (unsigned __int16)v23 > 0x39u) + && ((unsigned __int16)v23 < 0x3Au || (unsigned __int16)v23 > 0x3Cu) + && ((unsigned __int16)v23 < 0x3Du || (unsigned __int16)v23 > 0x3Fu) + && ((unsigned __int16)v23 < 0xFDu || (unsigned __int16)v23 > 0xFFu) + && ((unsigned __int16)v23 < 0x61u || (unsigned __int16)v23 > 0x63u) + && ((unsigned __int16)v23 < 0xCDu || (unsigned __int16)v23 > 0xCFu) ) + break; + } + pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] = rand() % 258 + 1; + } + } + if ( v16 == 2 ) + { + while ( 1 ) + { + v22 = pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]; + if ( (unsigned __int16)v22 < 0x73u || (unsigned __int16)v22 > 0x84u ) + { + if ( ((unsigned __int16)v22 < 0xE8u || (unsigned __int16)v22 > 0xF9u) + && ((unsigned __int16)v22 < 0x85u || (unsigned __int16)v22 > 0x96u) + && ((unsigned __int16)v22 < 0x97u || (unsigned __int16)v22 > 0xBAu) + && ((unsigned __int16)v22 < 0xBEu || (unsigned __int16)v22 > 0xC0u) + && ((unsigned __int16)v22 < 0xC4u || (unsigned __int16)v22 > 0xC6u) + && ((unsigned __int16)v22 < 0x2Bu || (unsigned __int16)v22 > 0x2Du) + && ((unsigned __int16)v22 < 0x31u || (unsigned __int16)v22 > 0x33u) + && ((unsigned __int16)v22 < 0x34u || (unsigned __int16)v22 > 0x36u) + && ((unsigned __int16)v22 < 0xFDu || (unsigned __int16)v22 > 0xFFu) + && ((unsigned __int16)v22 < 0x61u || (unsigned __int16)v22 > 0x63u) + && ((unsigned __int16)v22 < 0x1Cu || (unsigned __int16)v22 > 0x1Eu) ) + break; + } + pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] = rand() % 258 + 1; + } + } + if ( v16 == 3 ) + { + while ( 1 ) + { + v21 = pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]; + if ( (unsigned __int16)v21 < 0x73u || (unsigned __int16)v21 > 0x84u ) + { + if ( ((unsigned __int16)v21 < 0xE8u || (unsigned __int16)v21 > 0xF9u) + && ((unsigned __int16)v21 < 0x85u || (unsigned __int16)v21 > 0x96u) + && ((unsigned __int16)v21 < 0x97u || (unsigned __int16)v21 > 0xBAu) + && ((unsigned __int16)v21 < 0xBEu || (unsigned __int16)v21 > 0xC0u) + && ((unsigned __int16)v21 < 0xC4u || (unsigned __int16)v21 > 0xC6u) + && ((unsigned __int16)v21 < 0x2Bu || (unsigned __int16)v21 > 0x2Du) + && ((unsigned __int16)v21 < 0x5Eu || (unsigned __int16)v21 > 0x60u) + && ((unsigned __int16)v21 < 0x43u || (unsigned __int16)v21 > 0x45u) + && ((unsigned __int16)v21 < 0x4Fu || (unsigned __int16)v21 > 0x51u) + && ((unsigned __int16)v21 < 0xC1u || (unsigned __int16)v21 > 0xC3u) + && ((unsigned __int16)v21 < 0x13u || (unsigned __int16)v21 > 0x15u) + && ((unsigned __int16)v21 < 0xFDu || (unsigned __int16)v21 > 0xFFu) + && ((unsigned __int16)v21 < 0x61u || (unsigned __int16)v21 > 0x63u) + && ((unsigned __int16)v21 < 0x6Au || (unsigned __int16)v21 > 0x6Cu) ) + break; + } + pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] = rand() % 258 + 1; + } + } + if ( v16 == 4 ) + { + while ( 1 ) + { + v20 = pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]; + if ( (unsigned __int16)v20 < 0x73u || (unsigned __int16)v20 > 0x84u ) + { + if ( ((unsigned __int16)v20 < 0xE8u || (unsigned __int16)v20 > 0xF9u) + && ((unsigned __int16)v20 < 0x85u || (unsigned __int16)v20 > 0x96u) + && ((unsigned __int16)v20 < 0x97u || (unsigned __int16)v20 > 0xBAu) + && ((unsigned __int16)v20 < 0xBEu || (unsigned __int16)v20 > 0xC0u) + && ((unsigned __int16)v20 < 0xC4u || (unsigned __int16)v20 > 0xC6u) + && ((unsigned __int16)v20 < 0x2Bu || (unsigned __int16)v20 > 0x2Du) + && ((unsigned __int16)v20 < 0x6Du || (unsigned __int16)v20 > 0x6Fu) + && ((unsigned __int16)v20 < 0x46u || (unsigned __int16)v20 > 0x48u) + && ((unsigned __int16)v20 < 0x100u || (unsigned __int16)v20 > 0x102u) + && ((unsigned __int16)v20 < 0xD9u || (unsigned __int16)v20 > 0xDBu) + && ((unsigned __int16)v20 < 0xC7u || (unsigned __int16)v20 > 0xC9u) + && ((unsigned __int16)v20 < 0xE5u || (unsigned __int16)v20 > 0xE7u) + && ((unsigned __int16)v20 < 0xDFu || (unsigned __int16)v20 > 0xE1u) + && ((unsigned __int16)v20 < 0x5Bu || (unsigned __int16)v20 > 0x5Du) + && ((unsigned __int16)v20 < 0x49u || (unsigned __int16)v20 > 0x4Bu) + && ((unsigned __int16)v20 < 0xFDu || (unsigned __int16)v20 > 0xFFu) + && ((unsigned __int16)v20 < 0x61u || (unsigned __int16)v20 > 0x63u) + && ((unsigned __int16)v20 < 0x10u || (unsigned __int16)v20 > 0x12u) ) + break; + } + pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] = rand() % 258 + 1; + } + } + } + bountyHunting_monster_id_for_hunting = pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]; + if ( !pParty->monster_for_hunting_killed[(int)((char *)v8->ptr_1C - 102)] ) + { + bountyHunting_text = pNPCTopics[351].pText;//"В этом месяцу назначена награда за голову %s..." + if ( !pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] ) + bountyHunting_text = pNPCTopics[353].pText;//"Кое кто уже приходил в этом месяце за наградой" } else { - v12 = v10; - v13 = 0; - pParty->field_75A[v12] = 0; - *(_QWORD *)v11 = (signed __int64)((double)(309657600 * (pParty->uCurrentMonth + 12i64 * pParty->uCurrentYear - 14015)) * 0.033333335); - v14 = rand() % 258; - v15 = window_SpeakInHouse; - pParty->field_750[v12] = v14 + 1; - v16 = (int)((char *)v15->ptr_1C - 102); - if ( v16 ) + if ( pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] > 0 )//get prize { - v17 = v16 - 1; - if ( v17 ) - { - v18 = v17 - 1; - if ( v18 ) - { - v19 = v18 - 1; - if ( v19 ) - { - if ( v19 == 1 ) - { - while ( 1 ) - { - v20 = pParty->field_750[v12]; - if ( (unsigned __int16)v20 < 0x73u || (unsigned __int16)v20 > 0x84u ) - { - if ( ((unsigned __int16)v20 < 0xE8u || (unsigned __int16)v20 > 0xF9u) - && ((unsigned __int16)v20 < 0x85u || (unsigned __int16)v20 > 0x96u) - && ((unsigned __int16)v20 < 0x97u || (unsigned __int16)v20 > 0xBAu) - && ((unsigned __int16)v20 < 0xBEu || (unsigned __int16)v20 > 0xC0u) - && ((unsigned __int16)v20 < 0xC4u || (unsigned __int16)v20 > 0xC6u) - && ((unsigned __int16)v20 < 0x2Bu || (unsigned __int16)v20 > 0x2Du) - && ((unsigned __int16)v20 < 0x6Du || (unsigned __int16)v20 > 0x6Fu) - && ((unsigned __int16)v20 < 0x46u || (unsigned __int16)v20 > 0x48u) - && ((unsigned __int16)v20 < 0x100u || (unsigned __int16)v20 > 0x102u) - && ((unsigned __int16)v20 < 0xD9u || (unsigned __int16)v20 > 0xDBu) - && ((unsigned __int16)v20 < 0xC7u || (unsigned __int16)v20 > 0xC9u) - && ((unsigned __int16)v20 < 0xE5u || (unsigned __int16)v20 > 0xE7u) - && ((unsigned __int16)v20 < 0xDFu || (unsigned __int16)v20 > 0xE1u) - && ((unsigned __int16)v20 < 0x5Bu || (unsigned __int16)v20 > 0x5Du) - && ((unsigned __int16)v20 < 0x49u || (unsigned __int16)v20 > 0x4Bu) - && ((unsigned __int16)v20 < 0xFDu || (unsigned __int16)v20 > 0xFFu) - && ((unsigned __int16)v20 < 0x61u || (unsigned __int16)v20 > 0x63u) - && ((unsigned __int16)v20 < 0x10u || (unsigned __int16)v20 > 0x12u) ) - break; - } - pParty->field_750[v12] = rand() % 258 + 1; - } - } - } - else - { - while ( 1 ) - { - v21 = pParty->field_750[v12]; - if ( (unsigned __int16)v21 < 0x73u || (unsigned __int16)v21 > 0x84u ) - { - if ( ((unsigned __int16)v21 < 0xE8u || (unsigned __int16)v21 > 0xF9u) - && ((unsigned __int16)v21 < 0x85u || (unsigned __int16)v21 > 0x96u) - && ((unsigned __int16)v21 < 0x97u || (unsigned __int16)v21 > 0xBAu) - && ((unsigned __int16)v21 < 0xBEu || (unsigned __int16)v21 > 0xC0u) - && ((unsigned __int16)v21 < 0xC4u || (unsigned __int16)v21 > 0xC6u) - && ((unsigned __int16)v21 < 0x2Bu || (unsigned __int16)v21 > 0x2Du) - && ((unsigned __int16)v21 < 0x5Eu || (unsigned __int16)v21 > 0x60u) - && ((unsigned __int16)v21 < 0x43u || (unsigned __int16)v21 > 0x45u) - && ((unsigned __int16)v21 < 0x4Fu || (unsigned __int16)v21 > 0x51u) - && ((unsigned __int16)v21 < 0xC1u || (unsigned __int16)v21 > 0xC3u) - && ((unsigned __int16)v21 < 0x13u || (unsigned __int16)v21 > 0x15u) - && ((unsigned __int16)v21 < 0xFDu || (unsigned __int16)v21 > 0xFFu) - && ((unsigned __int16)v21 < 0x61u || (unsigned __int16)v21 > 0x63u) - && ((unsigned __int16)v21 < 0x6Au || (unsigned __int16)v21 > 0x6Cu) ) - break; - } - pParty->field_750[v12] = rand() % 258 + 1; - } - } - } - else - { - while ( 1 ) - { - v22 = pParty->field_750[v12]; - if ( (unsigned __int16)v22 < 0x73u || (unsigned __int16)v22 > 0x84u ) - { - if ( ((unsigned __int16)v22 < 0xE8u || (unsigned __int16)v22 > 0xF9u) - && ((unsigned __int16)v22 < 0x85u || (unsigned __int16)v22 > 0x96u) - && ((unsigned __int16)v22 < 0x97u || (unsigned __int16)v22 > 0xBAu) - && ((unsigned __int16)v22 < 0xBEu || (unsigned __int16)v22 > 0xC0u) - && ((unsigned __int16)v22 < 0xC4u || (unsigned __int16)v22 > 0xC6u) - && ((unsigned __int16)v22 < 0x2Bu || (unsigned __int16)v22 > 0x2Du) - && ((unsigned __int16)v22 < 0x31u || (unsigned __int16)v22 > 0x33u) - && ((unsigned __int16)v22 < 0x34u || (unsigned __int16)v22 > 0x36u) - && ((unsigned __int16)v22 < 0xFDu || (unsigned __int16)v22 > 0xFFu) - && ((unsigned __int16)v22 < 0x61u || (unsigned __int16)v22 > 0x63u) - && ((unsigned __int16)v22 < 0x1Cu || (unsigned __int16)v22 > 0x1Eu) ) - break; - } - pParty->field_750[v12] = rand() % 258 + 1; - } - } - } - else - { - while ( 1 ) - { - v23 = pParty->field_750[v12]; - if ( (unsigned __int16)v23 < 0x73u || (unsigned __int16)v23 > 0x84u ) - { - if ( ((unsigned __int16)v23 < 0xE8u || (unsigned __int16)v23 > 0xF9u) - && ((unsigned __int16)v23 < 0x85u || (unsigned __int16)v23 > 0x96u) - && ((unsigned __int16)v23 < 0x97u || (unsigned __int16)v23 > 0xBAu) - && ((unsigned __int16)v23 < 0xBEu || (unsigned __int16)v23 > 0xC0u) - && ((unsigned __int16)v23 < 0xC4u || (unsigned __int16)v23 > 0xC6u) - && ((unsigned __int16)v23 < 0x2Bu || (unsigned __int16)v23 > 0x2Du) - && ((unsigned __int16)v23 < 0x52u || (unsigned __int16)v23 > 0x54u) - && ((unsigned __int16)v23 < 4u || (unsigned __int16)v23 > 6u) - && ((unsigned __int16)v23 < 0x37u || (unsigned __int16)v23 > 0x39u) - && ((unsigned __int16)v23 < 0x3Au || (unsigned __int16)v23 > 0x3Cu) - && ((unsigned __int16)v23 < 0x3Du || (unsigned __int16)v23 > 0x3Fu) - && ((unsigned __int16)v23 < 0xFDu || (unsigned __int16)v23 > 0xFFu) - && ((unsigned __int16)v23 < 0x61u || (unsigned __int16)v23 > 0x63u) - && ((unsigned __int16)v23 < 0xCDu || (unsigned __int16)v23 > 0xCFu) ) - break; - } - pParty->field_750[v12] = rand() % 258 + 1; - } - } - } - else - { - while ( 1 ) - { - v24 = pParty->field_750[v12]; - if ( (unsigned __int16)v24 < 0x73u || (unsigned __int16)v24 > 0x84u ) - { - if ( ((unsigned __int16)v24 < 0xEBu || (unsigned __int16)v24 > 0xFCu) - && ((unsigned __int16)v24 < 0x85u || (unsigned __int16)v24 > 0x96u) - && ((unsigned __int16)v24 < 0x97u || (unsigned __int16)v24 > 0xBAu) - && ((unsigned __int16)v24 < 0xBEu || (unsigned __int16)v24 > 0xC0u) - && ((unsigned __int16)v24 < 0xC4u || (unsigned __int16)v24 > 0xC6u) - && ((unsigned __int16)v24 < 0x2Bu || (unsigned __int16)v24 > 0x2Du) - && ((unsigned __int16)v24 < 0xCDu || (unsigned __int16)v24 > 0xCFu) - && ((unsigned __int16)v24 < 0x5Eu || (unsigned __int16)v24 > 0x60u) - && ((unsigned __int16)v24 < 0xFDu || (unsigned __int16)v24 > 0xFFu) - && ((unsigned __int16)v24 < 0x6Du || (unsigned __int16)v24 > 0x6Fu) - && ((unsigned __int16)v24 < 0x61u || (unsigned __int16)v24 > 0x63u) ) - break; - } - pParty->field_750[v12] = rand() % 258 + 1; - } - } - v10 = v56; - } - v25 = v10; - v26 = pParty->field_750[v25]; - v27 = pParty->field_75A[v25] == v13; - word_F8B1A0 = pParty->field_750[v25]; - if ( v27 ) - { - //v1 = 0; - v27 = v26 == v13; - v29 = (int)pNPCTopics[351].pText; - if ( v27 ) - v29 = (int)pNPCTopics[353].pText; - dword_F8B1A4 = (char *)v29; - } - else - { - if ( v26 != v13 ) - { - party_finds_gold(100 * pMonsterStats->pInfos[(unsigned __int16)v26].uLevel, 0); - v28 = pParty->pPlayers; - do - { - v28->SetVariable(VAR_Award, 86); - ++v28; - } - while ( (signed int)v28 < (signed int)pParty->pHirelings ); - pParty->uNumBountiesCollected += 100 * pMonsterStats->pInfos[pParty->field_750[v25]].uLevel; - pParty->field_750[v25] = v13; - pParty->field_75A[v25] = v13; - } - //v1 = 0; - dword_F8B1A4 = pNPCTopics[352].pText; - } - } - else if ( uMessageParam == HOUSE_DIALOGUE_TOWNHALL_100 ) - { - pKeyActionMap->EnterText(1, 10, v8); - } - break; - } + party_finds_gold(100 * pMonsterStats->pInfos[(unsigned __int16)pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]].uLevel, 0); + for ( uint i = 0; i < 4; ++i ) + pParty->pPlayers[i].SetVariable(VAR_Award, 86); + pParty->uNumBountiesCollected += 100 * pMonsterStats->pInfos[pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)]].uLevel; + pParty->monster_id_for_hunting[(int)((char *)v8->ptr_1C - 102)] = 0; + pParty->monster_for_hunting_killed[(int)((char *)v8->ptr_1C - 102)] = false; + } + bountyHunting_text = pNPCTopics[352].pText;//"Поздравляю! Вы успешно..." + } + } + else if ( uMessageParam == HOUSE_DIALOGUE_TOWNHALL_PAY_FINE ) + pKeyActionMap->EnterText(1, 10, v8); + break; + } case BuildingType_Bank: { if ( dialog_menu_id >= 7 && dialog_menu_id <= 8 ) @@ -1583,7 +1525,7 @@ v25 = v10; v26 = pParty->field_750[v25]; v27 = pParty->field_75A[v25] == v13; - word_F8B1A0 = pParty->field_750[v25]; + bountyHunting_monster_id_for_hunting = pParty->field_750[v25]; if ( v27 ) { //v1 = 0; @@ -1591,7 +1533,7 @@ v29 = (int)pNPCTopics[351].pText; if ( v27 ) v29 = (int)pNPCTopics[353].pText; - dword_F8B1A4 = (char *)v29; + bountyHunting_text = (char *)v29; } else { @@ -1610,7 +1552,7 @@ pParty->field_75A[v25] = v13; } //v1 = 0; - dword_F8B1A4 = pNPCTopics[352].pText; + bountyHunting_text = pNPCTopics[352].pText; } } else if ( uMessageParam == 100 ) @@ -1662,11 +1604,11 @@ case HOUSE_DIALOGUE_SHOP_BUY_STANDARD: case HOUSE_DIALOGUE_SHOP_BUY_SPECIAL: { - if ( pParty->field_3C.field_50[(unsigned int)v8->ptr_1C] < (signed __int64)pParty->uTimePlayed ) + if ( pParty->field_3C.Shops_next_generation_time[(unsigned int)v8->ptr_1C] < (signed __int64)pParty->uTimePlayed ) { GenerateStandartShopItems(); GenerateSpecialShopItems(); - pParty->field_3C.field_50[window_SpeakInHouse->par1C] = pParty->uTimePlayed + (signed __int64)((double)(11059200 * (signed int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].field_1C) * 0.033333335); + pParty->field_3C.Shops_next_generation_time[window_SpeakInHouse->par1C] = pParty->uTimePlayed + (signed __int64)((double)(11059200 * (signed int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].field_1C) * 0.033333335); } if ( uMessageParam == HOUSE_DIALOGUE_SHOP_BUY_STANDARD ) { @@ -1858,7 +1800,7 @@ sub_421B2C_PlaceInInventory_or_DropPickedItem(); return; } - if ( pParty->field_3C.field_50[(unsigned int)v8->ptr_1C] < (signed __int64)pParty->uTimePlayed ) + if ( pParty->field_3C.Shops_next_generation_time[(unsigned int)v8->ptr_1C] < (signed __int64)pParty->uTimePlayed ) { GenerateStandartShopItems(); GenerateSpecialShopItems(); @@ -1869,7 +1811,7 @@ //+ (signed __int64)((double)(11059200 * (signed int)p2DEvents_minus1[26 * (unsigned int)ptr_507BC0->ptr_1C]) + (signed __int64)((double)(11059200 * (signed int)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].field_1C) * 0.033333335); - pParty->field_3C.field_50[v40] = v41; + pParty->field_3C.Shops_next_generation_time[v40] = v41; } v42 = v8->ptr_1C; @@ -2300,177 +2242,131 @@ //----- (004B7911) -------------------------------------------------------- void TownHallDialog() { - GUIWindow *v0; // eax@4 int v1; // eax@10 int v2; // esi@10 - GUIFont *v3; // ST20_4@20 - int v4; // eax@20 - MonsterInfo *v5; // edi@21 - unsigned int v6; // ST20_4@21 - char *v7; // ST1C_4@21 - unsigned int v8; // eax@21 - int v9; // esi@21 - char *v10; // eax@23 - signed int v11; // ebx@24 - signed int i; // esi@26 - int v13; // eax@27 - GUIWindow *v14; // ecx@28 - __int64 v15; // qax@28 + signed int pStringSum; // ebx@24 signed int v16; // ebx@28 int v17; // ebx@28 - unsigned __int8 v18; // sf@28 - char **v19; // edi@29 - GUIButton *v20; // eax@30 - GUIButton *v21; // esi@30 - int v22; // eax@30 + GUIButton *pButton; // eax@30 + int pTextHeight; // eax@30 unsigned int v23; // ecx@30 - unsigned __int16 v24; // ax@30 - GUIWindow a1; // [sp+Ch] [bp-110h]@21 - GUIWindow w; // [sp+60h] [bp-BCh]@21 - GUIWindow _this; // [sp+B4h] [bp-68h]@1 - int v28; // [sp+108h] [bp-14h]@1 + unsigned __int16 pTextColor; // ax@30 + GUIWindow window; // [sp+60h] [bp-BCh]@21 + GUIWindow townHall_window; // [sp+B4h] [bp-68h]@1 int v29; // [sp+10Ch] [bp-10h]@28 - int v30; // [sp+110h] [bp-Ch]@1 int v31; // [sp+114h] [bp-8h]@29 GUIFont *pOutString; // [sp+118h] [bp-4h]@21 - memcpy(&_this, window_SpeakInHouse, sizeof(_this)); - _this.uFrameX = 483; - _this.uFrameWidth = 148; - _this.uFrameZ = 334; - v28 = TargetColor(0xFFu, 0xFFu, 0xFFu); - v30 = TargetColor(0xFFu, 0xFFu, 0x9Bu); - sprintf(pTmpBuf.data(), "%s: %d", pGlobalTXT_LocalizationStrings[605], pParty->uFine); - _this.DrawTitleText(pFontArrus, 0, 0x104u, v30, pTmpBuf.data(), 3u); + memcpy(&townHall_window, window_SpeakInHouse, sizeof(townHall_window)); + townHall_window.uFrameX = 483; + townHall_window.uFrameWidth = 148; + townHall_window.uFrameZ = 334; + sprintf(pTmpBuf.data(), "%s: %d", pGlobalTXT_LocalizationStrings[605], pParty->uFine);//Текущий штраф + townHall_window.DrawTitleText(pFontArrus, 0, 260, TargetColor(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3); switch(dialog_menu_id) { - case HOUSE_DIALOGUE_MAIN: - { - v11 = 1; - pOutString = 0; - pShopOptions[0] = pGlobalTXT_LocalizationStrings[604]; - if ( pParty->uFine ) - { - pShopOptions[1] = pGlobalTXT_LocalizationStrings[603]; - v11 = 2; - } - for ( i = 0; i < v11; ++i ) - { - v13 = pFontArrus->CalcTextHeight(pShopOptions[i], &_this, 0, 0); - pOutString = (GUIFont *)((char *)pOutString + v13); - } - v29 = (100 - (signed int)pOutString) / v11; - v14 = pDialogueWindow; - v15 = 80 - v11 * (100 - (signed int)pOutString) / v11 - (signed int)pOutString; - v16 = v15 - HIDWORD(v15); - LODWORD(v15) = pDialogueWindow->pStartingPosActiveItem; - HIDWORD(v15) = v15 + pDialogueWindow->pNumPresenceButton; - v17 = (v16 >> 1) - v29 / 2 + 158; - v18 = -pDialogueWindow->pNumPresenceButton < 0; - pOutString = (GUIFont *)pDialogueWindow->pStartingPosActiveItem; - if ( v18 ^ __OFSUB__((int)v15, HIDWORD(v15)) ) - { - v31 = 2; - v19 = pShopOptions.data(); - do - { - v20 = v14->GetControl((unsigned int)pOutString); - v21 = v20; - v20->uY = v29 + v17; - v22 = pFontArrus->CalcTextHeight(*v19, &_this, 0, 0); - v23 = v21->uY; - v21->uHeight = v22; - v17 = v23 + v22 - 1; - v21->uW = v17; - v24 = v30; - if ( pDialogueWindow->pCurrentPosActiveItem != v31 ) - v24 = v28; - _this.DrawTitleText(pFontArrus, 0, v23, v24, *v19, 3u); - v14 = pDialogueWindow; - ++v31; - ++v19; - pOutString = (GUIFont *)((char *)pOutString + 1); - } - while ( (signed int)pOutString < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem ); - } - break; - } - - case HOUSE_DIALOGUE_TOWNHALL_99: - { - v5 = &pMonsterStats->pInfos[word_F8B1A0]; - v6 = TargetColor(0xFFu, 0xFFu, 0xFFu); - v7 = v5->pName; - v8 = TargetColor(0xFFu, 0xFFu, 0x9Bu); - sprintf(pTmpBuf.data(), "\f%05d%s\f%05d", v8, v7, v6); - sprintf(pTmpBuf2.data(), dword_F8B1A4, pTmpBuf.data(), 100 * v5->uLevel); - current_npc_text = pTmpBuf2.data(); - memcpy(&a1, pDialogueWindow, sizeof(a1)); - w.uFrameWidth = 458; - w.uFrameZ = 457; - pOutString = pFontArrus; - v9 = pFontArrus->CalcTextHeight(pTmpBuf2.data(), &w, 13, 0) + 7; - if ( 352 - v9 < 8 ) - { - pOutString = pFontCreate; - v9 = pFontCreate->CalcTextHeight(current_npc_text, &w, 13, 0) + 7; - } - - auto pTex = pIcons_LOD->GetTexture(uTextureID_Leather); - pRenderer->GetLeather(8, 352 - v9, pTex, pTex->uTextureHeight - v9); - pRenderer->DrawTextureIndexed(8, 347 - v9, pTexture_591428); - v10 = FitTextInAWindow(current_npc_text, pOutString, &w, 13, 0); - a1.DrawText(pOutString, 13, 354 - v9, 0, v10, 0, 0, 0); - break; - } - case HOUSE_DIALOGUE_TOWNHALL_100: - { - v0 = window_SpeakInHouse; - if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS) - { - sprintfex(pTmpBuf.data(), "%s\n%s", pGlobalTXT_LocalizationStrings[606], pGlobalTXT_LocalizationStrings[112]); // "Pay" "How Much?" - _this.DrawTitleText(pFontArrus, 0, 0x92u, v30, pTmpBuf.data(), 3u); - _this.DrawTitleText(pFontArrus, 0, 0xBAu, v28, (const char *)pKeyActionMap->pPressedKeysBuffer, 3); - v3 = pFontArrus; - v4 = pFontArrus->GetLineWidth((const char *)pKeyActionMap->pPressedKeysBuffer); - _this.DrawFlashingInputCursor(v4 / 2 + 80, 185, v3); - return; - } - if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CONFIRMED) - { - v1 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer); - v2 = v1; - if ( v1 <= 0 ) - { - pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); - return; - } - if ( v1 > pParty->uNumGold ) - { - PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful); - v2 = pParty->uNumGold; - } - if ( v2 > pParty->uFine ) - v2 = pParty->uFine; - Party::TakeGold(v2); - pParty->uFine -= v2; - if ( pParty->uFine < 0 ) - pParty->uFine = 0; - if ( uActiveCharacter ) - pPlayers[uActiveCharacter]->PlaySound(SPEECH_81, 0); - v0 = window_SpeakInHouse; - } - if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CANCELLED) - { - v0->receives_keyboard_input_2 = WINDOW_INPUT_NONE; - pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); - } - break; - } - default: - { - break; - } + case HOUSE_DIALOGUE_MAIN: + { + pStringSum = 1; + pTextHeight = 0; + pShopOptions[0] = pGlobalTXT_LocalizationStrings[604];//Охота за вознаграждение + if ( pParty->uFine > 0 ) + { + pShopOptions[1] = pGlobalTXT_LocalizationStrings[603];//Заплатить штраф + pStringSum = 2; + } + for ( uint i = 0; i < pStringSum; ++i ) + pTextHeight += pFontArrus->CalcTextHeight(pShopOptions[i], &townHall_window, 0, 0); + v29 = (100 - pTextHeight) / pStringSum; + v16 = 80 - pStringSum * ((100 - pTextHeight) / pStringSum); + v17 = (v16 / 2) - v29 / 2 + 158; + if ( pDialogueWindow->pNumPresenceButton > 0 ) + { + v31 = 2; + uint j = 0; + for ( uint i = pDialogueWindow->pStartingPosActiveItem; + i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i ) + { + pButton = pDialogueWindow->GetControl(i); + pButton->uY = v29 + v17; + pTextHeight = pFontArrus->CalcTextHeight(pShopOptions[j], &townHall_window, 0, 0); + v23 = pButton->uY; + pButton->uHeight = pTextHeight; + v17 = v23 + pTextHeight - 1; + pButton->uW = v17; + pTextColor = TargetColor(0xFFu, 0xFFu, 0x9Bu); + if ( pDialogueWindow->pCurrentPosActiveItem != v31 ) + pTextColor = TargetColor(0xFFu, 0xFFu, 0xFFu); + townHall_window.DrawTitleText(pFontArrus, 0, v23, pTextColor, pShopOptions[j], 3); + ++v31; + ++j; + } + } + break; + } + case HOUSE_DIALOGUE_TOWNHALL_MESSAGE: + { + sprintf(pTmpBuf.data(), "\f%05d%s\f%05d", TargetColor(0xFFu, 0xFFu, 0x9Bu), + pMonsterStats->pInfos[bountyHunting_monster_id_for_hunting].pName, TargetColor(0xFFu, 0xFFu, 0xFFu)); + sprintf(pTmpBuf2.data(), bountyHunting_text, pTmpBuf.data(), 100 * pMonsterStats->pInfos[bountyHunting_monster_id_for_hunting].uLevel); + current_npc_text = pTmpBuf2.data(); + memcpy(&window, pDialogueWindow, sizeof(window)); + window.uFrameWidth = 458; + window.uFrameZ = 457; + pOutString = pFontArrus; + pTextHeight = pFontArrus->CalcTextHeight(pTmpBuf2.data(), &window, 13, 0) + 7; + if ( 352 - pTextHeight < 8 ) + { + pOutString = pFontCreate; + pTextHeight = pFontCreate->CalcTextHeight(current_npc_text, &window, 13, 0) + 7; + } + pRenderer->GetLeather(8, 352 - pTextHeight, pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight - pTextHeight); + pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428); + window.DrawText(pOutString, 13, 354 - pTextHeight, 0, FitTextInAWindow(current_npc_text, pOutString, &window, 13, 0), 0, 0, 0); + break; + } + case HOUSE_DIALOGUE_TOWNHALL_PAY_FINE: + { + if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS) + { + sprintfex(pTmpBuf.data(), "%s\n%s", pGlobalTXT_LocalizationStrings[606], pGlobalTXT_LocalizationStrings[112]); // "Pay" "How Much?" + townHall_window.DrawTitleText(pFontArrus, 0, 146, TargetColor(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3); + townHall_window.DrawTitleText(pFontArrus, 0, 186, TargetColor(0xFFu, 0xFFu, 0xFFu), (const char *)pKeyActionMap->pPressedKeysBuffer, 3); + townHall_window.DrawFlashingInputCursor(pFontArrus->GetLineWidth((const char *)pKeyActionMap->pPressedKeysBuffer) / 2 + 80, 185, pFontArrus); + return; + } + if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CONFIRMED) + { + v1 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer); + v2 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer); + if ( v1 <= 0 ) + { + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + return; + } + if ( v1 > pParty->uNumGold ) + { + PlayHouseSound((unsigned int)window_SpeakInHouse->ptr_1C, HouseSound_NotEnoughMoney_TrainingSuccessful); + v2 = pParty->uNumGold; + } + if ( v2 > pParty->uFine ) + v2 = pParty->uFine; + Party::TakeGold(v2); + pParty->uFine -= v2; + if ( pParty->uFine < 0 ) + pParty->uFine = 0; + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->PlaySound(SPEECH_81, 0); + } + if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_CANCELLED) + { + window_SpeakInHouse->receives_keyboard_input_2 = WINDOW_INPUT_NONE; + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + } + break; + } + default: + break; } return; } @@ -4174,7 +4070,6 @@ v33 = _4B254D_SkillMasteryTeacher((int)v52.ptr_1C); LABEL_44: v15 = v33; -LABEL_45: v16 = (GUIButton *)pInString; goto LABEL_49; } @@ -4187,15 +4082,16 @@ v28 = v27 - 1; if ( !v28 ) { - v29 = (char *)&pMonsterStats + 88 * word_F8B1A0; + v29 = pMonsterStats->pInfos[bountyHunting_monster_id_for_hunting].pName; v30 = TargetColor(0xFFu, 0xFFu, 0xFFu); v31 = *(int *)v29; v32 = TargetColor(0xFFu, 0xFFu, 0x9Bu); sprintfex(pTmpBuf.data(), "\f%05d%s\f%05d", v32, v31, v30); - sprintfex(pTmpBuf2.data(), dword_F8B1A4, pTmpBuf.data(), 100 * (unsigned __int8)v29[8]); + sprintfex(pTmpBuf2.data(), bountyHunting_text, pTmpBuf.data(), 100 * (unsigned __int8)v29[8]); current_npc_text = pTmpBuf2.data(); v15 = ""; - goto LABEL_45; + v16 = (GUIButton *)pInString; + goto LABEL_49; } if ( v28 != 10 ) goto LABEL_41; @@ -4237,7 +4133,8 @@ sprintf(pTmpBuf.data(), format_4E2D80, v55, pItemsTable->pItems[contract_approved].pUnidentifiedName); sprintf(pTmpBuf2.data(), current_npc_text, pTmpBuf.data()); current_npc_text = pTmpBuf2.data(); - goto LABEL_45; + v16 = (GUIButton *)pInString; + goto LABEL_49; } v21 = v20 - 1; if ( !v21 )
--- a/UI/UIHouses.h Thu Sep 05 18:05:50 2013 +0600 +++ b/UI/UIHouses.h Fri Sep 06 16:42:23 2013 +0600 @@ -32,8 +32,8 @@ HOUSE_DIALOGUE_LEARN_SKILLS = 96, HOUSE_DIALOGUE_97 = 97, HOUSE_DIALOGUE_98 = 98, - HOUSE_DIALOGUE_TOWNHALL_99 = 99, - HOUSE_DIALOGUE_TOWNHALL_100 = 100, + HOUSE_DIALOGUE_TOWNHALL_MESSAGE = 99, + HOUSE_DIALOGUE_TOWNHALL_PAY_FINE = 100, HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN = 101, HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES = 102, HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS = 103,
--- a/UI/UIShops.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/UI/UIShops.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -70,7 +70,7 @@ int v61; // eax@90 int v62; // ecx@90 ItemGen *pItemInShop; // esi@90 - int v64; // eax@95 + //int v64; // eax@95 int all_text_height; // esi@96 char **v66; // edi@96 int v67; // eax@97 @@ -233,8 +233,8 @@ pItemInShop = &pParty->SpecialItemsInShops[(int)v61][v60]; if ( !v56 || !Str ) { - v64 = pPlayer->SelectPhrasesTransaction(pItemInShop, BuildingType_WeaponShop, v61, 2); - v7 = BuildDialogueString((char *)pMerchantsBuyPhrases[v64], uActiveCharacter - 1, pItemInShop, (char *)window_SpeakInHouse->ptr_1C, 2, 0); + v7 = BuildDialogueString((char *)pMerchantsBuyPhrases[pPlayer->SelectPhrasesTransaction(pItemInShop, BuildingType_WeaponShop, v61, 2)], + uActiveCharacter - 1, pItemInShop, (char *)window_SpeakInHouse->ptr_1C, 2, 0); pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0); dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3); } @@ -248,7 +248,7 @@ } else { - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed);//Приходите через 7 дней pNumActiveItem = 0; //added } } @@ -424,22 +424,20 @@ pItemInShop = &pParty->SpecialItemsInShops[(int)v61][v60];//v63 = (ItemGen *)&pParty->field_C59C[v62 + 724]; if ( !v56 || !Str ) { - v64 = pPlayer->SelectPhrasesTransaction(pItemInShop, BuildingType_WeaponShop, v61, 2); - v7 = BuildDialogueString((char *)pMerchantsBuyPhrases[v64], uActiveCharacter - 1, pItemInShop, (char *)window_SpeakInHouse->ptr_1C, 2, 0); - pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0); - dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3); + v7 = BuildDialogueString((char *)pMerchantsBuyPhrases[pPlayer->SelectPhrasesTransaction(pItemInShop, BuildingType_WeaponShop, v61, 2)], + uActiveCharacter - 1, pItemInShop, (char *)window_SpeakInHouse->ptr_1C, 2, 0); + dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0)) / 2 + 138, pColorWhite, v7, 3); } else { v7 = BuildDialogueString(pGlobalTXT_LocalizationStrings[181], uActiveCharacter - 1, pItemInShop, (char *)window_SpeakInHouse->ptr_1C, 2, 0); - pTextHeight = pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0); - dialog_window.DrawTitleText(pFontArrus, 0, (174 - pTextHeight) / 2 + 138, pColorWhite, v7, 3); + dialog_window.DrawTitleText(pFontArrus, 0, (174 - pFontArrus->CalcTextHeight(v7, &dialog_window, 0, 0)) / 2 + 138, pColorWhite, v7, 3); } } } else { - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); pNumActiveItem = 0; //added } } @@ -769,7 +767,7 @@ dialog_window.DrawTitleText(pFontArrus, 0, v115, pWhiteColor, v36, 3); return; } - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[window_SpeakInHouse->par1C]- pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[window_SpeakInHouse->par1C]- pParty->uTimePlayed); return; } break; @@ -841,7 +839,7 @@ dialog_window.DrawTitleText(pFontArrus, 0, v115, pWhiteColor, v36, 3); return; } - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[window_SpeakInHouse->par1C]- pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[window_SpeakInHouse->par1C]- pParty->uTimePlayed); return; } break; @@ -1018,7 +1016,7 @@ while ( v104 < 8 ); return; } - dialog_window.DrawCurrentTime(pParty->field_3C.field_50[window_SpeakInHouse->par1C]- pParty->uTimePlayed); + dialog_window.DrawCurrentTime(pParty->field_3C.Shops_next_generation_time[window_SpeakInHouse->par1C]- pParty->uTimePlayed); return; } break; @@ -1351,7 +1349,7 @@ DrawTextAtStatusBar(v65, 0); if ( !v109 ) { - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); return; } v66 = pMouse->GetCursorPos(&v98); @@ -1551,7 +1549,7 @@ DrawTextAtStatusBar(v65, 0); if ( !v109 ) { - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[ (unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); return; } v66 = pMouse->GetCursorPos(&v98); @@ -1932,7 +1930,7 @@ DrawTextAtStatusBar(v69, 0); if ( !v117 ) { - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); return; } v70 = pMouse->GetCursorPos(&v102); @@ -2063,7 +2061,7 @@ DrawTextAtStatusBar(v69, 0); if ( !v117 ) { - dialog_window.DrawCurrentTime( pParty->field_3C.field_50[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); + dialog_window.DrawCurrentTime( pParty->field_3C.Shops_next_generation_time[(unsigned int)window_SpeakInHouse->ptr_1C] - pParty->uTimePlayed); return; } v70 = pMouse->GetCursorPos(&v102);
--- a/mm7_2.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/mm7_2.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -218,81 +218,59 @@ } //----- (004BBA85) -------------------------------------------------------- -const char *sub_4BBA85_bounties() +void CheckBountyRespawnAndAward() { - int v0; // edi@1 - signed __int64 v1; // qax@2 int i; // eax@2 - int v3; // edx@3 - int v4; // edi@14 - __int16 v5; // ax@14 - char v6; // zf@14 - Player *v7; // ebx@16 - const char *result; // eax@19 + int rand_monster_id; // edx@3 uDialogueType = 83; pDialogueWindow->Release(); pDialogueWindow = GUIWindow::Create(0, 0, 640, 350, WINDOW_MainMenu, 0, 0); - pBtn_ExitCancel = pDialogueWindow->CreateButton(471u, 445u, 169u, 35u, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[34],// "Cancel" + pBtn_ExitCancel = pDialogueWindow->CreateButton(471, 445, 169, 35, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[34],// "Cancel" pIcons_LOD->GetTexture(uExitCancelTextureId), 0); pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", 0); - pDialogueWindow->CreateButton(480u, 160u, 140u, 30u, 1, 0, UIMSG_0, 0x53u, 0, "", 0); + pDialogueWindow->CreateButton(480, 160, 140, 30, 1, 0, UIMSG_0, 83, 0, "", 0); pDialogueWindow->_41D08F_set_keyboard_control_group(1, 1, 0, 2); dialog_menu_id = HOUSE_DIALOGUE_OTHER; - v0 = (int)((char *)window_SpeakInHouse->ptr_1C - 102); - if ( (signed __int64)__PAIR__(pParty->field_3C.field_0[2 * v0 + 1], pParty->field_3C.field_0[2 * v0]) < (signed __int64)pParty->uTimePlayed ) - { - pParty->field_75A[v0] = 0; - __debugbreak(); // starting year-related constant here; - v1 = (signed __int64)((double)(0x12750000 * (pParty->uCurrentMonth + 12i64 * pParty->uCurrentYear - 14015)) - * 0.033333335); - pParty->field_3C.field_0[2 * v0] = v1; - pParty->field_3C.field_0[2 * v0 + 1] = HIDWORD(v1); + //get new monster for hunting + if ( pParty->field_3C.bountyHunting_next_generation_time[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] < (signed __int64)pParty->uTimePlayed ) + { + pParty->monster_for_hunting_killed[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = false; + pParty->field_3C.bountyHunting_next_generation_time[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = (signed __int64)((double)(0x12750000 * (pParty->uCurrentMonth + 12i64 * pParty->uCurrentYear - 14015)) * 0.033333335); for ( i = rand(); ; i = rand() ) { - v3 = i % 258 + 1; - pParty->field_750[v0] = v3; - if ( (unsigned __int16)v3 < 0x73u || (unsigned __int16)v3 > 0x84u ) + rand_monster_id = i % 258 + 1; + pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = rand_monster_id; + if ( (unsigned __int16)rand_monster_id < 0x73u || (unsigned __int16)rand_monster_id > 0x84u ) { - if ( ((unsigned __int16)v3 < 0xEBu || (unsigned __int16)v3 > 0xFCu) - && ((unsigned __int16)v3 < 0x85u || (unsigned __int16)v3 > 0x96u) - && ((unsigned __int16)v3 < 0x97u || (unsigned __int16)v3 > 0xBAu) - && ((unsigned __int16)v3 < 0xC4u || (unsigned __int16)v3 > 0xC6u) ) + if ( ((unsigned __int16)rand_monster_id < 0xEBu || (unsigned __int16)rand_monster_id > 0xFCu) + && ((unsigned __int16)rand_monster_id < 0x85u || (unsigned __int16)rand_monster_id > 0x96u) + && ((unsigned __int16)rand_monster_id < 0x97u || (unsigned __int16)rand_monster_id > 0xBAu) + && ((unsigned __int16)rand_monster_id < 0xC4u || (unsigned __int16)rand_monster_id > 0xC6u) ) break; } } } - v4 = v0; - v5 = pParty->field_750[v4]; - v6 = pParty->field_75A[v4] == 0; - word_F8B1A0 = pParty->field_750[v4]; - if ( v6 ) - { - v6 = v5 == 0; - result = pNPCTopics[351].pText; - if ( v6 ) - result = pNPCTopics[353].pText; - } - else - { - if ( v5 ) + bountyHunting_monster_id_for_hunting = pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)]; + if ( !pParty->monster_for_hunting_killed[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] ) + { + bountyHunting_text = pNPCTopics[351].pText; + if ( !pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] ) + bountyHunting_text = pNPCTopics[353].pText; + } + else//get prize + { + if ( pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] ) { - party_finds_gold(100 * pMonsterStats->pInfos[(unsigned __int16)v5].uLevel, 0); - v7 = pParty->pPlayers; - do - { - v7->SetVariable(VAR_Award, 86); - ++v7; - } - while ( (signed int)v7 < (signed int)pParty->pHirelings ); - pParty->uNumBountiesCollected += 100 * pMonsterStats->pInfos[pParty->field_750[v4]].uLevel; - pParty->field_750[v4] = 0; - pParty->field_75A[v4] = 0; + party_finds_gold(100 * pMonsterStats->pInfos[(unsigned __int16)pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)]].uLevel, 0); + for ( uint i = 0; i < 4; ++i ) + pParty->pPlayers[i].SetVariable(VAR_Award, 86); + pParty->uNumBountiesCollected += 100 * pMonsterStats->pInfos[pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)]].uLevel; + pParty->monster_id_for_hunting[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = 0; + pParty->monster_for_hunting_killed[(int)((char *)window_SpeakInHouse->ptr_1C - 102)] = false; } - result = pNPCTopics[352].pText; - } - dword_F8B1A4 = (char *)result; - return result; + bountyHunting_text = pNPCTopics[352].pText; + } } //----- (004BBCDD) -------------------------------------------------------- @@ -334,7 +312,7 @@ { uDialogueType = 91; v4 = pParty->pPlayers; - ++*((char *)&pParty->field_75A[3] + (unsigned __int8)pParty->field_7B5_in_arena_quest + 1); + ++*((char *)&pParty->monster_for_hunting_killed[3] + (unsigned __int8)pParty->field_7B5_in_arena_quest + 1); do { v4->SetVariable(VAR_Award, (unsigned __int8)pParty->field_7B5_in_arena_quest + 3);
--- a/mm7_4.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/mm7_4.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -3629,7 +3629,7 @@ OracleDialogue(); break; case 311: - sub_4BBA85_bounties(); + CheckBountyRespawnAndAward(); break; case 399: __debugbreak(); // what kind of dialogue is that?
--- a/mm7_data.cpp Thu Sep 05 18:05:50 2013 +0600 +++ b/mm7_data.cpp Fri Sep 06 16:42:23 2013 +0600 @@ -1349,8 +1349,8 @@ std::array<__int16, 777> word_F8B158; // weak struct Texture *ShopTexture; // idb std::array<struct Texture *, 12> ItemsInShopTexture; -__int16 word_F8B1A0; // weak -const char *dword_F8B1A4; // idb +__int16 bountyHunting_monster_id_for_hunting; // word_F8B1A0 +const char *bountyHunting_text; // word_F8B1A4 int contract_approved; // weak int dword_F8B1AC_award_bit_number; // idb int dword_F8B1B0; // weak
--- a/mm7_data.h Thu Sep 05 18:05:50 2013 +0600 +++ b/mm7_data.h Fri Sep 06 16:42:23 2013 +0600 @@ -1009,8 +1009,8 @@ extern std::array<__int16, 777> word_F8B158; // weak extern struct Texture *ShopTexture; // idb extern std::array<struct Texture *, 12> ItemsInShopTexture; -extern __int16 word_F8B1A0; // weak -extern const char *dword_F8B1A4; // idb +extern __int16 bountyHunting_monster_id_for_hunting; // weak +extern const char *bountyHunting_text; // idb extern int contract_approved; // weak extern int dword_F8B1AC_award_bit_number; // idb extern int dword_F8B1B0; // weak @@ -1243,7 +1243,7 @@ void _4B4224_UpdateNPCTopics(int _this); void __fastcall DrawTextAtStatusBar(const char *Str, int a5); __int64 GetExperienceRequiredForLevel(int a1); -const char *sub_4BBA85_bounties(); +void CheckBountyRespawnAndAward(); void sub_4BBCDD(); void __fastcall _4BBF61_summon_actor(int a1, __int16 x, int y, int z); // idb void ArenaFight();