Объявления

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

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

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

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

Сообщение AlexSpl » 04 фев 2021, 12:08

Плагин для чистой версии SoD 3.2 EN (HD mod без дополнительных примочек). На наличие или отсутствие грейженого стека карта влиять не может. Важны только координаты и Seed. Что-то не так с Englification_Pack, возможно?
Вернуться к началу

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

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

Сообщение AlexSpl » 04 фев 2021, 12:15

Проверил. Грейженый стек есть на (25, 9, 0). Проверяйте свою сборку Героев (плагины/моды).
Вернуться к началу

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

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

Сообщение Rolex » 04 фев 2021, 12:17

AlexSpl писал(а):

Что-то не так с Englification_Pack, возможно?

Это обычный англификатор с оригинальными картами. Дело в том, что я проверял даже без Englification_Pack. Русская версия героев от Бука, на карте Аппеляция - грейженный стек есть всегда. Взял закинул оригинальную карту Reclamation и грейженного стека не стало. Включена опция HD+. Никаких других плагинов больше не подключено. Как это объяснить тогда?
Вернуться к началу

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

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

Сообщение AlexSpl » 04 фев 2021, 12:21

Я же говорю (и RoseKavalier об этом писал): HD+ меняет Seed.
Вернуться к началу

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

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

Сообщение Rolex » 04 фев 2021, 12:31

Да, с откл HD+ грейженный стек есть всегда. Но очень странно, что с вкл HD+, он на русской карте есть, а на оригинальной отсутствует.

Rolex писал(а):

Если подключить к HD+ плагин SoD_SP и включить опцию:

Creature Split (Разделение существ)
Восстанавливает действие стандартного алгоритма распределения отрядов при нападении на нейтральных монстров, даже с включенной надстройкой HD+.

то кол-во отрядов Золотых големов в Пирамиде начинает отображается верно. А вот Заброшеной шахте фиолетово включенна эта опция или нет, кол-во отрядов Троглодитов всегда отобржается верно с HD+.

А здесь почему так происходит, что для Заброшенной шахты работает, а для Пирамиды нет? Если код опции Creature Split включить в наш, то должно все заработать везде.

AlexSpl писал(а):

Поставить хук туда, где добавляется "\n\n(Visited)" и переписать сообщение на своё. Завтра гляну.

Лоухук?
Последний раз редактировалось Rolex 04 фев 2021, 12:44, всего редактировалось 4 раз(а).
Вернуться к началу

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

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

Сообщение AlexSpl » 04 фев 2021, 12:37

Если координаты одни и те же, то, возможно, HD+ формирует Seed, используя какие-то данные карты.

Цитата:
Лоухук?

Да. Наверное, самое сложное для тех, кто начинает писать плагины, - это поиск адресов для хуков :smile1:

Цитата:
А здесь почему так происходит, что для Заброшенной шахты работает, а для Пирамиды нет? Если код опции Creature Split включить в наш, то должно все заработать везде.

Сложно предположить. Если исправление возвращает оригинальный Seed, то всё должно работать везде :smile5:
Вернуться к началу

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

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

Сообщение Rolex » 04 фев 2021, 12:51

AlexSpl писал(а):

Сложно предположить. Если исправление возвращает оригинальный Seed, то всё должно работать везде

Вы не так меня поняли. С вкл опцией все везде и работает. Вопрос был в том, почему с откл опцией Creature Split (тоже самое, если откл SoD_SP) Заброшенная Шахта разбивается нормально с вкл HD+ (getStacksCount работает правильно), а Пирамида нет (getStacksCount работает не правильно).

PS: Хотя с шахтой по-разному бывает в зависимости от координат. Просто хотелось бы сделать, чтобы он разбивал как с HD+, так и без него - всегда правильно.
Заброшенная шахта:
(25, 9, 0) - разбивает верно даже с HD+.
(55, 89, 0) - разбивает неверно с HD+.
Последний раз редактировалось Rolex 05 фев 2021, 18:02, всего редактировалось 8 раз(а).
Вернуться к началу

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

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

