Current time: 25.11.2024, 03:55 Hello There, Guest! (LoginRegister)
Language: english | russian  

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

Posts: 16657
Post: #2641

Заодно протестирую определение косвенных вызовов, отлично. Актуальные ссылки в подписи?


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

Posts: 3881
Post: #2642

Последняя августовская версия ERA Scripts Rus. Она хоть и "альфа", но, по факту, просто была не опубликована.
Актуальные ссылки на остальное - в подписи.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
29.11.2017 10:18
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #2643

(28.11.2017 08:55)MOP Wrote:  Потому что ты переусложнил задачу.
Я оттягивал переделку диалогов под DL именно потому, что думал, что мне потребуется знание структур. Исходники WoG не были тогда выложены. Но, собравшись с духом и приступив к делу, я понял, что структуры вообще не нужны! Практически все данные перед показом кладутся в легко находимые переменные:
Всё, что остаётся - перевести их в текст и показать в нужном месте диалога.
У меня ушло 2-3 дня на каждый диалог, и больше я к ним не возвращался, чтобы что-то поправить. И новые строки в znpc00.txt не понадобились. Кстати, а зачем они тебе?
Реализация диалогов игровыми средствами не нравится мне тем, что не поддаётся изменению со стороны пользователя - код забит внутрь библиотеки, никакой тебе текстовой таблицы. Я только один такой диалог целиком написал - показ характеристик стартового героя, чем, думаю, доставил проблем ХЕРОМАНТу.
Я согласен. По диалогу экспы монстров я пошел этим же путем.
А вот с диалогом командира - задача стояла другая: научиться писать сложные диалоги с нуля. Потом процесс разросся и я продолжил, что в конечном итоге и вылилось в переусложненную задачу.


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

Posts: 16657
Post: #2644

Algor, скачал, спасибо.


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

Posts: 5422
Post: #2645

Image: VVXgkkzVpaQ.jpg

в топку рамку?
(This post was last modified: 30.11.2017 03:49 by Bes.)
30.11.2017 03:38
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2646

Неа, рамка хороша ) А текст какой-то зелёно-блеклый стал.


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

Posts: 5422
Post: #2647

да?
ну, ты наверное забыл, я ж дальтоник, мог легко упустить желтый и взять с зеленцой... хотя жена сказала тут жёлтый )
короче, хрен знает, что делать то?

посмотри исходники, что в ЛС, возможно это вк-сжатие дало искажение цвета
(This post was last modified: 30.11.2017 15:58 by Bes.)
30.11.2017 15:56
Visit this user's website Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3881
Post: #2648

(30.11.2017 15:56)Bes Wrote:  ну, ты наверное забыл, я ж дальтоник...
Вона как.... Bes, у тя на аве кони - розовые. Может конечно так и задумывалось, но я предупредил, если что.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
30.11.2017 20:38
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #2649

Вот такой диалог экспы монстра вышел
(скрины) (Click to View)
Code:
#include "stdafx.h"
#include "..\..\include\homm3.h"
#include "..\..\include\HoMM3_Dlg.cpp"

Patcher* _P;
PatcherInstance* _PI;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////// константы диалога экспы монстров /////// /////////////////////////////////////////

#define o_Dlg_ExpaMon 0x845880

#define o_DlgLoop (*(_int_*)0x847F00)
#define o_DlgUpgr (*(_int_*)0x840E18)
#define o_DlgTrig (*(_int_*)0x845AE8)

#define o_Mon     (*(_int_*)0x84730C)
#define o_Num     (*(_int_*)0x847D84)
#define o_Expo     (*(_int_*)0x85EB48)
#define o_CrExpo (*(_int_*)0x840F88)
#define o_MayChooseArtOpt (*(_int_*)0x841940)

#define o_Dlg_Case8 (*(_int_*)0x846B00)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////// дополнительный диалог с флагом опыта /// /////////////////////////////////////////

