Current time: 09.11.2024, 16:42 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Вопросы по моддингу
» (обсуждаем моддинг здесь)
Author Message
Berserker Offline
Administrators

Posts: 16645
Post: #1981

Раз показывает старую, значит где-то есть мод с большим приоритетом и там либо уже распакованный в папке файл, либо zip.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
16.01.2024 17:53
Find all posts by this user Quote this message in a reply
major Offline

Posts: 146
Post: #1982

Как можно вывести изображение и текст, например количество опыта, в окно состояния на карте приключений, как это делает HD мод?
09.02.2024 17:02
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2351
Post: #1983

(09.02.2024 17:02)major Wrote:  Как можно вывести изображение и текст, например количество опыта, в окно состояния на карте приключений, как это делает HD мод?

Проще всего - хакнуть эту функцию в HD-моде, т.к. Бараторч готовый код не отдаст. Сложнее - написать самому, т.к. оригинальная выводит только ресурсы. Под MoP эта функция была целиком переписана - выводила любые картинки и любой текст, но исходники не сохранились - можно только реверсом достать.
(This post was last modified: 09.02.2024 19:09 by XEPOMAHT.)
09.02.2024 19:08
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2819
Post: #1984

(09.02.2024 17:02)major Wrote:  Как можно вывести изображение и текст, например количество опыта, в окно состояния на карте приключений, как это делает HD мод?
HD-mod делает так:
Code:
int __stdcall sub_10086090(const char *text, int type, int subtype, int deley)
{
  *(_DWORD *)(MEMORY[0x6992B8] + 920) = 6;
  v4 = (_DWORD *)(MEMORY[0x6992B8] + 924);
  *v4 = deley + MEMORY[0x4F8970]();
  *(_DWORD *)(MEMORY[0x6992B8] + 928) = type;   // type смотри !!IF:N
  *(_DWORD *)(MEMORY[0x6992B8] + 932) = subtype;// subtype смотри !!IF:N
  MEMORY[0x404180](MEMORY[0x6992B8] + 936, text, strlen(text));
  return MEMORY[0x415D40](MEMORY[0x6992B8], 1, 1, 1);
}


game bug fixes extended.dll || My Plugins || My GitHub
10.02.2024 19:54
Visit this user's website Find all posts by this user Quote this message in a reply
major Offline

Posts: 146
Post: #1985

(10.02.2024 19:54)igrik Wrote:  HD-mod делает так:
Жаль, что я так не могу 96

(10.02.2024 19:54)igrik Wrote:  
Code:
int __stdcall sub_10086090(const char *text, int type, int subtype, int deley)
{
  *(_DWORD *)(MEMORY[0x6992B8] + 920) = 6;
  v4 = (_DWORD *)(MEMORY[0x6992B8] + 924);
  *v4 = deley + MEMORY[0x4F8970]();
  *(_DWORD *)(MEMORY[0x6992B8] + 928) = type;   // type смотри !!IF:N
  *(_DWORD *)(MEMORY[0x6992B8] + 932) = subtype;// subtype смотри !!IF:N
  MEMORY[0x404180](MEMORY[0x6992B8] + 936, text, strlen(text));
  return MEMORY[0x415D40](MEMORY[0x6992B8], 1, 1, 1);
}

Я так понимаю, нельзя просто так взять и вызвать эту функцию?
У меня AdvMgr (MEMORY[0x6992B8]) по этим смещениям не разобран. Ок, добавил ему в структуру
Code:
_dword_ info_type; // +920
_dword_ info_delay; // +924
_dword_ info_pic_type; // +928
_dword_ info_pic_subtype; // +932
_dword_ info_text; // +936

и переписал функцию
Code:
int test_message(const char* text, int type, int subtype, int deley)
{
    //*(_DWORD*)(MEMORY[0x6992B8] + 920) = 6;
    o_AdvMgr->info_type = 6;

    //*(_DWORD*)(MEMORY[0x6992B8] + 924) = deley + MEMORY[0x4F8970]();
    o_AdvMgr->info_delay = deley + CALL_0(_dword_, __cdecl, 0x4F8970);

    //*(_DWORD*)(MEMORY[0x6992B8] + 928) = type;   // type смотри !!IF:N
    o_AdvMgr->info_pic_type = type;

    //*(_DWORD*)(MEMORY[0x6992B8] + 932) = subtype;// subtype смотри !!IF:N
    o_AdvMgr->info_pic_subtype = subtype;

    //MEMORY[0x404180](MEMORY[0x6992B8] + 936, text, strlen(text));
    CALL_3(void, __thiscall, 0x404180, &o_AdvMgr->info_text, text, strlen(text));

    //return MEMORY[0x415D40](MEMORY[0x6992B8], 1, 1, 1);
    return CALL_4(int, __thiscall, 0x415D40, o_AdvMgr, 1, 1, 1);
}

