Current time: 12.04.2024, 18:08 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Создание скриптов с поддержкой мультиязычности
» SN:T + json
Author Message
wessonsm Offline

Posts: 787
Post: #46

Hmm. I just tried it and I have this symbol » normally displayed with json from the post above.
Is it because I have Cyrillic windows?
03.04.2022 17:59
Find all posts by this user Quote this message in a reply
Archer30 Offline
Moderators

Posts: 1103
Post: #47

wessonsm, thanks for testing!

I tested with daemon_n with the same json file, and we've achieved different results. It worked well for him, but not me. For now, I can only conclude the problem is PC specific.


Latest ERA mods and scripts in development - My GitHub
(This post was last modified: 03.04.2022 22:37 by Archer30.)
03.04.2022 22:36
Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16470
Post: #48

wessonsm, right, because Windows-1251 Encoding has this symbol and russian fnt file also has it. Chinese encoding does not include it.


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

Posts: 787
Post: #49

У меня в json несколько ключей с именами типа "wss.defname1", "wss.defname2", "wss.defname3" и так далее.
Как мне прочитать их значения в цикле и записать в массив?
Если я пытаюсь получить имя ключа так:
sprintf(Key[i], "wss.defname%d", i);
defname[i] = tr(Key[i]);
у меня не получается тип const char*, который требует функция tr.
25.02.2023 20:02
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #50

wessonsm, что за тип Key[i] ?
если это массив std::string , то вызови метод c_str() -> Key[i].c_str();

в общем, я думаю, у тебя что-то такое:
Code:
std::vector<std::string> Key;
std::vector<std::string> defname;
...
int i = 0;
defname[i] = Era::tr(Key[i].c_str());


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
26.02.2023 08:14
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 787
Post: #51

daemon_n, да. Сделал std::string - дело пошло, кажется. У меня был обычный массив char[].
Но появились другие проблемы, пытаюсь разбираться в общем.
С трудом мне эти json даются.
Пока все в коде плагина - все работает, как только пытаюсь сделать загрузку параметров из json - все ломается.
(This post was last modified: 26.02.2023 20:01 by wessonsm.)
26.02.2023 18:14
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2268
Post: #52

(25.02.2023 20:02)wessonsm Wrote:  У меня в json несколько ключей с именами типа "wss.defname1", "wss.defname2", "wss.defname3" и так далее.
Как мне прочитать их значения в цикле и записать в массив?
Если я пытаюсь получить имя ключа так:
sprintf(Key[i], "wss.defname%d", i);
defname[i] = tr(Key[i]);
у меня не получается тип const char*, который требует функция tr.

Проще создать и обрабатывать в цикле заранее подготовленный массив строк, т.е. имена "wss.defname1", "wss.defname2", "wss.defname3" и так далее записать компилятором непосредственно в саму программу в виде dword. Получение строк из json и так работает не очень быстро, а обработка "sprintf(Key[i], "wss.defname%d", i);" замедлит загрузку строк из json ещё сильнее.

(26.02.2023 18:14)wessonsm Wrote:  С трудом мне эти json даются.
Пока все в коде плагина - все работает, как только пытаюсь сделать загрузку параметров из json - все ломается.

Не мучайся и подгружай обычный txt. Лично у меня в ERA+ json не используются как раз по причине их сложности: не могу сделать их загрузку в память программы и в блокноте создавать сам json - писец какой-то из-за многочисленных фигурных скобочек, в которых я постоянно ошибаюсь....
(This post was last modified: 26.02.2023 20:30 by XEPOMAHT.)
26.02.2023 20:23
Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 787
Post: #53

(26.02.2023 20:23)XEPOMAHT Wrote:  Не мучайся и подгружай обычный txt. Лично у меня в ERA+ json не используются как раз по причине их сложности: не могу сделать их загрузку в память программы и в блокноте создавать сам json - писец какой-то из-за многочисленных фигурных скобочек, в которых я постоянно ошибаюсь....
Возможно, я так и сделаю.
Но все же текстовые таблицы не годятся для локализаций на азиатские языки, например. А там у меня и хинт-текст должен быть, который я тоже в json засунуть планировал.
Хочется сделать по-человечески. Да и вообще разобраться, что я не так делаю.
И до меня только что дошло, что sprintf используется для однобайтовых кодировок, а в json там многобайтовая. Возможно в этом проблема?
26.02.2023 20:51
Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16470
Post: #54

Quote:Получение строк из json и так работает не очень быстро
Максимально быстро. По готовому ключу в словаре, реализованному как быстрая хэш-карта.

wessonsm, будь другом, делай по-человечески, как и планировал. Покажи код, расскажи, что именно ломается.


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

Posts: 2810
Post: #55

wessonsm, возьми за образец мой способ копирования всех строк json в диалоге WoG Опций из WND.


game bug fixes extended.dll || My Plugins || My GitHub
27.02.2023 10:55
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 787
Post: #56

