Огромное спасибо всем за желание помочь. 
Я хочу сделать примерно вот такие кнопочки для карты приключений, которые нельзя сделать с помощью buttons.dll:
  
Ну в целом я их сделал наполовину, кнопочки видны и нажимаются, нажатия отслеживаются из erm, позиция автоматически подстраивается под разрешение HD-мода. Осталось сделать отображение хинт-текста и смену кадра курсора при наведении на кнопки (с чем я надеюсь справиться). Плюс они не перекрашиваются в цвета игрока, но это уже другая проблема. 
И загрузку параметров из json, над чем бьюсь безрезультатно третий день.
 
Code: 
 // dllmain.cpp : Определяет точку входа для приложения DLL. 
#define _CRT_SECURE_NO_WARNINGS 
#include "..\include\homm3.h" 
#include "..\include\era.h" 
 
using namespace Era; 
 
Patcher* _P; 
PatcherInstance* _PI; 
 
//    types: 
struct _background_{ 
    std::string name; 
    int x; 
    int y; 
    int id; 
}; 
 
struct _Button_{ 
    std::string name; 
    int x; 
    int y; 
    int id; 
    std::string caption_text; 
    std::string caption_font; 
    int caption_color; 
    std::string popup_text; 
    std::string hint_text; 
}; 
 
//    список параметров, которые нужно получить из json 
int Qty = 5;        //    количество кнопок 
int Align = 1;     
 
_background_ BkgPcx = {"bkgpcx.pcx", 184, 538, 4000}; 
 
_Button_ Buttons[5] = {{"adbut1.def", 194, 538, 4001, "111", "smalfont.fnt", 2, "", ""}, 
                       {"adbut1.def", 238, 538, 4002, "222", "smalfont.fnt", 2, "", ""}, 
                       {"adbut1.def", 282, 538, 4003, "333", "smalfont.fnt", 2, "", ""}, 
                       {"adbut1.def", 326, 538, 4004, "444", "smalfont.fnt", 2, "", ""}, 
                       {"adbut1.def", 370, 538, 4005, "555", "smalfont.fnt", 2, "", ""}}; 
     
 
     
//    Здесь должна быть функция загрузки параметров из json 
//    int __stdcall ReadJsonConfig() 
//    {     
//     
// 
//    return 1; 
//    } 
 
 
 
_Dlg_* __stdcall hook_AdvMapDlg_Construct(HiHook* hook, _Dlg_* dlg) 
{ 
    int HDResX, HDResY, offsetx, offsety, x, y, id, color; 
    char *name, *caption, *font; 
     
//    HDResX = *(int*)0x4F81BC;    HDResY = *(int*)0x4F81C3; 
    HDResX = o_WndMgr->screen_pcx16->width; 
    HDResY = o_WndMgr->screen_pcx16->height; 
    switch (Align)    { 
        case 0:        offsetx = 0; break; 
        case 2:     offsetx = HDResX - 800; break; 
        case 1:        default: offsetx = (HDResX - 800)/2; break;                 
    }     
    offsety = HDResY - 600;     
 
    CALL_1(_Dlg_*, __thiscall, hook->GetDefaultFunc(), dlg); 
 
    x = BkgPcx.x; y = BkgPcx.y; id = BkgPcx.id; name = (char*)(BkgPcx.name.c_str()); 
    dlg->AddItem(_DlgStaticPcx8_::Create(x + offsetx, y + offsety, id, name) ); 
 
    for (int i=0; i<Qty; i++)    { 
        x = Buttons[i].x; y = Buttons[i].y; id = Buttons[i].id; color = Buttons[i].caption_color; 
        name = (char*)(Buttons[i].name.c_str()); 
        caption = (char*)(Buttons[i].caption_text.c_str()); 
        font = (char*)(Buttons[i].caption_font.c_str()); 
         
        dlg->AddItem(_DlgTextButton_::Create(x + offsetx, y + offsety, id, name, caption, font, 0, 1, 0, 0, color)); 
    } 
    return dlg;     
} 
 
 
 
