Объявления

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

Улучшение ИИ

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Улучшение ИИ

Сообщение RoseKavalier » 07 май 2020, 12:43

AlexSpl писал(а):

Вот скажите, пожалуйста, почему функция sub_5C14F0 (GetResourcesRequirements) декомпилируется как

Код: Выделить всё
[...]
    result = *(char *)(this + 4) + a2 + 8 * *(char *)(this + 4) - 17;
[...]

?


(6A8344h - 6A8160h) / 1Ch = 17
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 07 май 2020, 12:45

I mean, where is the 3rd branch (a2 >= 30)?
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Улучшение ИИ

Сообщение RoseKavalier » 07 май 2020, 13:15

The branch is there, but there is indeed a decompilation error, you are right.
The -17 part is the error because the contiguous arrays are for building costs between 0 ~ 29... seems IDA tries to do a bit of optimization and gets it wrong.

Correct decompilation could be...
Код: Выделить всё
void __thiscall GetResourcesRequirements_5C14F0(H3Town *this, signed int buildingId, H3Resources *cost)
{
  if ( buildingId < 30 ) // not a dwelling
    *cost = TownNormalBuildingResourcesReq[this->Type][buildingId]; // TownNormalBuildingResourcesReq~TownSpecBuildingResourcesReq contiguous
  else
    *cost = TownDwellingResourcesReq[this->Type][buildingId - 30]; // TownDwellingResourcesReq
}


It gets it right however in sub_5C1580
Код: Выделить всё
 if ( buildingId >= 17 )
  {
    townType = this->Type;
    if ( buildingId >= 30 )
      v5 = (H3Resources *)((char *)TownDwellingResourcesReq + 28 * (buildingId + 14 * townType - 30));
    else
      v5 = (H3Resources *)((char *)TownSpecBuildingResourcesReq + 28 * (townType + buildingId + 8 * townType - 17));
  }
  else
  {
    v5 = &TownNormalBuildingResourcesReq[buildingId];
  }


Puzzling, thanks for sharing!
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 07 май 2020, 13:47

А как проверить что здание может быть построено в городе?
По дереву отстройки.

Пробую на 111 так:
Код: Выделить всё
      
if (!CurTown->CanBuildStructure(BuildingID)) continue;
...
struct H3Town
{
...
BOOL CanBuildStructure(INT32 id) { return THISCALL_3(BOOL, 0x4305A0, this, id, 0); }

Получаю всегда ложь, даже для ГМ1, BuildingID =0 .

Пробую так:
Код: Выделить всё
      if (!CurTown->bMask[0].GetState(BuildingID)) continue;

Наоборот получаю всегда истина, даже для улучшенного 7 уровня, BuildingID = 43.
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 07 май 2020, 14:00

Попробуйте с третьим аргументом, равным 1. В коде есть вызовы и с 0, и с 1.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 07 май 2020, 14:06

Это будет метод IsBuildingBuilt:
Код: Выделить всё
BOOL IsBuildingBuilt(INT32 id) { return THISCALL_3(BOOL, 0x4305A0, this, id, 1); }

И он работает верно, возвращает было ли построено это здание.
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 07 май 2020, 14:11

Может ли в принципе быть построено (не запрещено) или на текущем ходу?
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 07 май 2020, 14:12

Да именно на текущем ходу, и без учета ресурсов, это я отдельно проверяю, там вроде все ок:
Код: Выделить всё
      //Хватает ли ресурсов на здание
      if (!FASTCALL_2(int, 0x460D10, CurTown, BuildingID)) continue;
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 07 май 2020, 14:16

Тогда нужно проверять следующие поля: AlreadyBuiltThisTurn, BuiltShow, BuiltBonus, BMask. Конечно, хотелось бы найти уже существующую функцию.

Посмотрите на аналогичную для AI: CanAIBuildThis() (sub_5C1120).
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 07 май 2020, 14:37

Как-то она тоже странно работает, иногда выдает верные значения иногда нет:
Код: Выделить всё
THISCALL_2(BOOL, 0x5C1120, CurTown, BuildingID)

...
Исправил BOOL на bool и все заработало.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

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

Сейчас этот форум просматривают: Владимир и гости: 7