Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 88
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 22 раз.

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

Сообщение Catastrophe » 27 май 2019, 02:02

Немного оффтопа. Возможно вы заметили что я пользуюсь нестадартным екзешником игры, это моя модификация "HD exe"
Его главным отличием от оригинала является удобно отсортированное чит-меню, доступное без необходимости выносить ярлык с /nwcgrail
 чит-меню карты
Изображение
Изображение
Изображение
Изображение

 чит-меню боя
Изображение

https://drive.google.com/uc?export=down ... 0CktWyX5w4 (SoD / Complete)
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

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

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

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

Как вы могли знать, в оригинале игры было 4 неиспользуемых слота существ. Их id: 122, 124, 126, 128. Они должны были быть неапнутыми существами кузницы 3-6 уровней, но после отмены выхода этого замка (и слава богу, это мое личное мнение и оценочное суждение), для экономии ресурсов разработчики использовали четырех существующих нейтралов, чем освободили эти четыре слота. Эти слоты имеют существенный недостаток по сравнению с остальными, позже расскажу какой.

На героев выходило множество модов, где добавляли новых существ, но ни в одном из них эти четыре слота так и не смогли использовать.
Вводивший меня в моддинг тройки igrik, сказал что сделать с этими слотами ничего нельзя, так как в них не хватает места.
Позже я понял, что он имел в виду - эти существа имеют один указатель и для звука, и для графики:
Изображение
Но значит ли это, что слоты в таком виде непригодны для использования?
 а вот и нет!!!
Изображение

Что я сделал:
  • Вытащил деф крестьян, переименовал его в bad4 (без расширения .def), положил обратно
  • Вытащил звуки крестьян, заменил в их названии PSNT на BAD4, положил обратно
  • Скопировал флаг крестьян новому монстру: o_CreatureInfo[128].flags = 16; (был бы очень рад любой информации о том, какие существуют флаги и какие за что отвечают)
  • Заполнил необходимую информацию в CPRTRAITS.txt
И все работает без вылетов! Все анимации проигрываются, никаких багов замечено не было.

Разумеется, нужно еще добавить их графику в CPRSMALL.def, TWCRPORT.def, AVWATTAK.def, дать им деф для карты приключений (как?), жилище (как?), спавн (как?) и другое (что еще?)

Сделал пока так:
 возвращаем возрождение эрафии
Изображение

Как дать им иконку на карте? Включить в редакторе карт? Заставить спавниться во внешних жилищах из RoE?
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

offlinefeanor  
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 15 мар 2016, 16:23
Пол: Не указан
Поблагодарили: 15 раз.

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

Сообщение feanor » 27 май 2019, 17:54

Цитата:
На героев выходило множество модов, где добавляли новых существ, но ни в одном из них эти четыре слота так и не смогли использовать.

Да ладно, в куче модов их использовали и нормально.

Цитата:
Скопировал флаг крестьян новому монстру: o_CreatureInfo[128].flags = 16; (был бы очень рад любой информации о том, какие существуют флаги и какие за что отвечают)

ERM-help в помощь, так-то.

