ERMMASTER
17 Jan 2010, 21:54
Итак в прошлом году я уже поднимал этот вопрос, потом забил и сейчас довожу дело до конца..
С прошлого раза я знаю что флага удачи(как например морали) в игре нет (или его не нашли)
На вопрос как определить сработала ли у юнита в текущем раунде удача мне ответили:
****
Наверно единственный вариант - вручную посчитать урон, который должен быть нанесен существу, и если он примерно в 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
17 Jan 2010, 22:54
А что за чай "Уда"?
А навыки героя? Кинь название дефа удачи, может чем помогу.
ERMMASTER
18 Jan 2010, 00:13
УдаЧай!
) Нашел к чему придраться, ну соскочил палец при наборе)
Всмысле название дэфа удачи??
Добавлено ([mergetime]1263762804[/mergetime]):
Исправил название темы чтоб не отвлекались на подколки а помогли разобраться с проблемой!
feanor
18 Jan 2010, 00:47
http://forum.df2.ru/index.php?showtopic=68...ndpost&p=193891Внизу поста написано, как задавать-считывать удачу.
Можно попробовать считывать её в 77007 событии Эры, обнулять и на основе считанного значения прикручивать свой механизм.
tolich
18 Jan 2010, 00:48
C09SPA0.DEF - удача
C10SPF0.DEF - неудача
C09SPW0.DEF - мораль
C14SPE0.DEF - немораль
Добавлено ([mergetime]1263764926[/mergetime]):
feanor: чел хочет узнать, сработала удача или нет, а не повысить или понизить...
ERMMASTER
18 Jan 2010, 01:52
tolich спасибо конечно, но чем мне это поможет? Может я чегото непонял обьясни подробнее как DEF может помочь определить сработала ли удача?
Haart of the Abyss
18 Jan 2010, 01:57
Цитата
!!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
18 Jan 2010, 02:08
Лорд Хаарт, верно. И важно не забыть про ограничения макс бонуса атаки в 300% и макс. защиты в 70%.
Цитата
tolich спасибо конечно, но чем мне это поможет?
Дьяк в отладчике найдёт по перекрёстной ссылке, где юзается деф. Я так на мораль выходил, если не ошибаюсь.
Если честно, граждане, тут много тонких моментов. Основной конечно это всякие блесы шилды арморы офенсы и т.п., как их учитывать при той реализации, что предлагает автор ???
Второй момент, автор берёт специальный расчёт дамагу, однако лучше воспользоваться конкретным изученным алгоритмом расчёта - в физмиге
http://homm3world.narod.ru там скачаете физмиг, в нём лист № 21 или пункт 5.7 в оглавлении. Там чётко описано как и на что работает атака, защита, спелы и УдаЧай.
Ещё один очень жуткий момент - ненависть/иммуны существ(что можно глянуть там же в физмиге, пункт 2.2) , это будет портить все эти рас чёты, придётся и это учитывать...
да и расчёт нанесённого урона, просто жесть математики - выстрелы полной/ неполной стрелы, рукопашная стрелков и штраф стен города (плюс иже с ними армор арчери, 2 разных лука, один из них сборный, и 3 арта на арчери ) не будем думать каков расчёт для спецов по всему этому делу *death*
ну и даже не будем вспоминать о таких моментах как баллиста (на неё тоже удача влияет) и опять же спецам по баллисте...
Сколько всё это считать и учитывать *rofl* ?
Мой совет - искать структуры в экзешке/памяти, трудоёмко, зато надёжно !!
П.С. Извиняюсь за напрашиваемость, а мне помогите пжлст, с адресами структур для препятствий на поле битвы
http://forum.df2.ru/index.php?showtopic=54...F%BDentry38295#
ERMMASTER
18 Jan 2010, 10:16
pHOOM Ты абсолютно прав! Я слишком поверхностно подошел к данному вопросу. Пытаться учесть все эти тонкости ради такой реализации, это разрыв мозга!
Остаеться ждать другой вариант или надеяться что кто-то таки найдет флаг удачи!
P.S. Всем СпасибО!
Есть, конечно, и такая мысль: ресивер ММ, он позволяет получать текст из лога битвы, надо только избрать все варианты всяких разных переводов и кучи языков начиная с английского для процедуры проверки строки на вхождение слова Удача, ещё и в разных падежах )))
Есть и хитрый способ, берем функцию замены строк
http://forum.df2.ru/index.php?showtopic=5931 и делаем свою собственную строку для лога битвы при выпадении удачи, например с одной англ а в слове удача, и там уже дело техники, дерзайте , автор )
UPD Так-c, там же в теме по ссылке, в конце темы МоР сделал чтение строк из файлов, тебе нужен genrltxt.txt там 54 строка - "Удача улыбнулась %s", меняй её функцией МоР'а на свою строку, потом в битве читай каждую строку лога и загоняй в функцию проверки строк (её уж самому только писать, сравнивать строку лога со своей строкой, в итоге достигается языко/переводо - независимый скрипт) и, таким образом, думаю, ты достигнешь нужного тебе результата !!!
Тут только возникает неизвестная вещь - если строка лога записывается после нужного действия, то извиняй, получится только факт что удача сработала, но последствия удачи уже применены (убито больше народу), и тут как менять уж как то жестко надо...
ERMMASTER
18 Jan 2010, 10:58
Интересная идея! Мне такого в голову не могло прити)
Буду пробовать, еще раз спс.
Ну, что? Разобрался с удачей тем способом со строками ?? Всё-таки эффект удачи произходит до вывода строки в лог битвы, или после ? Если после, то можно ли на эффект повлиять ?
Ну с работой удачи - я разобрался, но написать скрипт, если и возможно, то только через эру и очень геморройно. Во-первых, обращение к длл 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
24 Jan 2010, 18:22
Способ со строками прокатил но немного с предподвыпердвертом
В строку естественно добавляеться после срабатывания удачи. такчто после считывания и сравнения можно определить была ли удача, но изменить урон в текущей атаке никак, только функцией (после действия) наносим доп. урон через !!BM:K# но при этом монстр будет странно дергаться после атаки и еще если этот урон его добьет, то останеться картинка отряда, но без численности. Вобщем баги.. баги
Добавлено ([mergetime]1264346563[/mergetime]):
А с Эрой я не сталкивался и абсолютно не шарю в этом... Но все равно спасибо Дьяк!
Haart of the Abyss
25 Jan 2010, 00:09
Цитата
Есть, конечно, и такая мысль: ресивер ММ, он позволяет получать текст из лога битвы, надо только избрать все варианты всяких разных переводов и кучи языков начиная с английского для процедуры проверки строки на вхождение слова Удача, ещё и в разных падежах
Смотрите с падежами не перемудрите. А то будет срабатывать после каждого каста одноимённого заклинания.
tolich
25 Jan 2010, 20:39
Есть другая идея: генерировать сработавшую удачу/неудачу скриптом, а чтобы она не срабатывала стандартно, перед каждым действием монстра принудительно ее обнулять. Тогда вопрос "сработала/не сработала" вообще стоять не будет.
DracoLich
26 Jan 2010, 12:15
хоббиты
tolich
26 Jan 2010, 12:25
Что, хоббитам нельзя поставить нулевую удачу, в принципе?
DracoLich
26 Jan 2010, 14:27
вообще никак. ни часы, ни -9999 удачи
tolich
26 Jan 2010, 14:33
DracoLich
26 Jan 2010, 14:52
хм, работает ^^
вопрос снят
ERMMASTER
26 Jan 2010, 22:28
Вааай Задача всей моей жизни решена! Спасибо ОГРОМНОЕ!!!
feanor
26 Jan 2010, 22:37
Я это еще в пятом посте предложил
tolich
26 Jan 2010, 23:09
Мда. Даже я не понял, что всего лишь повторил чью-то мысль...
ERMMASTER
27 Jan 2010, 18:18
Цитата(feanor @ 26 Jan 2010, 22:37)
Я это еще в пятом посте предложил
Да ты прав
Ну надо проще выражаться, понятнее! Мы крестьяне скриптинга Архи-магам не ровня
Добавлено ([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
27 Jan 2010, 13:57
но есть еще тонкость - такая эмуляция удачи не даст вероятности удачного овтета на атаку, а также самой анимации перед ударом
DracoLich
27 Jan 2010, 15:21
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
27 Jan 2010, 18:52
нене, я потом переместил код, все равно срабатывает и настоящая...
бтв какой-то баг форума с отображением сообщений ^^
Etoprostoya
27 Jan 2010, 18:58
Цитата(DracoLich @ 27 Jan 2010, 18:52)
бтв какой-то баг форума с отображением сообщений ^^
Он срабатывает, если у кого-то неправильно поставлен часовой пояс.
У меня было так, пока я время не поменял. У ERMMASTER'а так, наверное.
tolich
27 Jan 2010, 20:40
Нет, такое бывает, если написать сообщение, удалить и написать новое. Обычный глюк матрицы. ©
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.