Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с удачей!
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды > Скрипты
ERMMASTER
Итак в прошлом году я уже поднимал этот вопрос, потом забил и сейчас довожу дело до конца..

С прошлого раза я знаю что флага удачи(как например морали) в игре нет (или его не нашли)
На вопрос как определить сработала ли у юнита в текущем раунде удача мне ответили:

****
Наверно единственный вариант - вручную посчитать урон, который должен быть нанесен существу, и если он примерно в 2 раза меньше текущего (!!MF:D), значит, видимо, выпала удача.
Можно, наверно, как-нибудь через UN:C узнать...
****
Итак моя задача сделать так чтоб при срабатывании удачи в 50% случаев наносился еще 50% доп.урона. Вот что я сделал..

!?MF1&v5105=1; Тригер на атаку (v5105 определяет есть ли у героя нужный для срабатывания скил)

!!BG:Q?y8; /сиотрим кто ходит
!!FU&y8<>0:E; /если не левая сторона то выходим
!!BG:N?y1; /№ текужего стэка
!!BMy1:T?y2; /тип текущего стэка
!!FU&y1>20:E; /если стэк врага(правой стороны) выходим
!!VRy7:Sy1; /запоминаем номер стэка в y7
!!BMy1:U1/?y2; /берем минимальный урон стэка
!!BMy1:N?y3; /берем количество воинов в стэке
!!BMy1:A?y5; /берем атаку(с бонусами стэка)
!!VRy5:Sy5*5; /т.к. каждая ед. атки это +5% дамаги сразу вносим это в переменную
!!VRy5&y5>400:S400; /т.к. бонус дамаг от атаки не может быть больше 400% исключаем такую возможность
!!VRy4:Sy3*y2; /умножаем кол-во существ на их минимальный урон
!!VRy8:Sy4*50:100; /берем 50% этого показателя (т.к. при срабатывании удачи урон не удваеваеться а увеличиваеться на 50%)

!!VRy6:Sy4*y5:100; /получаем доп. урон с учетом атаки
!!VRy4:Sy4+y6; /прибавляем этот урон
!!MF:N?y1; /берем номер атакуемого отряда
!!BMy1:D?y5; /берем его защиту
!!VRy3:Sy5*25:1000; /Каждая ед. защиты уменьшает урон на 2.5% учитываем это
!!VRy3&y3>70:S70; /не может снижать урон более чем на 70% исключаем такое
!!VRy6:Sy4*y3:100; /вычисляем % урона, который "уйдет в защиту'
!!VRy4:Sy4-y6; /вычитаем этот урон
!!VRy4:+y8; /прибавляем 50% (типа сработала удача)

!!MF:D?y1; /смотрим какой урон нанесен
!!FU&y1<y4:E; /если этот урон меньше чем тот что мы расчитали +50% выходим(значит удача не сработала)
!!VRy6:S1R1; /кидаем кость на 50%
!!FU&y6=1:E; /смотрим нрань если несовпала выходим

!!BMy7:V18; /анимация удачи на атакующий отряд (будет 2 анимации удачи эта+родная) так мы увиди что сработал скил дамага
!!VRy2:Sy1*50:100; /50% от урона
!!VRy1:Sy1+y2; /прибавляем их к урону
!!VRz2:M3/y1; /переводим строковую переменную в числовую

!!BU:Mz2; /сообщение в быструю строку с нанесенным уроном
!!MF:Fy1; /наносим отредактированный урон


Вот такой гемморой! при проверке с маленькими показателями атаки/защиты все работает, но на больших картах со сверх показателями эта фигня часто срабатывает даже если небыло удачной атаки я уже заманался искать что тут неверно...
HELP!!!!
Berserker
А что за чай "Уда"?
Дьяк
А навыки героя? Кинь название дефа удачи, может чем помогу.
ERMMASTER
УдаЧай! laugh.gif) Нашел к чему придраться, ну соскочил палец при наборе)
Всмысле название дэфа удачи??

