Current time: 24.07.2024, 11:43 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
ERA II
» WoG Era 2: Русская и Английская версии
Author Message
feanor Offline

Posts: 624
Post: #136

Quote:P.S. Кстати, портировал плагин Семёна в MSVC 2008. Но пока ещё практически не тестил.
Когда начнешь свои плагины писать? (:
17.07.2011 18:39
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #137

Quote:Когда начнешь свои плагины писать? (:
Я есё не умею свои.
17.07.2011 18:44
Find all posts by this user Quote this message in a reply
Kocmodecaht Offline

Posts: 18
Post: #138

бЕРСЕРКЕр

когда выйдет герои 3.59 и когда выйдет эра 1.9 мне главное они нужны когда они выйдут?132
(This post was last modified: 18.07.2011 10:57 by Kocmodecaht.)
18.07.2011 10:55
Find all posts by this user Quote this message in a reply
FallenAngel Offline

Posts: 838
Post: #139

Gigi В полку прибыло.
18.07.2011 11:29
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #140

Надо пускать в эту тему по пропускам)
18.07.2011 11:57
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16553
Post: #141

Kocmodecaht, одному Богу известно...


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

Posts: 218
Post: #142

Berserker,
Quote:...Думаю над форматом руководства ...
*pdf и *chm рулят и педалят. Ab
Первый формат сложнее для реализации но многое можно реализовать. Второй, проще и нагляднее, но не все можно сделать (ограничения компиляции).

Лучше всего *chm использовать, имхо.
И как писал уже ранее, могу помочь с версткой руководства в любом из этих форматов. 118
18.07.2011 14:37
Visit this user's website Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 624
Post: #143

/me недоумевает - зачем Коцмодецахту эра 1.9?

Quote: Буду искать добровольца для перевода на английский.
На НС спроси.
Quote:Ну и для ЕРМ модуль ля работы с памятью.
Аналоги memcpy/malloc/mfree?
Чувствую, документации будет мнооого..
18.07.2011 14:41
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16553
Post: #144

Quote:*pdf и *chm рулят и педалят.
Так что лучше наверное html, а с педалями он превратится в chm )

Quote:Аналоги memcpy/malloc/mfree?
В ЕРМ больше всего достаёт привязанность к индексам и невозможность выделять временные массивы чисел и строк, в том числе и для работы с функциями/апи.


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

Posts: 16553
Post: #145

Устанавливаю флаг ВОГа на этапе запуска игры, чтобы поддерживались ЕРМ команды из плагинов. Событие клавиатуры уже работает для плагинов в любых меню, а для ЕРМ только в игровых.


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

Posts: 1468
Post: #146

hippocamus Wrote:Это ведь выльется в несовместимость твоего мода с большинством остальных.
Да какая совместимость? Кодовая? Не было её и не будет никогда. Если два мода настолько глубоки по вносимым изменениям в геймплей, что могут по моральному праву называться модами – они уже несовместимы. Никто не соединит ХотУ и ВОГ 3.59, Феникс с Реквизитом, TPM с WT, MoP c ЧУ… А если совместит – выйдет нестабильная и дисбалансная безвкусица. Я уже не говорю о том, что даже моды, делающиеся под ВОГ, сами с ним частично несовместимы, а часть опций ВОГа несовместима с другими.
Файлово-папочная совместимость? О ней заботятся чуть больше – она хоть достижима. Её-то я и соблюдаю.
Всё, что делают люди, всегда определяется их характером, а характеры у всех разные. Жёсткие диски теперь вмещают терабайты. Так что будем, как и прежде, устанавливать всё в отдельные папки, запускать разные экзешники и играть то в одно, то в другое, нервно кусая пальцы в детском капризе желания собрать все яйца в одну корзину.
Berserker Wrote:1) Если у тебя есть лучший вариант, напиши, я исправлю.
Дело не в лучшести. Регенерацию я превращал в таблицу, а во втором случае просто сдвигал код.
Berserker Wrote:3) Нужен этот свой триггер.
У меня настолько всё индивидуально, что лучше в общих чертах.
4A2470 – тру-функция встречи героев. Параметры её вызова я описывал в Инженерном Анализе. Зная параметры, можно достать в ней номера героев.
Функция ветвится на несколько хвостов. Чтобы сделать универсальный пост-триггер, я закрутил все хвосты в один и поставил триггер на этот хвост. А как ты собираешься – твоё дело.
Berserker Wrote:4) Тут папка старая, ибо совместимость, а Angel.dll и Era.dll должны находиться в корне.
Вот я и изменил
Berserker Wrote:1 жёстко прошитый патч
Вместо корневого каталога – Data\MoP\LIB.
Berserker Wrote:не хотелось бы видеть МОР в будущем на старой версии
Скорее всего, так и будет. Ведь какая разница, сколько изменений будет вносить ERA в экзешник? Хуки ведь всё равно будет ставить. А у меня в том месте может быть даже не изменённый код, а вообще левая наработка или отсутствие кода.
По крайней мере, программка для бин-файлов подойдёт.
Berserker Wrote:Проще было раньше согласовать.
Как и с кем можно согласовать десятки тысяч изменений в экзешнике? Можешь заценить - http://zalil.ru/31436918 Видите, я даже не боюсь утечек – ведь там никто, кроме меня, не разберётся. Естественная защита exe в виде невообразимой запутанности кода. Sm
Я наплевал на совместимость, как на призрачное суеверие, коим она для меня до сих пор является. И это сразу развязало руки. Пожалел ли я об этом хоть раз? Нет, ибо не родилось пока чего-то такого очень мне нужного, но несовместимого с модом, а для многих вещей у меня альтернативная реализация. Есть разве что предчувствие недовольства людей, уже привыкших к HD-моду.