Код: Выделить всё
Значение Способность
1 Широкий - занимает две клетки
2 Монстр может летать
4 Монстр может стрелять. Если вы даете эту способность не-стрелку, вы получите несколько сообщений об ошибке ("неверный ресурс"). Возможно только с доп. графикой.
8 Расширенный радиус атаки (две клетки). Это как дыхание дракона. Этот флаг не работает для стрельбы, только в рукопашном бою.
16 Живое существо. Делает монстра чувствительным к Благословению, Радости, Волне Смерти, Морали и другим вещам, работающим лишь на живых.
32 Катапульта. Монстр может атаковать стены города.
64 Осадное орудие. Не может двигаться. При телепортировании следует вылет из игры. Отряд не требуется убивать для достижения победы. Возле отряда отсутствует обозначение количества существ.
128 Король 1 - это все существа 7го уровня и нейтральные драконы, не принадлежащие к КОРОЛЬ 2 или КОРОЛЬ 3, существа, несущие доп. урон от заклинания Палач
256 Король 2 - Ангелы, Архангелы, Дьяволы, Архидьяволы, существа, несущие доп. урон от продвинутого или выше уровня заклинания Палач
512 Король 3 - Гиганты, Титаны, существа, несущие доп. урон от экспертного уровня заклинания Палач
1024 Иммунитет к заклинаниям разума (вроде Печали, Бешенства, т.п.)
2048 Монстр - 35 (архимаг), 74 (Созерцатель), 75 (Злой глаз). Анимация выстрела с этим флагом становится непрерывным прямым лучом.
4096 Нет пенальти в ближнем бою (для стрелков)
8192 В игре никогда не проверяется. Возможно, он раньше использовался, а теперь потерял своё значение.
16384 Иммунитет к заклинаниям огня, в т.ч. положительным (Эфриты)
32768 Двойной удар. (улуч. Стрелки или Крестоносцы)
65536 Нет ответа (Церберы или Гидры) 
131072 Нет пенальти морали (Элементали, Големы)
262144 Нежить (все существа Некрополиса, существо с этим флагом не имеет морали, получает урон от заклинания Уничтожить нежить и не несет урона от Волны смерти)
524288 Атакует всех вокруг, не работает вместе с Дыханием Дракона.
1048576 Расширенный радиус стрельбы. Это способность Магогов/Личей/Могучих Личей. Используется только ИИ, не имеет ценности для игрока.
2097152 Отряд не получает право на ход во время боя. По окончании битвы отряд исчезнет. Отряд не требуется убивать для достижения победы. Возле отряда отсутствует обозначение количества существ. Иммунитет к некоторым заклинаниям. Этот флаг автоматически устанавливается, когда существо умирает. Если вы сами установили этот флаг, то убрав его вы воскресите существо. При получении урона в "мертвом" состоянии количество существ и здоровья у последнего существа в стеке уменьшается. Поэтому после воскрешения может быть 0 существ. Но это вам не мешает установить с помощью BM:N столько существ, сколько нужно. Если же существо действительно умерло, то убирание флага существо не воскресит, но может привести к различным сбоям в работе AI. Телепортируется корректно.
4194304 По окончании битвы или в случае смерти отряд исчезнет. Такой флаг имеют элементали, вызванные заклинанием в битве.
8388608 При получении любого урона отряд погибнет. Отряд окрашен в синий цвет. Пример - заклинание Клона.
16777216 В этом раунде битвы отряду выпала мораль.
33554432 Отряд находится в состоянии ожидания.
67108864 В этом раунде битвы отряд уже совершил некое действие.
134217728 Отряд стоит в защитном положении.
268435456 Флаг выставляется стэку, когда тот был принесён в Жертву. Тело отряда исчезает после смерти.
536870912 Существа с этим флагом не меняют свой цвет при клонировании и окаменении.
1073741824 Отряд окрашен в серый цвет.
2147483648 Дракон. На юнита с этим флагом действует Пузырек крови дракона и влияния героя-дракона (Мутаре)


Цитата:
Как дать им иконку на карте? Включить в редакторе карт?

objects.txt в основанных на SoD версиях, плюс три объектных текстовика (zaobjts.txt, zeobjts.txt, zobjcts.txt) в нормальных основанных на Воге.

Цитата:
Заставить спавниться во внешних жилищах из RoE?

0063D684: 7A0000007C0000007E00000080000000
(таблица обитателей существ)
Вернуться к началу

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

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

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

feanor писал(а):

objects.txt

А вот тут поподробнее, как их там указать? Их пустых слотов там просто нет. Еще один подвох? И что делать?
В екзешнике наверняка идут обращения к строчкам из objects.txt (иначе как бы игра их получала), есть инфа об этом?
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

offlinefeanor  
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 15 мар 2016, 16:23
Пол: Не указан
Поблагодарили: 15 раз.

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

Сообщение feanor » 27 май 2019, 19:19

Да нет, там как раз без фашизма ЕМНИП.

Добавить строчки с дефом-типом-подтипом, остальное скопировать, увеличить счетчик в первой строке.
Вернуться к началу

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

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

Сообщение as239 » 29 май 2019, 07:43