Добавлено ([mergetime]1263762804[/mergetime]):
Исправил название темы чтоб не отвлекались на подколки а помогли разобраться с проблемой!
feanor
http://forum.df2.ru/index.php?showtopic=68...ndpost&p=193891

Внизу поста написано, как задавать-считывать удачу.
Можно попробовать считывать её в 77007 событии Эры, обнулять и на основе считанного значения прикручивать свой механизм.
tolich
C09SPA0.DEF - удача
C10SPF0.DEF - неудача
C09SPW0.DEF - мораль
C14SPE0.DEF - немораль

Добавлено ([mergetime]1263764926[/mergetime]):
feanor: чел хочет узнать, сработала удача или нет, а не повысить или понизить...
ERMMASTER
tolich спасибо конечно, но чем мне это поможет? Может я чегото непонял обьясни подробнее как DEF может помочь определить сработала ли удача?
Haart of the Abyss
Цитата
!!VRy5:Sy5*5; /т.к. каждая ед. атки это +5% дамаги сразу вносим это в переменную
!!VRy5&y5>400:S400; /т.к. бонус дамаг от атаки не может быть больше 400% исключаем такую возможность
!!VRy4:Sy3*y2; /умножаем кол-во существ на их минимальный урон
!!VRy8:Sy4*50:100; /берем 50% этого показателя (т.к. при срабатывании удачи урон не удваеваеться а увеличиваеться на 50%)

!!VRy6:Sy4*y5:100; /получаем доп. урон с учетом атаки
!!VRy4:Sy4+y6; /прибавляем этот урон
!!MF:N?y1; /берем номер атакуемого отряда
!!BMy1:D?y5; /берем его защиту
!!VRy3:Sy5*25:1000; /Каждая ед. защиты уменьшает урон на 2.5% учитываем это
!!VRy3&y3>70:S70; /не может снижать урон более чем на 70% исключаем такое
!!VRy6:Sy4*y3:100; /вычисляем % урона, который "уйдет в защиту'
Атака с защитой работают не так. Насколько я понял, ваш скрипт построен в рассчёте на то, что игра сначала увеличивает урон в соответствии с такой, затем уменьшает его в соответствии с защитой. На самом же деле защита вычитается из атаки и в зависимости от результата урон либо увеличивается, либо уменьшается.

P. S. Я нуб и не шарю.
Berserker
Лорд Хаарт, верно. И важно не забыть про ограничения макс бонуса атаки в 300% и макс. защиты в 70%.

Цитата
tolich спасибо конечно, но чем мне это поможет?

Дьяк в отладчике найдёт по перекрёстной ссылке, где юзается деф. Я так на мораль выходил, если не ошибаюсь.
pHOMM
Если честно, граждане, тут много тонких моментов. Основной конечно это всякие блесы шилды арморы офенсы и т.п., как их учитывать при той реализации, что предлагает автор ???
Второй момент, автор берёт специальный расчёт дамагу, однако лучше воспользоваться конкретным изученным алгоритмом расчёта - в физмиге http://homm3world.narod.ru там скачаете физмиг, в нём лист № 21 или пункт 5.7 в оглавлении. Там чётко описано как и на что работает атака, защита, спелы и УдаЧай.
Ещё один очень жуткий момент - ненависть/иммуны существ(что можно глянуть там же в физмиге, пункт 2.2) , это будет портить все эти рас чёты, придётся и это учитывать...

да и расчёт нанесённого урона, просто жесть математики - выстрелы полной/ неполной стрелы, рукопашная стрелков и штраф стен города (плюс иже с ними армор арчери, 2 разных лука, один из них сборный, и 3 арта на арчери ) не будем думать каков расчёт для спецов по всему этому делу *death*

ну и даже не будем вспоминать о таких моментах как баллиста (на неё тоже удача влияет) и опять же спецам по баллисте...

Сколько всё это считать и учитывать *rofl* ?

Мой совет - искать структуры в экзешке/памяти, трудоёмко, зато надёжно !!

П.С. Извиняюсь за напрашиваемость, а мне помогите пжлст, с адресами структур для препятствий на поле битвы http://forum.df2.ru/index.php?showtopic=54...F%BDentry38295#
ERMMASTER
pHOOM Ты абсолютно прав! Я слишком поверхностно подошел к данному вопросу. Пытаться учесть все эти тонкости ради такой реализации, это разрыв мозга! laugh.gif
Остаеться ждать другой вариант или надеяться что кто-то таки найдет флаг удачи!
P.S. Всем СпасибО!
pHOMM
Есть, конечно, и такая мысль: ресивер ММ, он позволяет получать текст из лога битвы, надо только избрать все варианты всяких разных переводов и кучи языков начиная с английского для процедуры проверки строки на вхождение слова Удача, ещё и в разных падежах )))

Есть и хитрый способ, берем функцию замены строк http://forum.df2.ru/index.php?showtopic=5931 и делаем свою собственную строку для лога битвы при выпадении удачи, например с одной англ а в слове удача, и там уже дело техники, дерзайте , автор )


UPD Так-c, там же в теме по ссылке, в конце темы МоР сделал чтение строк из файлов, тебе нужен genrltxt.txt там 54 строка - "Удача улыбнулась %s", меняй её функцией МоР'а на свою строку, потом в битве читай каждую строку лога и загоняй в функцию проверки строк (её уж самому только писать, сравнивать строку лога со своей строкой, в итоге достигается языко/переводо - независимый скрипт) и, таким образом, думаю, ты достигнешь нужного тебе результата !!!

Тут только возникает неизвестная вещь - если строка лога записывается после нужного действия, то извиняй, получится только факт что удача сработала, но последствия удачи уже применены (убито больше народу), и тут как менять уж как то жестко надо...
ERMMASTER
Интересная идея! Мне такого в голову не могло прити)
Буду пробовать, еще раз спс.
pHOMM
Ну, что? Разобрался с удачей тем способом со строками ?? Всё-таки эффект удачи произходит до вывода строки в лог битвы, или после ? Если после, то можно ли на эффект повлиять ?
Дьяк
Ну с работой удачи - я разобрался, но написать скрипт, если и возможно, то только через эру и очень геморройно. Во-первых, обращение к длл Angel должно быть в том же потоке, что и поток обрабатывающий битву и вероятность удачи (вероятнее всего так оно и есть). Т.к. случайное число для генерации получается из TlsGetValue (ячейка №12). Далее несколько действий над полученным значением (значение в eax):
MOV ECX,[DWORD EAX+14]
IMUL ECX,ECX,343FD
ADD ECX,269EC3
MOV [DWORD EAX+14],ECX
MOV EAX,ECX
SHR EAX,10
AND EAX,7FFF

и

SUB ESI,EDI
CDQ
INC ESI
IDIV ESI
MOV EAX,EDX
ADD EAX,EDI

в eax - значение, которое сравнивается с удачей героя, если оно меньше или равно, то удача срабатывает иначе нет.




Добавлено ([mergetime]1264171116[/mergetime]):
Хотя... можно попробовать вызвать процедуру генерации случайного числа для удачи через эру, если получиться и сравнивать с удачей героя. - это лучший вариант. Адресс процедуры 50C7C0h тип register eax = удача героя edx = 18 ecx = 1
результат есно в eax
ERMMASTER
Способ со строками прокатил но немного с предподвыпердвертом smile.gif
В строку естественно добавляеться после срабатывания удачи. такчто после считывания и сравнения можно определить была ли удача, но изменить урон в текущей атаке никак, только функцией (после действия) наносим доп. урон через !!BM:K# но при этом монстр будет странно дергаться после атаки и еще если этот урон его добьет, то останеться картинка отряда, но без численности. Вобщем баги.. баги

Добавлено ([mergetime]1264346563[/mergetime]):
А с Эрой я не сталкивался и абсолютно не шарю в этом... Но все равно спасибо Дьяк!
Haart of the Abyss
Цитата
Есть, конечно, и такая мысль: ресивер ММ, он позволяет получать текст из лога битвы, надо только избрать все варианты всяких разных переводов и кучи языков начиная с английского для процедуры проверки строки на вхождение слова Удача, ещё и в разных падежах
Смотрите с падежами не перемудрите. А то будет срабатывать после каждого каста одноимённого заклинания.
tolich
Есть другая идея: генерировать сработавшую удачу/неудачу скриптом, а чтобы она не срабатывала стандартно, перед каждым действием монстра принудительно ее обнулять. Тогда вопрос "сработала/не сработала" вообще стоять не будет.
DracoLich
хоббиты
tolich
Что, хоббитам нельзя поставить нулевую удачу, в принципе?
DracoLich
вообще никак. ни часы, ни -9999 удачи
tolich
А через флаг 213?
DracoLich
хм, работает ^^
вопрос снят
ERMMASTER
Вааай Задача всей моей жизни решена! Спасибо ОГРОМНОЕ!!!
feanor
Я это еще в пятом посте предложил laugh.gif
tolich
Мда. Даже я не понял, что всего лишь повторил чью-то мысль... sad.gif
ERMMASTER
Цитата(feanor @ 26 Jan 2010, 22:37)
Я это еще в пятом посте предложил laugh.gif


Да ты прав biggrin.gif
Ну надо проще выражаться, понятнее! Мы крестьяне скриптинга Архи-магам не ровня idontno.gif

Добавлено ([mergetime]1264605429[/mergetime]):
!?MF1&v5008=998; <<<<

А где же ты присваиваешь v5008 значение 998??
Стало быть последний тригерр в котором производиться это присваивание нужно переместить вверх до проверки иначе он не срабатывает!

Стало быть должно быть так?
CODE

ZVSE
!?BG0;
!!BG:A?v5008 N?v5009 E?v5010;
!!FU&v5008<>7:E;

!!BMv5009:G213/?y1/d G213/0/d;

!!VRy1&y1>3:S3;

!!VRy2:S1 R100;
!!VRy3:S5 *y1;

!!FU&y2>y3:E;
!!BMv5009:V18 T?y4 N?y5;
!!VRy5&y5=1:S0;
!!VRy5&y5>1:S1;
!!UN:N3/z1/y4/y5;
!!VRz1S^%Z1
!!BU:Mz1;
!!VRv5008:S999;

!?MF1&v5008=999;
!!MF:F?y4;
!!VRy4:*3 :2;
!!MF:Fy4;

!?MF1&v5008=6;
!!BMv5009:G213/?y1/d G213/0/d F?y-2;
!!VRy1&y1>3:S3;

!!VRy2:S1 R100;
!!VRy3:S5 *y1;

!!VRv5008:S998;

!!FU&y2>y3:E;

!!MF:F?y4;
!!VRy4:*3 :2;
!!MF:Fy4;
!!BMv5009:V18 T?y4 N?y5;
!!VRy5&y5=1:S0;
!!VRy5&y5>1:S1;
!!UN:N3/z1/y4/y5;
!!VRz1S^%Z1
!!BU:Mz1;

!?MF1&v5008=998;
!!BMv5009:G213/0/d;
!!BMv5010:G213/?y1/d G213/0/d;
!!VRy1&y1>3:S3;

!!VRy2:S1 R100;
!!VRy3:S5 *y1;

!!FU&y2>y3:E;

!!MF:F?y4;
!!VRy4:*3 :2;
!!MF:Fy4;
!!BMv5010:V18 T?y4 N?y5; êîëè÷åñòâî
!!VRy5&y5=1:S0;
!!VRy5&y5>1:S1;
!!UN:N3/z1/y4/y5;
!!VRz1S^%Z1
!!BU:Mz1;


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