Огромное спасибо всем за желание помочь.
Я хочу сделать примерно вот такие кнопочки для карты приключений, которые нельзя сделать с помощью buttons.dll:
Image: buttons.png
Ну в целом я их сделал наполовину, кнопочки видны и нажимаются, нажатия отслеживаются из erm, позиция автоматически подстраивается под разрешение HD-мода. Осталось сделать отображение хинт-текста и смену кадра курсора при наведении на кнопки (с чем я надеюсь справиться). Плюс они не перекрашиваются в цвета игрока, но это уже другая проблема.
И загрузку параметров из json, над чем бьюсь безрезультатно третий день.

Вот этот код работает: (Click to View)
Вот мой json: (Click to View)

Проблема, как оказалось, не в циклах, а в том, что я вообще не могу прочитать ни одного параметра из 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.)
28.02.2023 01:46
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2268
Post: #57

(28.02.2023 01:46)wessonsm Wrote:  Я хочу сделать примерно вот такие кнопочки для карты приключений, которые нельзя сделать с помощью buttons.dll:
Image: buttons.png

Да можно, только потребуется перекомпиляция buttons.dll, т.к. этот старый плагин был написан до HD-мода и часть его функционала HD-мод просто не даёт исполнять (т.к. Бараторч очень любит перехватывать функции целиком увы, что приходится обходить различными обходными манёврами в коде или просто костылями). Например Тифон 3 перехватывает почти весь функционал buttons.dll и заставляет его выполняться вместе с HD-модом, НО!!! Эровские конфиги при этом не работают, т.к. это вообще только Берсеркеру известно как нужно читать данные из памяти era.dll - мне никак не разобраться в секретах передачи данных между эрой и плагинами к ней, ну, если они вообще нужны, можно их читать из обычного текстовика, без каких-либо извращений. А так, если без конфигов - всё на уровне исполняемого кода (по крайней мере в Тифоне мне так удобнее).

(28.02.2023 01:46)wessonsm Wrote:  Ну в целом я их сделал наполовину, кнопочки видны и нажимаются, нажатия отслеживаются из erm, позиция автоматически подстраивается под разрешение HD-мода. Осталось сделать отображение хинт-текста и смену кадра курсора при наведении на кнопки (с чем я надеюсь справиться). Плюс они не перекрашиваются в цвета игрока, но это уже другая проблема.
И загрузку параметров из json, над чем бьюсь безрезультатно третий день.

Ну если напишешь плагин, полностью заменяющий устаревший buttons.dll, то в среде моддеров он наверняка найдёт применение (да и Берсеркер может включить его в саму ЭРУ, удалив наконец-то наследие Феникс-мода). То, что тебе осталось сделать, присутствует в buttons.dll (исходники у Маячка на сервере вроде б лежали, если нужны, но там чистый Ассемблер, под СИ не покатит точно, ну и добавится несовместимость с ЭРА+ при этом, т.к. адреса лучше брать у Игрика - так надёжнее).
28.02.2023 02:48
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2810
Post: #58

wessonsm, с JSON очень легко работать. Когда у тебя получится - ты это оценишь.

Вот выдержка из моего кода (я тоже писал WND на VS 2008)
Code:
// изменённая фукнция в era.h для работы с VS2008
char* tr (const char *key) {
  char* buf = _tr(key, NULL, -1);
  char* result = ToStaticStr(buf);
  MemFree(buf);

  return result;
}


// функция получения JSON строк методом ERA (в главном файле WND)
char* GetEraJSON(const char* json_string_name) {
    return tr(json_string_name);
}


// код из WND
char strPage[1024];
char* textPage = "wog_options.page%d.%s";

sprintf(o_TextBuffer, textPage, 42, "key_name");

// ... или ... получаем структуру диалога ВОГ Опций
_DlgSetup_* ds = o_WogOptions;
SetupJsonText(&ds->Name, "wog_options.main.name");

// ... или ... другая строка (в цикле: i = итератор)
sprintf(strPage, textPage, i, "key_name");
SetupJsonText(&ds->Pages[i]->Name, strPage);

PS: вечером постараюсь помочь с твоим кодом (для этого скинь ресурсы кнопок и бэкграунда)


game bug fixes extended.dll || My Plugins || My GitHub
28.02.2023 03:21
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 787
Post: #59

XEPOMAHT, спасибо за наводку на исходники, я их как раз собирался искать. То что Ассемблер это не страшно, так как мне там нужны по сути только адреса хуков.

igrik, большое спасибо за функцию, опробую в ближайшее время, как только смогу.
Кнопки и pcx я слепил на скорую руку из того что было, просто чтобы опробовать работоспособность плагина:
https://dropmefiles.com/4tzGH
(This post was last modified: 28.02.2023 05:23 by wessonsm.)
28.02.2023 04:54
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2810
Post: #60

wessonsm, держи
Code:
#include "stdafx.h"
#include "..\..\include\homm3.h"
#include "..\..\include\era.h"

using namespace Era;

