Ben80 писал(а):
Можно еще так делить:
- Код: Выделить всё
с->eax /= 2
c->eax >>= 1
Скопирую сюда, пожалуй, свои наработки из темы "как создать плагин для HD-мода".
Только исходный код, без готовых плагинов. Но лучше так, чем наоборот, не правда ли?
Монстры и игроки-компьютеры на любой сложности мыслят как на максимальной. Автор - igrik, я немного дополнил его код.
Принцип работы - после выдачи ресурсов сложность выставляется на 200% и возвращается на оригинальную перед расчетом очков на экране победы
Недочеты - при загрузке сохраненной игры изначально выставленная сложность не отображается. Но игра все равно ее помнит и посчитает очки на экране победы правильно!
- Код: Выделить всё
#include homm3.h
_int_ __stdcall Hook_StartNewGame(LoHook* h, HookContext* c)
{
c_chosen_difficulty = o_GameMgr->Field<_byte_>(0x1F6D8); // get initial difficulty
o_GameMgr->Field<_byte_>(0x1F6D8) = 4; // set difficulty to 200%
return EXEC_DEFAULT;
}
_int_ __stdcall c_score_calc1(LoHook* h, HookContext* c)
{
c->ecx = c_chosen_difficulty; // return initial difficulty
return EXEC_DEFAULT;
}
_int_ __stdcall c_score_calc2(LoHook* h, HookContext* c)
{
c->eax = c_chosen_difficulty; // return initial difficulty
return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x4C0107, Hook_StartNewGame);
_PI->WriteLoHook(0x4F46E2, c_score_calc1);
_PI->WriteLoHook(0x4F4723, c_score_calc2);
ПКМ по монстрам на карте дает расширенную информацию о них. Инфа от видений и дипломатии немного сместилась вниз.
Плагин двуязычный, знает русский и английский, определяет язык игры сам и отображает текст соответствующе
За основу брался плагин игрика для показа AI value нейтралов. Конечный результат зависит от используемых шрифтов.
- Код: Выделить всё
#include homm3.h
_bool_ isRusLng;
int __stdcall Y_LoadAllTXTinGames(LoHook* h, HookContext* c)
{
if ( o_CreatureInfo[0].name_single[0] != 'P' ) {
isRusLng = 1;
} else {
isRusLng = 0;
}
return EXEC_DEFAULT;
}
int c_neu_rmb_id;
int __stdcall c_get_neu_rmb(LoHook* h, HookContext* c)
{
c_neu_rmb_id = c->esi;
return EXEC_DEFAULT;
}
int __stdcall c_neu_rmb_public(LoHook* h, HookContext* c)
{
int c_neu_lv = o_pCreatureInfo[c_neu_rmb_id].level + 1;
int c_neu_at = o_pCreatureInfo[c_neu_rmb_id].attack;
int c_neu_df = o_pCreatureInfo[c_neu_rmb_id].defence;
int c_neu_sp = o_pCreatureInfo[c_neu_rmb_id].speed;
int c_neu_hp = o_pCreatureInfo[c_neu_rmb_id].hit_points;
int c_neu_d1 = o_pCreatureInfo[c_neu_rmb_id].damage_min;
int c_neu_d2 = o_pCreatureInfo[c_neu_rmb_id].damage_max;
char* c_neu_ds = o_pCreatureInfo[c_neu_rmb_id].specification_description;
if ( isRusLng == 1 )
{
sprintf(o_TextBuffer, "%s\n\nУровень: {%d}, Атака: {%d}, Защита: {%d},\nЗдоровье: {%d}, Урон: {%d}-{%d}, Скорость: {%d}.\n\n%s", o_TextBuffer, c_neu_lv, c_neu_at, c_neu_df, c_neu_hp, c_neu_d1, c_neu_d2, c_neu_sp, c_neu_ds);
}
else
{
sprintf(o_TextBuffer, "%s\n\nLevel: {%d}, Attack: {%d}, Defense: {%d},\nHealth: {%d}, Damage: {%d}-{%d}, Speed: {%d}.\n\n%s", o_TextBuffer, c_neu_lv, c_neu_at, c_neu_df, c_neu_hp, c_neu_d1, c_neu_d2, c_neu_sp, c_neu_ds);
}
return EXEC_DEFAULT;
}
...
// check language after loading all txt files
_PI->WriteLoHook(0x4EDFFD, Y_LoadAllTXTinGames);
// advanced rmb on neutrals
_PI->WriteLoHook(0x52FFEC, c_get_neu_rmb);
_PI->WriteLoHook(0x530020, c_neu_rmb_public);
_PI->WriteByte(0x530026, 120); // public y size
_PI->WriteByte(0x53002D, 100); // public y pos
_PI->WriteByte(0x530170, 217); // private y pos