Добавлено ([mergetime]1264605512[/mergetime]):
Чето форум перепутал куда сообщение ставить )
DracoLich
но есть еще тонкость - такая эмуляция удачи не даст вероятности удачного овтета на атаку, а также самой анимации перед ударом
DracoLich
CODE
ZVSE
!?BG0;
!!BG:A?v5008 N?v5009 E?v5010; v5008 хранит тип атаки (7-стрельба, 5-рукопаш) v5009 - номер атакующего (нужен для рукопашников)
**v5010 хранит номер атакуемого стека
!!FU&v5008<>7:E;

!!BMv5009:G213/?y1/d G213/0/d; получаем удачу в y1 и обнуляем ее

!!VRy1&y1>3:S3; максимум 3 удачи

!!VRy2:S1 R100; 100% всего
!!VRy3:S5 *y1; по 5% за 1 удачу

!!FU&y2>y3:E; если не прошла удача, выход
!!BMv5009:V18 T?y4 N?y5; выводим анимацию, получаем тип монстра и его количество
!!VRy5&y5=1:S0; один монстр - одинарное имя
!!VRy5&y5>1:S1; больше 1 - множественное имя
!!UN:N3/z1/y4/y5; имя монстра
!!VRz1S^%Z1 сегодня удачливы! Цель получает 150% урона.^; сообщение
!!BU:Mz1; вывод сообщения
!!VRv5008:S999; флаг для дальней атаки

!?MF1&v5008=999; в случае дальней атаки
!!MF:F?y4; нанесенный урон в y4
!!VRy4:*3 :2;
!!MF:Fy4;

!?MF1&v5008=998;
!!BMv5009:G213/0/d;
!!BMv5010:G213/?y1/d G213/0/d; удача отряда, сов. ответный удар, в y1, и обнуляем
!!VRy1&y1>3:S3; максимум 3 удачи

!!VRy2:S1 R100; 100% всего
!!VRy3:S5 *y1; по 5% за 1 удачу

!!FU&y2>y3:E;

!!MF:F?y4; нанесенный урон в y4
!!VRy4:*3 :2;
!!MF:Fy4;
!!BMv5010:V18 T?y4 N?y5; выводим анимацию, получаем тип монстра и его количество
!!VRy5&y5=1:S0; один монстр - одинарное имя
!!VRy5&y5>1:S1; больше 1 - множественное имя
!!UN:N3/z1/y4/y5; имя монстра
!!VRz1S^%Z1 сегодня удачливы! Цель получает 150% урона.^; сообщение
!!BU:Mz1; вывод сообщения

!?MF1&v5008=6; в случае ближней атаки
!!BMv5009:G213/?y1/d G213/0/d F?y-2; удача атакера в y1; флаги атакующего в y-2
!!VRy1&y1>3:S3; максимум 3 удачи

!!VRy2:S1 R100; 100% всего
!!VRy3:S5 *y1; по 5% за 1 удачу

!!VRv5008:S998; флаг для "ответ на удар"

!!FU&y2>y3:E;

!!MF:F?y4; нанесенный урон в y4
!!VRy4:*3 :2;
!!MF:Fy4;
!!BMv5009:V18 T?y4 N?y5; выводим анимацию, получаем тип монстра и его количество
!!VRy5&y5=1:S0; один монстр - одинарное имя
!!VRy5&y5>1:S1; больше 1 - множественное имя
!!UN:N3/z1/y4/y5; имя монстра
!!VRz1S^%Z1 сегодня удачливы! Цель получает 150% урона.^; сообщение
!!BU:Mz1; вывод сообщения

рабочий (вроде) вариант, но иногда срабатывает "настоящая" удача. как с ней бороться...
DracoLich
нене, я потом переместил код, все равно срабатывает и настоящая...
бтв какой-то баг форума с отображением сообщений ^^
Etoprostoya
Цитата(DracoLich @ 27 Jan 2010, 18:52)
бтв какой-то баг форума с отображением сообщений ^^

Он срабатывает, если у кого-то неправильно поставлен часовой пояс. idontno.gif У меня было так, пока я время не поменял. У ERMMASTER'а так, наверное.
tolich
Нет, такое бывает, если написать сообщение, удалить и написать новое. Обычный глюк матрицы. ©
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.