IPB

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

29 страниц V  « < 15 16 17 18 19 > »   
Reply to this topicStart new topic
> Мод на ХотА
AlexSpl
сообщение 28 Dec 2016, 00:20
Сообщение #321

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




Нет смысла в видео, всё равно ничего не видно. У вас хук работал (!). Почему он не работает сейчас?

Как бы вот это не поменялось:

Код
c->return_address = 0x4A2F55;
return NO_EXEC_DEFAULT;


Просто тестируйте, прежде чем постить.

Цитата
Вот так завелось:


Код
int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c)
{
    int tmpLevelBonus = 0;
    if (*(short*)(c->esi + 85) < 10) {
        
        for (int i = 0; i < 19; ++i) {
            switch ( *(int*)(c->esi + 301 + (i << 3)) ) {
                case 66:  tmpLevelBonus += 1; break;
                case 67:  tmpLevelBonus += 1; break;
                case 68:  tmpLevelBonus += 1; break;
            }
        }
    }
    

    int currentLevel = *(int*)(c->esi + 85);
    int diplomacyLevelBonus = *(int*)(c->esi + 201 + 4) * 2;
    
    c->eax = currentLevel + tmpLevelBonus + diplomacyLevelBonus;
        
    c->return_address = 0x4A2F55;
    return NO_EXEC_DEFAULT;
}


Ваш код, который работал.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 00:27
Сообщение #322

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




работал только мой код. Тот который последнее время пробуем - нет
Если что у видео есть выбор качества, у меня норм отображается smile.gif Всё видно

Т.е. текущий рабочий код выглядит так:
Код
int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c)
{
    int allLevelBonuses = 0;
    if (*(short*)(c->esi + 85) < 10) {
        
        for (int i = 0; i < 19; ++i) {
            switch ( *(int*)(c->esi + 301 + (i << 3)) ) {
                case 66:  allLevelBonuses += 1; break;
                case 67:  allLevelBonuses += 1; break;
                case 68:  allLevelBonuses += 1; break;
            }
        }

        if (*(char*)(c->esi + 201 + 4) > 0) {
            allLevelBonuses += *(char*)(c->esi + 201 + 4) * 2;
        }
    }

    int currentLevel = *(int*)(c->esi + 85);
    
    c->eax = currentLevel + allLevelBonuses;
    c->return_address = 0x4A2F55;

    return NO_EXEC_DEFAULT;
}

Никакой другой не работал. Только который был со смещениями
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 28 Dec 2016, 00:31 (Сообщение отредактировал AlexSpl - 28 Dec 2016, 00:40)
Сообщение #323

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




Я понимаю, что этот код работает. Но *(int*)(c->esi + 85) есть c->edx, а *(char*)(c->esi + 201 + 4) есть c->ecx.

Разницу между указателями и непосредственными значениями знаете?

* * *
Короче, просто задачка по теме:

Запарсите в уме

*(float*)&c->eax = 0.1f;

*Как* это работает, понимаете? Почему это работает? )
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 00:44
Сообщение #324

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




Цитата(AlexSpl @ 27 Dec 2016, 23:31) *
Я понимаю, что этот код работает. Но *(int*)(c->esi + 85) есть c->edx, а *(char*)(c->esi + 201 + 4) есть c->ecx.

Разницу между указателями и непосредственными значениями знаете?

* * *
Короче, просто задачка по теме:

Запарсите в уме

(*float*)&c->eax = 0.1f;

*Как* это работает, понимаете?

Да, то что должно быть одинаково я понимаю. Это по сути переменная, под каким видом пройдёт. Я в коде такое часто пишу.
Тот же baseHeroOffset то же самое, вот от сюда:
Код
int __stdcall setArmyValue(LoHook* h, HookContext* c)
{
    int baseHeroOffset = c->edi;
    float armyModifier = getArmyValueModifier(baseHeroOffset);
    (int)c->eax *= (1 + armyModifier);

    return EXEC_DEFAULT;
}


int __stdcall setArmyValuePreview(LoHook* h, HookContext* c)
{
    int baseHeroOffset = c->esi;
    float armyModifier = getArmyValueModifier(baseHeroOffset);
    (int)c->eax *= (1 + armyModifier);

    return EXEC_DEFAULT;
}

int __stdcall setArmyValueSplit(LoHook* h, HookContext* c)
{
    int baseHeroOffset = *(int*)(c->ebp + 8);
    float armyModifier = getArmyValueModifier(baseHeroOffset);
    (int)c->eax *= (1 + armyModifier);

    return EXEC_DEFAULT;
}


