IPB

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

29 страниц V  « < 12 13 14 15 16 > »   
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 25 Dec 2016, 17:51
Сообщение #261

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




По поводу стоимости откуда от монстров. Функа по адресу - 474942
Оттуда переходим сюда loc_00474980. В ней имеется функция GetDiplomacyPower. Я так понимаю она нам и нужна...
И в новом хуке (setSurrenderButton) заодно и переписать уменьшение выкупа? Что бы только для монстров другие процены были...
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 25 Dec 2016, 18:37 (Сообщение отредактировал AlexSpl - 25 Dec 2016, 18:42)
Сообщение #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.


Куда уж меньше? smile.gif И так уже сильный навык получился. Одна возможность откупаться от нейтралов чего стоит.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 25 Dec 2016, 19:31 (Сообщение отредактировал DedMorozzz - 25 Dec 2016, 19:48)
Сообщение #263

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




Цитата(AlexSpl @ 25 Dec 2016, 17:37) *
Дипломатия влияет на стоимость сдачи и так. Какие отличия должны быть при сдаче нейтралам?

Цитата
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.


Куда уж меньше? smile.gif И так уже сильный навык получился. Одна возможность откупаться от нейтралов чего стоит.


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

Потому планирую сделать откуп от монстров 30-20-10%. А арты снижать на 5% будут. Т.е. 2 арта дипломата = портал города за 2500 голды smile.gif

Но вот что планирую изменить, это либу. Что бы +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

При этом монстры не могут присоединяться. Эта способность убирается у дипломатии

На выходе достаточно много разных моментов, но все они не существенные smile.gif
Только библиотека влияет. Но по статистике за игру посещается примерно 1 библиотека. Так что не настолько и сильный навык, но уже полезный

И даже так, если выбрать логистику/землю/нападение или дипломатию, я выберу 1е)
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 25 Dec 2016, 19:45 (Сообщение отредактировал AlexSpl - 25 Dec 2016, 19:57)
Сообщение #264

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




Понятно. Нейтралам хотите платить больше. Я бы особо не заморачивался, а просто б умножил стоимость капитуляции на 2 для нейтралов.

Ага. Наоборот.

Цитата
2. снижать цену капитуляции на 20-40-60%

Цитата
5. сдаваться можно монстрам по цене 30-20-10% от стоимости

Т.е. снижение стоимости получается 90-80-70% (при сдаче нейтралам) против 60-40-20% (при сдаче героям)?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 25 Dec 2016, 19:48
Сообщение #265

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




Цитата(AlexSpl @ 25 Dec 2016, 18:45) *
Понятно. Нейтралам хотите платить больше. Я бы особо не заморачивался, а просто б умножил стоимость капитуляции на 2 для нейтралов.

Наоборот, меньше
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 25 Dec 2016, 20:01 (Сообщение отредактировал AlexSpl - 25 Dec 2016, 21:38)
Сообщение #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;


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 25 Dec 2016, 23:01 (Сообщение отредактировал DedMorozzz - 25 Dec 2016, 23:28)
Сообщение #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: проверил адресса, вроде всё верно. Странно
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 26 Dec 2016, 00:30 (Сообщение отредактировал AlexSpl - 26 Dec 2016, 01:05)
Сообщение #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 не выполняется.

* * *
Проверил, должно работать и на Хота.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 26 Dec 2016, 01:00 (Сообщение отредактировал DedMorozzz - 26 Dec 2016, 01:09)
Сообщение #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);
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 26 Dec 2016, 01:31
Сообщение #270

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




Убрал пост. Оказывается на C++ ещё та проблема float в int запихнуть. Сейчас подумаю.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 26 Dec 2016, 01:54 (Сообщение отредактировал AlexSpl - 26 Dec 2016, 17:58)
Сообщение #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) не патчит?


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 26 Dec 2016, 22:18 (Сообщение отредактировал DedMorozzz - 26 Dec 2016, 23:11)
Сообщение #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) не патчит?

Прочитал изменения хоты. Про дипломатию ни слова (только новый сборный арт добавили). Так что скорее всего нет
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 26 Dec 2016, 23:11
Сообщение #273

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




Да, после вызова функции идёт деление на 2.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 26 Dec 2016, 23:12
Сообщение #274

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




Цитата(AlexSpl @ 26 Dec 2016, 22:11) *
Да, после вызова функции идёт деление на 2.

Это так и надо? И где ограничение в 10% стоит, что меньше нельзя?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 26 Dec 2016, 23:26
Сообщение #275

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




см. код по адресу 4E4927h

Декомпилированный вариант:
Код
if ( DiploMod > 0.89999998 ) DiploMod = 0.89999998;


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

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




Цитата(AlexSpl @ 26 Dec 2016, 22:26) *
см. код по адресу 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мя - монстры доплачивают, что бы уже сбежал smile.gif я не шучу, -250 голды с архом стоит откуп)
Т.е. место верное. Убираю проверку на граничение цены. А вот как изменить её - не пойму какой esi/edi/ecx юзать
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 14:54 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 15:46)
Сообщение #277

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




Цитата(igrik @ 05 Dec 2016, 13:06) *
Цитата
Как молитве сделать не +4, а +6 ко всем статам (имеется ввиду атака+защита)?

Бонусы молитвы прописаны в "SPTRAITS.TXT".


Проверил, по факту только описание меняется. А даёт столько же, сколько и ранее. При этом манакост/школа к которой относится меняется, а логика нет.
Что собсно и ожидаемо. Было бы крайне странно, если бы логика поведения была бы описана обычным текстом
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 17:40 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 17:46)
Сообщение #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;
}


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 18:15
Сообщение #279

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




Цитата(AlexSpl @ 27 Dec 2016, 16:40) *
Здесь лучше хук на 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 ) {
От героя по той же цене убегает
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 18:30 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 19:01)
Сообщение #280

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




Цитата
А откуда ты взять ebp - 4
Я код почитал, попробовал разные варианты - ничего не подошло

Модификатор стоимости капитуляции хранится в локальной переменной (var_4, [ebp-4]).

Цитата
*(int*)(*(int*)0x699420 + 0x132C0)

Было бы неплохо увидеть значение. Но наверняка в combatManager'е есть и другие полезные поля, по которым можно определить, с кем велась битва.

* * *
Проверил, оказывается, что *(int*)(*(int*)0x699420 + 0x132C0) - это не адрес героя.
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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