Сообщение RoseKavalier » 04 фев 2021, 18:33

Pyramid has 2 enforced stacks of 20 diamond golems each, that means maximum 5 stacks for 40 gold golems.
The complete procedure also has extra steps for rearranging stacks order based on the gold golem split.
Вернуться к началу

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

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

Сообщение Rolex » 04 фев 2021, 18:56

All possible cases for the Pyramid:
1) (1 * 40) gold + (2 * 10) diamond golems
2) (2 * 20) gold + (2 * 10) diamond golems
3) (1 * 14 + 2 * 13) gold + (2 * 10) diamond golems
4) (4 * 10) gold + (2 * 10) diamond golems
5) (5 * 8) gold + (2 * 10) diamond golems
Вернуться к началу

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

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

Сообщение Rolex » 05 фев 2021, 16:38

Поправил коэф. и кол-во отрядов в коде функции, которая вычисляет кол-во отрядов на которое разобъется охрана Пирамиды с вкл HD+.
k, как я понял, соотношение силы армии героя к силе охраны Пирамиды. И вроде как все работает теперь верно с HD+. Думаю, можно было бы прямо из плагина проверять используется ли режим HD+ и если ДА, то тогда использовать в плагине функцию getStacksCountPyramid, иначе - getStacksCount.

Но есть парочка моментов. В функцию getStacksCount передаются еще координаты объекта и используються какие-то коэф. из массива devCoef[] для вычисления splitValue по какой-то интересной формуле. Нужно ли Deviation для Пирамиды проделывать или только для Заброшенной шахты? Если с Deviation, то функция часто возвращает неверный результат в функции с Пирамидой, поэтому пришлось ее закоментить. Но раз эти координаты передаються и используются в функции, то, видимо, есть ситуации, когда они непосредственно влияют на разбивку охраны. Верояно, нужно просто подправить код Deviation под Пирамиду.

Пирамида:
(32, 86, 0) - координаты входа
< 0,67 ---> 7 отрядов; < 1.00 ---> 6 отрядов, < 1.50 ---> 5 отрядов; < 2.00 ---> 4 отряда; >= 2.00 ---> 3 отряда (из них всегда 2 отряда алмазных големов)

Код: Выделить всё
int getStacksCountPyramid(double k, char x, char y, char z)
{
//   __int64 devCoef[] = { 0x5C6F80EB, 0xC8374AB9, 0x73D409E3, 0xBD38DECE };

   int n = 3;
   if (k < 0.67) n = 7; else
      if (k < 1.00) n = 6; else
         if (k < 1.50) n = 5; else
            if (k < 2.00) n = 4;
      
   // Deviation
//   __int64 splitValue = (((devCoef[0] * x + devCoef[1] * y + devCoef[2] * z + devCoef[3]) >> 0x10) & 0x7FFF) % 100 + 1;
//   if (splitValue <= 20) --n;
//   if (splitValue >= 80 && n < 7) ++n;

   return n;
}


И второй момент - это то, что на другой карте с другими координатами теже коэф. используються для другого кол-ва отрядов с вкл HD+.

Пирамида:
(9, 41, 0) - координаты входа
< 0.50 ---> 7 отрядов; < 0.67 ---> 6 отрядов, < 1.00 ---> 5 отрядов; < 1.50 ---> 4 отряда; >= 1.50 ---> 3 отряда (из них всегда 2 отряда алмазных големов)

Код: Выделить всё
int getStacksCountPyramid(double k)
{
   int n = 3;
   if (k < 0.50) n = 7; else
      if (k < 0.67) n = 6; else
         if (k < 1.00) n = 5; else
            if (k < 1.50) n = 4;

   return n;
}


И еще один кейс.

Пирамида:
(68, 105, 0) - координаты входа
< 0.50 ---> 6 отрядов; < 0.67 ---> 5 отрядов, < 1.00 ---> 4 отрядов; >= 1.00 ---> 3 отряда (из них всегда 2 отряда алмазных големов)
Здесь разбивки Золотых на 5 отрядов вообще нет, максимум - 4. Вот здесь видимо нужно Deviation использовать.

