Объявления

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

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 01 июн 2022, 14:33

Цитата:
AlexSpl, я так понимаю вы сейчас сильно заняты первыми Героями или уже не очень? Просто появилась интересная идея для весьма полезного плагина к третьим Героям. Хотел обсудить его с вами. Может найдется у вас время и на него. Он относительно небольшей должен быть в плане кол-ва кода, но интересный и полезный.

К сожалению, я сейчас "на волне" Героев 1. Но Вы всё равно озвучивайте. Плагины умею делать не только я :smile1:
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 02 июн 2022, 10:12

AlexSpl писал(а):

К сожалению, я сейчас "на волне" Героев 1.

Окей, не вопрос. Тогда доделывайте все то, что запланировали по Версии TE 1.1 на этот месяц и не отвлекайтесь. А там, если будет время, глянете.

AlexSpl писал(а):

Но Вы всё равно озвучивайте. Плагины умею делать не только я

Это понятно. Плагины много кто умеет писать, если речь о чем-то простеньком. Вопрос в том, какого качества и какой сложности будут эти плагины. Например, людей, которые могли бы написать что-то вроде NewSpells, среди тех, кто интересуется написанем плагинов, модов, патчей для Героев, я думаю, по пальцам одной руки можно пересчитать. Некоторые из них здесь даже не зарегистрированы, а те, что есть, очень редко сюда заходят. Так что среди тех, кто постоянно здесь активный, вы, наверное, единственный.

void_17 писал(а):

Можете обратиться ко мне если что.

Можете попробовать, если будет интересно. Предлагаю вести открытую разработку прямо здесь, как AlexSpl. Чтобы те, кто обучается, могли ознакомится с кодом и попытаться понять, что он делает. То есть сделали какую-то часть, поделились кодом и описали, что уже сделано. При желании можно дополнительно прикреплять dll, чтобы больше людей могли протестировать. Если что-то будет не получатся, AlexSpl, я думаю, подскажет. У самого сейчас времени не очень много, но на тестирование время найду.

---

В общем это несколько модифицированная фишка HotA - механизм исследования заклинаний. Это можно сделать подобно тому, как сделано в HotA, но при этом не используя никаких графичеких наработок самой HotA. Только оригинальные граф элементы.


Механизм исследования заклинаний в HotA:
- На экране Гильдии Магов можно проводить исследование заклинаний, изменяя имеющиеся в слотах заклинания.
- Цена исследования составляет (2 * уровень заклинания) ртути, серы, кристаллов и драгоценных камней и 1000 золота. Исследование в каждом городе можно проводить не чаще раза в день (независимо от строительства).
- При исследовании старое заклинание пропадает из слота и предлагается на выбор одно из двух новых (на пятом уровне генерируется одно новое заклинание без выбора). Исследование в одном и том же слоте можно проводить несколько раз, но промежуточные заклинания не могут быть изучены героями. Каждый раз заклинание генерируется в соответствии со стандартными шансами для города, но уже бывшие в Гильдии Магов или отклонённые при выборе заклинания не могут быть сгенерированы во второй раз, пока есть те, которых ещё не было.
- В любой момент можно бесплатно завершить исследование в слоте. В этом случае текущее заклинание станет доступным для изучения, но изменять заклинание в данном слоте больше будет нельзя.
- Обязательные для города заклинания не могут быть изменены на другие. В каждый момент в городе может идти только одно исследование, перед началом исследования в другом слоте текущее нужно завершить.

---

Я же предлагаю убрать исследование без завершения, то есть вот это:
исследование в одном и том же слоте можно проводить несколько раз, но промежуточные заклинания не могут быть изучены героями.

Таким образом исследование завершается сразу же и сразу появляется новое заклинание. Ненужно нам никаких хрустальных шаров со сверкающими заклинаниями.

Это упростит реализацию. Ненужно будет создавать или заимствовать доп граф элементы и писать взаимодействия с ними.

Но в качестве компенсации предлагаю сделать следущее:
Исследование завершается сразу же. В этом случае текущее заклинание становится доступным для изучения, но изменять заклинание в данном слоте больше будет нельзя для заклинаний 1-2 уровня (доступна 1 замена).
Для заклинаний 1-2 уровня можно изменять закл на слоте только 1 раз.
Для заклинаний 3 уровня можно изменять закл на одном слоте 2 раза.
Для заклинаний 4-5 уровней можно изменять заклинание на одном слоте 3 раза.
Плюс для пятого уровня также нужно оставить возможность выбора закла для изучения одного из двух предложенных (в HotA на пятом уровне генерируется только одно новое заклинание без выбора).

Кол-во оставшихся исследований на слоте можно выводить в подсказке в статусной строке:
нажмите для исследования (осталось Х исследования) -> если на слоте возможно исследование и достаточно ресурсов для этого
невозможно изменить -> если исследования на слоте закончились
на этом ходу исследование уже проводилось -> возможно только одно исследование за 1 ход, как с постройками, только исследования сами по себе и не связаны с постройками
недостаточно ресурсов для исследования -> если для исследования у героя недостаточно ресурсов.

 Скрины:
Изображение Изображение Изображение Изображение Изображение
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 02 июн 2022, 16:39

Процитирую пост daemon_n на HC:

Цитата:
Hi Alex! I really like the plugin you make!

