IPB

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

29 страниц V  « < 18 19 20 21 22 > »   
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 29 Dec 2016, 19:02
Сообщение #381

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




Работает! Снижает, правда всем юнитам, но уже чётко по раундам. Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем. В общем всё ок
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:07
Сообщение #382

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




Осталось только доп. условие (проверку уровня тактики героя) на это повесить:

Код
if ( roundNumber == 1 ) *(int*)(c->ecx + 196) -= 2;

Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:08 (Сообщение отредактировал DedMorozzz - 29 Dec 2016, 19:09)
Сообщение #383

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




Цитата(AlexSpl @ 29 Dec 2016, 18:07) *
Осталось только доп. условие (проверку уровня тактики героя) на это повесить:

Код
if ( roundNumber == 1 ) *(int*)(c->ecx + 196) -= 2;

Если правильно понимаю, то и только союзника уменьшать скорость smile.gif Врагам не надо
Сейчас всем юнитам

Т.е. такой код сейчас:

Код
int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);

        if (tacticLevel > 0) {

            int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
            if ( roundNumber == 1 ) {
                *(int*)(c->ecx + 196) -= 2;
            }
        }
    }

    return EXEC_DEFAULT;
}


И у врага отнимает 2 еденицы скорости на 2й ход. И у того у кого есть тактика
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:09
Сообщение #384

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




Цитата
Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем.

Дважды не надо. Первый хук добавляет 2 к скорости. В конце 1-го раунда (roundNumber == 1) мы эти 2 ед. забираем.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:10
Сообщение #385

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




Цитата(AlexSpl @ 29 Dec 2016, 18:09) *
Цитата
Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем.

Дважды не надо. Первый хук добавляет 2 к скорости. В конце 1-го раунда (roundNumber == 1) мы эти 2 ед. забираем.

не, я спецом. Проверить что это именно раунд и что всё работает корректно. Я часто для тестов добавляю доп условия, когда что-то настраиваю.
В финале этого не будет, само собой
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:13
Сообщение #386

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




Теперь нужно "выцепить" из combatManager уровень тактики героя левой (0) стороны и всё будет работать.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:14 (Сообщение отредактировал DedMorozzz - 29 Dec 2016, 19:15)
Сообщение #387

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




Цитата(AlexSpl @ 29 Dec 2016, 18:13) *
Теперь нужно "выцепить" из combatManager уровень тактики героя левой (0) стороны и всё будет работать.

так вот же:
Код
char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);

Но всё равно, даже с этим условием у врага отнимает тоже скорость
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:17 (Сообщение отредактировал AlexSpl - 29 Dec 2016, 19:22)
Сообщение #388

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




Цитата
И у врага отнимает 2 еденицы скорости на 2й ход

Это просто исправить. Там цикл сначала по отрядам стороны 0, а потом - стороны 1. Нужно ещё одно условие.

Код
int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(cmAddr + 0x53CC) + 201 + 19);
        int side = *(int*)(cmAddr + 0x132B8);

        if ( (side == 0) && (tacticLevel > 0) ) {

            int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
            if ( roundNumber == 1 ) {
                *(int*)(c->ecx + 196) -= 2;
            }
        }
    }

    return EXEC_DEFAULT;
}


Так же попробуйте side = 1, реально путаюсь )
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:20
Сообщение #389

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




Код
int side = *(int*)(cmAddr + 0x132B8);
if (side == 0) { // отнять скорость }
?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:27
Сообщение #390

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




Не, мы проверяем: если наша сторона левая (0) и у героя есть тактика, отнять скорость в конце первого раунда.

Хотя может и не сработать. Тогда есть запасной вариант.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:27
Сообщение #391

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




у меня слегка по другому получилось, но смысл тот же:
Код
int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);
        int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;

        if ((tacticLevel > 0) && (roundNumber == 1)) {
            int side = *(int*)(cmAddr + 0x132B8);
            if (side == 0) {
                *(int*)(c->ecx + 196) -= 2;
            }
        }
    }

    return EXEC_DEFAULT;
}

И отнимает всё равно у всех
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:28
Сообщение #392

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




Я уже понял. Счас исправим.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:31 (Сообщение отредактировал DedMorozzz - 29 Dec 2016, 19:32)
Сообщение #393

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




в банке перепроверил. site==0 не отнимает. ==1 отнимает у всех. 1 мин ещё раз перепроверю, но вроде так
PS: да, при site==1 в банке отнимает точно у всех
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:36 (Сообщение отредактировал AlexSpl - 29 Dec 2016, 19:39)
Сообщение #394

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




Код
int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(cmAddr + 0x53CC) + 201 + 19);
        int roundNumber = c->eax - 30000;

        if ( (tacticLevel > 0) && (roundNumber == 1) ) {
            if ( c->ebx == cmAddr + 0x132A0 ) { // проверяем, что цикл по отрядам левой стороны
                *(int*)(c->ecx + 196) -= 2;
            }
        }
    }

    return EXEC_DEFAULT;
}


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:46 (Сообщение отредактировал DedMorozzz - 29 Dec 2016, 19:47)
Сообщение #395

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




Силач! Всё работает, спасибо smile.gif

Итого финальный код, который будет давать +1/2/3 скорости для 1го хода, по уровням тактики, при нападении на банк существ, выглядит так:

Код
int __stdcall setBankUnitBonus(LoHook* h, HookContext* c)
{
    if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ
        if(*(char*)(c->ecx + 201 + 19) > 0) { // проверка на тактику
            *(int*)(c->esi+80) += *(char*)(c->ecx + 201 + 19);
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);
        int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;

        if ((tacticLevel > 0) && (roundNumber == 1)) {
            if ( c->ebx == cmAddr + 0x132A0 ) {
                *(int*)(c->ecx + 196) -= tacticLevel;
            }
        }
    }

    return EXEC_DEFAULT;
}


Ну или полная ф-я, которая даёт бонусы атаки/защиты при наличии навыков артиллерия и первая помощь + боевые машины что бы были

Код
int __stdcall setBankUnitBonus(LoHook* h, HookContext* c)
{
    if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ
        if(*(char*)(c->ecx + 201 + 19) > 0) { // проверка на тактику
            *(int*)(c->esi+80) += *(char*)(c->ecx + 201 + 19);
        }

        if(*(int*)(c->ecx + 201 + 20) > 0) { //проверка на артиллерию
            if ( *(int*)(c->ecx + 301 + (13 << 3)) == 4 ) { //13 - слот на кукле для баллисты. 4 - айди баллисты
                *(int*)(c->esi + 84) += *(int*)(c->ecx + 201 + 20);
            }
        }

        if(*(int*)(c->ecx + 201 + 27) > 0) { //проверка на палатку
            if ( *(int*)(c->ecx + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки
                *(int*)(c->esi + 88) += *(int*)(c->ecx + 201 + 27) * 2;
            }
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);
        int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;

        if ((tacticLevel > 0) && (roundNumber == 1)) {
            if ( c->ebx == cmAddr + 0x132A0 ) {
                *(int*)(c->ecx + 196) -= tacticLevel;
            }
        }
    }

    return EXEC_DEFAULT;
}


Лоу хуки всегда одинаковые:
Код
_PI->WriteLoHook(0x4E666A, setBankUnitBonus);
_PI->WriteLoHook(0x475A3D, resetTacticsUnitSpeedBonus);


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:50
Сообщение #396

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




Проверь ещё боевые машины на всякий. Что у них со скоростью?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 19:53
Сообщение #397

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




Цитата(AlexSpl @ 29 Dec 2016, 18:50) *
Проверь ещё боевые машины на всякий. Что у них со скоростью?

а что их проверять то? У них скорость 0 и их нету во время боя в банке существ smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 19:53
Сообщение #398

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




Ещё *(int*)0x699420 можно заменить на cmAddr, раз уж определили переменную. А раунд проще так получить:

Код
int roundNumber = c->eax - 30000; // *(int*)(cmAddr + 0x132A0) - 30000;
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 20:01
Сообщение #399

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




Цитата(AlexSpl @ 29 Dec 2016, 18:53) *
Код
int roundNumber = c->eax - 30000; // *(int*)(cmAddr + 0x132A0) - 30000;


Вот это не работает, если c->eax - 30000 использовать. Не отнимается скорость
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 20:08
Сообщение #400

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




Цитата
Вот это не работает, если c->eax - 30000 использовать. Не отнимается скорость

Это я уже не знаю, почему. В контексте хука (c->eax - 30000) - это номер раунда. Нужно у baratorch'а спрашивать, почему не работает. У меня в ассемблере - работает.
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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