Current time: 23.01.2025, 10:30 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Ваши вопросы по ERM-скриптам
Author Message
SergOz Offline

Posts: 1320
Post: #9166

igrik, да, блин, бывает...
Прочитав буквально первую строку твоего поста я всё понял. Я был прав насчёт сравнения текущего опыта с потенциально возможным уровнем, но маленький шаг (в голове) от таблицы в сторону цикла не сделал.
Код ещё не смотрел. Вечером попробую сам написать и потом выложу.
Спасибо! Thank_you


Карта-мод "Война на Холсте"
(This post was last modified: 10.11.2023 15:28 by SergOz.)
10.11.2023 00:30
Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1320
Post: #9167

igrik, ну, мой код оказался немного другим. Но он исправно работает 148

Столкнулся с тем, что в событии FU(OnUnequipArt), при обновлении экрана, происходит краш.
А ведь игрок может одевать/снимать арт сколько угодно раз, даже для прикола, так как я в этом квесте меняю не только уровень героя, но и его имя и портрет. Потому обновление экрана необходимо.
Для обновления экрана героя и всех прочих изменений, при снятии арта (это Шлем Белого Единорога с изменённым дэфом), пришлось вызывать функцию из FU(OnHeroScreenMouseClick).

Вот собственно сам код. Для краткости строчек (да и мне так привычнее)) кое-где не использую константы.

  1. !?FU(OnHeroScreenMouseClick);
  2. !!CM:F?(flag:y)I?(place:y)S?(subtype:y);
  3. !!FU(HelmUnicornUneqip)&(flag)=0/(place)=2/(subtype)=12:P; клик ЛКМ на слот головы
  4. !?FU(HelmUnicornUneqip);
  5. !!HE-1:A2/(ART_HELM_OF_THE_ALABASTER_UNICORN)/d/?(helm:y);
  6. !!FU&(helm)=0:E;
  7. !!HE(CURRENT_HERO):E?(exp:y)/d/1;
  8. !!re i/0/75;
  9. !!VR(data:y):Si*4 +8002732;
  10. !!UN:C(data)/4/?(must:y);
  11. !!VR(difference:y):S(must)-(exp);
  12. !!br&(difference)>0;
  13. !!en;
  14. !!VR(level:y):Si +1;
  15. !!HE(CURRENT_HERO):Ed/(level);
  16. !!SN:D;

P.S. Теперь попробую протестировать твой код. Если пойму что к чему 96


Карта-мод "Война на Холсте"
(This post was last modified: 10.11.2023 15:27 by SergOz.)
10.11.2023 08:56
Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1320
Post: #9168

Georgv, меня заинтересовала твоя идея насчёт копирования клонами опыта от "родительского" стека. Только я думаю что такая фишка должна быть только у героя - специалиста по заклинанию "Клон" или, в крайнем случае, если герой имеет экспертный навык магии Воды. Потому нужно делать соответствующие проверки. Вот мой скрипт, но я его не тестил тщательно.
  1. ZVSE2
  2. !#HE(HERO_CAITLIN):X3/65; даю Caitlin спецу по "Клону" (для теста)
  3. !?FU(OnBeforeBattleAction); BG0
  4. !!BG:A?(actionType:y); узнаю тип действия
  5. !!if&(actionType)=1; если колдует герой
  6. !!BG:S?(spell:y); узнаю номер колдуемого заклинания
  7. !!if(spell)=65; если это "Клон"
  8. !!HE(CURRENT_HERO):X?(spec:y)/?(spell:y); узнаю специальность активного героя
  9. !!VRi^improvedClone^|(spec)<>3/(spell)<>65:S0; если герой - не спец по "Клону"
  10. !!VRi^improvedClone^&(spec)=3/(spell)=65:S10; если герой - спец по "Клону"
  11. !!en;
  12. !!en;
  13. !?MM0&i^improvedClone^=10;
  14. !!MM:D?(gex:y); номер гекса, на который наведен курсор
  15. !!FU&(gex)<1|(gex)>185:E; если за пределами поля - выход
  16. !!BU:E(gex)/?(stack:y); номер стека на гексе
  17. !!FU&(stack)=-1:E; если нет стека - выход
  18. !!BM(stack):U5/?(klon:y); проверка есть ли у него клон
  19. !!if&(klon)>0; если отряд имеет клон
  20. !!VR(stackEA:y):S(stack) *-1 -1; номер отряда для EA
  21. !!EA(stackEA):E?(exp:y)/d/d/d; смотрим кол-во опыта у отряда
  22. !!VR(expEA:y):S(klon) *-1 -1; номер отряда клона для EA
  23. !!EA(expEA):E(exp)/2/d/d; добавляем клону опыт с родительского отряда
  24. !!en;

