Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 22 фев 2019, 09:17

Цитата:
Вот упрощенный код обмена героями в замке

Огромное спасибо! Все работает как надо!

@RoseKavalier
Thank you, it works!
Вернуться к началу

offlineАватара пользователя
Orzie  
Ветеран
Ветеран
 
Сообщения: 698
Зарегистрирован: 12 сен 2013, 15:17
Откуда: Томск
Пол: Не указан
Награды: 3
Высшая медаль (1) 3 место 1 этапа по HMM1 (1) Бонусный шлем (1)
Поблагодарили: 457 раз.

Re: Пользовательские плагины для HD мода

Сообщение Orzie » 25 фев 2019, 18:05

Никого никогда не интересовала имплементация некоторых двоечных механик? Нам вот, например, для H3SW бы очень сильно пригодилось.

 Из темы "Требуется помощь программистов" на момент 26.02.2019
1.1. Новый подбираемый объект: Лампа джиннов. Позволяет нанимать ограниченное и не растущее во времени количество джиннов. После найма последнего джинна лампа исчезает. Количество джиннов (от 2 до 4) определяется игрой на старте карты.

1.2. Новый посещаемый объект: Сфинкс. При посещении выводится диалоговое окно, в котором игрок выбирает, хочет ли он взаимодействовать со сфинксом. ИИ не посещает этот объект. При согласии игрока выводится текст т.н. "загадки" - предустанавливаемый в редакторе карт текст сообщения, а также доступно текстовое окно для набора "ответа на загадку". В случае правильного ответа игрок получает награду, предустановленную в редакторе посредством, к примеру, механики Ящика Пандоры. Обязательный тип награды - артефакт и/или ресурсы. В случае неправильного ответа герой игрока получает -3 к удаче до следующей битвы.
У нас есть несколько метастабильных прототипов для данной фичи, реализованных разными подходами. Можно взять на доработку.

1.5. Новые посещаемые объекты: жилища Героев 2. Позволяют нанимать некоторых существ на альтернативных условиях (копируя функционал Героев 2). Не могут принадлежать игроку. Не планируются быть доступными на случайных картах.
Крестьяне: бесплатный найм, количество на старте карты 1-41, недельный прирост 5-10.
Феи: бесплатный найм, количество на старте карты 15-25, недельный прирост 4-8.
Гоблины: бесплатный найм, количество на старте карты 15-40, недельный прирост 3-6.
Скелеты: бесплатный найм, количество на старте карты 10-25, недельный прирост 4-8.
Кентавры: бесплатный найм, количество на старте карты 10-20, недельный прирост 3-6.
Полурослики: бесплатный найм, количество на старте карты 20-40, недельный прирост 5-10.
Лучники: бесплатный найм, количество на старте карты 10-25, недельный прирост 2-4.
Гномы: бесплатный найм, количество на старте карты 1-21, недельный прирост 2-4.
Орки: бесплатный найм, количество на старте карты 7-10, недельный прирост 1-4.
Воры: бесплатный найм, количество на старте карты 10-25, недельный прирост 3-6.

1.6. Изменение механики посещаемого объекта: Заброшенная шахта. После захвата шахты любым игроком происходит замена объекта на стандартную работающую шахту с соответствующим спрайтом. Каждому конкретному спрайту .def выставляется в соответствие конкретный "стандартный" аналог. В случае ненахождения игрой соответствующего аналога при захвате шахты выставляется шахта с "дефолтным" спрайтом для занимаемого террейна.

1.9. Новый посещаемый объект: блокируемый телепорт. Работает аналогично обычному телепорту, но имеет название объекта "Teleport (Blockable)" и имеет двоечный функционал: при наличии стоящего героя на выходе из телепорта другой герой не способен появиться в "занятом" выходе и вступить в бой. При всех занятых выходах посещение телепорта приводит лишь к звуковому эффекту телепортации, но сам герой остаётся на месте.

2.1. Замена Минного Поля на экране осады Визарда (Башня) на стандартный ров.

2.4. Графические эффекты заклинаний лучевого типа. Анимация, аналогичная таковой в Героях 2. Принцип анимации - по требованию.
- Ледяная Стрела
- Молния
- Цепная Молния

2.5. Графические эффекты прочих заклинаний.
- Армагеддон (покраснение экрана, тряска)
- Другое
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 02 мар 2019, 07:20

Доработал функцию урона, чтобы учитывался двойной урон от марков и грандов, а также балисты при наличии артиллерии.
Все верно? Корректно получаю текущий отряд, текущего героя и наличие навыка артиллерия?
По тестам вроде все ок.

Код: Выделить всё
int __stdcall getLosses(LoHook* h, HookContext* c)
{
   int MinDamage, MaxDamage, DamageKt=1;

    _BattleStack_* foeStack = *(_BattleStack_**)(c->ebp + 8);
       
   int curStack = o_BattleMgr->GetCurrentStack()->creature_id;
   if ( curStack == CID_MARKSMAN || curStack == CID_GRAND_ELF) DamageKt = 2;

   _Hero_* CurHero = o_BattleMgr->hero[ o_BattleMgr->current_side ];
   int ARTI_Level = CurHero->second_skill[HSS_ARTILLERY];
   if ( ARTI_Level == 2 ) DamageKt = 2;
   else if ( ARTI_Level == 3 ) DamageKt = 4; 
      
   MinDamage = DamageKt*c->edi;
   MaxDamage = DamageKt*c->eax;

    MinKilled = MinDamage / foeStack->full_hp;
    if ( MinDamage % foeStack->full_hp >= foeStack->full_hp - foeStack->lost_hp ) ++MinKilled;
    if ( MinKilled > foeStack->count_current ) MinKilled = foeStack->count_current;
           
    MaxKilled = MaxDamage / foeStack->full_hp;
    if ( MaxDamage % foeStack->full_hp >= foeStack->full_hp - foeStack->lost_hp ) ++MaxKilled;
    if ( MaxKilled > foeStack->count_current ) MaxKilled = foeStack->count_current;

    return EXEC_DEFAULT;
}
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 02 мар 2019, 13:57