Patcher* _P;
PatcherInstance* _PI;

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

class Background {
  public:
    int id;
    int x;
    int y;    
    std::string pcxname;
};

class Button {
  public:    
    int id;
    int x;
    int y;    
    int caption_color;
    std::string defname;
    std::string caption_font;
    std::string caption_text;
    std::string popup_text;
    std::string hint_text;
};

class Namb {
  public:
    int qty;
    int align;
    Background *background;
    Button *buttons;

  Namb (int qty, int align) {
    this->qty = qty;
    this->align = align;
    this->background = new Background;
    this->buttons = new Button[qty];
  }

  ~Namb() {
    delete background;
    delete[] buttons;
  }
};

Namb *namb = NULL;

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

char* GetJsonStr(const char* json_string_name) {
    return tr(json_string_name);
}

int GetJsonInt(const char* json_string_name) {
    return atoi(GetJsonStr(json_string_name));
}

char* GetButtonsParamStr(int i, const char* key) {    
    sprintf(o_TextBuffer, "namb.button%d.%s", i, key);
    return GetJsonStr(o_TextBuffer);
}

int GetButtonsParamInt(int i, const char* key) {
    sprintf(o_TextBuffer, "namb.button%d.%s", i, key);
    return GetJsonInt(o_TextBuffer);
}

///////////////////////////////////////////////////////////////////
    
// функция загрузки параметров из json
int __stdcall ReadJsonConfig()
{    
    int qty = GetJsonInt("namb.qty");
    int align = GetJsonInt("namb.align");

    namb = new Namb(qty, align);

    namb->background->pcxname = GetJsonStr("namb.background.pcxname");
    namb->background->id = GetJsonInt("namb.background.id");
    namb->background->x = GetJsonInt("namb.background.x");
    namb->background->y = GetJsonInt("namb.background.y");

    for(int i = 0; i < qty; i++) {
        namb->buttons[i].id = GetButtonsParamInt(i, "id");
        namb->buttons[i].x = GetButtonsParamInt(i, "x");
        namb->buttons[i].y = GetButtonsParamInt(i, "y");
        namb->buttons[i].caption_color = GetButtonsParamInt(i, "caption_color");

        namb->buttons[i].defname = GetButtonsParamStr(i, "defname");
        namb->buttons[i].caption_font = GetButtonsParamStr(i, "caption_font");
        namb->buttons[i].caption_text = GetButtonsParamStr(i, "caption_text");
        namb->buttons[i].popup_text = GetButtonsParamStr(i, "popup_text");
        namb->buttons[i].hint_text = GetButtonsParamStr(i, "hint_text");
    }

    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 (namb->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 = namb->background->x;
    y = namb->background->y;
    id = namb->background->id;
    name = (char*)(namb->background->pcxname.c_str());
    
    dlg->AddItem(_DlgStaticPcx8_::Create(x + offsetx, y + offsety, id, name) );

    for (int i=0; i < namb->qty; i++)    {
        x = namb->buttons[i].x;
        y = namb->buttons[i].y;
        id = namb->buttons[i].id;
        color = namb->buttons[i].caption_color;

        name = (char*)(namb->buttons[i].defname.c_str());
        caption = (char*)(namb->buttons[i].caption_text.c_str());
        font = (char*)(namb->buttons[i].caption_font.c_str());
        
        _DlgTextButton_* bttn = _DlgTextButton_::Create(x + offsetx, y + offsety, id, name, caption, font, 0, 1, 0, 0, color);
            bttn->short_tip_text = (char*)(namb->buttons[i].caption_text.c_str());
            bttn->full_tip_text = (char*)(namb->buttons[i].popup_text.c_str());
        dlg->AddItem(bttn);
    }
    return dlg;    
}



int __stdcall hook_BeforeDrawAgems(HiHook* hook, _AdvMgr_* pAdvManager)
{
    _Dlg_* pDlgAdvMap;
    _DlgItem_* pItem;

    pDlgAdvMap = pAdvManager->dlg;

    pItem = pDlgAdvMap->GetItem(namb->background->id);
    pItem->Draw();

    for (int i = 0; i < namb->qty; i++) {
        pItem = pDlgAdvMap->GetItem(namb->buttons[i].id);
        pItem->Draw();
    }

    return CALL_1(int, __thiscall, hook->GetDefaultFunc(), pAdvManager);
}

_LHF_(LoHook_InitTxtFiles)
{
    ReadJsonConfig();
    return EXEC_DEFAULT;
}

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();
        _PI->WriteLoHook(0x4EEAC0, LoHook_InitTxtFiles);
        _PI->WriteHiHook(0x401510, SPLICE_, EXTENDED_, THISCALL_, hook_AdvMapDlg_Construct);
        _PI->WriteHiHook(0x40F250, SPLICE_, EXTENDED_, THISCALL_, hook_BeforeDrawAgems);
    }
    return TRUE;
}


game bug fixes extended.dll || My Plugins || My GitHub
01.03.2023 20:09
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