int __stdcall hook_BeforeDrawAgems(HiHook* hook, _AdvMgr_* pAdvManager) 
{ 
    _Dlg_* pDlgAdvMap; 
    _DlgItem_* pItem; 
 
    pDlgAdvMap = pAdvManager->dlg; 
 
    pItem = pDlgAdvMap->GetItem(BkgPcx.id); 
    pItem->Draw(); 
 
    for (int i=0; i<Qty; i++) { 
        pItem = pDlgAdvMap->GetItem(Buttons[i].id); 
        pItem->Draw(); 
    } 
 
    return CALL_1(int, __thiscall, hook->GetDefaultFunc(), pAdvManager); 
} 
 
 
 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) 
{ 
    static _bool_ plugin_On = 0; 
 
    if ( (ul_reason_for_call==DLL_PROCESS_ATTACH) && (!plugin_On) ) { 
        plugin_On = 1; 
        _P = GetPatcher(); 
        _PI = _P->CreateInstance("new_buttons"); 
        ConnectEra(); 
//        ReadJsonConfig();        //    раскомментировать для получения параметров из json 
        _PI->WriteHiHook(0x401510, SPLICE_, EXTENDED_, THISCALL_, hook_AdvMapDlg_Construct); 
        _PI->WriteHiHook(0x40F250, SPLICE_, EXTENDED_, THISCALL_, hook_BeforeDrawAgems); 
    } 
    return TRUE; 
}
  
  
Code: 
 { 
    "namb": { 
        "qty":   "5",                            //    колическтво кнопок 
        "align": "1",                            // 0 - left, 1 - center, 2 - right. Выравнивание по левому краю, центру или правому краю карты. 
         
        "background": {                            //    фоновый pcx, необязательная секция 
            "pcxname": "bkgpcx.pcx", 
            "x":   "184",                        //    Координаты нужно указывать для разрешения 800x600. 
            "y":   "538",                        //    Плагин передвинет их автоматически. 
            "id":  "4000",                         
        }, 
        "button0": { 
            "defname":  "adbut1.def", 
            "x":         "194",                     
            "y":         "538",                 
            "id":        "4001",                 
            "caption_text":  "111",                //    опционально, необязательный параметр 
            "caption_font":  "smalfont.fnt",    //    опционально, необязательный параметр 
            "caption_color": "2",                //    опционально, необязательный параметр 
            "popup_text":    "",                //    опционально, необязательный параметр 
            "hint_text":     "",                //    опционально, необязательный параметр 
        }, 
        "button1": { 
            "defname":       "adbut1.def", 
            "x":             "238", 
            "y":             "538", 
            "id":            "4002", 
            "caption_text":  "222",             
            "caption_font":  "smalfont.fnt",     
            "caption_color": "2",                 
        },                                         
        "button2": { 
            "defname":          "adbut1.def", 
            "x":            "282", 
            "y":            "538", 
            "id":           "4003", 
            "caption_text":  "333",             
            "caption_font":  "smalfont.fnt",     
            "caption_color": "2",                 
        }, 
        "button3": { 
            "defname":          "adbut1.def", 
            "x":            "326", 
            "y":            "538", 
            "id":           "4004", 
            "caption_text":  "444",             
            "caption_font":  "smalfont.fnt",     
            "caption_color": "2",                 
        }, 
        "button4": { 
            "defname":        "adbut1.def", 
            "x":          "370", 
            "y":          "538", 
            "id":         "4005", 
            "caption_text":  "555",             
            "caption_font":  "smalfont.fnt",     
            "caption_color": "2",                 
        }, 
    } 
}
  
  
Проблема, как оказалось, не в циклах, а в том, что я вообще не могу прочитать ни одного параметра из json. 
С json у меня не заладилось с самого начала. 
Началось все с того, что компилятор visual studio 2008 ругался на объявление функции tr из era.h 
std::string tr (const char *key, std::vector<std::string> params = {}) 
Сейчас у меня visual studio 2010, он тоже ругается. 
Я убрал тогда ={} и на этом успокоился, компилятор ругаться перестал, и все работало до тех пор, пока я не пытался вызывать функцию tr. 
Поскольку подставляемых параметров у меня в json нет, мне нужно передать в функцию пустой вектор из 0 элементов. Как это сделать, я понятия не имею и поэтому прошу помощи. 
Я даже не хочу постить весь тот бред сивой кобылы, который я пытался писать. 
В итоге если компилятор каким-то чудом это принимал, либо я получал ошибку загрузки dll, либо функция возвращает имя параметра вместо его значения, либо вылет. 
Может, как-то можно туда все таки передать этот пустой вектор, а может, мне нужно переделать саму функцию tr, если кто-то подскажет, буду весьма благодарен.
			  
			
			
			
				
(This post was last modified: 03.03.2023 20:15 by Guru105.)
 
			 
		 |