Ну и при вызове test_message(o_TextBuffer, 17, experience, 5000); очевидно получаю краш.
13.02.2024 04:36
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2351
Post: #1986

(13.02.2024 04:36)major Wrote:  Жаль, что я так не могу 96

Так и я не могу. Моддерам к интерфейсу окна приключений закрыт из-за совместимости с HD-модом (даже радар не перекрасить в цвета радуги).

(13.02.2024 04:36)major Wrote:  Я так понимаю, нельзя просто так взять и вызвать эту функцию?

Функция полностью перехвачена HD-модом. Библиотекой _HD3_.dll, насколько помню. Адрес функции - там же можно накопать, если диассемблировать HD-мод. Лично я давно забил на вывод информации в окно состояния в рамках ERA+, т.к. писать собственные функции, с дублированием кода HD-мода на Ассемблере с сохранением обратной совместимости, чтобы работало и с HD-модом, и без него, поленился.

(13.02.2024 04:36)major Wrote:  MEMORY[0x6992B8] + 936, text, strlen(text)

Там крошечный текстовый буфер, ты зачем туда пытаешься строку пропихнуть??? Текст туда надо копировать и не забыть записать и размер строки тоже (функция FMes_ExpandAndCopy). Если буфер забит мусором - почистить перед копированием (функция FMes_Clean). И то, и то лучше делать содовскими функциями. Наколько помню, в MoP я выводил текст в окне напрямую из воговской Z-переменной в обход копирования текста в _AdvMng_ + 936, т.к. работать с этим буфером у меня тоже тогда не получалось. А там самое главное, чтобы текст во время показа не менялся, т.е. текстовая переменная была уникальная. Помню, была такая фича в MoP - бегущая строка с анимированным def и музыкальным сопровождением в этом окне, но пришлось всё это убрать из MoP, т.к. вело к хаотическим утечкам памяти.
(This post was last modified: 13.02.2024 09:06 by XEPOMAHT.)
13.02.2024 08:01
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2819
Post: #1987

Вот оригиальная функция по показу кол-ва ресурсов (и только ресурсов!)
Code:
sprintf(o_TextBuffer, "AdvMgrInfo: %d", 666);
o_AdvMgr->Field<_dword_>(+940) = 0; // очищаем длину строки
CALL_4(void, __thiscall, 0x415FC0, o_AdvMgr, o_TextBuffer, 6 (Золото), 5000);

UPD: А вылетает не из-за размера текста и буфера, а потому что базово "окно состояния на карте приключений" может показывать только типы 0-8.
Code:
enum AdvManager::EBottomViewType
{
  BVTYPE_NONE             = 0,
  BVTYPE_NEW_TURN         = 1,
  BVTYPE_KINGDOM          = 2,
  BVTYPE_HERO             = 3,
  BVTYPE_TOWN             = 4,
  BVTYPE_ENEMY_TURN       = 5,
  BVTYPE_RESOURCE_MESSAGE = 6,
  BVTYPE_MESSAGE          = 7,
  BVTYP

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


game bug fixes extended.dll || My Plugins || My GitHub
13.02.2024 09:11
Visit this user's website Find all posts by this user Quote this message in a reply
major Offline

Posts: 146
Post: #1988

igrik, спасибо за структуры, помню, что видел твой пост, но потом забыл про него.

В общем, поковырявшись ещё час-полтора, понял, что IF:L не такой уж плохой вариант. 96
Ну, а серьезно, там ограничение не только в показе определенных типов. Ничто же не мешает воспользоваться старыми-добрыми костылями и запихать нужную картинку в деф к ресурсам и показывать её. Но проблема-таки в том, что нельзя показать картинку за мифрилом, игра крашится.
По коду так и не смог понять, почему. Там дальше и деф погружается и нужный кадр должен отрисовываться, а почему краш не понятно.
Хотя мне достаточно того, что мифрил отображается, мне он все равно не нужен, можно смело поменять на опыт.
14.02.2024 12:37
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16645
Post: #1989

В IF:L можно выводить любые изображения

Code:
[+] Added support for displaying inline def-images right in texts as a part of Era Markup Language (EML).