Просто идея
Единожды в моде я применил такое:
1. Накодил в Олли функцию. При этом все вызовы функций экзешника в ней написал относительно, как в длл (не call функция, а mov eax, адрес функции; call eax). Прыжки – если касаются этой же функции, то прямые, если в экзешник – тоже относительные. В общем, всё ясно.
2. Потом скопировал машинный код этой функции в файл и сохранил.
3. Загрузил файл в игре, получил адрес буфера, выполнил функцию по этому адресу, освободил буфер с файлом.

В чём смысл и польза? Даже длл, которая занимается всего лишь тем, что экспортирует одну маленькую процедуру, обычно весит несколько килобайт, ибо несёт в себе много системного барахла. Чтобы выполнить из неё процедуру, нужно узнать ID библиотеки, потом ID процедуры. А в таком вот файле – ни единого ненужного байта, это чисто файл-функция, и его ID – это и есть адрес процедуры.
Вот если бы такие файлы можно было создавать легко, без Олли, и так же легко править их исходники…


Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
(This post was last modified: 18.07.2011 19:47 by MOP.)
18.07.2011 18:19
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #147

Quote:Как и с кем можно согласовать десятки тысяч изменений в экзешнике? Можешь заценить - http://zalil.ru/31436918 Видите, я даже не боюсь утечек – ведь там никто, кроме меня, не разберётся.
)) какая же это утечка, что мы с этим ехе будем делать?) что с ним вообще можно сделать?)
Quote:Естественная защита exe в виде невообразимой запутанности кода.
на самом деле в этом нет ничего хорошего. Ты конечно монстровый реверсер и ассемблерщик, но ведь такой код очень сложно отлаживать и менять в будущем.

В своей платформе ХД 3 я готовлю практически полное отсутствие асма в коде непосредственных изменений и дополнений игры (хочу реализовать дизасм, чтобы не париться о затираемом хуками коде, и хукать только вызовы функций, используя только передаваемые им параметры - при этом мы получим самую лучшую кодовую совместимость).
Но даже сейчас последний код в хд выглядит очень неплохо. Вот кусок нововведеиня: "пригласить героя в таверне":

Code:
_Dlg_* THISHOOK hook_TavernDlgCreate(_int32_ x, _int32_ y)
{
    _Dlg_* this_; SET_THIS(this_);
    _ptr_ DlgStaticText_Create = 0x5BC6A0;

    THISCALL_3(TavernDlgCreate_default, this_, x, y);


    if ((!o_NetworkGame) && o_GameType != GAMETYPE_HOTSEAT)
    {

        UpdateHeroesAvailabilityList(0);

        //////if (invited_hero_index == -1)
            this_->AddInitItem(b_DlgStaticPcx8_Create(214, 427, 48, 32, 400, "HPSRAND4.PCX", 2048));
        //////else
        //////    this_->AddInitItem(b_DlgStaticPcx8_Create(214, 427, 48, 32, 400, o_HeroInfo[inviteable_heroes[invited_hero_index]].hps_name, 2048));

        this_->AddInitItem(b_DlgButton_Create(201, 431, 11, 24, 401, "ADOPLFA.DEF", 0, 1, 0, 0, 2));
        this_->AddInitItem(b_DlgButton_Create(264, 431, 11, 24, 402, "ADOPRTA.DEF", 0, 1, 0, 0, 2));
        this_->AddInitItem((_DlgItem_*)THISCALL_12(DlgStaticText_Create, o_New(0x50), 121, 427, 74, 32, HD::txt_ini->GetTxtValue(4), "smalfont.fnt", 1, 0, 5, 0, 8));
    }

    return this_;
}

