Current time: 14.12.2018, 22:20 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Исследование героев
» туториал(ы)
Author Message
igrik Offline
Administrators

Posts: 1486
Post: #841

(02.09.2017 19:17)RoseKavalier Wrote:  Another question: how about "mouse-over text"?
Смотри тут. Это недописанное окно командира.
Code:
_DlgStaticDef_* CommDef;
_DlgStaticTextPcx8ed_* statbar = NULL;

// показ сообщения по ПКМ на первичных навыках командира
void Y_New_CommanderDlg_ShowPreSkill_RMC(int npc_id, int skill)
{
    int skill_power = *(int*)(0x28620C0 + 296 * npc_id + 56 + skill*4); // получить силу скила
    char* text = "";
    int sizeX, sizeY;

    bool art_npc_155 = false;    
    for (char i = 0; i < 6; ++i ){
        if (o_Npc[npc_id].arts[i][0] == 155 )
            art_npc_155 = true;    
    }
    if ( !art_npc_155 || skill_power > 1 )
    {
        text = Get_ITxt(skill_power + 136 + skill *6, 1);        // получить строку в текстовике в зависимости от силы скила
        sizeX = 560; sizeY = 440;
    }
    else
    {
        text = Get_ITxt(skill + 236, 1);
        sizeX = 340; sizeY = 220;
    }

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, sizeX, sizeY, DF_SCREENSHOT | DF_SHADOW, NULL);                            
    dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0);
    
    dlg->AddItem(_DlgStaticDef_::Create(dlg->width/2 -35, 25, 70, 70, 2, "ComSkls2.def", skill_power + skill*7 + 6*art_npc_155, 0, 0x12));          
    dlg->AddItem(_DlgStaticText_::Create(25, 95, dlg->width -50, dlg->height -25 -95, text, "medfont.fnt", 1, 3, ALIGN_H_CENTER | ALIGN_V_TOP, 0));

    dlg->RMC_Show();
}

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

    int npc_id = dlg_Npc->field_64; // получаем номер командира/героя
    _Npc_* npc = GetNpc(npc_id); // получаем структуру командира
    _Hero_* hero = o_GameMgr->GetHero(npc_id); // структура героя
    int temp_1, temp_2; // временная переменная

    // обновление подсказки при движении мыши (id = 10)
    if (msg->type == MT_MOUSEOVER)
        {
            _DlgItem_* it = dlg_Npc->FindItem(msg->x_abs, msg->y_abs);
            char* text = "";
            if (it)    
            {
                switch (it->id)
                {
                    case 3:     text = Get_ITxt(263, 1); break; // подсказка Уволить командира
                    case 4:     text = Get_ITxt(273, 1); break; // подсказка для просмотра биографии
                    case 6:  text = Get_ITxt(npc->type + 10, 1); break; // подсказка первого спец_умения
                    case 7:  text = Get_ITxt(npc->type + 10, 2); break; // подсказка второго спец_умения
                    case 11: text = Get_ITxt(259, 1); break; // подсказка Имя командира

                    case 12: text = Get_ITxt(npc->lvl_attack + 100, 1);      break; // подсказка дефа навыка атаки
                    case 13: text = Get_ITxt(npc->lvl_defence + 106, 1);     break; // подсказка дефа навыка защиты
                    case 14: text = Get_ITxt(npc->lvl_hit_points + 112, 1);  break; // подсказка дефа навыка здоровья
                    case 15: text = Get_ITxt(npc->lvl_damage + 118, 1);       break; // подсказка дефа навыка урона
                    case 16: text = Get_ITxt(npc->lvl_spell_power + 124, 1); break; // подсказка дефа навыка силы магии
                    case 17: text = Get_ITxt(npc->lvl_speed + 130, 1);       break; // подсказка дефа навыка скорости

                    case 31: case 61: sprintf(o_TextBuffer, "%s%d", Get_ITxt(264, 1), npc->now_level +1); text = o_TextBuffer; break;// подсказка уровня командира
                    case 32: case 33: text = Get_ITxt(242, 1);       break; // подсказка класса командира
                    case 34: case 35: sprintf(o_TextBuffer, "%s%s", Get_ITxt(266, 1), hero->name); text = o_TextBuffer; break;// подсказка хозяина героя
                    case 36: case 37: sprintf(o_TextBuffer, "%s%d", Get_ITxt(267, 1), npc->now_expa); text = o_TextBuffer; break;// подсказка текущего опыта
                    case 38: case 39: sprintf(o_TextBuffer, "%s%d", Get_ITxt(268, 1), CALL_1(int, __thiscall, 0x769260, npc)); text = o_TextBuffer; break;// подсказка следующего опыта

                    case 40: text = Get_ITxt(269, 1); break; // подсказка навыки класса
                    case 41: text = Get_ITxt(270, 1); break; // подсказка артефакты
                    case 42: text = Get_ITxt(271, 1); break; // подсказка основные навыки
                    case 43: text = Get_ITxt(272, 1); break; // подсказка вторичные навыки

                    case 45: temp_1 = Get_NpcSkillPower(npc, 0); temp_2 = hero->attack;
                             if ( npc->type == 7 ) temp_2 += (temp_2/2);
                             sprintf(o_TextBuffer, Get_ITxt(275, 2), temp_1 + temp_2); text = o_TextBuffer; break;                                            // подсказка атака
                    case 46: temp_1 = Get_NpcSkillPower(npc, 1); temp_2 = hero->defence;
                             if ( npc->type == 7 ) temp_2 += (temp_2/2);
                             sprintf(o_TextBuffer, Get_ITxt(276, 2), temp_1 + temp_2); text = o_TextBuffer; break;                                            // подсказка защита

                    case 47: sprintf(o_TextBuffer, Get_ITxt(277, 2), Get_NpcSkillPower(npc, 2)); text = o_TextBuffer; break;                                // подсказка здоровье
                    case 48: sprintf(o_TextBuffer, Get_ITxt(278, 2), Get_NpcSkillPower(npc, 3)/2, Get_NpcSkillPower(npc, 3)); text = o_TextBuffer; break;    // подсказка сила урон
                    case 49: sprintf(o_TextBuffer, Get_ITxt(279, 2), Get_NpcSkillPower(npc, 4)); text = o_TextBuffer; break;                                // подсказка сила магии
                    case 50: sprintf(o_TextBuffer, Get_ITxt(280, 2), Get_NpcSkillPower(npc, 6)); text = o_TextBuffer; break;                                // подсказка сопротивление
                    case 51: sprintf(o_TextBuffer, Get_ITxt(281, 2), ((npc->specBon[0] & 0x10) ? 24 : 0)); text = o_TextBuffer; break;                        // подсказка боезапас
                    case 52: sprintf(o_TextBuffer, Get_ITxt(282, 2), Get_NpcSkillPower(npc, 5)); text = o_TextBuffer; break;                                // подсказка скорость

                    case 30722:    text = Get_ITxt(261, 1); break; // Ok Выход
                    default: text = "";    break;
                }
            statbar->SetText(text);
            statbar->Draw();
            statbar->RedrawScreen();
            }
        }


    if (msg->type == MT_MOUSEBUTTON)
            {
                if (msg->subtype == MST_RBUTTONDOWN) // клик ПКМ
                {
                    switch (msg->item_id)
                    {
                        case 3: b_MsgBox(Get_ITxt(201, 1), MBX_RMC);            break;  // Уволить командира
                        case 4: case 11: b_MsgBox(Get_ITxtBio(npc_id, 1), MBX_RMC);            break;  // ПКМ для просмотра биографи
                        case 6: b_MsgBox(Get_ITxt(npc->type + 19, 1), MBX_RMC);        break;  // ПКМ первого спец_умения
                        case 7: b_MsgBox(Get_ITxt(npc->type + 19, 2), MBX_RMC);        break;  // ПКМ второго спец_умения

                        case 12: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 0);     break; // ПКМ дефа навыка атаки
                        case 13: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 1);     break; // ПКМ дефа навыка защиты
                        case 14: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 2);     break; // ПКМ дефа навыка здоровья
                        case 15: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 3);     break; // ПКМ дефа навыка урона
                        case 16: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 4);     break; // ПКМ дефа навыка силы магии
                        case 17: Y_New_CommanderDlg_ShowPreSkill_RMC(npc_id, 5);     break; // ПКМ дефа навыка скорости

                        case 32: case 33: b_MsgBox(Get_ITxt(npc->type + 186, 1), MBX_RMC);        break;  // ПКМ на описании класса

                        case 30722: b_MsgBox(Get_ITxt(261, 2), MBX_RMC); break; // ПКМ Ok Выход
                    }
                }
            }
    return r;
}
// новое диалоговое окно командира для ERA (0x0076A46E)
int Y_New_CommanderDlg_Show(int NHero_id, bool lvl_up)
{
    _Npc_* npc = GetNpc(NHero_id); // получаем структуру командира
    _Hero_* hero = o_GameMgr->GetHero(NHero_id); // структура героя
    int sizeX, sizeY;
    char* name_pcx;
    
    if (!lvl_up)    {
        name_pcx = "DlgCom0.pcx";    
        sizeX = 634; sizeY = 505;
    }
    else {
        name_pcx = "DlgCom1.pcx";    
        sizeX = 634; sizeY = 600;    
    }

    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, sizeX, sizeY, DF_SCREENSHOT | DF_SHADOW, Y_New_CommanderDlg_Proc);

    // деф командира
    dlg->field_64 = NHero_id; // сохраняем номер командира в структуре диалога для Dlg_Proc
    dlg->AddItem(_DlgStaticPcx8_::Create(20, 70, 100, 130, 4, "CRBKGNEU.pcx")); // фон замка под дефом командира нейтральный (id = 4)
    dlg->AddItem(CommDef = _DlgStaticDef_::Create(-130, -80, 100, 130, 5, o_CreatureInfo[npc->type + 174].def_name, 0, 0, 0x12)); // шагающий деф командира (id = 5)

    // задник диалога под цвет игрока (id = 1)
    _DlgStaticPcx8_* fonPcx;
    dlg->AddItem(fonPcx = b_DlgStaticPcx8_Create(0, 0, dlg->width, dlg->height, 1, name_pcx, 2048));
    fonPcx->Colorize(o_GameMgr->GetMeID());

    // кнопки ок и уволить
    dlg->AddItem(_DlgButton_::Create(285, dlg->height -76, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2)); // кнопка ok (id = 30722)
    dlg->AddItem(_DlgButton_::Create(564, dlg->height -76, 51, 35, 3, "hsbtns2.def", 0, 1, 1, 28, 2));   // кнопка удалить командира (id = 3)
    CALL_3 (void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0);  // установить курсор(0,0)

    dlg->AddItem(_DlgStaticText_::Create(20, 70, 100, 130, "", "medfont.fnt", 1, 4, ALIGN_H_CENTER | ALIGN_V_CENTER, 0));  // подсказка на дефе (пустышка, но по ней ПКМ определяет id и выдает окно биографии)
    
    // дефы спец_умений командира
    dlg->AddItem(_DlgStaticDef_::Create(395, 113, 43, 43, 6, "ComSkls.def", npc->type *2, 0, 0x12));    // первый деф спец_умений (id = 6)
    dlg->AddItem(_DlgStaticDef_::Create(504, 113, 43, 43, 7, "ComSkls.def", npc->type *2 +1, 0, 0x12)); // первый деф спец_умений (id = 7)

    // подсказка в статус баре    
    statbar = _DlgStaticTextPcx8ed_::Create(8, dlg->height -18 -8, dlg->width - 16, 18, "Подсказка", "smalfont.fnt", "HD_TStat.pcx", 1, 10, ALIGN_H_CENTER | ALIGN_V_CENTER);
    dlg->AddItem(statbar);

    dlg->AddItem(_DlgStaticText_::Create(131, 18, 370, 17, npc->name, "medfont.fnt", 7, 11, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // имя командира (id = 11)

    // артефакты (id 20...25)
    bool art_npc_155 = false;
    for (char i = 0; i < 6; ++i ){
        if (npc->arts[i][0] > 0 )
            dlg->AddItem(_DlgStaticDef_::Create(330 +48*i, 184, 45, 45, 20, "artifact.def", npc->arts[i][0], 0, 0x12));
        if (npc->arts[i][0] == 155 )
            art_npc_155 = true;            
    }

    // скилы (id 12...17)
    for (char i = 0; i < 6; ++i ){
        int art_freme_skill = *(int*)(0x28620C0 +296*NHero_id +56 +4*i);
        if (art_freme_skill < 2 && art_npc_155)
            art_freme_skill = 6;
        dlg->AddItem(_DlgStaticDef_::Create(40 +96*i, 270, 70, 70, 12+i, "ComSkls2.def", art_freme_skill +7*i, 0, 0x12));
    }

    dlg->AddItem(_DlgStaticText_::Create(22, 46, 96, 18, Get_ITxt(264, 1), "medfont.fnt", 7, 31, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // уровень_текст (id = 31)
    sprintf(o_TextBuffer, "%d", npc->now_level +1);
    dlg->AddItem(_DlgStaticText_::Create(22, 46, 96, 18, o_TextBuffer, "medfont.fnt", 1, 61, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0)); // уровень_число (id = 61)

    dlg->AddItem(_DlgStaticText_::Create(16, 205, 104, 18, Get_ITxt(265, 1), "medfont.fnt", 7, 32, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // класс_текст1 (id = 32)
    dlg->AddItem(_DlgStaticText_::Create(16, 220, 104, 18, Get_ITxt(npc->type +216, 1), "medfont.fnt", 1, 33, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // класс_текст2 (id = 33)

    dlg->AddItem(_DlgStaticText_::Create(128, 46, 192, 18, Get_ITxt(266, 1), "medfont.fnt", 7, 34, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Хозяин_текст (id = 34)
    dlg->AddItem(_DlgStaticText_::Create(128, 46, 192, 18, hero->name, "medfont.fnt", 1, 35, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0)); // Хозяин_имя (id = 35)
    
    dlg->AddItem(_DlgStaticText_::Create(330, 46, 284, 18, Get_ITxt(267, 1), "medfont.fnt", 7, 36, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Текущий_опыт_текст (id = 36)
    sprintf(o_TextBuffer, "%d", o_Npc[NHero_id].now_expa);
    dlg->AddItem(_DlgStaticText_::Create(330, 46, 284, 18, o_TextBuffer, "medfont.fnt", 1, 37, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0)); // Текущий_опыт_число (id = 37)    

    dlg->AddItem(_DlgStaticText_::Create(330, 68, 284, 18, Get_ITxt(268, 1), "medfont.fnt", 7, 38, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Следующий_уровень_текст (id = 38)

    sprintf(o_TextBuffer, "%d", CALL_1(int, __thiscall, 0x769260, npc));
    dlg->AddItem(_DlgStaticText_::Create(330, 68, 284, 18, o_TextBuffer, "medfont.fnt", 1, 39, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));   // Следующий_уровень_число (id = 39)    

    dlg->AddItem(_DlgStaticText_::Create(377, 91, 192, 18, Get_ITxt(269, 1), "medfont.fnt", 7, 40, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Навыки_класса_текст (id = 40)
    dlg->AddItem(_DlgStaticText_::Create(377, 160, 192, 18, Get_ITxt(270, 1), "medfont.fnt", 7, 41, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Артефакты_текст (id = 41)

    dlg->AddItem(_DlgStaticText_::Create(133, 247, 366, 18, Get_ITxt(271, 1), "medfont.fnt", 7, 42, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Основные_навыки_текст (id = 42)
    dlg->AddItem(_DlgStaticText_::Create(133, 344, 366, 18, Get_ITxt(272, 1), "medfont.fnt", 7, 43, ALIGN_H_CENTER | ALIGN_V_CENTER, 0)); // Вторичные_навыки_текст (id = 43)
    
    int temp_1, temp_2; // временные переменные

    temp_1 = Get_NpcSkillPower(npc, 0);     temp_2 = hero->attack;
    if ( npc->type == 7 ) temp_2 += (temp_2/2);
    sprintf(o_TextBuffer, "%d (%d)", temp_1, temp_1 + temp_2);
    dlg->AddItem(_DlgStaticText_::Create(128, 69, 192, 18, o_TextBuffer, "medfont.fnt", 1, 65, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Атака_число (id = 65)
    dlg->AddItem(_DlgStaticText_::Create(128, 69, 192, 18, Get_ITxt(275, 1), "medfont.fnt", 7, 45, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Атака_текст (id = 45)

    temp_1 = Get_NpcSkillPower(npc, 1);     temp_2 = hero->defence;
    if ( npc->type == 7 ) temp_2 += (temp_2/2);
    sprintf(o_TextBuffer, "%d (%d)", temp_1, temp_1 + temp_2);
    dlg->AddItem(_DlgStaticText_::Create(128, 91, 192, 18, o_TextBuffer, "medfont.fnt", 1, 66, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Защита_число (id = 66)
    dlg->AddItem(_DlgStaticText_::Create(128, 91, 192, 18, Get_ITxt(276, 1), "medfont.fnt", 7, 46, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Защита_текст (id = 46)

    sprintf(o_TextBuffer, "%d", Get_NpcSkillPower(npc, 2));
    dlg->AddItem(_DlgStaticText_::Create(128, 113, 192, 18, o_TextBuffer, "medfont.fnt", 1, 67, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Здоровье_число (id = 67)
    dlg->AddItem(_DlgStaticText_::Create(128, 113, 192, 18, Get_ITxt(277, 1), "medfont.fnt", 7, 47, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Здоровье_текст (id = 47)

    temp_1 = Get_NpcSkillPower(npc, 3);
    sprintf(o_TextBuffer, "%d - %d", temp_1/2, temp_1);
    dlg->AddItem(_DlgStaticText_::Create(128, 135, 192, 18, o_TextBuffer, "medfont.fnt", 1, 68, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Урон_число (id = 68)
    dlg->AddItem(_DlgStaticText_::Create(128, 135, 192, 18, Get_ITxt(278, 1), "medfont.fnt", 7, 48, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Урон_текст (id = 48)

    sprintf(o_TextBuffer, "%d", Get_NpcSkillPower(npc, 4));
    dlg->AddItem(_DlgStaticText_::Create(128, 157, 192, 18, o_TextBuffer, "medfont.fnt", 1, 69, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Сила_магии_число (id = 69)
    dlg->AddItem(_DlgStaticText_::Create(128, 157, 192, 18, Get_ITxt(279, 1), "medfont.fnt", 7, 49, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Сила_магии_текст (id = 49)

    sprintf(o_TextBuffer, "%d%%", Get_NpcSkillPower(npc, 6));
    dlg->AddItem(_DlgStaticText_::Create(128, 179, 192, 18, o_TextBuffer, "medfont.fnt", 1, 70, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Сопротивление_число (id = 70)
    dlg->AddItem(_DlgStaticText_::Create(128, 179, 192, 18, Get_ITxt(280, 1), "medfont.fnt", 7, 50, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Сопротивление_текст (id = 70)

    sprintf(o_TextBuffer, "%d", (npc->specBon[0] & 0x10 ? 24 : 0));
    dlg->AddItem(_DlgStaticText_::Create(128, 201, 192, 18, o_TextBuffer, "medfont.fnt", 1, 71, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Боезапас_число (id = 71)
    dlg->AddItem(_DlgStaticText_::Create(129, 201, 192, 18, Get_ITxt(281, 1), "medfont.fnt", 7, 51, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Боезапас_текст (id = 51)

    sprintf(o_TextBuffer, "%d", Get_NpcSkillPower(npc, 5));
    dlg->AddItem(_DlgStaticText_::Create(128, 223, 192, 18, o_TextBuffer, "medfont.fnt", 1, 72, ALIGN_H_RIGHT | ALIGN_V_CENTER, 0));    // Скорость_число (id = 72)
    dlg->AddItem(_DlgStaticText_::Create(128, 223, 192, 18, Get_ITxt(282, 1), "medfont.fnt", 7, 52, ALIGN_H_LEFT | ALIGN_V_CENTER, 0)); // Скорость_текст (id = 52)

    dlg->Run();
    dlg->Destroy(TRUE);

    return 1;
}

Структура командира:
Code:
#define o_Npc ((_Npc_*)0x28620C0)         // получение структуры командира

struct _Npc_;

// Структура командира 0x128h (296)
NOALIGN struct _Npc_
{
_dword_ on;               // 0x00     +0    Доступность
_dword_ alive;            // 0x04     +4    Жив_или_мёртв  
_dword_ id;               // 0x08     +8    Номер_героя_хозяина (ну и номер командира)
_dword_ type;             // 0x0C     +12   Тип_командира
_dword_ type_Hero;        // 0x10     +16   Тип_героя
_dword_ LastExpaInBattle; // 0x14     +20   Опыт в прошлых битвах
_dword_ CustomPrimary;    // 0x18     +24   Если вы установить 1 (вкл), первичные навыки не будут изменяться с продвижением командира по уровням
                           //                Если установить 0, то здоровье и урон  будут автоматически прибавляться вместе с уровнем командира (из ERM Help = CO:P)
_dword_ attack;           // 0x1C     +28   Атака
_dword_ defence;          // 0x20     +32   Защита
_dword_ hit_points;       // 0x24     +36   Здоровье
_dword_ damage;           // 0x28     +40   Урон
_dword_ spell_power;      // 0x2C     +44   Сила_магии
_dword_ speed;            // 0x30     +48   Скорость
_dword_ resistance;       // 0x34     +52   Сопротивление

_dword_ lvl_attack;       // 0x38     +56   Уровень_Атаки
_dword_ lvl_defence;      // 0x3C     +60   Уровень_Защиты
_dword_ lvl_hit_points;   // 0x40     +64   Уровень_Здоровья
_dword_ lvl_damage;       // 0x44     +68   Уровень_Урона
_dword_ lvl_spell_power;  // 0x48     +72   Уровень_Сила_магии
_dword_ lvl_speed;        // 0x4C     +76   Уровень_Скорости
_dword_ lvl_resistance;   // 0x50     +80   Уровень_Сопротивления

_word_ arts[10][8];       // 0x54     +84   Номер_артефакта; Кол-во проведённых с ним битв
_char_ name[32];          // 0xF4     +244  Имя
_dword_ old_expa;         // 0x114    +276  Старый_опыт_героя
_dword_ now_expa;         // 0x118    +280  Текущий_опыт
_dword_ now_level;        // 0x11C    +284  Текущий_уровень (при отображении добавляем +1)
_dword_ specBon[2];       // 0x120    +288  Особые_бонусы(сумма_битов); Запрещенные_бонусы(сумма_битов)
};

// функция получения адреса структуры командира
inline _Npc_*  GetNpc(_int_ hero_id) {return ((_Npc_ *)(0x28620C0 + 296 * hero_id));}
// функция получения строк из командирского текстовика "znpc00.txt"
inline char* Get_ITxt(int StrNum, int ItemNum) {return CALL_3 (char*, __cdecl, 0x77710B, StrNum, ItemNum, 0x2860724);}
// функция получения строк из командирского текстовика "znpc01.txt" Имена и биографии
inline char* Get_ITxtBio(int StrNum, int ItemNum) {return CALL_3 (char*, __cdecl, 0x77710B, StrNum, ItemNum, 0x286072C);}
// функция получения силы первичного командирского навыка
inline int Get_NpcSkillPower(_Npc_* npc, int skill_id) {return CALL_2 (int, __thiscall, 0x769460, npc, skill_id);}
Image: B9WQ3qs.jpg


Скачать HoMM3 ERA 2.7.7 (Repack: Rus & HD) || (wogNativeDialogs)
03.09.2017 01:15
Visit this user's website Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #842

Очень приятно, спасибо еще раз за помощь)

EDIT:
Modified to use with short_tip_text. Works great, thanks x2
Code:
int __stdcall show_text_hint(_Dlg_* this_, _EventMsg_* msg)
{
    int r = this_->DefProc(msg);
    char* text;
    text = "";
    if (msg->type == MT_MOUSEOVER) {
        _DlgItem_* it = this_->FindItem(msg->x_abs, msg->y_abs);        
        if (it) {
            if (it->short_tip_text != NULL)
                text = it->short_tip_text;
        }
        statbar->SetText(text);
        statbar->Draw();
        statbar->RedrawScreen();
    }        
    return r;
}
(This post was last modified: 03.09.2017 23:43 by RoseKavalier.)
03.09.2017 18:39
Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #843

I read conversation at DF2 (don't have account there...) and your solution below.
Я читал разговор на DF2 (нет аккаунта там...) и ваше решение ниже.
Graphic mode

It seems bug is related to different graphic mode,
32-bit GDI ok
True not ok
Image: tFuHLND.png

By any chance, could there be updated versions of dialog files?
Случайно, может быть обновленных версий диалоговые файлы?

If not, is there a way to make Set_DlgStdBackground() more... dynamic and less "one-size fits all". Seems to increment in +64
Если нет, есть ли способ, чтобы сделать Set_DlgStdBackground() в более... динамичным и менее "одну гребенку". Кажется, прирост в +64

Спасибо за ваше время)

Code:
width = 272;
dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, d_w, d_h, 0, 0, o_GameMgr->GetMeID()), 0);
Image: vzITrz1.png

Code:
width = 250
Set_DlgStdBackground (dlg);
Image: KR3sUij.png

Code:
width = 260
Set_DlgStdBackground (dlg);
Image: EMrhDFS.png
07.09.2017 04:06
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 1486
Post: #844

(07.09.2017 04:06)RoseKavalier Wrote:  By any chance, could there be updated versions of dialog files?
Случайно, может быть обновленных версий диалоговые файлы?

If not, is there a way to make Set_DlgStdBackground() more... dynamic and less "one-size fits all". Seems to increment in +64
Если нет, есть ли способ, чтобы сделать Set_DlgStdBackground() в более... динамичным и менее "одну гребенку". Кажется, прирост в +64
Обновленных версий нет.

Да, там проиходит увеличение дилогового окна на +64.
Если хотите сделать более динамичным, то вам необходимо исследовать функцию 0x48FA80 и перед показом диалога изменять все "64" на нужное увеличение размера, а потом возвращать этот параметр (=64).
Я бы сделал так.


Скачать HoMM3 ERA 2.7.7 (Repack: Rus & HD) || (wogNativeDialogs)
07.09.2017 13:41
Visit this user's website Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #845

Отличный ответ, спасибо!

EDIT: good news ---
you can place any custom *.pcx, *.def, *.bmp inside your plugin folder and it can be used directly.
вы можете разместить любой заказ, *.pcx, *.def, *.bmp ..., внутри папки плагинов и его можно использовать напрямую.

Image: mdDrR8w.png

EDIT2: after some thinking... started making a function for dynamic background.
Lacks color but maybe that can be fixed...
после некоторых размышлений, я начал делать функцию для динамического фона.

It works will all graphic modes as far as I could tell.
Code:
int create_standard_background(_Dlg_* dlg, int status_bar)
{
    //dlg->AddItem(_DlgStaticPcx8_::Create(0, 0, min(dlg->width,256), min(dlg->height,256), 0, "DiBoxBck.pcx"));
    
    int current_x, remaining_x, current_y, remaining_y, horizontal_row;

    current_x = 0;
    remaining_x = dlg->width;
    current_y = 0;
    remaining_y = dlg->height;
    horizontal_row = 0;

    if (remaining_x < 64 || remaining_y < 64)
        return 0;

    while (TRUE) {        
        while (TRUE) { // do horizontal pass first
            if (remaining_x > 0) {
                dlg->AddItem(_DlgStaticPcx8_::Create(current_x, horizontal_row * 256, min(remaining_x, 256), min(remaining_y, 256), 0, "DiBoxBck.pcx"));
                current_x = current_x + 256;
                remaining_x = remaining_x - 256;
            }
            else break;
        }        
        current_x = 0;        // reset x position to 0        
        remaining_x = dlg->width; // reset length of horizontal line
        remaining_y = remaining_y - 256; // update remaining y since we're done with horizontal pass
        horizontal_row = horizontal_row + 1;    // we might be working on a new row soon if condition below is met        
        if (remaining_y <= 0)
            break;        // no more rows to add
    }

    int top_left = 0;
    int top_right = 1;
    int bottom_left = 2;
    int bottom_right = 3;
    int left_middle = 4;
    int right_middle = 5;
    int top_middle = 6;
    int bottom_middle = 7;

    if (status_bar) {
        bottom_left = 8;
        bottom_right = 9;
        bottom_middle = 10;
    }

    // add horizontal borders    
    current_x = 0;
    remaining_x = dlg->width;
    while (remaining_x >= 64) {
        dlg->AddItem(_DlgStaticDef_::Create(current_x, 0, 0, "dialgbox.def", top_middle, 0, 0));
        dlg->AddItem(_DlgStaticDef_::Create(current_x, dlg->height - 64, 0, "dialgbox.def", bottom_middle, 0, 0));
        current_x += 64;
        remaining_x -= 64;
    }
    // add vertical borders
    current_y = 0;
    remaining_y = dlg->height;
    while (remaining_y >= 64) {
        dlg->AddItem(_DlgStaticDef_::Create(0, current_y, 0, "dialgbox.def", left_middle, 0, 0));
        dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 64, current_y, 0, "dialgbox.def", right_middle, 0, 0));
        current_y += 64;
        remaining_y -= 64;
    }

    // add four corners
    dlg->AddItem(_DlgStaticDef_::Create(0, 0, 0, "dialgbox.def", top_left, 0, 0));
    dlg->AddItem(_DlgStaticDef_::Create(0, dlg->height - 64, 0, "dialgbox.def", bottom_left, 0, 0));
    dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 64, 0, 0, "dialgbox.def", top_right, 0, 0));    
    dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 64, dlg->height - 64, 0, "dialgbox.def", bottom_right, 0, 0));
}
Image: HWByect.png
(This post was last modified: 08.09.2017 10:24 by RoseKavalier.)
08.09.2017 04:00
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 1486
Post: #846

(08.09.2017 04:00)RoseKavalier Wrote:  EDIT2: after some thinking... started making a function for dynamic background.
Lacks color but maybe that can be fixed...
после некоторых размышлений, я начал делать функцию для динамического фона.

It works will all graphic modes as far as I could tell.
Wow nice!!
Add a repainted dialogue to the player's color. Like this
Code:
// add color this player
CALL_5 (int, __thiscall, 0x5FF400, dlg, 512, 13, 0, o_GameMgr->GetMeID());

// add four corners
dlg->AddItem(_DlgStaticDef_::Create(0, 0, 0, "dialgbox.def", top_left, 0, 0));
dlg->AddItem(_DlgStaticDef_::Create(0, dlg->height - 64, 0, "dialgbox.def", bottom_left, 0, 0));
dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 64, 0, 0, "dialgbox.def", top_right, 0, 0));    
dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 64, dlg->height - 64, 0, "dialgbox.def", bottom_right, 0, 0));
}
Image: Q5zoYrS.jpg


Скачать HoMM3 ERA 2.7.7 (Repack: Rus & HD) || (wogNativeDialogs)
08.09.2017 11:16
Visit this user's website Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #847

(08.09.2017 11:16)igrik Wrote:  Wow nice!!
Add a repainted dialogue to the player's color. Like this
Code:
// add color this player
CALL_5 (int, __thiscall, 0x5FF400, dlg, 512, 13, 0, o_GameMgr->GetMeID());
Image: Q5zoYrS.jpg

!!!!!

Я не знаю, почему и как это работает, но это **** невероятно! Огромное спасибо)

109

Ed: same logic, blue background.
же логику, синий фон.

Code:
int create_blue_background(_Dlg_* dlg)
{
    int current_x, remaining_x, current_y, remaining_y, horizontal_row;

    current_x = 0;
    remaining_x = dlg->width;
    current_y = 0;
    remaining_y = dlg->height;
    horizontal_row = 0;

    if (remaining_x < 42 || remaining_y < 42)
        return 0;

    while (TRUE) {
        while (TRUE) { // do horizontal pass first
            if (remaining_x > 0) {
                dlg->AddItem(_DlgStaticPcx8_::Create(current_x, horizontal_row * 256, min(remaining_x, 256), min(remaining_y, 256), 0, "DlgBluBk.bmp"));
                current_x += 256;
                remaining_x -= 256;
            }
            else break;
        }
        current_x = 0;        // reset x position to 0        
        remaining_x = dlg->width; // reset length of horizontal line
        remaining_y = remaining_y - 256; // update remaining y since we're done with horizontal pass
        horizontal_row = horizontal_row + 1;    // we might be working on a new row soon if condition below is met        
        if (remaining_y <= 0)
            break;        // no more rows to add
    }

    int top_left = 0;
    int top_right = 1;
    int bottom_left = 2;
    int bottom_right = 3;
    int left_middle = 4;
    int right_middle = 5;
    int top_middle = 6;
    int bottom_middle = 7;

    // add horizontal borders    
    current_x = 0;
    remaining_x = dlg->width;
    while (remaining_x >= 42) {
        dlg->AddItem(_DlgStaticDef_::Create(current_x, 0, 0, "DlgBluBo.def", top_middle, 0, 0));
        dlg->AddItem(_DlgStaticDef_::Create(current_x, dlg->height - 42, 0, "DlgBluBo.def", bottom_middle, 0, 0));
        current_x += 42;
        remaining_x -= 42;
    }
    // add vertical borders
    current_y = 0;
    remaining_y = dlg->height;
    while (remaining_y >= 42) {
        dlg->AddItem(_DlgStaticDef_::Create(0, current_y, 0, "DlgBluBo.def", left_middle, 0, 0));
        dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 42, current_y, 0, "DlgBluBo.def", right_middle, 0, 0));
        current_y += 42;
        remaining_y -= 42;
    }

    // add four corners
    dlg->AddItem(_DlgStaticDef_::Create(0, 0, 0, "DlgBluBo.def", top_left, 0, 0));
    dlg->AddItem(_DlgStaticDef_::Create(0, dlg->height - 42, 0, "DlgBluBo.def", bottom_left, 0, 0));
    dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 42, 0, 0, "DlgBluBo.def", top_right, 0, 0));
    dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 42, dlg->height - 42, 0, "DlgBluBo.def", bottom_right, 0, 0));
}
(This post was last modified: 08.09.2017 17:45 by RoseKavalier.)
08.09.2017 17:36
Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #848

Small modification for create_standard_background(...) to prevent border appearance in status bar... actually would be slightly more efficient starting from (dlg->height - 64) and working back but this works fine)
Небольшая модификация для create_standard_background(...) для предотвращения появления границы в строке состояния...

Code:
    // add vertical borders
    current_y = 0;
    remaining_y = dlg->height;
    while (remaining_y >= 64) {
        if (remaining_y - 64 <= 37)
            current_y = dlg->height - 64 - 37; // hide a bit for status bar
        dlg->AddItem(_DlgStaticDef_::Create(0, current_y, 0, "dialgbox.def", left_middle, 0, 0));
        dlg->AddItem(_DlgStaticDef_::Create(dlg->width - 64, current_y, 0, "dialgbox.def", right_middle, 0, 0));
        current_y += 64;
        remaining_y -= 64;
    }

~~~~~

Are there structures available for Quest Guards / Seer Huts? Only thing I could find is QU receiver from ERA but no structure... I could probably map these myself but if someone has and is willing to share, would be quite helpful!
Имеющиеся конструкции для охранников квеста / хижины Провидца? Единственное, что я мог найти, это QU приемник от эпохи, но не структура... Я мог бы сопоставить его сам, но если кто-то имеет и готов поделиться, это было бы очень полезно!

e.g.
struct + 0x3C = deadline / крайний срок
(This post was last modified: 18.09.2017 05:38 by RoseKavalier.)
18.09.2017 05:05
Find all posts by this user Quote this message in a reply
gamecreator Offline
Administrators

Posts: 7146
Post: #849

(18.09.2017 05:05)RoseKavalier Wrote:  Are there structures available for Quest Guards / Seer Huts? Only thing I could find is QU receiver from ERA but no structure... I could probably map these myself but if someone has and is willing to share, would be quite helpful!
Link updated. It has the sources you need.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
18.09.2017 20:55
Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #850

Wonderful, much appreciated. What a great community!
19.09.2017 05:14
Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #851

Hello... another question I can't seem to solve.
Привет ... другой вопрос, который я не могу решить.

Code:
dlg->AddItem(_DlgTextEdit_::Create(50, 360, 400, 60, 13, "1234", "medfont.fnt", 1, 1, "DlgBluBk.PCX", 5, 4, 0, 0));

// _DlgTextEdit_* Create(int x, int y, int width, int height, int max_len, char* text, char* font_name, _dword_ text_color, _dword_ text_align, char* bkground_pcx8_name, int id, _bool_ has_border, int border_width, int border_height)

Is there an easy way to restrict which characters can be input in _DlgTextEdit_?
e.g. digits only
Есть ли простой способ ограничить, какие символы могут быть введены в _DlgTextEdit_?
например только цифры
Image: zFCZDEQ.png
26.09.2017 09:02
Find all posts by this user Quote this message in a reply
Valery Offline

Posts: 1920
Post: #852

Is there some restriction from HD for that? Because I can't anymore input any digits in that box and I can't find any tweak about in HD.

@Edit: I found, HD requires ctrl hold to change digits.


Era mods and utilities
(This post was last modified: 26.09.2017 11:12 by Valery.)
26.09.2017 11:08
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 1486
Post: #853

(26.09.2017 09:02)RoseKavalier Wrote:  Hello... another question I can't seem to solve.
Is there an easy way to restrict which characters can be input in _DlgTextEdit_?
I do not know how to do it yet. But I'll figure it out.


Скачать HoMM3 ERA 2.7.7 (Repack: Rus & HD) || (wogNativeDialogs)
26.09.2017 18:08
Visit this user's website Find all posts by this user Quote this message in a reply
RoseKavalier Offline

Posts: 18
Post: #854

@Valery
You don't need to press Control, just click in the area and you can type numbers. This is not a HD feature, it is available with regular HoMM3 - or at the very least it worked on my 4.0 copy without HDmod.

@igrik
Thanks)
I looked at function that does for creatures but I got lost.
0x5BB000 (process command)
0x5FF3A0 (load correct text to 0x697428)

Alternatively, I thought of reading text from edit and removing unwanted characters - then load back text without unwanted characters to edit.

Спасибо)
Я смотрел на функцию, которая делает для существ, но я потерялся.
0x5BB000 (команда процесса)
0x5FF3A0 (загрузить правильный текст в 0x697428)

В качестве альтернативы, я думал о чтении текста из редактирования и удалении нежелательных символов, а затем загружать текст без ненужных символов для редактирования.
Code:
proc:
    (print to buffer) ((_DlgTextEdit_*)dlg->GetItem(edit_id))->text;
    (remove non-digits from buffer);
    ((_DlgTextEdit_*)dlg->GetItem(edit_id))->text = buffer;

I have not had time to try and code it and test so no idea if it could/would work.
27.09.2017 08:35
Find all posts by this user Quote this message in a reply
Valery Offline

Posts: 1920
Post: #855

Nope, typing directly digits has no effect, need to hold control key in HD mod. Without HD is ok.


Era mods and utilities
27.09.2017 15:50
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-2018 MyBB Group