![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#261
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
По поводу стоимости откуда от монстров. Функа по адресу - 474942
Оттуда переходим сюда loc_00474980. В ней имеется функция GetDiplomacyPower. Я так понимаю она нам и нужна... И в новом хуке (setSurrenderButton) заодно и переписать уменьшение выкупа? Что бы только для монстров другие процены были... |
|
|
![]()
Сообщение
#262
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Дипломатия влияет на стоимость сдачи и так. Какие отличия должны быть при сдаче нейтралам?
Цитата Base price when surrendering is half the army's cost in gold. This can be further reduced via Diplomacy and Artifacts to a total of 5% of normal price. Куда уж меньше? ![]() |
|
|
![]()
Сообщение
#263
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Дипломатия влияет на стоимость сдачи и так. Какие отличия должны быть при сдаче нейтралам? Цитата Base price when surrendering is half the army's cost in gold. This can be further reduced via Diplomacy and Artifacts to a total of 5% of normal price. Куда уж меньше? ![]() На самом деле баланс штука тонкая это факт) Но по сути, что такое откупиться от нейтралов - это тот же самый таун портал, только с ценой в 2.5к голды(стоимость героя) + цена войска (процент от неё). И при этом не с любого места На выходе не выходит чего-то сверх сильного, вот в начале игры будет пользоваться спросом, когда надо будет вернуться в город. Обычно цепочки строятся, которые вернут войска, а с дипломатией та же цепочка будет, но вот в замке можно быть сразу ускореным, если убежать с каким нибуть условным ангелом Потому планирую сделать откуп от монстров 30-20-10%. А арты снижать на 5% будут. Т.е. 2 арта дипломата = портал города за 2500 голды ![]() Но вот что планирую изменить, это либу. Что бы +3 давала на всех левелах. Сейчас +4 на эксперте (но на практике не проверялось насколько это эффективно) Итого в планах навык дипломатии должен давать: 1. усиливать войска при учёте побега/разбивки на пачки на 10-20-30% 2. снижать цену капитуляции на 20-40-60% (родное поведение) 3. уменьшать левел для посещения либы на 2-4-6 (родное поведение) 4. либа давать будет на +1 к статам выше, т.е. по +3 5. сдаваться можно монстрам по цене 30-20-10% от стоимости Арты: 1. увеличивают силу армии на 10% 2. Умеьшает цену капитуляции на 10% для героя (5% для монстров) 3. Уменьшает левел для посещения либы на 1 При этом монстры не могут присоединяться. Эта способность убирается у дипломатии На выходе достаточно много разных моментов, но все они не существенные ![]() Только библиотека влияет. Но по статистике за игру посещается примерно 1 библиотека. Так что не настолько и сильный навык, но уже полезный И даже так, если выбрать логистику/землю/нападение или дипломатию, я выберу 1е) |
|
|
![]()
Сообщение
#264
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Понятно. Нейтралам хотите платить больше. Я бы особо не заморачивался, а просто б умножил стоимость капитуляции на 2 для нейтралов.
Ага. Наоборот. Цитата 2. снижать цену капитуляции на 20-40-60% Цитата 5. сдаваться можно монстрам по цене 30-20-10% от стоимости Т.е. снижение стоимости получается 90-80-70% (при сдаче нейтралам) против 60-40-20% (при сдаче героям)? |
|
|
![]()
Сообщение
#265
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#266
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Тогда смотрите на инструкцию по адресу 4E4804h. Она как раз в регистр edx коэффициенты (0.2, 0.4, 0.6) загружает.
Т.е. примерная функция хука: Код if ( opponent == neutrals ) { switch ( diplomacyLevel ) { case 1: (float)c->edx = 0.7f; case 2: (float)c->edx = 0.8f; case 3: (float)c->edx = 0.9f; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; }; else return EXEC_DEFAULT; diplomacyLevel в данном контексте элементарно получается: Код char diplomacyLevel = (char)c->ecx; * * * Т.е. код такой должен быть: Код if ( *(int*)(*(int*)0x699420 + 0x132C0) == 0 ) {
switch ( (char)c->ecx ) { case 1: (float)c->edx = 0.7f; case 2: (float)c->edx = 0.8f; case 3: (float)c->edx = 0.9f; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; }; else return EXEC_DEFAULT; |
|
|
![]()
Сообщение
#267
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код int __stdcall setSurrenderPrice(LoHook* h, HookContext* c) { float surrenderPrice[4] = {0.00, 0.70, 0.8, 0.9}; if ( *(int*)(*(int*)0x699420 + 0x132C0) == 0 ) { float currentModifier = ( ((char)c->ecx >= 0) && ((char)c->ecx <= 3) ? surrenderPrice[(char)c->ecx] : 1 ); c->edx = currentModifier; //c->edx = 0.2; //c->ecx = 0.2; c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; } return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4E4804, setSurrenderPrice); закоментил 2 строки которые пробовал и не вылетает при которых. В общем 60% скидка. Арх убегает за 1999 голды Любой вариант, цена та же. Только дипломатия учитывается PS: проверил адресса, вроде всё верно. Странно |
|
|
![]()
Сообщение
#268
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Сам свитч работает?
Код switch ( (char)c->ecx ) { case 1: (float)c->edx = 0.7f; case 2: (float)c->edx = 0.8f; case 3: (float)c->edx = 0.9f; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; Полагаю, вот это условие *(int*)(*(int*)0x699420 + 0x132C0) == 0 не выполняется. * * * Проверил, должно работать и на Хота. |
|
|
![]()
Сообщение
#269
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
так ошибка:
1>.\dllmain.cpp(329) : error C2106: '=' : left operand must be l-value 1>.\dllmain.cpp(330) : error C2106: '=' : left operand must be l-value 1>.\dllmain.cpp(331) : error C2106: '=' : left operand must be l-value и в 1м вариенте она и была. Если убираю флоат - тогда ошибки нету. Но цена откупа = 40% 1 Арх = 1999 Полный код: Код int __stdcall setSurrenderPrice(LoHook* h, HookContext* c) { if ( *(int*)(*(int*)0x699420 + 0x132C0) == 0 ) { switch ( (char)c->ecx ) { case 1: c->edx = 0.7f; case 2: c->edx = 0.8f; case 3: c->edx = 0.9f; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; } return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4E4804, setSurrenderPrice);
|
|
|
![]()
Сообщение
#270
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Убрал пост. Оказывается на C++ ещё та проблема float в int запихнуть. Сейчас подумаю.
|
|
|
![]()
Сообщение
#271
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Попробуйте вот так:
Код int __stdcall setSurrenderPrice(LoHook* h, HookContext* c) { if ( *(int*)(*(int*)0x699420 + 0x132C0) == 0 ) { switch ( (char)c->ecx ) { case 1: *(float*)&c->edx = 0.7f; break; case 2: *(float*)&c->edx = 0.8f; break; case 3: *(float*)&c->edx = 0.9f; break; default: c->edx = 0; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; } return EXEC_DEFAULT; } И без условия: Код int __stdcall setSurrenderPrice(LoHook* h, HookContext* c) { switch ( (char)c->ecx ) { case 1: *(float*)&c->edx = 0.7f; break; case 2: *(float*)&c->edx = 0.8f; break; case 3: *(float*)&c->edx = 0.9f; break; default: c->edx = 0; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; } * * * Посмотрел код. Там есть ограничение: уменьшение стоимости не может быть более 90%. Так что его тоже нужно убирать. А случайно Хота эту функцию (GetDiplomacyPower) не патчит? |
|
|
![]()
Сообщение
#272
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
С дипломатией арх от монстров убегает за 250 золотых (при 2х артах дипломатии и без них)
От героя тоже за 250 золотых Арх стоит 5000 Герой без дипломатии не может убежать от монстров, а от героя убегает за 2500 золотых Код int __stdcall setSurrenderPrice(LoHook* h, HookContext* c) { if ( *(int*)(*(int*)0x699420 + 0x132C0) == 0 ) { switch ( (char)c->ecx ) { case 1: *(float*)&c->edx = 0.7f; break; case 2: *(float*)&c->edx = 0.8f; break; case 3: *(float*)&c->edx = 0.9f; break; default: c->edx = 0; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; } return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4E4804, setSurrenderPrice); case 3: *(float*)&c->edx = 0.3f; break; -- тут ставлю 0.3 и получается откуп за 35% цены Судя по всему цена режется на 2. Но не менее 5% Цитата А случайно Хота эту функцию (GetDiplomacyPower) не патчит? Прочитал изменения хоты. Про дипломатию ни слова (только новый сборный арт добавили). Так что скорее всего нет |
|
|
![]()
Сообщение
#273
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Да, после вызова функции идёт деление на 2.
|
|
|
![]()
Сообщение
#274
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#275
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
см. код по адресу 4E4927h
Декомпилированный вариант: Код if ( DiploMod > 0.89999998 ) DiploMod = 0.89999998;
|
|
|
![]()
Сообщение
#276
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
см. код по адресу 4E4927h Декомпилированный вариант: Код if ( DiploMod > 0.89999998 ) DiploMod = 0.89999998; Не пойму какое значение верное для этой проверки Код int __stdcall setSurrenderMinPrice(LoHook* h, HookContext* c) { //ebp+var_4 -- такое в ИДА есть, но явно не то что надо /* if ( (char) c->edi > 1) { *(float*)&c->edi = 1.0f; } */ //ecx+eax*8 ---- и такое есть /* if ( (char) (c->ecx + c->eax*8) > 1 ) { *(float*)& (c->ecx + c->eax*8) = 1.0f; } */ return NO_EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4E492A, setSurrenderMinPrice); Вот этот код (т.е. просто return NO_EXEC_DEFAULT;), при 2х артах дипломата далает цену откупа (при базовом значении 0.9) в -5% (-10% / 2) С 1м артом цена = 0. С 2мя - монстры доплачивают, что бы уже сбежал ![]() Т.е. место верное. Убираю проверку на граничение цены. А вот как изменить её - не пойму какой esi/edi/ecx юзать |
|
|
![]()
Сообщение
#277
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Как молитве сделать не +4, а +6 ко всем статам (имеется ввиду атака+защита)? Бонусы молитвы прописаны в "SPTRAITS.TXT". Проверил, по факту только описание меняется. А даёт столько же, сколько и ранее. При этом манакост/школа к которой относится меняется, а логика нет. Что собсно и ожидаемо. Было бы крайне странно, если бы логика поведения была бы описана обычным текстом |
|
|
![]()
Сообщение
#278
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Здесь лучше хук на 4E4931h поставить, чтобы не пропустить инструкцию pop edi.
Код такой: Код {
float diploCap = 0.99f; // ограничение if ( *(float*)(c->ebp - 4) > diploCap ) { *(float*)(c->ebp - 4) = diploCap; } c->return_address = 0x4E493F; return NO_EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#279
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Здесь лучше хук на 4E4931h поставить, чтобы не пропустить инструкцию pop edi. Код такой: Код { float diploCap = 0.99f; // ограничение if ( *(float*)(c->ebp - 4) > diploCap ) { *(float*)(c->ebp - 4) = diploCap; } c->return_address = 0x4E493F; return NO_EXEC_DEFAULT; } Работает! Спасибо. А откуда ты взять ebp - 4 Я код почитал, попробовал разные варианты - ничего не подошло PS: только вот эта проверка не работает. if ( *(int*)(*(int*)0x699420 + 0x132C0) == 0 ) { От героя по той же цене убегает |
|
|
![]()
Сообщение
#280
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата А откуда ты взять ebp - 4 Я код почитал, попробовал разные варианты - ничего не подошло Модификатор стоимости капитуляции хранится в локальной переменной (var_4, [ebp-4]). Цитата *(int*)(*(int*)0x699420 + 0x132C0) Было бы неплохо увидеть значение. Но наверняка в combatManager'е есть и другие полезные поля, по которым можно определить, с кем велась битва. * * * Проверил, оказывается, что *(int*)(*(int*)0x699420 + 0x132C0) - это не адрес героя. |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 4 October 2025 - 04:46 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|