Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

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

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

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

Сообщение RoseKavalier » 05 май 2019, 18:23

The seed is changed at some point, but I did not search where.
Still, your map will always be the same if you use the same seed in those hooks.
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 264
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 11 раз.

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

Сообщение as239 » 08 май 2019, 16:22

Протестировал на картах с одинаковыми seed, да чем меньше радиус этого квадрата тем меньше вероятность проблемных дорог.
Однако часто возникают дороги "лесенкой" и иногда попадаются респы почти полностью из гор.
Изображение

Так что лучше всего - это постообработкой карты "затыкать" дыры между респами и оставлять единственный проход в центр.
Вроде не так сложно это сделать, но нужен пример как работать со структурами RMG, у меня нет их в homm3.h и как ими пользоваться я не понимаю.
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 264
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 11 раз.

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

Сообщение as239 » 13 май 2019, 08:28

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

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 85
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 19 раз.

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

Сообщение Catastrophe » 20 май 2019, 14:08

пара моих фич. с ассемблером никогда не дружил, если вы знаете способ, как сделать то же самое проще/лучше - прошу не высмеивать, а поделиться

снятие лимита на количество капитолиев
Код: Выделить всё
_PI->WriteJmp(0x4B9C12, 0x4B9C68);

принцип работы: пропускает проверку заменой условного перехода (jle) на безусловный (jmp)

разрешает солмиру (йогу) колдовать в кампании "рождение варвара"
Код: Выделить всё
_PI->WriteHexPatch(0x4DAFC1, "90 90 90 90 90 90 90");

принцип работы: заменяет nop'ами mov [ebp+var_8], offset Campaign14SolmyrBannedSkills

 скриншот
Изображение


"fun tavern" (см. скриншот)
Код: Выделить всё
_PI->WriteDword(0x677D20, 0x524E4547);
_PI->WriteDword(0x677D24, 0x5458544C);
_PI->WriteDword(0x677D28, 0x5458542E);

принцип работы: подменяет содержимое одной переменной с randtvrn.txt на GENRLTXT.TXT

 fun tavern
Изображение


изменение стартового опыта героев
Код: Выделить всё
_PI->WriteDword(0x4BFB4E, 0); // max random exp, default is 50
_PI->WriteByte(0x4BFB5D, 0); // additional exp offset, default is 40

принцип работы: изменяет формулу (опыт выдается всем героям в начале игры по следующей формуле: Random(0, 50) + 40)
прошу помочь тех, кто разбирается - как можно изменить эту формулу на фиксированное количество? на оффсет выделен всего 1 байт...
Последний раз редактировалось Catastrophe 20 май 2019, 17:39, всего редактировалось 4 раз(а).
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

offlineBen80  
Ветеран
Ветеран
 
Сообщения: 694
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 144 раз.

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

Сообщение Ben80 » 20 май 2019, 16:27

Catastrophe писал(а):

прошу помочь тех, кто разбирается - как можно изменить эту формулу на фиксированное количество? на оффсет выделен всего 1 байт...


Для меня ответ очевиден - использовать LoHook, в котором можно прописать какую угодно формулу...
Но поскольку это очевидно, то не такого ответа вы, видимо, ждете. Не могу только понять, какого...
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 85
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 19 раз.

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

Сообщение Catastrophe » 20 май 2019, 16:48

Ben80 писал(а):

Для меня ответ очевиден - использовать LoHook, в котором можно прописать какую угодно формулу...
Но поскольку это очевидно, то не такого ответа вы, видимо, ждете. Не могу только понять, какого...

А для меня это не очевидно, я не очень хорошо в этом разбираюсь. В моем моде большая часть кода взята с наработок других авторов или написана igrik'ом / RoseKavalier'ом по моей просьбе, я в основном занимался переводом, балансом, твиками.
Можно шаблон использования LoHook? Комментарий из патчера неинформативен
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

offlineBen80  
Ветеран
Ветеран
 
Сообщения: 694
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 144 раз.

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

Сообщение Ben80 » 20 май 2019, 17:07

Не знаю насчет шаблона (на сайте уже такое огромное количество материала по данной теме, что только читай - и не так много нужно прочитать, чтобы составить представление о LoHook), но вот как будет в вашем случае:

Код: Выделить всё
int __stdcall setHeroExperience(LoHook* h, HookContext* c)
{
    c->eax = 500;

    return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x4BFB5E, setHeroExperience);


Здесь просто задается опыт, равный 500. Но это, так сказать, формула. Которую можно усложнить, как заблагорассудиться.
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 85
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 19 раз.

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

Сообщение Catastrophe » 20 май 2019, 18:10

Что ж, это было просто. Только у вас хук стоит на неправильный адрес, на 5E (где push 0) вылетает игра, нужно ставить на 5B (где как раз стоит add eax, 28h). На выходе все работает, более того, работает лучше, чем хотелось бы! Если добавить 1000+ экспы (1+ лвл), то герой при старте все равно будет 1 лвла и не будет автоматически учить навыки (как высокоуровневые герои в тюрьмах), их можно будет вкачать самому после первого получения опыта, лвлы накинутся тогда же.
Код: Выделить всё
int __stdcall c_start_exp(LoHook* h, HookContext* c)
{
   c->eax = 5000;
   return EXEC_DEFAULT;
}
...
         _PI->WriteDword(0x4BFB4E, 0); // random amount of experience = from 0 to this value
         _PI->WriteByte(0x4BFB5D, 0); // additional, fixed amount of experience
         _PI->WriteLoHook(0x4BFB5B, c_start_exp); // since it's limited to byte
Последний раз редактировалось Catastrophe 21 май 2019, 18:28, всего редактировалось 1 раз.
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

offlineBen80  
Ветеран
Ветеран
 
Сообщения: 694
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 144 раз.

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

Сообщение Ben80 » 20 май 2019, 18:38

Catastrophe писал(а):

Что ж, это было просто. Только у вас хук стоит на неправильный адрес, на 5E (где push 0) вылетает игра, нужно ставить на 5B (где как раз стоит add eax, 28h).


Этот адрес не может быть неправильным, у вас игра вылетает из-за чего-то другого (или что-то не так сделали).
Вы определитесь - вопрошающий вы или эксперт. Если вопрощающий, то странно видеть подобные ваши "уточнения". А если эксперт - то уж про LoHook'и должны бы знать.
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 85
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 19 раз.

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

Сообщение Catastrophe » 20 май 2019, 20:45

Ну у нас же не могут базы и екзешники отличаться? у меня на 5E стоит команда push 0, сразу после нужной add eax, 28h, которая находится в 5B. С первым вариантом игра вылетает, со вторым все работает. Я не эксперт, но разве я не прав? LoHook ведь исполняется вместо оригинального кода по указанному адресу, и вся его суть в редактировании регистра перед непосредственном считыванием инфы с него? Зачем тогда ставить его после необходимого нам участка, а не на нем, или чуть пораньше?
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

Пред.След.

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

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

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

cron