That should work, except you are not guaranteed to have a hero (e.g. if you are in defence) so your code in its current state will crash when trying to check artillery skill level.
Note with custom maps you can have Ballista without hero, therefore don't check if creature is ballista - do check for hero.
Код: Выделить всё
(if CurHero)


It's a good idea which I never implemented because I could never figure out what to do with Crusaders and Wolf Raiders in counterpart.
Double max damage but not minimum?

EDIT:
also you need to check there is at least 1 shot left, otherwise melee attack does not have double !
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 03 мар 2019, 08:27

Thanks, good points.
Here is a corrected code:
Код: Выделить всё
    _BattleStack_* foeStack = *(_BattleStack_**)(c->ebp + 8);
   _BattleStack_* curStack = o_BattleMgr->GetCurrentStack();
   
   int curStackID = curStack->creature_id;
   if ( curStackID == CID_MARKSMAN || curStackID == CID_GRAND_ELF) DamageKt = 2;

   _Hero_* CurHero = o_BattleMgr->hero[ o_BattleMgr->current_side ];
   if ( CurHero && curStackID == CID_BALLISTA) {
      int ARTI_Level = CurHero->second_skill[ HSS_ARTILLERY ];
      if ( ARTI_Level == 2 ) DamageKt = 2;
      else if ( ARTI_Level == 3 ) DamageKt = 4; 
   }

But I cant find, how to understand what archers are in a melee attack.


Logic for Crusaders and Wolf Raiders:
1. MinDamage, MaxDamage
2. AfterMinDamage: CounterstrikeMinDamage1, CounterstrikeMaxDamage1
3. AfterMaxDamage: CounterstrikeMinDamage2, CounterstrikeMaxDamage2
4. AfterCounterstrike1_MinDamage: MinDamage1_1, MaxDamage1_1
5. AfterCounterstrike1_MaxDamage: MinDamage1_2, MaxDamage1_2
6. AfterCounterstrike2_MinDamage: MinDamage2_1, MaxDamage2_1
7. AfterCounterstrike2_MaxDamage: MinDamage2_2, MaxDamage2_2
8. TotalMinDamage = MinDamage + Min( MinDamage1_1, MinDamage1_2, MinDamage2_1, MinDamage2_2 )
9. TotalMaxDamage = MaxDamage + Max( MaxDamage1_1, MaxDamage1_2, MaxDamage2_1, MaxDamage2_2 )
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 05 мар 2019, 02:03

Код: Выделить всё
if (mon->creature.shots)
 {
}


The difficulty with crusaders and wolf raiders is getting CounterstrikeMinDamage1, CounterstrikeMaxDamage1, CounterstrikeMinDamage2, CounterstrikeMaxDamage2.

[min ~ 2x max] englobes all possibilities, just not very precise)
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 мар 2019, 03:33

Что-то не пойму никак, о чем речь идет ))
Как связать баллистику с артиллерией, грандов с марками, да тут еще и крестоносцы с грейженными волками )) Винегрет какой-то
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 05 мар 2019, 17:07

RoseKavalier писал(а):

Код: Выделить всё
if (mon->creature.shots)
 {
}


The difficulty with crusaders and wolf raiders is getting CounterstrikeMinDamage1, CounterstrikeMaxDamage1, CounterstrikeMinDamage2, CounterstrikeMaxDamage2.

[min ~ 2x max] englobes all possibilities, just not very precise)


Can not find what is "mon".
I've tried this:
Код: Выделить всё
curStack->creature.shots

But here is a result:
Изображение


Yes, now i see problem too (last string):

Код: Выделить всё
    MinKilled = MinDamage / foeStack->full_hp;
    if ( MinDamage % foeStack->full_hp >= foeStack->full_hp - foeStack->lost_hp ) ++MinKilled;
    int count_current_AfterMinDamage = foeStack->count_current-MinKilled;
    int CounterstrikeMinDamage1 = count_current_AfterMinDamage * FunctionWhichReturnsDamageConsideringStatsAndBonuses(  curStack, foeStack ); 
Последний раз редактировалось as239 05 мар 2019, 17:17, всего редактировалось 1 раз.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 05 мар 2019, 17:15

Ben80 писал(а):

Что-то не пойму никак, о чем речь идет ))
Как связать баллистику с артиллерией, грандов с марками, да тут еще и крестоносцы с грейженными волками )) Винегрет какой-то


Речь об отображении урона в количестве убиваемых юнитов.
До правок, урон от марков и грандов отображался без учета двойного выстрела.
У баллисты, при продвинутой артиллерии тоже 2 выстрела, а при экспертной еще и двойной урон, т.е. количество убиваемых существ увеличивается на 4.
И не надо путаться в сочетаниях: баллиста у нас с артиллерией, а катапульта с баллистикой.

А вот у волков и крестоносцев, очень сложно подсчитать их двойной урон т.к. перед вторым ударом им идет ответка.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 мар 2019, 17:38

По поводу проверки у кого из клиентов подключен плагин - есть решение делать это через отправку сообщений в чат.
Какое именно это будет сообщение, задается в плагине, соответственно, выдать другой подключенный плагин за данный вряд ли получиться (если, конечно, читер не является хакером, ну а если он хакер, то с ним вообще вряд ли стоит бороться).

На днях покажу код.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6