I am one of the developers of ERA mods and the author of a game build with a bunch of mods for it.
I checked the plugin today - it works almost perfectly with ERA and its mods, including it is even possible to research spells - yes, yes, I did it like in HotA, only on erm
Nevertheless, there are some points that need to be finalized for full compatibility.

I ask you to post the plugin sources (as I understand, they were previously attached to the plugin, but now they are not there) so that I can correct it for ERA.
I myself study C++ and already have some experience in creating plugins, including those for the interface (adding/removing/changing its elements). I have some reversing skills, so I think I can handle it) If anything, Discord nickname #daemon_n5347

Учитывая, что ERA базируется на SoD 3.2 и не добавляет заклинания, Вы можете попробовать подключить его плагин к оригинальной игре.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

Re: Как создать плагин для HD мода

Сообщение Rolex » 02 июн 2022, 17:37

AlexSpl писал(а):

including it is even possible to research spells - yes, yes, I did it like in HotA, only on erm

В том-то и дело, что мой вариант отличается от варинта HotA. Нет бесконечного перебора заклов при исследовании, а есть фиксированное кол-во раз на слоте для каждого уровня. Да, и конечно нужно на плюсах все это дело, erm не катит. Но главное, нужна полная совместимость с NewSpells, чтобы при подключенном NewSpells при исследовании появлялись заклы, которые добавляет сам NewSpells. Вы, как автор кода NewSpells, вероятно, лучше других знаете как это сделать.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 529
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 116 раз.

Re: Как создать плагин для HD мода

Сообщение void_17 » 04 июн 2022, 17:03

Дошли руки и доделал гайд по patcher_x86 в группе вк.
https://vk.com/@mods4heroes3-patcher-x8 ... tchit-igry
Пишите, кто хочет дополнить или исправить что-то.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 18 июн 2022, 03:30

Внимание, вопрос! Уважаемые знатоки, помогите мне вернуть веру в C++:

Изображение

Изображение

Изображение

Первый вариант рабочий, в двух других - стабильный вылет. Могу предположить, что gpAdvManager->DoBattle() меняет экземпляр hero, но не указатель же на него. Но третий вариант вообще сбивает с толку: а тут что не так? :smile5:

Первый раз с таким сталкиваюсь :smile8:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 18 июн 2022, 05:12

Реально метод TAdvManager::DoBattle() меняет указатель hero (!). Добро пожаловать в мир Героев 1 :smile2: И из-за этого крашится функция AddCreatures(). Но всё равно не могу догнать, почему крашится третий вариант. Хотя, я мог забыть раскомментировать строчку.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 19 июн 2022, 06:22

Может, RoseKavalier или void_17 заглянут. Такая задачка по IDA:

Код: Выделить всё
leftTile = &this->player[1].gap0[720 * this->town[town_id].x + 27 + 10 * this->town[town_id].y];
leftTile->flags |= 0x10u;
leftTile->layer1_res_id |= 0xE0u;
leftTile->extra_tile_info = 2 * this->player[owner].color;
rightTile = &this->map[this->town[town_id].x + 1][this->town[town_id].y];
rightTile->flags |= 0x10u;
rightTile->layer1_res_id |= 0xE0u;
rightTile->extra_tile_info = 2 * this->player[owner].color + 1;

IDA не очень любит, когда индекс получается вычитанием. Код выше эквивалентен следующему (это флаги слева и справа от входа в город):

Код: Выделить всё
leftTile = &this->map[this->town[town_id].x - 1][this->town[town_id].y];
leftTile->flags |= 0x10u;
leftTile->layer1_res_id |= 0xE0u;
leftTile->extra_tile_info = 2 * this->player[owner].color;
rightTile = &this->map[this->town[town_id].x + 1][this->town[town_id].y];
rightTile->flags |= 0x10u;
rightTile->layer1_res_id |= 0xE0u;
rightTile->extra_tile_info = 2 * this->player[owner].color + 1;

Но как IDA заставить считать индексы от map, а не от player?
Вернуться к началу

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

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 19 июн 2022, 13:40

Post address? I can check later.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 19 июн 2022, 15:47

Цитата:
Post address? I can check later.

It's Heroes 1. I can't find exactly the same example in Heroes 3 db, but probably the following one from Heroes 3 (sub_5BF1E0) would be close, I don't know:

Код: Выделить всё
if ( Town->MageLevel >= 1 )
{
  v15 = 6;
  for ( i = &SpellsCountOnGuildLevel[-1]; ; i = &SpellsCountOnGuildLevel[-1] )
  {
   v16 = i[v13];
   if ( Town->Type == 2
     && __PAIR64__(
         Modif3Mask2 & *(&Town->BuildableMask + offsetof(town, Owner)),
         Modif3Mask & *&Town->BuildableMask) )
   {
     ++v16;
   }
   if ( v16 > 0 )
   {
     v17 = &Town->recruits[1][2 * v15 + 2 + 2 * v16];
     do
     {
      if ( *v17 != -1 )
        break;
      --v16;
      v17 -= 2;
     }
     while ( v16 > 0 );
   }
   *(&Town->Spells[4][5] + v13 + 3) = v16;
   ++v13;
   v15 += 6;
   if ( v13 > Town->MageLevel )
     break;
  }
  v12 = Structure2Build;
}

This chunk of code starts from 0x5BF332. But this is maybe due to gaps in town class.
Вернуться к началу

Пред.След.

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

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

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

cron