Насчёт (*float*)&c->eax = 0.1f;
Это не понятно, выглядит как странное приведение типа. Но в том случае когда c->eax это интеджер
Но это так, догадка что переписывается тип..
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 28 Dec 2016, 00:50 (Сообщение отредактировал AlexSpl - 28 Dec 2016, 01:01)
Сообщение #325

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




Да нет тут высшей математики.

Лежит число по адресу A. Захотели его прочитать, пишете *(type*)A. Где type - это тип, который Вам нужен.

Хотите читайте его как целое, а хотите - как дробное.

Цитата
*(float*)&c->eax = 0.1f;

1. &c->eax - получаем адрес числа, а не его значение;
2. *(float*)&c->eax - интерпретируем число по адресу &c->eax, как float.



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

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




Цитата
Но это так, догадка что переписывается тип..

Допустим, я компилятор и я заявляю, что тип pretty буду обрабатывать так: каждый нечётный бит, равный 1, будет добавлять 4 к значению.

0000 0000 = 0
1000 1000 = 0
0100 0000 = 4
0100 0100 = 8
и т.д.

Пусть в регистре eax находится адрес числа 1101 1101 = 0xDD = 221. Тогда *(int*)eax будет возвращать 221, а *(pretty*)eax - 16.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 01:39 (Сообщение отредактировал DedMorozzz - 28 Dec 2016, 01:40)
Сообщение #327

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




Цитата(AlexSpl @ 27 Dec 2016, 23:50) *
Цитата
*(float*)&c->eax = 0.1f;

1. &c->eax - получаем адрес числа, а не его значение;
2. *(float*)&c->eax - интерпретируем число по адресу &c->eax, как float.


Слегка не ясно. Зачем амперсант тогда. Если
Цитата
2. *(float*)&c->eax - интерпретируем число по адресу &c->eax, как float.

Т.е. значение адресса берём. Это не то же самое что и *(float*)c->eax ?

Как я понял. &c->eax == 0x4E480B (условно)
При этом c->eax = 12 (условно)
Соотв. если флоат интерпретирует значение по адрессу как флоат, это то же самое что и без амперсанта ...
(float) c->eax === *(float*)&c->eax ?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 28 Dec 2016, 01:51 (Сообщение отредактировал AlexSpl - 28 Dec 2016, 10:27)
Сообщение #328

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




Цитата
Т.е. значение адресса берём. Это не то же самое что и *(float*)c->eax ?

Например, если c->eax = 0, то *(float*)c->eax прочитает память по нулевому адресу. Типичная причина вылета.

Можно ещё так:
Код
*(float*)&c->eax = 1.1f;

Код
(float&)c->eax = 1.1f;


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 12:13
Сообщение #329

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




Какая ф-я(адрес) расчёт скорости героя на начало хода ведёт?
Имеется виду именно минимальная скорость монстра в войске героя. Хочу при определёных условиях мин скорость монстра увеличивать
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 28 Dec 2016, 12:37
Сообщение #330

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20603 раза




004E4C00, DoCalcHeroMovementPoints
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 12:39
Сообщение #331

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




Цитата(feanor @ 28 Dec 2016, 11:37) *
004E4C00, DoCalcHeroMovementPoints


Цитата(DedMorozzz @ 27 Dec 2016, 23:14) *
Как я понимаю базовая ф-я расчёта скорости героя - CalcHeroMovementsPoints
Далее, если я верно понимаю должно вызываться это - loc_004E4E22, для расчёта скорости по земле
Для воды - другая ф-я. Но вот что дальше делать - пока не понимаю


Вот на этом подзастрял..
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 28 Dec 2016, 12:52 (Сообщение отредактировал feanor - 28 Dec 2016, 12:53)
Сообщение #332

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20603 раза




004E4ED9 - место где скорость минимального существа преобразуется в запас очков хода

наверное, так
Код
int __stdcall qwertyuiop(LoHook* h, HookContext* c)
{
    c->ecx += *(char*)(c->ebx + 201);
    return EXEC_DEFAULT;
}

h->WriteLoHook(0x4E4ED9, (void*)qwertyuiop);


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 12:57
Сообщение #333

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




Цитата(feanor @ 28 Dec 2016, 11:52) *
004E4ED9 - место где скорость минимального существа преобразуется в запас очков хода

наверное, так
Код
int __stdcall qwertyuiop(LoHook* h, HookContext* c)
{
    c->ecx += *(char*)(c->ebx + 201);
    return EXEC_DEFAULT;
}

h->WriteLoHook(0x4E4ED9, (void*)qwertyuiop);

да, оно. Спасибо!
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 13:36
Сообщение #334

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




чёт странное происходит:

Код
int __stdcall setBaseHeroSpeed(LoHook* h, HookContext* c)
{
    char speedBonus = 0;
    if (*(char*) (c->edx + 201 + 0) > 0) {
        speedBonus = 3;
    }

    char finalBonus = *(char*)(c->ebx + 201) + speedBonus;
    c->ecx += finalBonus;

    return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x4E4ED9, setBaseHeroSpeed);


Муха из болота. Скорость 9. Базовая скорость 1900.
Базовый поиск пути - скорость становится 1960
Улучшенный - 2000

Ожидаемо 2000 всегда ибо в коде прописано "при наличии поиска пути" делать +3 к скорости. Уровень навыка пока что не влияет...
В чём тут ошибка?
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 28 Dec 2016, 13:40
Сообщение #335

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20603 раза




Цитата
Код
    if (*(char*) (c->edx + 201 + 0) > 0) {

ebx же


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 13:45
Сообщение #336

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




Цитата(feanor @ 28 Dec 2016, 12:40) *
Цитата
Код
    if (*(char*) (c->edx + 201 + 0) > 0) {

ebx же

вот жеж! Выше вообще готовое решение было smile.gif А я подумал что то выборка обычной скорости монстра была...
И пытался навесить условие с левелом навыка
А всё намного проще оказалось! Спасибо smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 15:10
Сообщение #337

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




Пробую сделать +1/+2/+3 скорости на 1й ход, для тактики, во время боя во всех банках (т.е. там где войска по центру)

Иду от простого к сложному. Пробую для любого боя, без учёта тактики сделать бонус к ходу

.text:00475A37 loc_00475A37: ; CODE XREF: sub_00475800+255j
.text:00475A37 cmp dword ptr [ecx+34h], 0FFFFFFFFh ; Compare Two Operands
.text:00475A3B jz short loc_00475A45 ; Jump if Zero (ZF=1)
.text:00475A3D call combatMonster_SetUpNewRound ; Call Procedure
.text:00475A42 mov ecx, [ebp-4]

Сюда мы попадаем когда начинается новый ход.

Здесь я должен убрать бонус к скорости, если он есть. Но лучшее решение - взять номер раунда, если 1й, тогда давать бонус, но временно...
В общем, пробую хоть что-то сделать, что бы работало. Т.е. язнаю что попадаю в блок выше (475A37) после 1го раунда

Делаю:
Код
int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c)
{
    //*(int*)(c->ecx +196) += 2;
    *(int*)(c->ecx + 1224) += 2;
    return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x475A37, setTacticsUnitSpeed);


Не работает. Итого вопрос - как более правильно задать скорость монстров, желательно на 1н ход. Какой адресс и edi/edx... юзать
И заодно, было бы здорово понять когда бой в банке, а когда обычный
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 20:00 (Сообщение отредактировал DedMorozzz - 28 Dec 2016, 20:00)
Сообщение #338

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




Попробовал на ф-ю Battle
Код
_PI->WriteLoHook(0x4AD163, setTacticsUnitSpeed);

Судя по коду 2 переменные там:
Код
.text:004AD161                     mov     ebp, esp


Зная по примеру из магии замедления, есть 2 смещения монстров. 196 скорость и 1224 - модификатор скорости
В надежде что или ebp или esp будет монстр - пробовал им задать. При любом раскладе вылетает
Какой адрес верный? Должна же в ф-ии битвы присутствовать переменная с монстрами
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 28 Dec 2016, 20:43
Сообщение #339

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




Что я могу сказать? ) Не решается эта задача так просто. Нужно ловить в коде инициализацию отрядов. Если бой в банке, всем союзным добавлять +1 к скорости. В начале второго раунда убирать этот бонус. Куча работы.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 20:51 (Сообщение отредактировал DedMorozzz - 28 Dec 2016, 21:11)
Сообщение #340

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




Цитата(AlexSpl @ 28 Dec 2016, 19:43) *
Что я могу сказать? ) Не решается эта задача так просто. Нужно ловить в коде инициализацию отрядов. Если бой в банке, всем союзным добавлять +1 к скорости. В начале второго раунда убирать этот бонус. Куча работы.


я понимаю ):
Нашел код боя. Нашел код нового раунда. Вроде знаю смещения модификаторов скорости
А вот совместить как - хз. Даже не то что совместить, а хотя бы реализовать частично кусок - хз как

Потому и пошел по частям - увеличить при любом бое союзным юнитам скорость на 1. Но не понял как
Нет цели всё сразу, пробую по частям

PS: т.е. на данный момент хочу решить задачу такую - при наличии тактики (смещение +19) всем союзным юнитам сделать +2 скорости
PPS: чуток подкопал по банкам/склепам
0040AB40 - адресс посещения банка. (.text:0040AB40 Enter2ObjectGuardText proc near) там диалог. Последний блокперед боем (004AC24E loc_004AC24E:) В нём вызывается (loc_004ABAB0) это уже сам бой
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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