P.S. Можно ещё считывать наложенные на "родительский" отряд заклинания и копировать их клону, но это, наверное, перебор)


Карта-мод "Война на Холсте"
(This post was last modified: 26.11.2023 02:44 by SergOz.)
26.11.2023 02:38
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16702
Post: #9169

!!HE(CURRENT_HERO) точно установлен в BG? Обычно получаем сторону и героя уже через BH(side):N или через Era Erm Framework глобальную переменную вида i^battle_hero_%i(battle_current_side)^.


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

Posts: 1320
Post: #9170

(26.11.2023 04:11)Berserker Wrote:  !!HE(CURRENT_HERO) точно установлен в BG? Обычно получаем сторону и героя уже через BH(side):N или через Era Erm Framework глобальную переменную вида i^battle_hero_%i(battle_current_side)^.

id активной стороны, в моём скрипте, не задействовано. А вообще у меня, при тесте, выдавало корректные данные.
За неимением свободного времени на глубокий тестинг, предоставим его Georgv.

P.S. Надеюсь, он поделится итогом)


Карта-мод "Война на Холсте"
(This post was last modified: 26.11.2023 05:51 by SergOz.)
26.11.2023 05:37
Find all posts by this user Quote this message in a reply
Georgv Offline

Posts: 30
Post: #9171

(26.11.2023 02:38)SergOz Wrote:  Georgv, меня заинтересовала твоя идея насчёт копирования клонами опыта от "родительского" стека. Только я думаю что такая фишка должна быть только у героя - специалиста по заклинанию "Клон" или, в крайнем случае, если герой имеет экспертный навык магии Воды. Потому нужно делать соответствующие проверки. Вот мой скрипт, но я его не тестил тщательно.
SergOz, Спасибо ! Я сейчас не дома - как буду на месте, потестирую. Там основная проблема была в том что если добавить клону опыт через EA. то он сохраняется на всех призванных отрядах с тем же номером и обнулить нельзя. Так то я копировать опыт научился, но побороть сохранение опыта не смог. Как по мне опыт у клонов должен копироваться у всех героев, а то странно получается - при нулевом опыте отряд клонируется с полной его силой, а чем выше опыт отряда тем слабее.
05.12.2023 00:38
Find all posts by this user Quote this message in a reply
Georgv Offline

Posts: 30
Post: #9172

SergOz, Нет увы, так тоже не работает. Создал клон опытного голема - его убили, затем создал клон архангела. Все характеристики атаки защиты скорости итд. у клона архангела остались как у голема.
(This post was last modified: 05.12.2023 01:55 by Georgv.)
05.12.2023 01:08
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2373
Post: #9173

(05.12.2023 01:08)Georgv Wrote:  Создал клон опытного голема - его убили, затем создал клон архангела. Все характеристики атаки защиты скорости итд. у клона архангела остались как у голема.

В SoD-е нельзя призывать разные типы монстров в одном бою. Часть механики призывных заклинаний. В баттлеменеджере записывается тип призывного монстра - записывайте туда значение -1 с помощью UN:C.
05.12.2023 02:05
Find all posts by this user Quote this message in a reply
Georgv Offline

Posts: 30
Post: #9174

XEPOMAHT, Спасибо ! Но если бы я еще знал как, куда и когда записать этот -1. Не настолько я мастер в un:с увы...
05.12.2023 02:23
Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #9175

(05.12.2023 02:23)Georgv Wrote:  XEPOMAHT, Спасибо ! Но если бы я еще знал как, куда и когда записать этот -1. Не настолько я мастер в un:с увы...
Всё достаточно просто. Нужно всего лишь немного разобраться.
Что такое UN:C