Нашли баг с обменом в городе.
Порядок воспроизведения:
1. Запускаем случайный шаблон например JC.
2. Заходим в город
3. Садим стартового героя в город
4. Покупаем второго героя
5. Нанимаем войско 1-го уровня, важно купить именно через диалог, а не горячей клавешей
6. Нажимаем "E", передаем войско от стартового героя
7. Закрываем диалог обмена и с игрой начинаются большие проблемы

Вот код:
Код: Выделить всё
bool inTownDlg;

char __stdcall Y_DlgTown_Proc(HiHook* hook, _TownMgr_* tm, _EventMsg_* klick)
{
   char res = CALL_2(char, __thiscall, hook->GetDefaultFunc(), tm, klick);
   inTownDlg = false;

   if (res) {
      if (klick->type == 2 && klick->subtype == HK_E) {
         int heroU_id = tm->town->up_hero_id;
         int heroD_id = tm->town->down_hero_id;

         if ( heroU_id != -1 && heroD_id != -1) {
            _Hero_* heroU = o_GameMgr->GetHero(heroU_id);
            _Hero_* heroD = o_GameMgr->GetHero(heroD_id);

            inTownDlg = true;

            if ( *(int*)((int)o_Executive +4) != (int)o_WndMgr ) {
               *(int*)((int)o_TownMgr +4) = (int)o_AdvMgr;
               *(int*)((int)o_TownMgr +8) = (int)o_WndMgr;

               *(int*)((int)o_AdvMgr +4) = NULL;
               *(int*)((int)o_AdvMgr +8) = (int)o_WndMgr;           

               *(int*)((int)o_WndMgr +4) = (int)o_TownMgr;
               *(int*)((int)o_WndMgr +8) = (int)o_MouseMgr;
            }
            CALL_2(void, __fastcall, 0x4A25B0, heroU, heroD);
            CALL_3(void, __thiscall, 0x4AAA60, o_TownMgr, heroU, heroD);

            CALL_1(void, __thiscall, 0x5D5930, o_TownMgr);       
            CALL_1(void, __thiscall, 0x5D5810, o_TownMgr);   

            inTownDlg = false;

            return 1;   
         }
      }
   }

   return res;
}

int __stdcall Y_Dlg_HeroesMeet(LoHook* h, HookContext* c)
{   
   if ( inTownDlg ) { // пропускаем обновление экрана
      c->return_address = 0x4AAC2A;
      return NO_EXEC_DEFAULT;
   }
   return EXEC_DEFAULT;
}//-------------------------------------------------------------------------------------------------------


         _PI->WriteHiHook(0x5D3640, SPLICE_, EXTENDED_, THISCALL_, Y_DlgTown_Proc);
         _PI->WriteLoHook(0x4AAC1B, Y_Dlg_HeroesMeet);
Вернуться к началу

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

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

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

feanor писал(а):

Да нет, там как раз без фашизма

Действительно!) Потребовалось всего-то скопировать строчки элементалей и заменить id.
 
Изображение

Осталось поселить их в жилищах из возрождения эрафии, не знаешь как?
у меня проблемы с головой, ты в том же посте на это отвечал
ток адреса не те, в RoE у элемов были большие жилища:
Код: Выделить всё
         _PI->WriteDword(0x63D58C, 122);
         _PI->WriteDword(0x63D5A4, 124);
         _PI->WriteDword(0x63D5B0, 126);
         _PI->WriteDword(0x63D62C, 128);

и вот еще для сопряжения из RoE
 (которое жилище со всеми элемами)
Изображение

Код: Выделить всё
         _PI->WriteDword(0x677938, 122);
         _PI->WriteDword(0x67793C, 128);
         _PI->WriteDword(0x677940, 126);
         _PI->WriteDword(0x677944, 124);
Последний раз редактировалось Catastrophe 30 май 2019, 17:03, всего редактировалось 2 раз(а).
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

offlinefeanor  
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 15 мар 2016, 16:23
Пол: Не указан
Поблагодарили: 15 раз.

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

Сообщение feanor » 29 май 2019, 12:48

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

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 » 29 май 2019, 19:57

2as239: Навскидку проблема может быть в этом фрагменте кода:

Код: Выделить всё
if ( *(int*)((int)o_Executive +4) != (int)o_WndMgr ) {
    *(int*)((int)o_TownMgr +4) = (int)o_AdvMgr;
    *(int*)((int)o_TownMgr +8) = (int)o_WndMgr;

    *(int*)((int)o_AdvMgr +4) = NULL;
    *(int*)((int)o_AdvMgr +8) = (int)o_WndMgr;           

    *(int*)((int)o_WndMgr +4) = (int)o_TownMgr;
    *(int*)((int)o_WndMgr +8) = (int)o_MouseMgr;
}

RoseKavalier не пояснял. Но по виду - это декомпилированный участок оригинального кода или кода Хоты. Здесь либо автору в личку писать, либо самому сидеть с дебаггером и разбираться в причинах.
Вернуться к началу

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

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

Сообщение RoseKavalier » 29 май 2019, 20:56

Simply observation of what was different when meeting hero on map first.
This was my original message, you can likely follow the same logic to figure out what's going on.
There are some functions to replace parent / kid automatically, remove them using Executive Manager but I did not bother to try that.

Цитата:
As I thought, the order of managers matters, similar to _Dlg_.
I have not tested further than seeing it stopped doing the weird stuff.
Изображение
Код: Выделить всё
struct _Mgr_
{
   DWORD *vTable;
   _Mgr_ *mgr1;
   _Mgr_ *mgr2;
   DWORD f_0C;
   DWORD f_10;
   char name[19]; // not sure of length, but "heroWindowManager" is pretty long

   void Printf() // I used this to debug quickly
   {
      o_TextBuffer[0] = 0;
      if (mgr1 && mgr2)
         sprintf(o_TextBuffer, "Manager %s\nManager #1: %s\nManager #2: %s", name, mgr1->name, mgr2->name);
      if (mgr1 && !mgr2)
         sprintf(o_TextBuffer, "Manager %s\nManager #1: %s\nManager #2: none", name, mgr1->name);
      if (!mgr1 && mgr2)
         sprintf(o_TextBuffer, "Manager %s\nManager #1: none\nManager #2: %s", name, mgr2->name);
      if (!mgr1 && !mgr2)
         sprintf(o_TextBuffer, "Manager %s\nNo kids", name);
      H3MessageBox(o_TextBuffer, MBX_OK); // 0x4F6C00 macro
   }

   void setManagers(void *m1, void *m2)
   {
      mgr1 = (_Mgr_ *)m1;
      mgr2 = (_Mgr_ *)m2;
   }
};

char __stdcall Y_DlgTown_Proc(HiHook* hook, _TownMgr_* tm, _EventMsg_* klick)
{
   char res = CALL_2(char, __thiscall, hook->GetDefaultFunc(), tm, klick);
   inTownDlg = false;

   if (res) {
      if (klick->type == 2 && klick->subtype == HK_E) {
         int heroU_id = tm->town->up_hero_id;
         int heroD_id = tm->town->down_hero_id;

         if (heroU_id != -1 && heroD_id != -1) {
            _Hero_* heroU = o_GameMgr->GetHero(heroU_id);
            _Hero_* heroD = o_GameMgr->GetHero(heroD_id);

            inTownDlg = true;

            _Mgr_ *mgr = (_Mgr_*)o_TownMgr;
            mgr->setManagers(o_AdvMgr, o_WndMgr);
            
            mgr = (_Mgr_*)o_AdvMgr;
            mgr->setManagers(NULL, o_TownMgr);

            mgr = (_Mgr_*)o_WndMgr;
            mgr->setManagers(o_TownMgr, o_MouseMgr);

            /*_Mgr_ *mgr = (_Mgr_*)o_TownMgr;
            mgr->Printf();
            mgr = (_Mgr_*)o_AdvMgr;
            mgr->Printf();
            mgr = (_Mgr_*)o_WndMgr;
            mgr->Printf();
            mgr = (_Mgr_*)o_MouseMgr;
            mgr->Printf();*/

            CALL_3(void, __thiscall, 0x4AAA60, o_TownMgr, heroU, heroD);

            // redraw town dlg
            CALL_1(void, __thiscall, 0x5D5930, o_TownMgr);
            CALL_1(void, __thiscall, 0x5D5810, o_TownMgr);

            inTownDlg = false;

            return 1;
         }
      }
   }

   return res;
}
Вернуться к началу

Пред.След.

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

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

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