IPB

Здравствуйте, гость ( Вход | Регистрация )

138 страниц V  « < 98 99 100 101 102 > »   
Reply to this topicStart new topic
> Меняем разрешение в Героях (HDmod), дополнение к Heroes III
Sadness
сообщение 27 Aug 2012, 00:46
Сообщение #1981

Legendary lover
Сообщений: 629
Спасибо сказали: 307 раз




Цитата(hippocamus @ 26 Aug 2012, 21:50) *
Бараторч, а можешь сделать кроме кнопки "Переиграть вручную" кнопку "Автобой с магией"? Иногда банально герой вешает вначале общее ускорение или благословение, и исход битвы круто меняется, неохота опять же каждый раз переигрывать вручную.



тогда неплохо было бы для онлайна "переиграть бой", после боя вручную ))
и зациклить)
Go to the top of the pageAdd Nick
 
+Quote Post
SAG19330184
сообщение 27 Aug 2012, 12:06
Сообщение #1982

Организатор лиги WCL
Сообщений: 981
Спасибо сказали: 632 раза




нужна опция: отключение читкодов в турнирном режиме


--------------------
Постоянно играю на рейтинг www.heroes-III.com в онлайне через сервер GameRanger - в HoMM3 SOD или WT. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Aug 2012, 15:06 (Сообщение отредактировал AlexSpl - 27 Aug 2012, 15:06)
Сообщение #1983

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




2baratoch: На HW ответить не могу. Раз зашла речь про квик-комбат, то, может, чем поможет эта инфа. В принципе там вся тема посвящена багам квика.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 27 Aug 2012, 16:00
Сообщение #1984

Immortal
Сообщений: 1 468
Спасибо сказали: 1153 раза




Жесть, нужно чаще использовать быструю битву и брать много гидр.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 27 Aug 2012, 16:24 (Сообщение отредактировал Sav - 27 Aug 2012, 16:25)
Сообщение #1985

Immortal
Сообщений: 9 441
Спасибо сказали: 3956 раз




Это точно был SoD 3.2? Что-то непохоже на правду, в коде явственно прописано бить только тех, кто рядом (цикл по рядом стоящих гексам). В отладчике в коде многоголового удара при быстрой битве гидра бьёт не больше стеков, чем надо.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Aug 2012, 16:53 (Сообщение отредактировал AlexSpl - 27 Aug 2012, 16:43)
Сообщение #1986

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Это точно был SoD 3.2?

Не совсем - 4.0 RU. Хотя какая разница?

Цитата
В отладчике в коде многоголового удара при быстрой битве гидра бьёт не больше стеков, чем надо.

Точно квик-комбат, а не автобой смотрите? Неплохо бы аналогичный лог увидеть для сравнения.

Цитата
Жесть, нужно чаще использовать быструю битву и брать много гидр.

Не только гидры так странно себя ведут, но и церберы ещё, к примеру

baratoch пишет:
Цитата
в квике, после того как вначале все стрекозы покусают гидру, они БОЛЬШЕ НЕ ХОДЯТ!!! гидра стоит и безнаказанно убивает стоящих вокруг нее стрекоз!!!!!!!!

Возможно, истина где-то посередине. Возможно, после того, как мухи соберутся вокруг гидры, AI продолжает генерировать ходы, однако по какой-то причине отряды остаются на месте.
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 27 Aug 2012, 17:09 (Сообщение отредактировал Sav - 27 Aug 2012, 17:10)
Сообщение #1987

Immortal
Сообщений: 9 441
Спасибо сказали: 3956 раз




Цитата(AlexSpl)
Хотя какая разница?

Разница в том, что я анализировал (и вижу смысл анализировать в дальнейшем) только 3.2, в 4.0 другой код и за то, что там, я ничего сказать не могу.


Цитата(AlexSpl)
Точно квик-комбат, а не автобой смотрите? Неплохо бы аналогичный лог увидеть для сравнения.

Задолбаюсь ведь составлять такой лог. Могу дать лог вызовов функции нанесения урона.
Лучше даже так проверю - дам вражескому герою 7 крестьян и если гидре хоть раз нанесут урон после урона крестьянину - значит не всех она бьёт.

Цитата(AlexSpl)
Возможно, истина где-то посередине. Возможно, после того, как мухи соберутся вокруг гидры, AI продолжает генерировать ходы, однако по какой-то причине отряды остаются на месте.

Хм, а это вполне возможно, в H3 в некоторых местах игровые моменты привязаны к отображению.

Всё, разобрался. Стрекозы не ходят не только в быстрой битве, но и в обычной. Они просто боятся бить гидру, а о том, что можно отступить и что ответка одна и сразу кончится, не знают. Это просто несовершенство ИИ.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Aug 2012, 17:15 (Сообщение отредактировал AlexSpl - 27 Aug 2012, 17:16)
Сообщение #1988

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Всё, разобрался. Стрекозы не ходят не только в быстрой битве, но и в обычной. Они просто боятся бить гидру, а о том, что можно отступить и что ответка одна и сразу кончится, не знают. Это просто несовершенство ИИ.

Поведение мух зависит ещё и от уровня сложности. Мой лог - для 160%. Но попробуйте сравнить один и тот же бой для 100% и 200% - результаты будут разными (даже при обычной битве).
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 27 Aug 2012, 17:23
Сообщение #1989

Immortal
Сообщений: 9 441
Спасибо сказали: 3956 раз




Да, на 160% они так не делают.
Go to the top of the pageAdd Nick
 