Полное описание структур героев, менджера битвы и стека в битве.

Пример:
  1. ; небольшое обучение по UN:C
  2. ZVSE2 ; новый инициализатор кода на ERM2, позволяющий получать переменные так = "?(battleMgr:y);"
  3. !?FU(OnStackToStackDamage);
  4. ; Триггер получения урона в бою (стек актакует другой стек)
  5. ; параметры функции (Получить - можно, некторые даже и нужно. Изменить - нельзя! ( = если изменить - игра скорее всего вылетит))
  6. !#VA(attacker:x) (defender:x);
  7. !#VA(finalDamageConst:x) (finalDamage:x);
  8. !#VA(basicDamage:x) (damageBonus:x);
  9. !#VA(isDistant:x) (distanceArg:x) (isTheoretical:x);
  10. ; выход, если теоретическая битва (AI)
  11. !!FU|(isTheoretical)=(TRUE):E; ( "(TRUE)" смотри мод "..mods/Era Erm Framework/Data/s/9999 era - consts.erm")
  12. ; получаем структуры атакующего и защищающегося стеков
  13. !!BM(attacker):Z?(attackerStack:y);
  14. !!BM(defender):Z?(defenderStack:y);
  15. ; выход, структура стека пуста (защита на дурака)
  16. !!FU&(defenderStack)=(NULL):E; ( "(NULL)" смотри мод "..mods/Era Erm Framework/Data/s/9999 era - consts.erm")
  17. ; указатель на Менеджер битвы (именно тут не нужен, но чтобы просто не искать его. Так, для инфы)
  18. !!UN:C6919200/4/?(battleMgr:y); // тут 3 параметра у ресивера UN:C
  19. ; атакующий монстр получаем id монстра в бою (_int32_ creature_id; // +52 0x34 (тип монстра))
  20. !!UN:C(attackerStack)/52/4/?(creature_id:y); // а тут "прокачанный" ресивер UN:C (второй параметр - это просто плюс смещение от начального адреса)
  21. !!UN:C(attackerStack)/132/4/?(flags:y); // получаем флаги монстра (см. рессивер BM:X)
  22. !!if&(flags)&(MON_FLAG_CLONE); // ( "(MON_FLAG_CLONE это = 8388608)" смотри мод "..mods/Era Erm Framework/Data/s/9999 era - consts.erm")
  23. !!IF:M^Юхуху!!! Это же клон! Номер монстра %(creature_id)^;
  24. !!el;
  25. !!IF:M^Тю!!! Этот тип не был призван! Номер монстра %(creature_id)^;
  26. !!en;

PS: Исправил, добавив получение стека по замечанию Daemon_n


game bug fixes extended.dll || My Plugins || My GitHub
05.12.2023 05:00
Visit this user's website Find all posts by this user Quote this message in a reply
Georgv Offline

Posts: 30
Post: #9176

igrik, Спасибо ! попытаюсь разобраться.
05.12.2023 05:11
Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1320
Post: #9177

Georgv, а так?
Возможно, можно как-то покороче, но сколько не крутил - не выходит короче 148
  1. ZVSE2
  2. !#HE(HERO_CAITLIN):X3/65; даю Caitlin спецу по "Клону" (для теста)
  3. !?FU(OnBeforeBattleAction); BG0
  4. !!BG:A?(actionType:y); узнаю тип действия
  5. !!if&(actionType)=1; если колдует герой
  6. !!BG:S?(spell:y); узнаю номер колдуемого заклинания
  7. !!if(spell)=65; если это "Клон"
  8. !!HE(CURRENT_HERO):X?(spec:y)/?(spell:y); узнаю специальность активного героя
  9. !!VRi^improvedClone^|(spec)<>3/(spell)<>65:S0; если герой - не спец по "Клону"
  10. !!VRi^improvedClone^&(spec)=3/(spell)=65:S10; если герой - спец по "Клону"
  11. !!en;
  12. !!en;
  13. !?MM0&i^improvedClone^=10;
  14. !!MM:D?(gex:y); номер гекса, на который наведен курсор
  15. !!FU&(gex)<1|(gex)>185:E; если за пределами поля - выход
  16. !!BU:E(gex)/?(stack:y); номер стека на гексе
  17. !!FU&(stack)=-1:E; если нет стека - выход
  18. !!BM(stack):U5/?(klon:y); проверка есть ли у него клон
  19. !!if&(klon)>0; если отряд имеет клон
  20. !!UN:C6919200/4/?(combat:y); комбат менеджер
  21. !!BM(stack):Z?(struktStack:y); получаю структуру активного стека
  22. !!UN:C(struktStack)/+192/4/?(hpMon:y); узнаю здоровье активного стека
  23. !!UN:C(struktStack)/+196/4/?(speedMon:y); узнаю скорость активного стека
  24. !!UN:C(struktStack)/+200/4/?(atMon:y); узнаю атаку активного стека
  25. !!UN:C(struktStack)/+204/4/?(defMon:y); узнаю защиту активного стека
  26. !!UN:C(struktStack)/+208/4/?(minDamMon:y); узнаю мин урон активного стека
  27. !!UN:C(struktStack)/+212/4/?(maxDamMon:y); узнаю макс урон активного стека
  28. !!UN:C(struktStack)/+40/4/?(stackKlon:y); узнаю номер стека-клона
  29. !!VR(stackEA:y):S(stack) *-1 -1; номер родительского стека для EA
  30. !!EA(stackEA):E?(exp:y)/d/d/d; узнаём кол-во опыта у отряда
  31. !!VR(stackKlonEA:y):S(stackKlon) *-1-1; номер стека-клона для ЕА
  32. !!EA(stackKlonEA):E(exp)/2/d/d ; устанавливаем клону опыт с родительского отряда
  33. !!BM(stackKlon):Z?(struktStackKlon:y); получаю структуру стека-клона
  34. ; устанавливаю клону параметры родительского стека
  35. !!UN:C(struktStackKlon)/+192/4/(hpMon);
  36. !!UN:C(struktStackKlon)/+196/4/(speedMon);
  37. !!UN:C(struktStackKlon)/+200/4/(atMon);
  38. !!UN:C(struktStackKlon)/+204/4/(defMon);
  39. !!UN:C(struktStackKlon)/+208/4/(minDamMon);
  40. !!UN:C(struktStackKlon)/+212/4/(maxDamMon);
  41. !!en;


Карта-мод "Война на Холсте"
05.12.2023 06:52
Find all posts by this user Quote this message in a reply
Georgv Offline

Posts: 30
Post: #9178

SergOz, Да - такой вариант работает. Я уже и сам думал над таким вариантом сейчас, но тут есть две проблемы.1 - все параметры копируются не от базовых характеристик юнита, а от текущих. То есть все бонусы от заклинаний, бонус к защите если юнит стоит в защите итд. будут копированы клону. 2. - элементали, они не наследуют характеристики как клоны, но если элементаль вызывается в тот же номер отряда, что погибший клон, он почему-то копирует опыт. То есть по хорошему нужно как-то узнать базовые характеристики отряда без модификаторов и применить их. И как-то обнулять опыт элементалям при вызове.
05.12.2023 07:26
Find all posts by this user Quote this message in a reply
Georgv Offline

Posts: 30
Post: #9179

SergOz, Но так да - идея хорошая - благодарю ! В принципе на наследование бонусов от заклинаний можно даже забить - считать это фичей заклинания клон. Типа моментальная копия со всеми характеристиками юнита в данный момент времени.)) Элементалей бы как-то обнулить - наверное нужно при колдовстве заклинания призыва проходить циклом по всем юнитам, искать элементалей с флагом вызванный и им опыт ставить 0.
05.12.2023 07:47
Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1320
Post: #9180

Georgv, если хочешь без бонусов, то нужно узнавать тип монстра в родительском стеке, и считывать параметры в MA:A, MA:D, MA:S и т.д. и после устанавливать через UN:C.
P.S. а с элемами я чёт не понял проблему


Карта-мод "Война на Холсте"
(This post was last modified: 05.12.2023 08:09 by SergOz.)
05.12.2023 08:05
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-2025 MyBB Group