Код: Выделить всё
int getStacksCountPyramid(double k)
{
   int n = 3;
   if (k < 0.50) n = 6; else
      if (k < 0.67) n = 5; else
         if (k < 1.00) n = 4;

   return n;
}


Понимаю, что HD+ меняет Seed, но можно же и к HD+ адаптировать как-то работу плагина.

PS: в исходниках SoD_SP:
https://github.com/RoseKavalier/H3Plugi ... /sodsp.zip

нашел в файле improvements.cpp то, что нужно, но у меня оно почему-то не работает (THISCALL_1 не определен). Куча файлов, библиотек, переопределений...

Код: Выделить всё
/*
 *
 * This hook restores original wandering monster split seed.
 *
 */
void __stdcall _HH_CreatureSplit(HiHook *h, int This)
{
   LOG_HIHOOK;
   if (F_Multiplayer() || !FOptions.split)
      return THISCALL_1(void, h->GetDefaultFunc(), This);
   THISCALL_1(void, 0x50C7B0, This);
}

/*
 *
 * This hook restores seed calculation when entering creature banks.
 *
 */
void __stdcall _HH_creatureBankSeed(HiHook *h, int _this)
{
   LOG_HIHOOK;
   if (F_Multiplayer() || !FOptions.rng)
      return THISCALL_1(void, h->GetDefaultFunc(), _this);
   return THISCALL_1(void, 0x50C7B0, _this);
}

/*
 *
 * This hook prevents hdmod from modifying the random seed at the start of certain battles.
 * Some battles have a random seed determined from rand(1, 1000) which gets skipped if seed != -1
 *
 */
INT __stdcall _HH_BattleRNG(HiHook* h, INT This, INT a2, INT a3, INT a4, INT a5, INT a6, INT a7, INT a8, INT seed, INT a10, INT a11)
{
   LOG_HIHOOK;
   if (FOptions.rng && seed == -1)
   {
      sodsp::gen::GGameFlags.gameStart = TRUE;
      seed = 0xBAD4D;
   }
   return THISCALL_11(INT, h->GetDefaultFunc(), This, a2, a3, a4, a5, a6, a7, a8, seed, a10, a11);
}

/*
 *
 * This function is called later in the process after _HH_BattleRNG
 * and restores the original rand() call, resulting in original rng.
 *
 */
void BattleRng(int& seed)
{
   if (sodsp::gen::GGameFlags.gameStart)
   {
      sodsp::gen::GGameFlags.gameStart = FALSE;
      seed = -1;
   }
}

/*
 *
 * This hook restores original RNG calculations by using the original
 * RandomSeed function.
 *
 */
_LHF_(OriginalRng)
{
   LOG_LOHOOK;
   if (!F_Multiplayer() && FOptions.rng)
   {
      static DWORD default_rng_address;

      if (!default_rng_address)
      {
         HiHook *hh;
         hh = _SODSP->GetFirstHiHookAt(0x61842C); // HD+
         if (hh)
            default_rng_address = hh->GetDefaultFunc();
         else
            default_rng_address = c->return_address; // regular HD
      }

      if (c->return_address == default_rng_address)
         return EXEC_DEFAULT;

      c->return_address = default_rng_address;
      return NO_EXEC_DEFAULT;
   }
   return EXEC_DEFAULT;
}

...

pi->WriteHiHook(0x4AC2D6, CALL_,   THISCALL_, _HH_CreatureSplit);
pi->WriteHiHook(0x4ABBA9, CALL_,   THISCALL_, _HH_creatureBankSeed);
pi->WriteHiHook(0x4AD160, SPLICE_, THISCALL_, _HH_BattleRNG);
pi->WriteLoHook(0x61842C, OriginalRng);
Вернуться к началу

Пред.След.

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

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

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

cron