Code:
_int32_ THISHOOK hook_TavernProc(_EventMsg_* msg)
{
    _Dlg_* this_; SET_THIS(this_);
    _int32_ r;


    if (msg->type == HM_MOUSEOVER)
    {
        r = (_int32_)THISCALL_2(TavernProc_default, this_, msg);
        
        if ((!o_NetworkGame) && o_GameType != GAMETYPE_HOTSEAT)
        {
            switch (msg->item_id)
            {
            case 400:
            case 401:
            case 402:
                if (invited_hero_index != -1)
                {
                    sprintf(o_TextBuffer, o_GENRLTXT_TXT->GetString(16),
                        (char*)o_Game->GetHero(inviteable_heroes[invited_hero_index])->name,
                        (char*)o_Game->GetHero(inviteable_heroes[invited_hero_index])->Get_className());
                    r = n_DrawToTavernStatusBar(this_, o_TextBuffer);
                }
            }
        }

        // fix tavern statusbar
        o_WndMan->DrawRect(this_->x, this_->y, this_->x + this_->width, this_->y + this_->height);
        return r;
    }


    if ((!o_NetworkGame) && o_GameType != GAMETYPE_HOTSEAT)
    {
        if (msg->type == HDM_MOUSEWHEEL)
        {
            if (msg->subtype < 0)
                msg->item_id = 401;
            else
                msg->item_id = 402;
            msg->type = HM_MOUSEBUTTON;
            msg->subtype = MB_LBUTTONCLICK;
        }


        if (msg->type == HM_MOUSEBUTTON)
        {
            _DlgStaticPcx8_* hero_hps = (_DlgStaticPcx8_*)this_->GetItem(400);

            if ((msg->subtype == MB_LBUTTONDOWN) ||
                (msg->subtype == MB_RBUTTONDOWN) ||
                (msg->subtype == MB_LBUTTONCLICK))
            {
                switch (msg->item_id)
                {
                case 5:
                case 6:
                    UpdateHeroesAvailabilityList(msg->item_id - 5);
                    hero_hps->pcx8->DerefOrDelete();
                    hero_hps->pcx8 = o_LoadPcx8("HPSRAND4.PCX");
                    n_DrawToTavernStatusBar(this_, " ");
                    break;
                }
            }
                
            if (msg->subtype == MB_LBUTTONCLICK)
            {
                switch (msg->item_id)
                {
                case 401:
                    invited_hero_index--;
                    if (invited_hero_index < -1)
                        invited_hero_index = inviteable_heroes_count-1;
                    break;

                case 402:
                    invited_hero_index++;
                    if (invited_hero_index >= inviteable_heroes_count)
                        invited_hero_index = -1;
                    break;
                }

                switch (msg->item_id)
                {
                case 401:
                case 402:

                    hero_hps->pcx8->DerefOrDelete();
                    if (invited_hero_index == -1)
                    {
                        hero_hps->pcx8 = o_LoadPcx8("HPSRAND4.PCX");
                        n_DrawToTavernStatusBar(this_, " ");
                    }
                    else
                    {
                        ////invited_hero_id = inviteable_heroes[invited_hero_index];
                        hero_hps->pcx8 = o_LoadPcx8(o_HeroInfo[inviteable_heroes[invited_hero_index]].hps_name);
                        sprintf(o_TextBuffer, o_GENRLTXT_TXT->GetString(16),
                            (char*)o_Game->GetHero(inviteable_heroes[invited_hero_index])->name,
                            (char*)o_Game->GetHero(inviteable_heroes[invited_hero_index])->Get_className());
                        n_DrawToTavernStatusBar(this_, o_TextBuffer);
                    }
                    hero_hps->Draw();
                    o_WndMan->DrawRect(this_->x, this_->y, this_->x + this_->width, this_->y + this_->height);
                    return 1;
                }

            }
        }
    }
    return (_int32_)THISCALL_2(TavernProc_default, this_, msg);
}
Даже некомментированный код выглядит вполне читаемым.

