Огромное спасибо всем за желание помочь.
Я хочу сделать примерно вот такие кнопочки для карты приключений, которые нельзя сделать с помощью 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 wessonsm.)
|