  To embed image in text use the following tags:
  {~>def_name.def}                          Will display the first frame from the first group of def_name.def image in place of text cursor.
  {~>def_name.def:frame_index}              Will display specified frame from the first group of def_name.def image or nothing if index is invalid.
  {~>def_name.def:group_index:frame_index}  Will display specified frame from specified group of def_name.def image or nothing if index is invalid.

  Frames and frame groups are counted from 0. Frames are automatically trimmed.
  By default images are rendered "inline". It means, that they are treated as non-wrapping sequence of white space characters. Images do not allocate
  vertical space except the height of current font. But they automatically allocate necessary width.

  Images can be aligned vertically using the following attribute: valign=top|middle|bottom.
  Examples:
    {~>ava0037.def valign=bottom}
    {~>smalres.def:5}

  Vertical alignment modes:
  - 'top'.    Image is drawn from the top left pixel of current character box.
  - 'middle'. Image is vertically centered relative to current text line height. This is the default mode for inline images.
  - 'bottom'. Image is drawn so, that it's bottom edge matches current text line bottom edge.

  It's possible to display image in a horizontally mirrored form. Just add "mirror" attribute.
  Example: {~>ava0037.def mirror}

Тегами ставим нужный цвет текста, полупрозрачность и картинку.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
14.02.2024 16:46
Find all posts by this user Quote this message in a reply
major Offline

Posts: 146
Post: #1990

Подскажите, очень нужна помощь. Несколько дней изучаю многофайловые сборки, но нормальных примеров так и не встретил. Пытаюсь разбить свой "проект" на несколько файлов, и есть некоторые трудности по части компиляции и ошибках линковщика. Visual Studio, C++.

1. Почитал, что в хедерах прописываются только объявления переменных и прототипы функций. Непонятно, почему, объявляя переменную в хедере
Code:
#pragma once
#ifndef _GLOBALS_H_
#define _GLOBALS_H_
int param;
#endif
и подключая этот хедер к другим файлам .cpp я получаю ошибку линковщика по типу множественного определения. Ведь переменную я еще не определил, только объявил.
Каким образом можно создать переменную, которая будет использоваться в разных .cpp файлах проекта?
Пример для наглядности, переменных много, как и функций, поэтому хотелось вынести все это по разным файлам.

2. Как можно подключить хедер Эры era.h к разных файлам .cpp? Здесь тоже тонна ошибок множественного определения.
23.03.2024 21:21
Find all posts by this user Quote this message in a reply
Solstheim Offline

Posts: 2
Post: #1991

Всем здравствуйте. Я постараюсь выразить свою проблему и идею. Я не программист, но хочу сделать собственные Герои 3 для внутреннего пользования.
Вдохновил меня на это дело HoTA, а потом я нашёл утешение в ERA…чей сборки не помню. Там фактически никакого нового контента нет, но для меня это вроде как стабильно работающий и идеальный WOG. Но в нём не хватает контента из HotA. А в HotA нет возможностей WOG/ERA. Сам же оригинальный WOG 1.44 постоянно вылетает на win 7.
Есть ещё древний диск тоже с WOG-овской версией. Я не знаю, что там за версия, но она настолько сырая, что никаких WOG-настроек там нет. Но зато есть существа 8 лвл. Вот эта версия стабильно работает на 7-рке.

Во-первых, я хочу добавить множество новых гор и лесов, камней, кустиков, деревьев и т.д. Зачем? Просто красиво и атмосферно. Во-вторых, я хотел бы пойти дальше и наполнять игру всё новым и новым контентом вроде новых нейтралов и их жилищ и т.д.

Что я начал? Я просто поставил голую Heroes Complete, залез в тамошний lod, и стал добавлять свои объекты. Прописал их даже в object.txt и rand_trn.txt. Добавлял я ледяные горы, скаченные откуда-то из VCMI (просто как тест). Создал для них автоматически через DefTOOL сопутствующие def-у файлы. При помощи resEdit2 всё это укомплектовал в единый игровой (не свой, а именно игровой) lod включая обновлённые txt. Конечно же я понимаю, что правки в rand_trn.txt явно недостаточно для того, чтобы игра поняла, что я от неё хочу. Тем не менее на игру мои изменения всё же произвели глубокие впечатления — она просто стала крашится при создании карты. Тоже самое стал крашится и редактор карт.

В файле objects был взят шаблон снежных гор. Только поменял названия на имя новых def-файлов.
А вот с rand_trn.txt я вообще не понял по какому принципу там находятся файлы и как придумывать ID.
Знаю, что есть какая-то мифическая утилита для редактирования объектов. Но ссылка там битая и древняя, потому скачать не удалось. Можно делать это при помощи редактора карт, но мне нужно чтобы это было не на одной карте, а использовалось всегда и по умолчанию.

Итак вопросы:

1. Реально ли вообще наполнять Heroes 3 Complete? Или лучше для этого использовать WOG или вообще, как лучше?
2. Если для Complete это реально (хотя я люблю WOG), то что я не так делаю, и что я упустил? Если у кого-то есть время и настроение распишите (без сленга) поэтапно что какой программой делать на примере непроходимого объекта для карты (лес, горы). Мне нужно чтобы он виделся как встроенным редактором карт, так и самой игрой, а также генерировался.
   
p.s. знаю, что об этом расписано много всего, но я уже который день рыщу по разным форум включая англоязычный, и это только больше меня стало запутывать. А то, что довольно информативно, устарело, как и устарели ссылки. То есть многие мододелы хрен клали на разработку и куда-то исчезли вместе со своими утилитами.
(This post was last modified: 26.06.2024 02:21 by Solstheim.)
26.06.2024 02:20
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2351
Post: #1992

(26.06.2024 02:20)Solstheim Wrote:  1. Реально ли вообще наполнять Heroes 3 Complete? Или лучше для этого использовать WOG или вообще, как лучше?

Проще всё же использовать ERA с патчем на редатор карт. Т.к. там есть возможность оформить свой мод в виде мода, без свалок в игровых архивов и прочих заморочек. Оригинальный WoG давно не поддерживается сообществом мододелов.

(26.06.2024 02:20)Solstheim Wrote:  2. Если для Complete это реально (хотя я люблю WOG), то что я не так делаю, и что я упустил? Если у кого-то есть время и настроение распишите (без сленга) поэтапно что какой программой делать на примере непроходимого объекта для карты (лес, горы). Мне нужно чтобы он виделся как встроенным редактором карт, так и самой игрой, а также генерировался.

Для того, чтобы твои новые лес/горы по новым индексам увидел генератор карт, придётся патчить его код. Если ты используешь стандартные индексы содовских декораций, то патчить код не нужно. Наиболее удобно это сделано, как ни странно, в HoA, но потребуется редактор HotA.dat. Для ERA+ поддерка любых новых объектов в генераторе карт так же давным давно сделана, при этом ERA+ уже содержит готовый винегрет отборной всячины для картоделов, но это нихрена никому оказалось не нужно. Скорее всего, твои желания по новым объектам уже реализованы в ERA+.

(26.06.2024 02:20)Solstheim Wrote:  То есть многие мододелы хрен клали на разработку и куда-то исчезли вместе со своими утилитами.

Так уж 20 лет минуло. Некоторые мододелы из отцов уже стали дедами. 166 Старожилы на форуме ещё остаются - можешь спрашивать у них и софт, и какие-либо примеры.
26.06.2024 03:49
Find all posts by this user Quote this message in a reply
Solstheim Offline

Posts: 2
Post: #1993

(26.06.2024 03:49)XEPOMAHT Wrote:  
(26.06.2024 02:20)Solstheim Wrote:  1. Реально ли вообще наполнять Heroes 3 Complete? Или лучше для этого использовать WOG или вообще, как лучше?

Проще всё же использовать ERA с патчем на редатор карт. Т.к. там есть возможность оформить свой мод в виде мода, без свалок в игровых архивов и прочих заморочек. Оригинальный WoG давно не поддерживается сообществом мододелов.

(26.06.2024 02:20)Solstheim Wrote:  2. Если для Complete это реально (хотя я люблю WOG), то что я не так делаю, и что я упустил? Если у кого-то есть время и настроение распишите (без сленга) поэтапно что какой программой делать на примере непроходимого объекта для карты (лес, горы). Мне нужно чтобы он виделся как встроенным редактором карт, так и самой игрой, а также генерировался.

Для того, чтобы твои новые лес/горы по новым индексам увидел генератор карт, придётся патчить его код. Если ты используешь стандартные индексы содовских декораций, то патчить код не нужно. Наиболее удобно это сделано, как ни странно, в HoA, но потребуется редактор HotA.dat. Для ERA+ поддерка любых новых объектов в генераторе карт так же давным давно сделана, при этом ERA+ уже содержит готовый винегрет отборной всячины для картоделов, но это нихрена никому оказалось не нужно. Скорее всего, твои желания по новым объектам уже реализованы в ERA+.

(26.06.2024 02:20)Solstheim Wrote:  То есть многие мододелы хрен клали на разработку и куда-то исчезли вместе со своими утилитами.

Так уж 20 лет минуло. Некоторые мододелы из отцов уже стали дедами. 166 Старожилы на форуме ещё остаются - можешь спрашивать у них и софт, и какие-либо примеры.

Спасибо за довольно оперативный ответ.

Посмотрел ERA+. Действительно много контента, прям кайф. И три новых города, но нет Фабрики из HotA 1.7.0 (уже вроде 1.7.1 вышла) вместе с новыми биомами. Один биом я так понимаю сделали альпийским для Сопряжения/Колонии. Второй взят из Героев 2, и сделан для фабрики.

Значит для Complete делать мод нецелесообразно. А как насчёт WOG? Я вот всё утро искал, и всё же нашёл старенький компакт диск с ранней версией WOG за 2003 год. Никаких вылетов на Win 7 нет. Никаких WOG-настроек тоже нет. Есть просто стандартные для WOG существа и анимация деревьев. Есть в lod-е текстовые файлы ZEOBJTS.txt и т.д. Стоит ли проделать тоже самое, что я делал для SoD только на этой версии? Или будет тот же эффект?

Если на WOG это нереально тоже, тогда возвращаясь к ERA+, с чего начать, чтобы взять основу героев, и добавлять контент поэтапно самому, и чтобы он таки работал? Кстати при открытии вкладки «города», в редакторе карт, происходит вылет. Подозреваю что дело в Причале, который он заменяет картинкой Случайного Города. Я пока ещё ничего не менял. У меня версия ERA 2 PLUS v3.9.1.

Я просто хочу сделать как бы почти классику, но балансно и «лорно» её дополнять новым контентом. Чтобы всё тематическое. Тем более я и сам могу создавать картинки, а не только использовать чужие. Опять же для себя чисто.

P.S. Вообще касательно деревьев/гор/объектов — это как раз очень важный атрибут для игры, особенно для интересных приключенческих карт. Чем больше разнообразного контента (но всё же тематического и вписывающегося визуально) — тем богаче можно развить карту. Я, когда был маленький, я строил карты повторяя прочитанные книги в жанре фэнтэзи) Такие себе приключения делал. Было это очень-очень давно. Потому не стоит так прямо думать, что никому это не нужно. Именно это и побудило желание сделать что-то своё.

UPD. Разобрался. Скачал версию Clear — и стал навешивать обновленные моды в том порядке, в котором хочу. Чтоб баланс был какой-то в нововведениях. Действительно очень удобно. Теперь понять бы как самому делать моды для ERA)
(This post was last modified: 26.06.2024 07:16 by Solstheim.)
26.06.2024 04:56
Find all posts by this user Quote this message in a reply
major Offline

Posts: 146
Post: #1994

Подскажите, как на с++ определить место клика в экране обмена героев (аналог ЕРМ CM:I)? И может как-то можно наиболее просто узнать левого и правого героев?
14.07.2024 11:22
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16645
Post: #1995

major, смотри в исходниках вога, в каких местах стоят перехватчики.

_B1.cpp, поиск по MouseClick. В перехватчиках видно, куда вог сохраняет ссылку на структуру события мыши.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
14.07.2024 18:40
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group