int New_Dlg_ExpaMon_Case8(int style)
{
    int x = 512;
    int y = 400;
    if (style == 1)
        y += 40;

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, x, y, DF_SCREENSHOT | DF_SHADOW, NULL);
    Set_DlgBackground_RK(dlg, 0);

    dlg->AddItem(_DlgStaticDef_::Create(dlg->width/2 -41, 26, 2, "PSKILL.def", 4, 0, 0x12));

    dlg->AddItem(_DlgStaticText_::Create(20, 126, dlg->width -40, 20, Get_ITxtExp(460), "bigfont.fnt", 10, 5, ALIGN_H_CENTER | ALIGN_V_TOP, 0));

    for (int i = 0; i < 11; i++){
        dlg->AddItem(_DlgStaticText_::Create(24, 150 +i*20, dlg->width -48, 20, Get_ITxtExp(461 +i), "bigfont.fnt", 7, 10+i, ALIGN_H_LEFT | ALIGN_V_CENTER, 0));    
    }

    dlg->AddItem(_DlgStaticText_::Create(24, 150, dlg->width -48, 20, o_pCreatureInfo[o_Mon].name_single, "bigfont.fnt", 1, 22, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));
    

    int runk = CALL_2(_int_, __cdecl, 0x727F20, 1000, o_Expo);
    sprintf(o_TextBuffer, "%s (%d)", Get_ITxtExp(2+runk), runk);
    dlg->AddItem(_DlgStaticText_::Create(24, 170, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 23, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));


    sprintf(o_TextBuffer, "%d", o_Expo);
    dlg->AddItem(_DlgStaticText_::Create(24, 190, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 24, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));


    sprintf(o_TextBuffer, "%d", CALL_3(_int_, __cdecl, 0x727FB0, 1000, runk +1, 0) - o_Expo);
    dlg->AddItem(_DlgStaticText_::Create(24, 210, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 25, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));


    int t1 = CALL_1(_int_, __cdecl, 0x7283D0, 1000);
    int t2 = CALL_1(_int_, __cdecl, 0x727E20, 1000) * t1 / 100;
    sprintf(o_TextBuffer, "%d%% (%d)", t1, t2);
    dlg->AddItem(_DlgStaticText_::Create(24, 230, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 26, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));


    sprintf(o_TextBuffer, "%d", o_Num);
    dlg->AddItem(_DlgStaticText_::Create(24, 250, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 27, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));


    t1 = CALL_3(_int_, __cdecl, 0x727FB0, 1000, runk, 0);
    t2 = 999999;
    if( t1 ){ t2 = o_Num * o_Expo / t1 - o_Num; }    
    sprintf(o_TextBuffer, "%d", t2);
    dlg->AddItem(_DlgStaticText_::Create(24, 270, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 28, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));

    sprintf(o_TextBuffer, "%hf", CALL_1(double, __cdecl, 0x727C00, 1000));
    dlg->AddItem(_DlgStaticText_::Create(24, 290, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 29, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));

    sprintf(o_TextBuffer, "%hf", CALL_1(double, __cdecl, 0x727E00, 1000));
    dlg->AddItem(_DlgStaticText_::Create(24, 310, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 30, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));

    t1 = CALL_1(_int_, __cdecl, 0x7283B0, 1000);
    sprintf(o_TextBuffer, "%d", t1);
    dlg->AddItem(_DlgStaticText_::Create(24, 330, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 31, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));

    t2 = CALL_3(_int_, __cdecl, 0x727FB0, 1000, 10, 0);
    int t3 = 999999;
    if ( t2 ){
        int t4 = o_Num * (t2 + t1);
        t3 = t4 / t2 - o_Num;
    }
    sprintf(o_TextBuffer, "%d", t3);
    dlg->AddItem(_DlgStaticText_::Create(24, 350, dlg->width -48, 20, o_TextBuffer, "bigfont.fnt", 1, 32, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));


    if (style == 1){
        dlg->AddItem(_DlgStaticPcx8_::Create(dlg->width/2 -33, dlg->height -26 -31, 0, "Box64x30.pcx"));
        dlg->AddItem(_DlgButton_::Create(dlg->width/2 -32, dlg->height -26 -30, 64, 30, 1, "iOkay.def", 0, 1, 1, 28, 2));
        dlg->Run();
    }
    if (style == 4)
        dlg->RMC_Show();
        
    dlg->Destroy(TRUE);
    return 1;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////// диалог по выбору типа действия артефакта /////////////////////////////////////////

int __stdcall New_Dlg_ExpaMon_BannerDlg_Proc(_Dlg_* dlg, _EventMsg_* msg)
{
    int r = dlg->DefProc(msg);
        if (msg->subtype == MST_LBUTTONCLICK){
            if (msg->item_id >= 30 && msg->item_id <40){
                for (int i = 0; i < 9; i++){
                    ((_DlgStaticDef_*)dlg->GetItem(30+i))->def_frame_index = 0;                
                }
                ((_DlgStaticDef_*)dlg->GetItem(msg->item_id))->def_frame_index = 1;
                CALL_2(_int_, __thiscall, 0x728380, o_CrExpo, msg->item_id -30);
                dlg->Redraw(TRUE);
            }
        }
    return r;
}

