Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Герои 2 (разные версии) с плагинами

Не запускается игра? Проблемы со звуком? Где, в конце концов, взять игру, скачать патчи, приложения и карты? Как установить все это? Все проблемы обсуждаем в этом разделе
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 14 авг 2023, 17:27

AlexSpl писал(а):

У меня база TE, там уже не видно, что было в оригинале. По какому адресу это условие? Кстати, у меня это winCoeff, casualties - это уже потери (в ед. существ).


PHILAI.CPP, строка 3443. Потери можно мерять в единицах существ, а можно в долях или процентах - кому как удобнее.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5584
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2184 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 14 авг 2023, 17:43

Нормальное условие, снижающее вероятность гибели. Но я бы ушёл от этих полумер (0.99, 0.999). Тем более они не нужны с Вашими тремя предложенными правками.

В TE я сделал так:

Код: Выделить всё
int __thiscall philAI::QuickCombat(
        philAI *this,
        struct armyGroup *armyGroupAttacker,
        struct hero *heroAttacker,
        struct armyGroup *armyGroupDefender,
        struct hero *heroDefender,
        int townBattle,
        int town_id,
        float *winCoefAttacker,
        float *winCoefDefender)
{
  double v9; // st7
  float v11; // [esp+0h] [ebp-50h]
  int defenderPlayerId; // [esp+8h] [ebp-48h]
  float v14; // [esp+10h] [ebp-40h]
  int a13; // [esp+14h] [ebp-3Ch] BYREF
  int a12; // [esp+18h] [ebp-38h] BYREF
  float winCoeff; // [esp+1Ch] [ebp-34h] BYREF
  int a11; // [esp+20h] [ebp-30h] BYREF
  float v19; // [esp+24h] [ebp-2Ch]
  int a10; // [esp+28h] [ebp-28h] BYREF
  BOOL win; // [esp+30h] [ebp-20h]
  float v22; // [esp+38h] [ebp-18h]
  int exp1; // [esp+3Ch] [ebp-14h]
  int exp2; // [esp+40h] [ebp-10h]
  float dice; // [esp+44h] [ebp-Ch]
  struct armyGroup *v26; // [esp+48h] [ebp-8h]
  int a14; // [esp+4Ch] [ebp-4h] BYREF

  exp1 = game::ExperienceValueOfStack(gpGame, armyGroupAttacker, heroAttacker);
  exp2 = game::ExperienceValueOfStack(gpGame, armyGroupDefender, heroDefender);
  win = 0;
  v26 = 0;
  if ( heroDefender )
    defenderPlayerId = heroDefender->owner_id;
  else
    defenderPlayerId = -1;
  philAI::ProbableOutcomeOfBattle(
    this,
    armyGroupAttacker,
    heroAttacker,
    armyGroupDefender,
    heroDefender,
    0,
    townBattle,
    town_id,
    defenderPlayerId,
    &winCoeff,
    &a10,
    &a11,
    &a12,
    &a13,
    &a14);
  if ( winCoeff > 0.75 )
    winCoeff = 1.0;
  dice = RandInt(0, 99) / 100.0;
  if ( dice >= winCoeff )
  {
    v14 = 1.0 - winCoeff;
    v26 = armyGroupDefender;
  }
  else
  {
    win = 1;
    v14 = winCoeff;
    v26 = armyGroupAttacker;
  }
  if ( dice <= winCoeff )
    v9 = winCoeff - dice;
  else
    v9 = dice - winCoeff;
  v11 = v9;
  v22 = v11;
  if ( win && winCoeff > 0.6 )
    v22 = v22 * (winCoeff + 0.65);
  v19 = (1.0 - v22) * (1.0 - v22);
  if ( v14 > 0.8 && v19 > 0.2 )
    v19 = v19 * v19;
  if ( v14 > 0.96 && (1.0 - v14) / 2.0 < v19 )
    v19 = (1.0 - v14) / 2.0;
  if ( win )
  {
    if ( heroAttacker )
    {
      advManager::GiveExperience(gpAdvManager, heroAttacker, exp2, 1);
      hero::ApplyBattleWinTemps(heroAttacker);
    }
    *winCoefDefender = 1.0;
    *winCoefAttacker = v19;
  }
  else
  {
    if ( heroAttacker )
    {
      heroAttacker->currMobility = 0;
      hero::ApplyBattleLossTemps(heroAttacker);
    }
    if ( heroDefender )
      hero::ApplyBattleWinTemps(heroAttacker);
    *winCoefDefender = v19 * v22;
    *winCoefAttacker = 1.0;
    if ( *winCoefAttacker >= 1.0 && heroDefender )
      advManager::GiveExperience(gpAdvManager, heroDefender, exp2, 1);
  }
  if ( *winCoefAttacker < 1.0 )
  {
    if ( *winCoefDefender >= 1.0 )
      advManager::TransferArtifacts(gpAdvManager, heroDefender, heroAttacker);
  }
  else
  {
    advManager::TransferArtifacts(gpAdvManager, heroAttacker, heroDefender);
  }
  philAI::DamageGroup(this, armyGroupAttacker, heroAttacker, heroDefender, *winCoefAttacker);
  philAI::DamageGroup(this, armyGroupDefender, heroDefender, heroAttacker, *winCoefDefender);
  if ( win && townBattle )
    game::ClaimTown(gpGame, town_id, giCurPlayer);
  return win;
}


Вот это уже я правил через плагин:

Код: Выделить всё
if ( heroAttacker )
    {
      heroAttacker->currMobility = 0;
      hero::ApplyBattleLossTemps(heroAttacker);
    }
    if ( heroDefender )
      hero::ApplyBattleWinTemps(heroAttacker);

Так что не обращайте внимания. Это моя база времён правок экзешника.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 14 авг 2023, 18:13

AlexSpl писал(а):

Нормальное условие, снижающее вероятность гибели. Но я бы ушёл от этих полумер (0.99, 0.999).


Я говорю только о том чтобы убрать "casualties < 0.99". Просто если в вашем листинге v9 окажется равно 0 (а такое возможно), то v19 окажется равным 1.0. Вот чтобы v19 не могло быть равно 1.0, и предлагаю.
Последний раз редактировалось Ben80 15 авг 2023, 06:01, всего редактировалось 1 раз.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 14 авг 2023, 18:32

Ben80 писал(а):

то v19 окажется равным 1.0.


И это и будет одновременный слив.
Последний раз редактировалось Ben80 15 авг 2023, 06:02, всего редактировалось 2 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5584
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2184 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 14 авг 2023, 19:05

Цитата:
И это и будет одновременный слив.

Почему? Это самый благоприятный для нейтралов случай победы (dice == winCoeff). v19 == 1.0, зато v22 == 0.0 и их произведение 0. Т.е. нейтралы побеждают без потерь. Или есть другой вариант, когда v19 == 1.0? :smile5:
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 14 авг 2023, 19:20

AlexSpl писал(а):

Цитата:
И это и будет одновременный слив.

Почему? Это самый благоприятный для нейтралов случай победы (dice == winCoeff). v19 == 1.0, зато v22 == 0.0 и их произведение 0. Т.е. нейтралы побеждают без потерь. Или есть другой вариант, когда v19 == 1.0? :smile5:


Видимо, все-таки разница в коде Героев 1 и Героев 2. У вас в листинге:
Код: Выделить всё
    *winCoefDefender = v19 * v22;
    *winCoefAttacker = 1.0;


А в Героях 2:
Код: Выделить всё
    *casualtiesD = casualties;
    *casualtiesA = 1.0;


то есть нет произведения v19 и v22, а есть просто v19.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 14 авг 2023, 19:28

А здесь получается тоже правки нужны, иначе одновременный слив ? (изменить "a4 >= 0.99" на "a4 = =1.0")
Или в Героях 1 тут тоже другое ? :smile1:
Код: Выделить всё
//----- (004B6410) --------------------------------------------------------
signed int __stdcall philAI::DamageGroup(void *a1, int a2, int a3, float a4)
{
  signed int result; // eax@2

  if ( a4 >= 0.99 )
  {
    if ( a2 )
      advManager::HeroLoses((int)gpAdvManager, a2);
    else
      armyGroup::DamageGroup((armyGroup *)a1, a4);
    result = 1;
  }
  else
  {
    armyGroup::DamageGroup((armyGroup *)a1, a4);
    result = 0;
  }
  return result;
}
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5584
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2184 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 14 авг 2023, 19:30

Да, тут тоже нужно менять. У меня так:

Код: Выделить всё
int __thiscall philAI::DamageGroup(
        philAI *this,
        struct armyGroup *armyGroup,
        struct hero *hero,
        struct hero *heroEnemy,
        float winCoeff)
{
  if ( winCoeff >= 1.0 )
  {
    if ( hero )
      advManager::HeroLoses(gpAdvManager, hero);
    else
      armyGroup::DamageGroup(armyGroup, winCoeff);
    return 1;
  }
  else
  {
    armyGroup::DamageGroup(armyGroup, winCoeff);
    return 0;
  }
}
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5584
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2184 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 14 авг 2023, 23:15

Фил гениален, поскольку всё гениальное просто :smile12:

Код: Выделить всё
int __thiscall philAI::ChooseToPayRansomOnHero(philAI *this, int a2)
{
  return 1;
}
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 15 авг 2023, 04:14

Ben80 писал(а):

Видимо, все-таки разница в коде Героев 1 и Героев 2. У вас в листинге:
Код: Выделить всё
    *winCoefDefender = v19 * v22;
    *winCoefAttacker = 1.0;


А в Героях 2:
Код: Выделить всё
    *casualtiesD = casualties;
    *casualtiesA = 1.0;


то есть нет произведения v19 и v22, а есть просто v19.


AlexSpl писал(а):

Почему? Это самый благоприятный для нейтралов случай победы (dice == winCoeff). v19 == 1.0, зато v22 == 0.0 и их произведение 0. Т.е. нейтралы побеждают без потерь. Или есть другой вариант, когда v19 == 1.0? :smile5:


Правильный вариант - в Героях 2 (видимо, поправили). В Героях 1 - ошибка. "dice = winCoeff" означает что обе стороны несут максимальные потери, но раз мы решили, что одновременных сливов не будет, то одна сторона все-таки должна остаться в живых, и вот этот код как раз это обеспечивает:
Код: Выделить всё
  if(casualties > 0.6)
    casualties = casualties - 0.1;


Можно подправить на более скромное:
Код: Выделить всё
  if(casualties > 0.6)
    casualties = casualties - 0.05;


Мне просто легче ориентироваться в смысле происходящего, потому что у меня все переменные в листинге имеют осмысленные имена, пусть не всегда на 100% удачные, но по смыслу в целом адекватные. Например, у меня одна из переменных названа probWinnerD, у вас возможно более удачное название dice, но в целом название probWinnerD помогает мне ориентироваться.
Вернуться к началу

Пред.След.

Вернуться в Техническая часть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1