Вот мне например понадобилось для окна гильдии магов сдвинуть все элементы вниз на 22 пикс кроме статусбара, добавить панель-заголовок и скорректировать неправильное в оригинале положение кнопки Ок на 1 пикс.
Code:
_Dlg_* THISHOOK hook_MagicGuildDlgCreate()
{
    _Dlg_* this_; SET_THIS(this_);
    _ptr_ ColorizePalette16 = 0x6003E0;

    THISCALL_1(MagicGuildDlgCreate_default, this_);
    _DlgItem_* item;
    this_->GetItem(1)->y += 22;
    for (int id = 4; id <= 65; id++)
    {
        item = this_->GetItem(id);
        if (item != NULL)
            item->y += 22;
    }
    this_->GetItem(30720)->x += 1;
    _DlgStaticPcx8_* title;
    this_->AddInitItem(title = b_DlgStaticPcx8_Create(0, 0, 800, 23, 400, "HD_THBCS.PCX", 2048));
    FASTCALL_2(ColorizePalette16, title->pcx8->palette16.colors, o_Game->GetMeID());
    this_->AddInitItem((_DlgItem_*)THISCALL_12(0x5BC6A0, o_New(0x50), 0, 0, 800, 23, o_TCOMMAND_TXT->GetString(14) , "bigfont.fnt", 1, 0, 5, 0, 8));

    return this_;
}
даже не представляю во сколько раз по трудовремязатратам превзошла бы это
реализация на асме, размещая код внутри экзешника


Quote:В чём смысл и польза? Даже длл, которая занимается всего лишь тем, что экспортирует одну маленькую процедуру, обычно весит несколько килобайт, ибо несёт в себе много системного барахла. Чтобы выполнить из неё процедуру, нужно узнать ID библиотеки, потом ID процедуры. А в таком вот файле – ни единого ненужного байта, это чисто файл-функция, и его ID – это и есть адрес процедуры.
   Вот если бы такие файлы можно было создавать легко, без Олли, и так же легко править их исходники…
зачем, если
Quote:Жёсткие диски теперь вмещают терабайты.
(This post was last modified: 18.07.2011 21:49 by baratorch.)
18.07.2011 21:45
Find all posts by this user Quote this message in a reply
hippocamus Offline

Posts: 517
Post: #148

Quote:Жёсткие диски теперь вмещают терабайты.
Супер! Сделал его! Gigi:D128
Если честно, Моп, нужно смотреть на будущее.
Ну вот выйдет ХотА. Которая пока представляет из себя только 10-й город. Если у тебя ест ьсовместимость - играем в Моп с 10 городами, иначе - с 9-ю.
Добавим 11-й, 12-й города - ты будешь сидеть с 9-ю, но гордый.
Мы тебе несомненно разрешим добавить эти города в мод - но тебе придётся изобретать велосипед. Вместо того, чтобы воспользоваться совместимостью с де-факто стандартом Эрой, ты будешь утверждать, что совместимость тебе не нужна. И окажется, что твой мод в стороне... Wog3.59 будет совместим с Эрой, хотя бы потому, что Эра подстроится под него, сохранив старые совместимости, или незначительно их модифицировав.
Не говорю ничего насчёт ТПМ, потому что не знаю их политики.


-= подпись Гиппокамуса =-
18.07.2011 22:52
Visit this user's website Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 624
Post: #149

Quote:Ну вот выйдет ХотА.
Ну вот это, издеваться не надо.

Quote:Вместо того, чтобы воспользоваться совместимостью с де-факто стандартом Эрой, ты будешь утверждать, что совместимость тебе не нужна.
А причем тут совместимость с хотой?

Quote:Wog3.59 будет совместим с Эрой
правда?
18.07.2011 23:17
Find all posts by this user Quote this message in a reply
hippocamus Offline

Posts: 517
Post: #150

1. Ну, я же в вас верю! Sm
2. У Хоты будет 100% совместимость с Эрой - править экзешник мы не будем. Уж если что - попросим поправить Эру Sm
3. Что такое Эра? Хуки на экзешник, позволяющие расширять его функции. Сомневаешься, что под 3.59 будет приспособлена новая версия Эры?


-= подпись Гиппокамуса =-
18.07.2011 23:42
Visit this user's website 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