int New_Dlg_ExpaMon_BannerDlg()
{
    if (!o_MayChooseArtOpt || !o_CrExpo){
        b_MsgBox(Get_ITxtExp(455), 4);    
        return 0;
    }

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 460, 420, DF_SCREENSHOT | DF_SHADOW, New_Dlg_ExpaMon_BannerDlg_Proc);
    Set_DlgBackground_RK(dlg, 0);

    sprintf(o_TextBuffer, "%s", Get_ITxtExp(340));
    dlg->AddItem(_DlgStaticText_::Create(18, 30, 424, 30, o_TextBuffer, "bigfont.fnt", 7, 3, ALIGN_H_CENTER | ALIGN_V_TOP, 0));
    
    int dy = 34;

    for (int i = 0; i < 9; i++){
        dlg->AddItem(CALL_8 (_DlgItem_*, __thiscall, 0x44FE00, o_New(56), 18, 62+i*dy, 424, 30, 10+i, *(int*)(*(int*)0x6AAD18 + 118), 1024));
        dlg->GetItem(10+i)->SendCommand(5, 4);
        
        sprintf(o_TextBuffer, "%s", Get_ITxtExp(341 +i));
        dlg->AddItem(_DlgStaticText_::Create(56, 69+i*dy, 372, 16, o_TextBuffer, "smalfont.fnt", 1, 20+i, ALIGN_H_LEFT | ALIGN_V_CENTER, 0));

        dlg->AddItem(_DlgButton_::Create(20, 65+i*dy, 30+i, "SYSOPCHK.DEF", 0, 0, 0, 0));
    }

    int s = CALL_1(_int_, __thiscall, 0x727BE0, o_CrExpo);
    ((_DlgStaticDef_*)dlg->GetItem(30+s))->def_frame_index = 1;

    dlg->AddItem(_DlgStaticPcx8_::Create(dlg->width/2 -33, dlg->height -20 -31, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(dlg->width/2 -32, dlg->height -20 -30, 64, 30, 95, "iOkay.def", 0, 1, 1, 28, 2));

    dlg->Run();
    int t = CALL_1(_int_, __thiscall, 0x727BE0, o_CrExpo);
    dlg->Destroy(TRUE);
    if ( s == t)
         return 0;
    else return 1;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// основной диалог ////////////////////////////////////////////////////////////////////

int __stdcall New_Dlg_ExpaMon_Proc(_Dlg_* dlg, _EventMsg_* msg)
{
    int r = dlg->DefProc(msg);

    if (msg->type == MT_MOUSEOVER)
        {
            _DlgItem_* it = dlg->FindItem(msg->x_abs, msg->y_abs);
            char* text_bar = "";
            if (it)    
            {
                switch (it->id)
                {
                    case 1: text_bar = Get_ITxtExp(107); break;
                    
                    case 6: text_bar = Get_ITxtExp(456); break;
                    case 8: case 9: sprintf(o_TextBuffer, "%s", *(int*)(o_Dlg_ExpaMon +76)); text_bar = o_TextBuffer; break;                
                    case 10: text_bar = Get_ITxtExp(123); break;

                    case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18:
                    case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26:
                        sprintf(o_TextBuffer, "%s", *(int*)(*(int*)(o_Dlg_ExpaMon +40)+4*(it->id-11))); text_bar = o_TextBuffer; break;

                    case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37:
                    case 38: case 39: case 40: case 41: case 42: case 43: case 44: case 45:
                        sprintf(o_TextBuffer, "%s", *(int*)(*(int*)(o_Dlg_ExpaMon +48)+4*(it->id-30))); text_bar = o_TextBuffer; break;
                    
                    case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57:
                    case 58: case 59: case 60: case 61: case 62: case 63: case 64: case 65:
                        sprintf(o_TextBuffer, "%s", *(int*)(*(int*)(o_Dlg_ExpaMon +24)+4*((it->id-50)/2))); text_bar = o_TextBuffer; break;                    

                    case 95: text_bar = "Ok"; break;                     
                    default: text_bar = "";    break;
                }
                ((_DlgTextEdit_*)dlg->GetItem(2))->SetText(text_bar);
                ((_DlgTextEdit_*)dlg->GetItem(2))->RedrawScreen();
                dlg->Redraw();
            }  
    }

    if (msg->type == MT_MOUSEBUTTON)
    {
        if (msg->subtype == MST_RBUTTONDOWN)
        {
            int frame = 0;
            switch (msg->item_id)
            {
                case 3: dlg->Redraw(); break;

                case 5: case 6:
                case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17:
                case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25:
                case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37:
                case 38: case 39: case 40: case 41: case 42: case 43: case 44: case 45:
                        New_Dlg_ExpaMon_Case8(4); break;                          

                case 9: if (New_Dlg_ExpaMon_BannerDlg() == 1){
                            o_DlgLoop = 1;
                            return dlg->Close(msg);    
                        }    break;

                case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57:
                case 58: case 59: case 60: case 61: case 62: case 63: case 64: case 65:
                    frame = *(int*)(*(int*)(o_Dlg_ExpaMon +20)+4*((msg->item_id-50)/2));
                    if (frame == 0){
                        sprintf(o_TextBuffer, "%s\n", *(int*)(*(int*)(o_Dlg_ExpaMon +16)+4*((msg->item_id-50)/2)));
                    }
                    else {
                        sprintf(o_TextBuffer, "%s\n\n %s\n", *(int*)(*(int*)(o_Dlg_ExpaMon +16)+4*((msg->item_id-50)/2)),
                                                            Get_ITxtExp(*(int*)(0x840E1C +4*((msg->item_id-50)/2))+1));
                    }    
                    b_MsgBoxAndDef("Expa_Mon.def", frame, o_TextBuffer);    break;
                    
                default: break;
            }
        }

        if (msg->subtype == MST_LBUTTONCLICK){
            if (msg->item_id == 1)    {
                o_DlgUpgr = 1;
                return dlg->Close(msg);
            }
        }
        if (msg->subtype == MST_LBUTTONDOWN){
            if (msg->item_id == 5 || msg->item_id == 6 || (msg->item_id >= 10 && msg->item_id <= 45)){
                New_Dlg_ExpaMon_Case8(1);
            }

            if (msg->item_id == 9){
                int hero_id = *(short*)(o_CrExpo +12);
                if (hero_id < 0 || hero_id >=156 )
                    hero_id = -1;

                if (hero_id == -1 || !o_MayChooseArtOpt || !o_CrExpo){
                    b_MsgBox(Get_ITxtExp(455), 1);
                }
                else {
                    b_MsgBoxD(Get_ITxtExp(459), MBX_OKCANCEL, 8, 156);
                    if (o_WndMgr->result_dlg_item_id == DIID_OK) {
                        o_DlgLoop = CALL_1(_int_, __thiscall, 0x728280, o_CrExpo);

                        _Hero_* hero = o_GameMgr->GetHero(hero_id);

                        int Art[] = {156, -1};
                        CALL_3(char, __thiscall, 0x4E3200, hero, &Art, -1);

                        return dlg->Close(msg);    
                    }
                }
            }
        }
    }

    return r;
}

int New_Dlg_ExpaMon(signed int Mon, signed int  Num, int Expo, _ptr_ CRExpo)
{
    int dop_str = *(int*)(o_Dlg_ExpaMon +52);
    int dop_str_txt = dop_str;
    int art_num = *(int*)(o_Dlg_ExpaMon +88);
    int Changin = *(int*)(o_Dlg_ExpaMon +84);

    
    int is_art = 0;
    if (CRExpo){
        if (CALL_1(_int_, __thiscall, 0x7279C0, CRExpo)){
            is_art = 1;
            dop_str_txt -= 1;
            if (art_num < 1)
            art_num = 1;
        }
    }

    int x = 800;
    int y = 252 +8 +16*(dop_str_txt) +52*Round((float)dop_str/2);

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, x, y, DF_SCREENSHOT | DF_SHADOW, New_Dlg_ExpaMon_Proc);

    Set_DlgBackground_RK(dlg, 1);
    b_MouseMan_SetCursor(0,0);

    // Добавляем кнопку OK (id = 30722)
    dlg->AddItem(_DlgStaticPcx8_::Create(dlg->width -31 -52, dlg->height - 31 -40, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(dlg->width -30 -52, dlg->height -30 -40, 64, 30, 95, "iOkay.def", 0, 1, 1, 28, 2));

    // Добавляем кнопку просмотра улучшенного (id = 1)
    int is_grade_bttn_on = *(int*)(o_Dlg_ExpaMon +56);
    if (is_grade_bttn_on){
        dlg->AddItem(_DlgStaticPcx8_::Create(dlg->width -31 -122, dlg->height - 31 -40, 0, "Box64x30.pcx"));
        dlg->AddItem(_DlgButton_::Create(dlg->width -30 -122, dlg->height -30 -40, 64, 30, 1, "DlgUpExp.def", 0, 1, 0, 88, 0));
    }

    // Подсказка (id = 2)
    dlg->AddItem(_DlgStaticText_::Create(8, dlg->height -26, dlg->width -34, 18, "", "smalfont.fnt", 1, 2, ALIGN_H_CENTER | ALIGN_V_CENTER, 0));

    // заголовок диалога (id = 3)
    sprintf(o_TextBuffer, "%s", *(int*)o_Dlg_ExpaMon);
    dlg->AddItem(_DlgStaticText_::Create(340, 14, 120, 30, o_TextBuffer, "bigfont.fnt", 7, 3, ALIGN_H_CENTER | ALIGN_V_TOP, 0));

    // нижнее описание монстра красным (id = 4)
    sprintf(o_TextBuffer, "%s", *(int*)(o_Dlg_ExpaMon +4));
    dlg->AddItem(_DlgStaticText_::Create(18, dlg->height - 70, dlg->width -200, 30, o_TextBuffer, "bigfont.fnt", 27, 4, ALIGN_H_LEFT | ALIGN_V_CENTER, 0));

    // картинка и рамка монстра (id = 5, 6)
    dlg->AddItem(_DlgStaticDef_::Create(18, 35, 5, "twcrport.def", Mon +2, 0, 0x12));
    dlg->AddItem(_DlgStaticDef_::Create(18, 35, 6, "twcrport.def", 1, 0, 0x12));  

    // название артефакта и рамка для него (id = 7,8)
    dlg->AddItem(_DlgStaticText_::Create(18, 100, 60, 15, o_GENRLTXT_TXT->GetString(615), "medfont.fnt", 1, 7, ALIGN_H_CENTER | ALIGN_V_TOP, 0));
    dlg->AddItem(_DlgStaticPcx8_::Create(23, 117, 8, "artbckg.pcx"));    
    
    // артефакт и цифры его кол-ва (id = 9)
    if (art_num > 0){
        dlg->AddItem(_DlgStaticDef_::Create(25, 119, 9, "Artifact.def", 156, 0, 0x12));    // рамка монстра (id = 9)
        sprintf(o_TextBuffer, "%d", art_num);
        dlg->AddItem(_DlgStaticText_::Create(47, 142, 20, 20, o_TextBuffer, "tiny.fnt", 1, 9, ALIGN_H_RIGHT | ALIGN_V_BOTTOM, 0));
    }
    
    // желтая рамка обрамления ранга
    int rank_mon = 0;
        if ((_ptr_)CRExpo)
            rank_mon = CALL_2(int, __cdecl, 0x727F20, 1000, Expo);
    dlg->AddItem(CALL_8 (_DlgItem_*, __thiscall, 0x44FE00, o_New(56), 168-4+ 56*rank_mon, 50, 56, 128+16*(dop_str_txt), 100, *(int*)(*(int*)0x6AAD18 + 118), 1024));
    dlg->GetItem(100)->SendCommand(5, 4);

    // верхние названия    
    for (int i = 0; i <= 10; i++){
    dlg->AddItem(_DlgStaticText_::Create(168 +56*i, 34, 58, 15,
        CALL_3 (char*, __cdecl, 0x77710B, 1+i, 1, 0x847D88),
        "smalfont.fnt", 7, 10, ALIGN_H_LEFT | ALIGN_V_TOP, 0));
    }
    // элементы заполнения колонок (первый столбик) id = 11...(26)
    int y0 = 50;    int yy = 16;
    for (int i = 0; i < (8+dop_str_txt); i++){
        sprintf(o_TextBuffer, "%s", *(int*)(*(int*)(o_Dlg_ExpaMon +36)+4*i));
        dlg->AddItem(_DlgStaticText_::Create(80, y0 + yy*i, 80, 15, o_TextBuffer, "smalfont.fnt", 7, 11+i, ALIGN_H_LEFT | ALIGN_V_TOP, 0));
    }
    int x0 = 168;    int xx = 56;
    char text[16];
    for (char i = 0; i < (8+dop_str_txt); i++){
        sprintf(o_TextBuffer, "%s", *(int*)(*(int*)(o_Dlg_ExpaMon +44)+4*i));
        for (char j = 0; j < 11; j++){
            for (char k = 0; k < 8; k++){
                if (*(char*)(*(int*)(*(int*)(o_Dlg_ExpaMon +44)+4*i) +j*8 +k) != ' ')
                    text[k] = *(char*)(*(int*)(*(int*)(o_Dlg_ExpaMon +44)+4*i) +j*8 +k);
                else {
                    for (char s = k; s < 16; s++){
                        text[s] = ' ';
                    }
                    k = 7;
                }
            }
            dlg->AddItem(_DlgStaticText_::Create(x0 + xx*j, y0 + yy*i, 54, 15, text, "smalfont.fnt", 1, 30+i, ALIGN_H_LEFT | ALIGN_V_TOP, 0));
        }
    }
    // нижние картинки с дефами (id 50 ... )
    int xd = 18;  int xxd = 366;
    int yd = 50 +8 +16*8 +16*dop_str_txt;
    int yyd = 52;
    if (dop_str > 0 || art_num > 0){
        for (int i = 0; i < (dop_str); i++){
            dlg->AddItem(_DlgStaticDef_::Create(xd, yd, 50+i*2, "Expa_Mon.def", *(int*)(*(int*)(o_Dlg_ExpaMon +20)+4*i), 0, 0x12));
            sprintf(o_TextBuffer, "%s", *(int*)(*(int*)(o_Dlg_ExpaMon +16)+4*i));
            dlg->AddItem(_DlgStaticText_::Create(xd+54, yd, 330, 50, o_TextBuffer, "smalfont.fnt", 7, 51+i*2, ALIGN_H_LEFT | ALIGN_V_CENTER, 0));
            if (xd == 18)
                xd = 400;
            else xd = 18;
            if ( (i+10)%2 == 1 )
                yd += 52;
        }    
    }

    dlg->Run();
    dlg->Destroy(TRUE);
    return 0;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int Y_ChangeBmp_To_DefFrame()
{
        
        _PI->WriteDword(0x792048, 0); // E_ART.bmp
        int sdv = 7;
        _PI->WriteDword((0x71F86F +sdv), 1);  // E_SHOOTN.bmp
        _PI->WriteDword((0x71F89F +sdv), 2);  // N_SHOOTN.bmp

        _PI->WriteDword((0x71F94C +sdv), 3);  // E_CASTER.bmp
        _PI->WriteDword((0x71F97C +sdv), 4);  // N_CASTER.bmp

        _PI->WriteDword((0x71FA2D +sdv), 5);  // E_FEAR.bmp
        _PI->WriteDword((0x71FA5E +sdv), 6);  // N_FEAR.bmp

        _PI->WriteDword((0x71FB0B +sdv), 7);  // E_RETAIL1.bmp
        _PI->WriteDword((0x71FB3B +sdv), 8);  // N_RETAIL1.bmp

        _PI->WriteDword((0x71FBE8 +sdv), 9);  // E_DEFBON.bmp
        _PI->WriteDword((0x71FC18 +sdv), 10); // N_DEFBON.bmp

        _PI->WriteDword((0x71FCC5 +sdv), 11); // E_DWARF.bmp
        _PI->WriteDword((0x71FCF5 +sdv), 12); // N_DWARF.bmp

        _PI->WriteDword((0x71FDA8 +sdv), 13); // E_GOLEM.bmp
        _PI->WriteDword((0x71FDD8 +sdv), 14); // N_GOLEM.bmp

        _PI->WriteDword((0x71FE89 +sdv), 15); // E_DIST.bmp
        _PI->WriteDword((0x71FEBA +sdv), 16); // N_DIST.bmp

        _PI->WriteDword((0x71FF6B +sdv), 17); // E_OBST.bmp
        _PI->WriteDword((0x71FF9C +sdv), 18); // N_OBST.bmp

        _PI->WriteDword((0x72007B +sdv), 19); // E_FLY.bmp
        _PI->WriteDword((0x7200AC +sdv), 20); // N_FLY.bmp

        _PI->WriteDword((0x720156 +sdv), 21); // E_SHOOT.bmp
        _PI->WriteDword((0x720187 +sdv), 22); // N_SHOOT.bmp

        _PI->WriteDword((0x720231 +sdv), 23); // E_BREATH.bmp
        _PI->WriteDword((0x720262 +sdv), 24); // N_BREATH.bmp

        _PI->WriteDword((0x72030C +sdv), 25); // E_ALIVE.bmp
        _PI->WriteDword((0x72033D +sdv), 26); // N_ALIVE.bmp

        _PI->WriteDword((0x7203E7 +sdv), 27); // E_KING1.bmp
        _PI->WriteDword((0x720418 +sdv), 28); // N_KING1.bmp

        _PI->WriteDword((0x7204C2 +sdv), 29); // E_KING2.bmp
        _PI->WriteDword((0x7204F3 +sdv), 30); // N_KING2.bmp

        _PI->WriteDword((0x72059D +sdv), 31); // E_KING3.bmp
        _PI->WriteDword((0x7205CE +sdv), 32); // N_KING3.bmp

        _PI->WriteDword((0x720678 +sdv), 33); // E_MIND.bmp
        _PI->WriteDword((0x7206A9 +sdv), 34); // N_MIND.bmp

        _PI->WriteDword((0x720753 +sdv), 35); // E_MELEE.bmp
        _PI->WriteDword((0x720784 +sdv), 36); // N_MELEE.bmp

        _PI->WriteDword((0x72082E +sdv), 37); // E_FIRE.bmp
        _PI->WriteDword((0x72085F +sdv), 38); // N_FIRE.bmp

        _PI->WriteDword((0x720909 +sdv), 39); // E_DOUBLE.bmp
        _PI->WriteDword((0x72093A +sdv), 40); // N_DOUBLE.bmp

        _PI->WriteDword((0x7209E4 +sdv), 41); // E_RETAIL.bmp
        _PI->WriteDword((0x720A15 +sdv), 42); // N_RETAIL.bmp

        _PI->WriteDword((0x720ABF +sdv), 43); // E_MORAL.bmp
        _PI->WriteDword((0x720AF0 +sdv), 44); // N_MORAL.bmp

        _PI->WriteDword((0x720B9A +sdv), 45); // E_UNDEAD.bmp
        _PI->WriteDword((0x720BCB +sdv), 46); // N_UNDEAD.bmp

        _PI->WriteDword((0x720C75 +sdv), 47); // E_ROUND.bmp
        _PI->WriteDword((0x720CA6 +sdv), 48); // N_ROUND.bmp

        _PI->WriteDword((0x720D50 +sdv), 49); // E_DRAGON.bmp
        _PI->WriteDword((0x720D81 +sdv), 50); // N_DRAGON.bmp

        _PI->WriteDword((0x720E34 +sdv), 51); // E_HARPY.bmp
        _PI->WriteDword((0x720E65 +sdv), 52); // N_HARPY.bmp

        _PI->WriteDword((0x720F18 +sdv), 53); // E_CHAMP.bmp
        _PI->WriteDword((0x720F49 +sdv), 54); // N_CHAMP.bmp

        _PI->WriteDword((0x720FFC +sdv), 55); // E_MINOT.bmp
        _PI->WriteDword((0x72102D +sdv), 56); // N_MINOT.bmp

        _PI->WriteDword((0x7210E0 +sdv), 57); // E_SHOOTA.bmp
        _PI->WriteDword((0x721111 +sdv), 58); // N_SHOOTA.bmp

        _PI->WriteDword((0x7211C4 +sdv), 59); // E_FEARL.bmp
        _PI->WriteDword((0x7211F5 +sdv), 60); // N_FEARL.bmp

        _PI->WriteDword((0x7212A8 +sdv), 61); // E_REBIRTH.bmp
        _PI->WriteDword((0x7212D9 +sdv), 62); // N_REBIRTH.bmp

        _PI->WriteDword((0x72138C +sdv), 63); // E_UNIC.bmp
        _PI->WriteDword((0x7213BD +sdv), 64); // N_UNIC.bmp

        _PI->WriteDword((0x721484 +sdv), 65); // E_BLOCK.bmp
        _PI->WriteDword((0x7214B4 +sdv), 66); // N_BLOCK.bmp

        _PI->WriteDword((0x72155E +sdv), 67); // E_MANA.bmp
        _PI->WriteDword((0x72158E +sdv), 68); // N_MANA.bmp

        _PI->WriteDword((0x721638 +sdv), 69); // E_DBLOW.bmp
        _PI->WriteDword((0x721668 +sdv), 70); // N_DBLOW.bmp

        _PI->WriteDword((0x721A01 +sdv), 71); // E_HATE.bmp
        _PI->WriteDword((0x721A31 +sdv), 72); // N_HATE.bmp

        _PI->WriteDword((0x721C59 +sdv), 73); // E_TROLL.bmp
        _PI->WriteDword((0x721C89 +sdv), 74); // N_TROLL.bmp

        _PI->WriteDword((0x721E4C +sdv), 75); // E_CAST.bmp
        _PI->WriteDword((0x721E7C +sdv), 76); // N_CAST.bmp

        _PI->WriteDword((0x722037 +sdv), 77); // E_CAST1.bmp
        _PI->WriteDword((0x722067 +sdv), 78); // N_CAST1.bmp

        _PI->WriteDword((0x72224B +sdv), 77); // E_CAST1.bmp
        _PI->WriteDword((0x72227B +sdv), 78); // N_CAST1.bmp

        _PI->WriteDword((0x722436 +sdv), 79); // E_CAST2.bmp
        _PI->WriteDword((0x722466 +sdv), 80); // N_CAST2.bmp

        _PI->WriteDword((0x722643 +sdv), 79); // E_CAST2.bmp
        _PI->WriteDword((0x722673 +sdv), 80); // N_CAST2.bmp

        _PI->WriteDword((0x722A86 +sdv), 81); // E_BLESS.bmp
        _PI->WriteDword((0x722AB6 +sdv), 82); // N_BLESS.bmp

        _PI->WriteDword((0x72303C +sdv), 83); // E_RDEF.bmp
        _PI->WriteDword((0x72306C +sdv), 84); // N_RDEF.bmp

        _PI->WriteDword((0x72311F +sdv), 85); // E_DEATH.bmp
        _PI->WriteDword((0x72314F +sdv), 86); // N_DEATH.bmp

        _PI->WriteDword((0x72341C +sdv), 87); // E_BLOCK1.bmp
        _PI->WriteDword((0x72344C +sdv), 88); // N_BLOCK1.bmp

        _PI->WriteDword((0x7234F6 +sdv), 89); // E_BLOCK2.bmp
        _PI->WriteDword((0x723526 +sdv), 90); // N_BLOCK2.bmp

        _PI->WriteDword((0x723754 +sdv), 91); // E_SGTYPE.bmp
        _PI->WriteDword((0x723784 +sdv), 92); // N_SGTYPE.bmp

        _PI->WriteDword((0x7237D5 +sdv), 93); // E_SGNUM.bmp
        _PI->WriteDword((0x723805 +sdv), 94); // N_SGNUM.bmp

        _PI->WriteDword((0x7239C8 +sdv), 95); // E_SUMMON.bmp
        _PI->WriteDword((0x7239F8 +sdv), 96); // N_SUMMON.bmp

        _PI->WriteDword((0x723BBB +sdv), 97); // E_SUMMON1.bmp
        _PI->WriteDword((0x723BEB +sdv), 98); // N_SUMMON1.bmp

        _PI->WriteDword((0x723DAD +sdv), 99); // E_SUMMON2.bmp
        _PI->WriteDword((0x723DDD +sdv), 100); // N_SUMMON2.bmp

        int adress = 0x792848;
        for (int i = 0; i < 58; i++){
            _PI->WriteDword(adress, 101+i);
            adress += 4;
        }

    return 1;
}

_int_ __stdcall New_Dlg_ExpaMon_Lo(LoHook* h, HookContext* c)
{
    New_Dlg_ExpaMon(o_Mon, o_Num, o_Expo, o_CrExpo);

    c->return_address = 0x773C22;
    return NO_EXEC_DEFAULT;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    static _bool_ plugin_On = 0;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        if (!plugin_On)
        {
            plugin_On = 1;    

            _P = GetPatcher();
            _PI = _P->CreateInstance("Dlg_ExpaMon");
            char* version_dll = "Dlg_ExpaMon beta 1";
            
            Y_ChangeBmp_To_DefFrame();

            _PI->WriteLoHook(0x773BA4, New_Dlg_ExpaMon_Lo);

        }
        break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Завтра оба диалога соберу в одну dll и вроде фсё
Кстати да, некоторые косяки оригинального воговского диалога сохранены Ab


game bug fixes extended.dll || My Plugins || My GitHub
(This post was last modified: 30.11.2017 22:30 by igrik.)
30.11.2017 22:26
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2650

Bes, psd-исходников не вижу и ЛС тоже )
igrik, отличная работа! 132
А что за косяки, если не секрет? )


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

Posts: 16657
Post: #2651

Algor, рекомендую оформить bug fixes в отдельный мод. Он дублируется в Remagic и Era scripts (там разные файлы, кстати), его нельзя абсолютно безопасно интегрировать в WoG (это всё-таки скриптовые исправления, вроде паралича на 1 ход на машины войны), но он будет очень полезен многим.

keyboard fix более не актуален.

С Era Quick Savings поступлю, скорее всего, так же. Будет модом, поскольку добавлять новые вог-опции сейчас крайне неудобно. Вот бы диалог для новых опций в виде плагина…


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

Posts: 3881
Post: #2652

(01.12.2017 04:19)Berserker Wrote:  Algor, рекомендую оформить bug fixes в отдельный мод. Он дублируется в Remagic и Era scripts (там разные файлы, кстати), его нельзя абсолютно безопасно интегрировать в WoG (это всё-таки скриптовые исправления, вроде паралича на 1 ход на машины войны), но он будет очень полезен многим.
По хорошему, всё, что там содержится надо реализовать нормальными патчами, не на ERM. Это ж я от безальтернативности велосипедю...

(01.12.2017 04:19)Berserker Wrote:  keyboard fix более не актуален.
Отлично.

(01.12.2017 04:19)Berserker Wrote:  С Era Quick Savings поступлю, скорее всего, так же. Будет модом, поскольку добавлять новые вог-опции сейчас крайне неудобно. Вот бы диалог для новых опций в виде плагина…
Я планирую отказаться от использования меню WoG-опций.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
01.12.2017 12:36
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2653

Может быть удастся договориться с igrik и сделаем своё меню опций, например, рядом с кнопкой вог-опций. Только на DL и с данными из json в простом и удобном для расширения виде, не как сейчас. Сама же идея опций неплоха.


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

Posts: 16657
Post: #2654

Quote:По хорошему, всё, что там содержится надо реализовать нормальными патчами, не на ERM. Это ж я от безальтернативности велосипедю...
RoseKavalier исправлял баги, если составить краткий список ошибок, можно будет попросить его добавить ещё пару исправлений. Или там Ben на df2 тоже плагины для SoD пишет. Это ведь баги SoD, мы все заинтересованы в их исправлении.


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

Posts: 2356
Post: #2655

(01.12.2017 15:11)Berserker Wrote:  сделаем своё меню опций, например, рядом с кнопкой вог-опций.

Желательно бы для ERA вообще ликвидировать меню вог-опций вместе с кнопкой (там вроде и кнопки как таковой нет - стоит перехват клика по определённой области экрана). А саму кнопку для нового меню опций скриптов поставить в главном игровом меню. Правда, кто способен сделать такое под ERA?

Если и планируется оставить меню вог-опций, то хотя бы попытаться перенести его из WoG 3.59, где оно было расширено под новые скрипты.
01.12.2017 15:33
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