(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);}
  
 
			 
			
			
  
game bug fixes extended.dll  ||  My Plugins  ||  My GitHub
			
				
(This post was last modified: 27.09.2017 11:29 by igrik.)
 
			 
		 |