![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1981
|
|
![]() Legendary lover Сообщений: 629 Спасибо сказали: 307 раз ![]() |
Бараторч, а можешь сделать кроме кнопки "Переиграть вручную" кнопку "Автобой с магией"? Иногда банально герой вешает вначале общее ускорение или благословение, и исход битвы круто меняется, неохота опять же каждый раз переигрывать вручную. тогда неплохо было бы для онлайна "переиграть бой", после боя вручную )) и зациклить) |
|
|
![]()
Сообщение
#1982
|
|
![]() Организатор лиги WCL Сообщений: 981 Спасибо сказали: 632 раза ![]() |
нужна опция: отключение читкодов в турнирном режиме
-------------------- Постоянно играю на рейтинг www.heroes-III.com в онлайне через сервер GameRanger - в HoMM3 SOD или WT. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил
|
|
|
![]()
Сообщение
#1983
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
2baratoch: На HW ответить не могу. Раз зашла речь про квик-комбат, то, может, чем поможет эта инфа. В принципе там вся тема посвящена багам квика.
|
|
|
![]()
Сообщение
#1984
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Жесть, нужно чаще использовать быструю битву и брать много гидр.
-------------------- |
|
|
![]()
Сообщение
#1985
|
|
Immortal Сообщений: 9 441 Спасибо сказали: 3956 раз ![]() |
Это точно был SoD 3.2? Что-то непохоже на правду, в коде явственно прописано бить только тех, кто рядом (цикл по рядом стоящих гексам). В отладчике в коде многоголового удара при быстрой битве гидра бьёт не больше стеков, чем надо.
|
|
|
![]()
Сообщение
#1986
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Это точно был SoD 3.2? Не совсем - 4.0 RU. Хотя какая разница? Цитата В отладчике в коде многоголового удара при быстрой битве гидра бьёт не больше стеков, чем надо. Точно квик-комбат, а не автобой смотрите? Неплохо бы аналогичный лог увидеть для сравнения. Цитата Жесть, нужно чаще использовать быструю битву и брать много гидр. Не только гидры так странно себя ведут, но и церберы ещё, к примеру baratoch пишет: Цитата в квике, после того как вначале все стрекозы покусают гидру, они БОЛЬШЕ НЕ ХОДЯТ!!! гидра стоит и безнаказанно убивает стоящих вокруг нее стрекоз!!!!!!!! Возможно, истина где-то посередине. Возможно, после того, как мухи соберутся вокруг гидры, AI продолжает генерировать ходы, однако по какой-то причине отряды остаются на месте. |
|
|
![]()
Сообщение
#1987
|
|
Immortal Сообщений: 9 441 Спасибо сказали: 3956 раз ![]() |
Цитата(AlexSpl) Хотя какая разница? Разница в том, что я анализировал (и вижу смысл анализировать в дальнейшем) только 3.2, в 4.0 другой код и за то, что там, я ничего сказать не могу. Цитата(AlexSpl) Точно квик-комбат, а не автобой смотрите? Неплохо бы аналогичный лог увидеть для сравнения. Задолбаюсь ведь составлять такой лог. Могу дать лог вызовов функции нанесения урона. Лучше даже так проверю - дам вражескому герою 7 крестьян и если гидре хоть раз нанесут урон после урона крестьянину - значит не всех она бьёт. Цитата(AlexSpl) Возможно, истина где-то посередине. Возможно, после того, как мухи соберутся вокруг гидры, AI продолжает генерировать ходы, однако по какой-то причине отряды остаются на месте. Всё, разобрался. Стрекозы не ходят не только в быстрой битве, но и в обычной. Они просто боятся бить гидру, а о том, что можно отступить и что ответка одна и сразу кончится, не знают. Это просто несовершенство ИИ. |
|
|
![]()
Сообщение
#1988
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Всё, разобрался. Стрекозы не ходят не только в быстрой битве, но и в обычной. Они просто боятся бить гидру, а о том, что можно отступить и что ответка одна и сразу кончится, не знают. Это просто несовершенство ИИ. Поведение мух зависит ещё и от уровня сложности. Мой лог - для 160%. Но попробуйте сравнить один и тот же бой для 100% и 200% - результаты будут разными (даже при обычной битве). |
|
|
![]()
Сообщение
#1989
|
|
Immortal Сообщений: 9 441 Спасибо сказали: 3956 раз ![]() |
Да, на 160% они так не делают.
|
|
|
![]()
Сообщение
#1990
|
|
![]() Immortal Сообщений: 1 437 Спасибо сказали: 2149 раз ![]() |
может в быстрой битве боевой-ИИ импользуется только самый простой?
я просто не в курсе, может такое быть хотя бы теоретически или ИИ общий и неделимый. |
|
|
![]()
Сообщение
#1991
|
|
Immortal Сообщений: 2 413 Спасибо сказали: 4619 раз ![]() |
Sav, не разобрался.
Вот лог урона по стэку (без магии с запретом боевого духа и удачи 4 гидры хаоса против 18x5 стрекоз в улье, 0 атака 0 защита героя) 160% сложность 1 - квик (все гидры живы) 2 - авто (одна умирает) стабильно 441379: - атака стрекоз 4400DF: - атака гидры ![]() налицо неадекват квика -------------------- |
|
|
![]()
Сообщение
#1992
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Ага, это урон. Плохо, что здесь не видно координат стеков. Ведь по логу атак нельзя говорить о том, где именно расположены стеки мух. |
|
|
![]()
Сообщение
#1993
|
|
![]() Legendary lover Сообщений: 629 Спасибо сказали: 307 раз ![]() |
нужна опция: отключение читкодов в турнирном режиме Зачем? Если используются пароли - по сути не нужна. А если не используются, то любая вторая копия игры попросту запускается без турнирного режима, делается сейв GM1, если необходимо, и все читы снова работают. Цитата налицо неадекват квика Если это неизменённый квик 3.2/4.0, то лично я бы не брался за его исправление. Это оригинальный баг игры, уже многим известно, что на квике комп лучше справляется против стрелковых блоков. Там даже где-то приводился совершенно фееричный пример выигрыша заведомо более слабыми войсками. Если разбирать неадекватность каждого из юнитов - выйдет жуткая работа, зато если всё исправить - появится куча ярых противников квика: ведь раньше-то он давал лучшие результаты! Все уже не один раз замечали, что автобой реально либо сильно лучше либо сильно хуже играет тот же бой на квике, так что если его менять - то не для онлайна, поскольку конкретно это - уже сильное вмешательство в геймплей |
|
|
![]()
Сообщение
#1994
|
|
Immortal Сообщений: 9 441 Спасибо сказали: 3956 раз ![]() |
Кажется, нашёл ошибку.
Код signed int __thiscall A0_Battle_Stack_Draw_Flying_sub_4B47A0(_BattleStack_ *this, int TarGex) { int StartGex_Coloumn_v2; // ecx@1 int TarGex_v3; // ebx@1 _BattleStack_ *this_v4; // esi@1 signed __int64 Distance_v5; // qax@13 signed int Flying_Distance_v6; // ecx@13 int StartGexNum_mul_112_v7; // edx@13 char *TarGexNum_mul_112_v8; // ecx@13 double Distance_sqr_v9; // ST48_8@13 int FramesCount_v10; // edi@14 float Frames_Count_v11; // ST68_4@16 float X_Dist_v12; // ST64_4@16 float Y_Dist_v13; // ST64_4@16 void *Def_v14; // eax@17 float MovingAnim_Time_v15; // ST5C_4@21 float Frame_X_Speed_v16; // ST5C_4@24 float Frame_Y_Speed_v17; // ST60_4@24 int v18; // ebx@24 int v19; // edi@24 int v20; // ecx@24 DWORD v21; // eax@32 int v22; // eax@34 int v25; // [sp+Ch] [bp-44h]@24 int v26; // [sp+10h] [bp-40h]@24 DWORD WaitingTime_v27; // [sp+20h] [bp-30h]@21 float Y_Speed_v28; // [sp+28h] [bp-28h]@16 float X_Speed_v29; // [sp+2Ch] [bp-24h]@16 signed int Start_Y_v30; // [sp+30h] [bp-20h]@13 signed int Start_X_v31; // [sp+34h] [bp-1Ch]@13 int Frames_Remained_v32; // [sp+38h] [bp-18h]@22 float Curr_X_v33; // [sp+3Ch] [bp-14h]@21 int X_Dist_v34; // [sp+40h] [bp-10h]@13 float Curr_Y_v35; // [sp+40h] [bp-10h]@21 int Y_Dist_v36; // [sp+44h] [bp-Ch]@13 float Def_Frames_Count_v37; // [sp+44h] [bp-Ch]@21 signed int Def_FramesCount_v38; // [sp+48h] [bp-8h]@19 char Need_Change_Orientation_v39; // [sp+4Fh] [bp-1h]@2 this_v4 = this; TarGex_v3 = TarGex; StartGex_Coloumn_v2 = this->GexNum_dword38 % 17; if ( StartGex_Coloumn_v2 <= TarGex % 17 ) { if ( StartGex_Coloumn_v2 >= TarGex % 17 ) Need_Change_Orientation_v39 = 0; else Need_Change_Orientation_v39 = this_v4->Orientation_dword44 == 0; } else { Need_Change_Orientation_v39 = this_v4->Orientation_dword44 == 1; } if ( A0_Battle_Need_Open_Bridge_sub_466D10((int)A0_BattleMgr_dword_699420, this_v4, TarGex) ) { this_v4->AnimSectionNum_dword3C = 2; this_v4->AnimFrameNum_dword40 = 0; A0_Battle_Draw_sub_493FC0((int)A0_BattleMgr_dword_699420, 1, 0, 0, 0, 1, 0); A0_Battle_Open_CastleBridge_sub_466DA0((int)A0_BattleMgr_dword_699420); } if ( this_v4->Creature_29dword74.Flags_dword10 & 1 ) { if ( Need_Change_Orientation_v39 ) { TarGex_v3 = (this_v4->Orientation_dword44 != 0 ? 2 : 0) - 1 + TarGex; TarGex += (this_v4->Orientation_dword44 != 0 ? 2 : 0) - 1; } } A0_Battle_Clear_Stack_Image_sub_446550(this_v4); if ( Need_Change_Orientation_v39 ) A0_Battle_Stack_Ch_Orient_sub_446440(this_v4, 1); StartGexNum_mul_112_v7 = 112 * this_v4->GexNum_dword38; Start_Y_v30 = *(_WORD *)((char *)&A0_BattleMgr_dword_699420->hex[0].Y_Position + StartGexNum_mul_112_v7); Start_X_v31 = *(_WORD *)((char *)&A0_BattleMgr_dword_699420->hex[0].X_Position + StartGexNum_mul_112_v7); TarGexNum_mul_112_v8 = (char *)A0_BattleMgr_dword_699420 + 112 * TarGex_v3; Y_Dist_v36 = *((_WORD *)TarGexNum_mul_112_v8 + 227) - Start_Y_v30; X_Dist_v34 = *((_WORD *)TarGexNum_mul_112_v8 + 226) - Start_X_v31; Distance_sqr_v9 = (double)(X_Dist_v34 * X_Dist_v34 + Y_Dist_v36 * Y_Dist_v36); Distance_v5 = (signed __int64)sqrt(LODWORD(Distance_sqr_v9), HIDWORD(Distance_sqr_v9)); Flying_Distance_v6 = this_v4->Anim_21dword110.FlightAnim_FrameDistance_dword50; if ( Flying_Distance_v6 <= 0 ) FramesCount_v10 = 1; else FramesCount_v10 = ((_DWORD)Distance_v5 + Flying_Distance_v6 / 2) / Flying_Distance_v6; Frames_Count_v11 = (double)FramesCount_v10; X_Dist_v12 = (double)X_Dist_v34; X_Speed_v29 = X_Dist_v12 / Frames_Count_v11; Y_Dist_v13 = (double)Y_Dist_v36; Y_Speed_v28 = Y_Dist_v13 / Frames_Count_v11; if ( !A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) ) { this_v4->IsMoving_byte30 = 1; A0_Battle_Stack_StartSound_sub_43D260(this_v4, 6); A0_Battle_Stack_DrawMoving_Or_ChangeOrientDraw_sub_446660(this_v4, 20, -1, 0); A0_Battle_Stack_StartSound_sub_43D260(this_v4, 0); A0_Battle_RemoveStack_From_Gexes_sub_468310(A0_BattleMgr_dword_699420, this_v4); Def_v14 = this_v4->Def_dword164; this_v4->AnimSectionNum_dword3C = 0; if ( *((_DWORD *)Def_v14 + 10) > 0 && **((_DWORD **)Def_v14 + 11) ) Def_FramesCount_v38 = ***((_DWORD ***)Def_v14 + 7); else Def_FramesCount_v38 = 0; Curr_X_v33 = (double)Start_X_v31; Curr_Y_v35 = (double)Start_Y_v30; Def_Frames_Count_v37 = (double)Def_FramesCount_v38; MovingAnim_Time_v15 = (double)this_v4->Anim_21dword110.MovingAnim_Time_dword48; WaitingTime_v27 = (signed __int64)(MovingAnim_Time_v15 * A0_BattleSettings_PeriodMults_dword_63CF7C[*(_DWORD *)&A0_Reg_Key_CombatSpeed_dword_69883C] / Def_Frames_Count_v37); if ( FramesCount_v10 > 0 ) { Frames_Remained_v32 = FramesCount_v10; do { this_v4->AnimFrameNum_dword40 = 0; if ( Def_FramesCount_v38 > 0 ) { do { v25 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616]; v26 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620]; v18 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624]; Frame_X_Speed_v16 = X_Speed_v29 / Def_Frames_Count_v37; Curr_X_v33 = Frame_X_Speed_v16 + Curr_X_v33; v19 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628]; v20 = *(_DWORD *)(WndMgr_dword_6992D0 + 64); Frame_Y_Speed_v17 = Y_Speed_v28 / Def_Frames_Count_v37; Curr_Y_v35 = Frame_Y_Speed_v17 + Curr_Y_v35; A0_DrawSurface16_sub_44DF80( *(void **)&A0_BattleMgr_dword_699420->field_5394[28], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624] - *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616] + 1, *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628] - *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620] + 1, *(_DWORD *)(v20 + 48), *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620], *(_DWORD *)(v20 + 36), *(_DWORD *)(v20 + 40), *(_DWORD *)(v20 + 44), 0); *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616] = dword_6AAD50; *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620] = dword_6AAD54; *(_QWORD *)&A0_BattleMgr_dword_699420->f13300[2624] = qword_6AAD58; A0_BattleMgr_dword_699420->f13300[2604] = 1; A0_Battle_Stack_Draw_sub_43DE60(this_v4, (signed __int64)Curr_X_v33, (signed __int64)Curr_Y_v35, 0); A0_BattleMgr_dword_699420->f13300[2604] = 0; if ( v25 > *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616] ) v25 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616]; if ( v26 > *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620] ) v26 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620]; if ( v18 < *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624] ) v18 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624]; if ( v19 < *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628] ) v19 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628]; A0_Wait_Till_Time_sub_4F8980(A0_NextTimeToDrawingWait_dword_6989E8); v21 = timeGetTime() - A0_NextTimeToDrawingWait_dword_6989E8; if ( (signed int)WaitingTime_v27 > (signed int)v21 ) v21 = WaitingTime_v27; A0_NextTimeToDrawingWait_dword_6989E8 += v21; A0_FlipScreenArea_sub_603190(WndMgr_dword_6992D0, v25, v26, v18 - v25 + 1, v19 - v26 + 1); v22 = this_v4->AnimFrameNum_dword40 + 1; this_v4->AnimFrameNum_dword40 = v22; } while ( v22 < Def_FramesCount_v38 ); TarGex_v3 = TarGex; } } while ( Frames_Remained_v32-- != 1 ); } } A0_Battle_Gex_Put_Stack_sub_4683A0(A0_BattleMgr_dword_699420, this_v4, TarGex_v3); this_v4->GexNum_dword38 = TarGex_v3; if ( !A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) ) { A0_Battle_Stack_StartSound_sub_43D260(this_v4, 7); A0_End_Sample_sub_59A180(A0_SoundMgr_dword_699414, *((_DWORD *)this_v4->Move_Sound_dword170 + 7)); A0_Battle_Stack_DrawMoving_Or_ChangeOrientDraw_sub_446660(this_v4, 21, -1, 0); A0_Battle_Stack_DrawMoving_Or_ChangeOrientDraw_sub_446660(this_v4, 2, 1, 0); this_v4->IsMoving_byte30 = 0; } A0_Battle_Stack_AfterActionRemoveSpells_sub_4441F0(this_v4, 0); return 1; } Можно заметить, что A0_Battle_RemoveStack_From_Gexes_sub_468310(A0_BattleMgr_dword_699420, this_v4), т. е. удаление стека с гекса, происходит только если !A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420), т. е. если битва отрисовывается на экран. При этом A0_Battle_Gex_Put_Stack_sub_4683A0(A0_BattleMgr_dword_699420, this_v4, TarGex_v3), т. е. постановка стека на новый гекс, выполняется всегда. Таким образом, стрекозы отлетают от гидр, но при этом ссылки на них остаются у гексов вокруг гидры, гидра бьёт через эти ссылки, а они при анализе видят, что гидра сильно ответит, если её ударить, и не бьют её сами. Т. е. это баг не гидры, но любого летающего. |
|
|
![]()
Сообщение
#1995
|
|
![]() Legendary lover Сообщений: 629 Спасибо сказали: 307 раз ![]() |
Кажется, нашёл ошибку. Код signed int __thiscall A0_Battle_Stack_Draw_Flying_sub_4B47A0(_BattleStack_ *this, int TarGex) { int StartGex_Coloumn_v2; // ecx@1 int TarGex_v3; // ebx@1 _BattleStack_ *this_v4; // esi@1 signed __int64 Distance_v5; // qax@13 signed int Flying_Distance_v6; // ecx@13 int StartGexNum_mul_112_v7; // edx@13 char *TarGexNum_mul_112_v8; // ecx@13 double Distance_sqr_v9; // ST48_8@13 int FramesCount_v10; // edi@14 float Frames_Count_v11; // ST68_4@16 float X_Dist_v12; // ST64_4@16 float Y_Dist_v13; // ST64_4@16 void *Def_v14; // eax@17 float MovingAnim_Time_v15; // ST5C_4@21 float Frame_X_Speed_v16; // ST5C_4@24 float Frame_Y_Speed_v17; // ST60_4@24 int v18; // ebx@24 int v19; // edi@24 int v20; // ecx@24 DWORD v21; // eax@32 int v22; // eax@34 int v25; // [sp+Ch] [bp-44h]@24 int v26; // [sp+10h] [bp-40h]@24 DWORD WaitingTime_v27; // [sp+20h] [bp-30h]@21 float Y_Speed_v28; // [sp+28h] [bp-28h]@16 float X_Speed_v29; // [sp+2Ch] [bp-24h]@16 signed int Start_Y_v30; // [sp+30h] [bp-20h]@13 signed int Start_X_v31; // [sp+34h] [bp-1Ch]@13 int Frames_Remained_v32; // [sp+38h] [bp-18h]@22 float Curr_X_v33; // [sp+3Ch] [bp-14h]@21 int X_Dist_v34; // [sp+40h] [bp-10h]@13 float Curr_Y_v35; // [sp+40h] [bp-10h]@21 int Y_Dist_v36; // [sp+44h] [bp-Ch]@13 float Def_Frames_Count_v37; // [sp+44h] [bp-Ch]@21 signed int Def_FramesCount_v38; // [sp+48h] [bp-8h]@19 char Need_Change_Orientation_v39; // [sp+4Fh] [bp-1h]@2 this_v4 = this; TarGex_v3 = TarGex; StartGex_Coloumn_v2 = this->GexNum_dword38 % 17; if ( StartGex_Coloumn_v2 <= TarGex % 17 ) { if ( StartGex_Coloumn_v2 >= TarGex % 17 ) Need_Change_Orientation_v39 = 0; else Need_Change_Orientation_v39 = this_v4->Orientation_dword44 == 0; } else { Need_Change_Orientation_v39 = this_v4->Orientation_dword44 == 1; } if ( A0_Battle_Need_Open_Bridge_sub_466D10((int)A0_BattleMgr_dword_699420, this_v4, TarGex) ) { this_v4->AnimSectionNum_dword3C = 2; this_v4->AnimFrameNum_dword40 = 0; A0_Battle_Draw_sub_493FC0((int)A0_BattleMgr_dword_699420, 1, 0, 0, 0, 1, 0); A0_Battle_Open_CastleBridge_sub_466DA0((int)A0_BattleMgr_dword_699420); } if ( this_v4->Creature_29dword74.Flags_dword10 & 1 ) { if ( Need_Change_Orientation_v39 ) { TarGex_v3 = (this_v4->Orientation_dword44 != 0 ? 2 : 0) - 1 + TarGex; TarGex += (this_v4->Orientation_dword44 != 0 ? 2 : 0) - 1; } } A0_Battle_Clear_Stack_Image_sub_446550(this_v4); if ( Need_Change_Orientation_v39 ) A0_Battle_Stack_Ch_Orient_sub_446440(this_v4, 1); StartGexNum_mul_112_v7 = 112 * this_v4->GexNum_dword38; Start_Y_v30 = *(_WORD *)((char *)&A0_BattleMgr_dword_699420->hex[0].Y_Position + StartGexNum_mul_112_v7); Start_X_v31 = *(_WORD *)((char *)&A0_BattleMgr_dword_699420->hex[0].X_Position + StartGexNum_mul_112_v7); TarGexNum_mul_112_v8 = (char *)A0_BattleMgr_dword_699420 + 112 * TarGex_v3; Y_Dist_v36 = *((_WORD *)TarGexNum_mul_112_v8 + 227) - Start_Y_v30; X_Dist_v34 = *((_WORD *)TarGexNum_mul_112_v8 + 226) - Start_X_v31; Distance_sqr_v9 = (double)(X_Dist_v34 * X_Dist_v34 + Y_Dist_v36 * Y_Dist_v36); Distance_v5 = (signed __int64)sqrt(LODWORD(Distance_sqr_v9), HIDWORD(Distance_sqr_v9)); Flying_Distance_v6 = this_v4->Anim_21dword110.FlightAnim_FrameDistance_dword50; if ( Flying_Distance_v6 <= 0 ) FramesCount_v10 = 1; else FramesCount_v10 = ((_DWORD)Distance_v5 + Flying_Distance_v6 / 2) / Flying_Distance_v6; Frames_Count_v11 = (double)FramesCount_v10; X_Dist_v12 = (double)X_Dist_v34; X_Speed_v29 = X_Dist_v12 / Frames_Count_v11; Y_Dist_v13 = (double)Y_Dist_v36; Y_Speed_v28 = Y_Dist_v13 / Frames_Count_v11; if ( !A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) ) { this_v4->IsMoving_byte30 = 1; A0_Battle_Stack_StartSound_sub_43D260(this_v4, 6); A0_Battle_Stack_DrawMoving_Or_ChangeOrientDraw_sub_446660(this_v4, 20, -1, 0); A0_Battle_Stack_StartSound_sub_43D260(this_v4, 0); A0_Battle_RemoveStack_From_Gexes_sub_468310(A0_BattleMgr_dword_699420, this_v4); Def_v14 = this_v4->Def_dword164; this_v4->AnimSectionNum_dword3C = 0; if ( *((_DWORD *)Def_v14 + 10) > 0 && **((_DWORD **)Def_v14 + 11) ) Def_FramesCount_v38 = ***((_DWORD ***)Def_v14 + 7); else Def_FramesCount_v38 = 0; Curr_X_v33 = (double)Start_X_v31; Curr_Y_v35 = (double)Start_Y_v30; Def_Frames_Count_v37 = (double)Def_FramesCount_v38; MovingAnim_Time_v15 = (double)this_v4->Anim_21dword110.MovingAnim_Time_dword48; WaitingTime_v27 = (signed __int64)(MovingAnim_Time_v15 * A0_BattleSettings_PeriodMults_dword_63CF7C[*(_DWORD *)&A0_Reg_Key_CombatSpeed_dword_69883C] / Def_Frames_Count_v37); if ( FramesCount_v10 > 0 ) { Frames_Remained_v32 = FramesCount_v10; do { this_v4->AnimFrameNum_dword40 = 0; if ( Def_FramesCount_v38 > 0 ) { do { v25 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616]; v26 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620]; v18 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624]; Frame_X_Speed_v16 = X_Speed_v29 / Def_Frames_Count_v37; Curr_X_v33 = Frame_X_Speed_v16 + Curr_X_v33; v19 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628]; v20 = *(_DWORD *)(WndMgr_dword_6992D0 + 64); Frame_Y_Speed_v17 = Y_Speed_v28 / Def_Frames_Count_v37; Curr_Y_v35 = Frame_Y_Speed_v17 + Curr_Y_v35; A0_DrawSurface16_sub_44DF80( *(void **)&A0_BattleMgr_dword_699420->field_5394[28], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624] - *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616] + 1, *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628] - *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620] + 1, *(_DWORD *)(v20 + 48), *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616], *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620], *(_DWORD *)(v20 + 36), *(_DWORD *)(v20 + 40), *(_DWORD *)(v20 + 44), 0); *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616] = dword_6AAD50; *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620] = dword_6AAD54; *(_QWORD *)&A0_BattleMgr_dword_699420->f13300[2624] = qword_6AAD58; A0_BattleMgr_dword_699420->f13300[2604] = 1; A0_Battle_Stack_Draw_sub_43DE60(this_v4, (signed __int64)Curr_X_v33, (signed __int64)Curr_Y_v35, 0); A0_BattleMgr_dword_699420->f13300[2604] = 0; if ( v25 > *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616] ) v25 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2616]; if ( v26 > *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620] ) v26 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2620]; if ( v18 < *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624] ) v18 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2624]; if ( v19 < *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628] ) v19 = *(_DWORD *)&A0_BattleMgr_dword_699420->f13300[2628]; A0_Wait_Till_Time_sub_4F8980(A0_NextTimeToDrawingWait_dword_6989E8); v21 = timeGetTime() - A0_NextTimeToDrawingWait_dword_6989E8; if ( (signed int)WaitingTime_v27 > (signed int)v21 ) v21 = WaitingTime_v27; A0_NextTimeToDrawingWait_dword_6989E8 += v21; A0_FlipScreenArea_sub_603190(WndMgr_dword_6992D0, v25, v26, v18 - v25 + 1, v19 - v26 + 1); v22 = this_v4->AnimFrameNum_dword40 + 1; this_v4->AnimFrameNum_dword40 = v22; } while ( v22 < Def_FramesCount_v38 ); TarGex_v3 = TarGex; } } while ( Frames_Remained_v32-- != 1 ); } } A0_Battle_Gex_Put_Stack_sub_4683A0(A0_BattleMgr_dword_699420, this_v4, TarGex_v3); this_v4->GexNum_dword38 = TarGex_v3; if ( !A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420) ) { A0_Battle_Stack_StartSound_sub_43D260(this_v4, 7); A0_End_Sample_sub_59A180(A0_SoundMgr_dword_699414, *((_DWORD *)this_v4->Move_Sound_dword170 + 7)); A0_Battle_Stack_DrawMoving_Or_ChangeOrientDraw_sub_446660(this_v4, 21, -1, 0); A0_Battle_Stack_DrawMoving_Or_ChangeOrientDraw_sub_446660(this_v4, 2, 1, 0); this_v4->IsMoving_byte30 = 0; } A0_Battle_Stack_AfterActionRemoveSpells_sub_4441F0(this_v4, 0); return 1; } Можно заметить, что A0_Battle_RemoveStack_From_Gexes_sub_468310(A0_BattleMgr_dword_699420, this_v4), т. е. удаление стека с гекса, происходит только если !A0_Battle_ShouldNotRenderBattle_sub_46A080((int)A0_BattleMgr_dword_699420), т. е. если битва отрисовывается на экран. При этом A0_Battle_Gex_Put_Stack_sub_4683A0(A0_BattleMgr_dword_699420, this_v4, TarGex_v3), т. е. постановка стека на новый гекс, выполняется всегда. Таким образом, стрекозы отлетают от гидр, но при этом ссылки на них остаются у гексов вокруг гидры, гидра бьёт через эти ссылки, а они при анализе видят, что гидра сильно ответит, если её ударить, и не бьют её сами. Т. е. это баг не гидры, но любого летающего. Сильно облегчил задачу! |
|
|
![]()
Сообщение
#1996
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Исправлять однозначно.
-------------------- |
|
|
![]()
Сообщение
#1997
|
|
![]() Legendary lover Сообщений: 629 Спасибо сказали: 307 раз ![]() |
|
|
|
![]()
Сообщение
#1998
|
|
Immortal Сообщений: 9 441 Спасибо сказали: 3956 раз ![]() |
Да, это действительно эта ошибка.
Вот исправление: Код // При постановке стека на гекс после полёта предварительно убираем его с предыдущих гексов, если надо. void __stdcall HiHook_AfterFly_ChangeStackPosition(HiHook* h, _BattleMgr_* this_, _BattleStack_* stack, _int32_ tar_hex_ix) { // Если битва не отрисовывается, убираем стек с гексов. if (this_->ShouldNotRenderBattle()) { CALL_2(void, __thiscall, 0x468310, this_, stack); } // Ставим стек на гекс. CALL_3(void, __thiscall, h->GetDefaultFunc(), this_, stack, tar_hex_ix); } Код // При постановке стека на гекс после полёта предварительно убираем его с предыдущих гексов, если надо. _PI->WriteHiHook(0x4B4B84, CALL_, EXTENDED_, THISCALL_, HiHook_AfterFly_ChangeStackPosition); С ним 1 гидра хаоса убивает 35 стрекоз из 60 в быстрой битве. |
|
|
![]()
Сообщение
#1999
|
|
![]() 😸🧡✊✌️ Сообщений: 16 412 Спасибо сказали: 3273 раза ![]() |
Замечу, что кроме того, что гидра атакует удалённо летунов, ещё к ней и подойти будет проблематично, ведь соседние ячейки поля боя заняты.
-------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#2000
|
|
Immortal Сообщений: 9 441 Спасибо сказали: 3956 раз ![]() |
Не уверен, вполне возможно, что стек может встать на гекс, на котором стоит он сам (может же двухгексовый подойти в любую сторону на 1 шаг).
|
|
|
![]() ![]() |
Текстовая версия | Сейчас: 29 August 2025 - 16:46 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|