+Quote Post
Vizit0r
сообщение 27 Aug 2012, 17:37
Сообщение #1990

Immortal
Сообщений: 1 437
Спасибо сказали: 2149 раз




может в быстрой битве боевой-ИИ импользуется только самый простой?
я просто не в курсе, может такое быть хотя бы теоретически или ИИ общий и неделимый.
Go to the top of the pageAdd Nick
 
+Quote Post
baratorch
сообщение 27 Aug 2012, 17:38 (Сообщение отредактировал baratorch - 27 Aug 2012, 17:40)
Сообщение #1991

Immortal
Сообщений: 2 413
Спасибо сказали: 4619 раз




Sav, не разобрался.
Вот лог урона по стэку (без магии с запретом боевого духа и удачи 4 гидры хаоса против 18x5 стрекоз в улье, 0 атака 0 защита героя) 160% сложность
1 - квик (все гидры живы)
2 - авто (одна умирает)
стабильно

441379: - атака стрекоз
4400DF: - атака гидры

налицо неадекват квика


--------------------
HoMM 3 HD:
http://sites.google.com/site/heroes3hd
последняя версия - 3.61f


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Aug 2012, 17:57 (Сообщение отредактировал AlexSpl - 27 Aug 2012, 18:05)
Сообщение #1992

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Неплохо бы числа в конце строк в координаты (X, Y) законвертить, а то не понятно. Ведь это координаты, если не ошибаюсь?
Ага, это урон. Плохо, что здесь не видно координат стеков. Ведь по логу атак нельзя говорить о том, где именно расположены стеки мух.
Go to the top of the pageAdd Nick
 
+Quote Post
Sadness
сообщение 27 Aug 2012, 18:18
Сообщение #1993

Legendary lover
Сообщений: 629
Спасибо сказали: 307 раз




Цитата(SAG19330184 @ 27 Aug 2012, 13:06) *
нужна опция: отключение читкодов в турнирном режиме


Зачем? Если используются пароли - по сути не нужна. А если не используются, то любая вторая копия игры попросту запускается без турнирного режима, делается сейв GM1, если необходимо, и все читы снова работают.


Цитата
налицо неадекват квика


Если это неизменённый квик 3.2/4.0, то лично я бы не брался за его исправление. Это оригинальный баг игры, уже многим известно, что на квике комп лучше справляется против стрелковых блоков. Там даже где-то приводился совершенно фееричный пример выигрыша заведомо более слабыми войсками.
Если разбирать неадекватность каждого из юнитов - выйдет жуткая работа, зато если всё исправить - появится куча ярых противников квика: ведь раньше-то он давал лучшие результаты!

Все уже не один раз замечали, что автобой реально либо сильно лучше либо сильно хуже играет тот же бой на квике, так что если его менять - то не для онлайна, поскольку конкретно это - уже сильное вмешательство в геймплей
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 27 Aug 2012, 18:58 (Сообщение отредактировал Sav - 27 Aug 2012, 19:01)
Сообщение #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), т. е. постановка стека на новый гекс, выполняется всегда.
Таким образом, стрекозы отлетают от гидр, но при этом ссылки на них остаются у гексов вокруг гидры, гидра бьёт через эти ссылки, а они при анализе видят, что гидра сильно ответит, если её ударить, и не бьют её сами. Т. е. это баг не гидры, но любого летающего.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Sadness
сообщение 27 Aug 2012, 19:19
Сообщение #1995

Legendary lover
Сообщений: 629
Спасибо сказали: 307 раз




Цитата(Sav @ 27 Aug 2012, 19:58) *
Кажется, нашёл ошибку.
Код
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), т. е. постановка стека на новый гекс, выполняется всегда.
Таким образом, стрекозы отлетают от гидр, но при этом ссылки на них остаются у гексов вокруг гидры, гидра бьёт через эти ссылки, а они при анализе видят, что гидра сильно ответит, если её ударить, и не бьют её сами. Т. е. это баг не гидры, но любого летающего.


Сильно облегчил задачу!
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 27 Aug 2012, 19:27
Сообщение #1996

Immortal
Сообщений: 1 468
Спасибо сказали: 1153 раза




Исправлять однозначно.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Sadness
сообщение 27 Aug 2012, 19:31
Сообщение #1997

Legendary lover
Сообщений: 629
Спасибо сказали: 307 раз




Цитата(Berserker @ 27 Aug 2012, 20:27) *
Исправлять однозначно.


А по-мне, так сила — в незнании. До n-го дня никто и знать не знал про такой лютый баг, играли себе спокойно
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 27 Aug 2012, 19:33 (Сообщение отредактировал Sav - 27 Aug 2012, 19:34)
Сообщение #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 в быстрой битве.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 27 Aug 2012, 19:39
Сообщение #1999

😸🧡✊✌️
Сообщений: 16 412
Спасибо сказали: 3273 раза




Замечу, что кроме того, что гидра атакует удалённо летунов, ещё к ней и подойти будет проблематично, ведь соседние ячейки поля боя заняты.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 27 Aug 2012, 19:44
Сообщение #2000

Immortal
Сообщений: 9 441
Спасибо сказали: 3956 раз




Не уверен, вполне возможно, что стек может встать на гекс, на котором стоит он сам (может же двухгексовый подойти в любую сторону на 1 шаг).
Go to the top of the pageAdd Nick
 
+Quote Post

138 страниц V  « < 98 99 100 101 102 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29 August 2025 - 16:46
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика