IPB

Здравствуйте, гость ( Вход | Регистрация )

29 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> Мод на ХотА
AlexSpl
сообщение 12 Dec 2016, 21:52 (Сообщение отредактировал AlexSpl - 12 Dec 2016, 22:07)
Сообщение #101

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




А как игра будет знать, что нужно вычесть эти +2 после боя?

Насколько я помню (по Героям 1 и 2), мораль считается примерно так:

- бонус за армию (сводится к 2 - [кол-во фракций в отряде героя*]);
- бонус героя;
- бонусы за арты;
- бонусы за посещённые объекты.

При кол-ве разных отрядов больше 1

Или +282 - это совокупный временный бонус, который после битвы обнуляется?
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 12 Dec 2016, 22:14 (Сообщение отредактировал igrik - 12 Dec 2016, 22:35)
Сообщение #102

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




А игра и не знает как их вычесть. На сколько я понял из кода. Она просто после боя вызывает функцию 0x4E3C3C, в которой заново пересчитывает мораль (+282) в следующей последовательности:
- проверили лидерство (и навык и специализацию)
- проверили арты (108, 49, 50, 51)
- проверили есть ли грааль в Замке
и потом вернули результат.

В любом случае, добавочные временные показатели после боя вычитаются/обнуляются корректно.

PS: да да. расчет специализации "Лидерство" в коде имеет место быть. Я как то изощрялся и знаю, что герой 32767 уровня (последний вообще возможный уровень) являющийся специалистом по лидерству имеет +4915 ед. боевого духа))


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 12 Dec 2016, 22:19 (Сообщение отредактировал AlexSpl - 12 Dec 2016, 22:21)
Сообщение #103

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
А игра и не знает как их вычесть. На сколько я понял из кода. Она просто после боя вызывает функцию 0x4E3C3C

Не знаю, как в Тройке, но в Г1-2 подобная функция пересчитывает мораль по каждому чиху (например, если просто зайти в окно героя). Так понимаю, на экране героя 2 птички не исчезают? А что в описании по ПКМ?
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 12 Dec 2016, 22:33
Сообщение #104

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




На столько глубоко я не копал. Поэтому точно не знаю. Предпологаю, что после битвы где-то происходит обнуление морали, а потом вывзов этой функции. Знаю, что приведенный мной код работает правильно. В Г3 эта функция вызывается тоже довольно таки часто и я увидел разницу только в последнем параметре (0 или 1).
Да, 2 птички не исчезают, а пишет, что "+х временно до следующей битвы".


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 12 Dec 2016, 22:38
Сообщение #105

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Интересная инфа. Спасибо. Начинаю припоминать, что ведь ивенты тоже мораль могут давать, так что действительно имеет смысл не пересчитывать.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 14 Dec 2016, 16:25 (Сообщение отредактировал DedMorozzz - 14 Dec 2016, 17:16)
Сообщение #106

God
Сообщений: 267
Спасибо сказали: 25 раз




igrik, завелось. Спасибо. Вот сдвига мне и не хватало (хм...как-то странно звучит, ну да ладно)
Сам адресс функци вроде нашел, а вот +282 не нашел де пишется

Терь хочу убрать возможность коннекта юнитов, при наличии дипломатии.
Как я понимаю это достаточно сложно. Ибо нужна ф-я которая проводит всё расчёты:
Аля сила войска, что бы понять убегать нейтралам или нет. Насколько паков делить войска и т.д.
И в ней (как я это себе вижу). Будет проверка, если дипломатия имеется, и прошло сравнение силы войск, тогда мол присоедениться..

Как я понимаю, сразу в ней и можно "увеличить" силу армии на 5/10/15%, в зависимости от навыка дипломатии..

Соотв. вопрос - как отключить присоединение войск, какая ф-я это, что бы её обнулить
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 14 Dec 2016, 19:09 (Сообщение отредактировал igrik - 14 Dec 2016, 19:12)
Сообщение #107

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Проблема в том, что таковой функции нет. Расчет присоединения прописан в 2-х так называемых местах: ПКМ на монстре и при атаке монстров. Первое feanor описал тут, второе же нигде пока не было описано (а происходит приблизительно в 0x4A704A). Но это такая дикая муть. Лично я пока не знаю приемлемого решения по данному вопросу.
Но, насколько мне известно, данный вопрос решил только MoP. Каким именно способом - я не знаю, хотя склоняюсь к такому варианту: еженедельный перебор всех монстров на карте с изменением параметра агрессии на "выше нуля".
Можно конечно и при нападении менять этот параметр агрессии, но тогда остается нерешенным косяк с ПКМ. В общем я пока хз, но попробую покопать.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 14 Dec 2016, 19:32
Сообщение #108

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Самый простой способ - при старте карты генерировать всех монстров с агрессией равной 10 (её значение не меняется по ходу игры). Но нужно ещё учесть месяц существ. Инициализация рандомных объектов происходит в цикле 4C0A24h (для SoD 3.2). Там и кол-во монстров в отрядах нейтралов генерируется, если, конечно, не указано их точное кол-во автором карты. Этот случай отдельно смотреть надо.
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 14 Dec 2016, 19:33
Сообщение #109

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Агрессия 10 - монстры никогда не присоединятся. Так делать нельзя, ведь нужно оставить возможность присоединения за деньги


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 14 Dec 2016, 19:41
Сообщение #110

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Агрессия 10 - монстры никогда не присоединятся. Так делать нельзя, ведь нужно оставить возможность присоединения за деньги

Цитата
Соотв. вопрос - как отключить присоединение войск, какая ф-я это, что бы её обнулить


Тогда нужно менять саму функцию присоединения. У меня где-то была база с разобранной Дипломатией (правда, для СоД).
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 14 Dec 2016, 19:47 (Сообщение отредактировал igrik - 14 Dec 2016, 19:47)
Сообщение #111

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Ну если отключить, то тогда да. Но это решение совсем не приемлемое, ИМХО.
На счет базы - было бы отлично ее увидеть. Уверен, что в данном месте в коде нет разницы для SoD/HotA/WoG/Era


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 14 Dec 2016, 19:59
Сообщение #112

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2377 раз




Я вроде делал плагин для ЭРЫ DiplomacyCorrect.bin, разрешающий присоединение только за деньги. Лежал три года на сервере mop-drew.ru. Если ни у кого не сохранился - завтра найду.

А, впрочем, уже нашёл:
Код
; НАЗВАНИЕ: DiplomacyCorrect
; ВЕРСИЯ: 1.0
; АВТОР: MoP
; ОПИСАНИЕ: разрешает присоединение монстров только за деньги
; EXE: TE

; 4A755D:
;    JG SHORT 004A75A3 => JMP SHORT 004A75A3
A755D EB


--------------------
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 14 Dec 2016, 20:07 (Сообщение отредактировал AlexSpl - 14 Dec 2016, 20:25)
Сообщение #113

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




В HotA это функция sub_4A73B0. Вот тут теория: http://heroescommunity.com/viewthread.php3?TID=28341

Цитата
; JG SHORT 004A75A3 => JMP SHORT 004A75A3


В данном случае этот джамп на безусловный поменять:
Код
.text:004A7530                 jle     short loc_4A7550


Т.е. jle short loc_4A7550 на jmp short loc_4A7532
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 14 Dec 2016, 20:12 (Сообщение отредактировал DedMorozzz - 14 Dec 2016, 20:12)
Сообщение #114

God
Сообщений: 267
Спасибо сказали: 25 раз




на самом деле да. Цель убрать вообще возможность присоединения.
Повторюсь, основная цель сбалансить игру для джебуса. А насчёт "недели монстра", я за лет 7-8 опыта игры в Г3 не припомню игры больше чем 4я неделя)
Потому и хочу сделать навык более балансным. Убрать одно, а дать другое. Вот туда и библиотека, сила армии в глазах монстров, возможность откупаться от монстров (мб с ценойв 10% от армии) .. Что бы навык был полезным. Но работал немного по другому

В принципе агрессия == 10, кастыль, но вполне себе решение smile.gif Но как я понимаю, это изменение генератора, а не смена функи..
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 14 Dec 2016, 20:17 (Сообщение отредактировал igrik - 14 Dec 2016, 20:28)
Сообщение #115

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Тогда весь патч будет иметь вид (отключение только бесплатного присоединения)
Код
_PI->WriteDword((0x417236 + 1), 3);    // при ПКМ
_PI->WriteHexPatch((0x4A755D), "EB");  // при нападении на монстров

Но на работоспособность я не проверял.
Кстати, возможно где-то еще есть расчет для AI.

upd: проверил на хоте. Работает.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 14 Dec 2016, 20:33 (Сообщение отредактировал AlexSpl - 14 Dec 2016, 20:49)
Сообщение #116

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Лучше jle short loc_4A7550 на jmp short loc_4A7532 (см. мой пост выше).

UPD Хотя нет, тогда монстры сбегать перестанут smile.gif

Попробуйте так:
Код
_PI->WriteHexPatch((0x4A755D), "EB");  // проходим мимо бесплатного присоединения
_PI->WriteHexPatch((0x4A75A9), "EB");  // проходим мимо платного присоединения


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 14 Dec 2016, 22:41
Сообщение #117

God
Сообщений: 267
Спасибо сказали: 25 раз




Монстры больше не присоединяются, это вышло! Хоть и не понял откуда вы эти адреса получили)
И что такое параметр "ЕВ"?

А вот это не завелось:
Код
_PI->WriteDword((0x417236 + 1), 3);    // при ПКМ

Всё равно пишется что присоединятся, а по факту сбегают (я так понимаю, что и нападают тоже..)
Пробовал вместо +1, делать +2. Или 3 на большие числа менять - ошибка

Так же поискал силу армии. Поучитал темку http://heroescommunity.com/viewthread.php3?TID=28341
Цель - всё та же дипломатия. Силу армии при наличии навыка, для монстров считать выше на 5/10/15%

Искал по Power (ничё не нашел) и по Army
Нашел такое: 0044A950 ; int __fastcall GetArmyAIValue(_MonArr_ *MonArr)
Т.к. не нашел силы армии героя. Думаю понижу расчёт силы армии монстров.. решил задать просто число. Валится игра
Делал так:
Код
_PI->WriteLoHook(0x44A950, getArmyValue);


В функе это

Код
c->return_address = 0x63EAE4; // тут 0.05 хранится
return NO_EXEC_DEFAULT;


Каким образом усилить свою армию или ослабить армию нейтралов, при расчёте побега или на сколько пачек делать войска?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 14 Dec 2016, 22:59 (Сообщение отредактировал AlexSpl - 14 Dec 2016, 23:52)
Сообщение #118

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




EB - это опкод ближнего безусловного джампа (jmp short).

Я вот что порекомендую. Откройте базу IDA, перейдите по адресу 4A73B0h (клавиша G, в окошко введите адрес: 4A73B0). Поставьте брейкпоинт (клавиша F2). Теперь запустите игру, выставьте оконный режим и загрузите карту. Далее, в IDA выберите пункт меню Debugger -> Attach to process... В списке процессов найдите HotA. Игра будет приостановлена. Самое время ставить hardware брейкпоинты. Но сейчас ничего не нужно делать, просто нажмите F9. В игре нападите на монстра. После этого сработает брейкпоинт. Переключитесь в графический режим (блок-схемы, клавиша Space) и последовательно нажимайте F8 (Step over), чтобы пошагово выполнять инструкции. Наблюдайте, что происходит smile.gif Надоест - снова жмите F9.

Смысл сего мероприятия в том, чтобы попытаться понять логику работы функции (в данном случае sub_4A73B0). В этой функции как раз таки присутствует вызов (call) другой функции, которая и считает силу армии. А возвращаемое значение уже можно вертеть, как угодно.

Цитата
... Валится игра

Это будет происходить очень часто, пока не поймёте, как устроен код.

P.S.
Цитата
Силу армии при наличии навыка, для монстров считать выше на 5/10/15%

А смысл? На что это будет влиять, если монстры не будут присоединяться?

Ага...
Цитата
Каким образом усилить свою армию или ослабить армию нейтралов, при расчёте побега или на сколько пачек делать войска?

ОК, условие побега действительно зависит от силы армии. Поэтому, после того, как она будет подсчитана, Вам нужно добавить собственный код, который в зависимости от уровня Дипломатии будет умножать её на 1.05, 1.10 или 1.15. Тут двумя строчками уже не отделаешься smile.gif Насчёт деления на стеки. Это уже совсем другая функция, но принцип тот же: после расчёта силы армии модифицируем значение собственным кодом.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 17 Dec 2016, 16:56 (Сообщение отредактировал DedMorozzz - 17 Dec 2016, 17:01)
Сообщение #119

God
Сообщений: 267
Спасибо сказали: 25 раз




Вот что получилось найти:
ф-я при нападении на юнитов (4A73B0):
Суммарно вызывается 3 ф-ии: sub_00427650, sub_004A7230, sub_004A68D0/sub_004A6A60
1я (sub_00427650). Как я понимаю именно тут расчёт армии и происходит. Ибо вызывается в ней и функу которую кидал выше, монстрВелью и Hero_GetAttackDefCoef (004E5670)

2я (sub_004A7230). По коду только несколько кейсов. Скорее всего решает в какой блок кинуть дальше (см. пункт 3)

3я sub_004A68D0. Тут как я понял идёт рассчёт насколько стаков делить и будет ли пачка улучшеных юнитов. Т.е. уже начало боя
или если армия сильнее, тогда это:
sub_004A6A60 (тут вопрос, нападать или дать сбежать)

Т.о. Увеличить "вес" армии надо или в 1й (скорее всего) или 2й ф-ии.
Редачил вызовы из 1й ф-ии. Пробовал менять Hero_GetAttackDefCoef (как я понимаю, увеличение силы армии, от статов) что бы возвращала всегда 1/1000/0.05 даже 20-49 триглодитов нападают на 50 архов, при любом из этих значений
Как всё же увеличить вес своей армии, при расчёт побега на 20%? Снова таки, под дипломатию и цифры сам подгоню...
Ибо понимаю, что вроде нашел что надо. Но что с этим дальше делать, пока что не представляю
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 17 Dec 2016, 20:03 (Сообщение отредактировал AlexSpl - 17 Dec 2016, 20:05)
Сообщение #120

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




"Чистую" силу армии героя ("альфу") считает функция sub_44A950 (в цикле проходит по всем слотам). Функция sub_427650 возвращает уже полную силу армии (с учётом атаки и защиты героя) в регистре eax, а именно умножает "альфу" на sqrt((1 + 0.05 * HeroAttack) * (1 + 0.05 * HeroDefense)). Но для Вашей задачи, если сильно не заморачиваться на округлении, модифицировать можно полную силу, так как 1.2 (увеличение на 20%) - просто ещё один множитель.

Поэтому перед выполнением инструкции по адресу 4A7441h необходимо выполнить собственный код, который будет умножать значение регистра eax на 1.2 (или на коэффициент, зависящий от уровня Дипломатии). Затем вернуть управление по адресу 4A7441h.
Go to the top of the pageAdd Nick
 
+Quote Post

29 страниц V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 23 November 2025 - 05:10
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика