Перейти к содержанию

[Resident Evil 4] Спавн врагов


Рекомендуемые сообщения

В видео про спавн врагов в ре6, во второй его части пользователь спросил: могу ли я сделать подобное для ре4, версия 1.1

Еще в феврале в 10-х числах начал искать. Как-то несколько дней что-то проверял, потом нашел зацепку, потом затянулось и только в марте снова взялся.

Только сейчас дошли руки записать видео, скрипт пробный уже недели 2 готов был.

 

Версия игры 1.1., это не Ultra HD Remaster или как он там в стим называется, но кажется  в нем все так же работает, разве что указатели в других местах.

Сделал пробный скрипт спавна врагов. Спавнит в упрощенном варианте, рядом с игроком.

Если на уровне не предусмотрены враги, то возможен вылет при попытке спавна (возможно файл не загружен в памяти, а при создании объекта не проверяется, что не загружен).

 

Как обычно работает на Tab. Сначала инициализирует массив со всеми структурами npc/enemy, прописано изначально только на врагов (0x12). При смене уровня обновляет массив заново.

Можно убрать инициализацию цикла и создавать, заполняя данные вручную.

По крайне мене когда я пытался,  если спавнить не врагов а все иное, то вылет происходит, не сильно проверял почему, т.к. главной целью было спавнить врагов.

 

видео

 

Скрипт

Спойлер

 


[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048)
alloc(enemies,2048)
label(returnhere)
label(originalcode)
label(exit)
label(skip)
label(tick)
label(data)
label(loop)
//label(initdata)
label(exitloop)
registerSymbol(data)
registerSymbol(enemies)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here

test eax, eax
je originalcode

pushad
pushf

//cmp [enemies], 0
//jne exitloop
mov ecx, [033F6EC4+8] //current object count on level
mov edi, [leveldata]
cmp ecx, edi
je exitloop
mov [enemies], 0
xor ebp,ebp
mov edi,[00A3A280]
mov ecx, [033F6EC4+8]
mov [leveldata], ecx //save it
mov ecx, enemies+4

loop:
lea esi,[edi+ebp+000063F8]
cmp byte [esi+1], 12
jne @f
inc [enemies]
mov [ecx], esi
add ecx, 4
skiploop:
add ebp, 20
cmp ebp, 2000
jb loop

exitloop:

push 9
call GetAsyncKeyState
test eax,eax
je @f

call GetTickCount
sub eax, [tick]
cmp eax, 200
jb @f

//get random index between 0..enemies count
call rand
xor edx, edx
div [enemies]
mov ecx, enemies+4
mov esi, [ecx+edx*4]

movzx eax, [esi+1]
push eax
mov ecx, 033F6EC4
call 00409F93

test eax, eax
je @f

mov ecx, [data]
mov [ecx*4+data+4], eax
inc [data]

mov esi, [033F6EAC]
mov ecx, [esi+c0]
mov [eax+c0], ecx
mov ecx, [esi+c4]
fld [floats]
//mov [eax+c4], ecx
fstp [eax+c4]
mov ecx, [esi+c8]
mov [eax+c8], ecx

/*
mov byte ptr [eax+11d], 4
//mov [eax+478], 0404
mov [eax+47a], 0404
//mov [eax+00000464], 5A0E1BCA

mov [eax+474], 08012420
*/

//mov ecx, eax
//mov edx, [eax]
//call [edx+10]

mov ebp, eax
//get random index between 0..enemies count
call rand
xor edx, edx
div [enemies]
mov ecx, enemies+4
mov esi, [ecx+edx*4]

mov eax, ebp

//initdata
sub esp, 100
//relocated code 005A943A
mov dl,[esi+02]
mov [eax+0000011D],dl
mov cl,[esi+03]
mov [eax+00000485],cl
mov edx,[esi+04]
mov [eax+00000474],edx
mov cl,[esi+0B]
mov [eax+00000492],cl
//movsx edx,word ptr [esi+1A]
//mov [esp+14],edx
//fild dword ptr [esp+14]
//fmul dword ptr [game.exe+5CEC80] { [1000.00] }
//fstp dword ptr [eax+0000046C]
mov cx,[esi+08]
//fld dword ptr [game.exe+634D00] { [6.28] }
mov [eax+00000478],cx
//fmul dword ptr [game.exe+5D6BA8] { [0.00] }
mov [eax+0000047A],cx
//movsx ecx,word ptr [esi+12]
//mov [esp+14],ecx
//fild dword ptr [esp+14]
//fmul st(0),st(1)
//fstp dword ptr [eax+000000D0]
//movsx edx,word ptr [esi+14]
//mov [esp+14],edx
lea edx,[eax+000000C0]
//mov edi,edx
//fild dword ptr [esp+14]
//fmul st(0),st(1)
//fstp dword ptr [eax+000000D4]
//movsx ecx,word ptr [esi+16]
//mov [esp+14],ecx
//fild dword ptr [esp+14]
//fmul st(0),st(1)
//fstp dword ptr [eax+000000D8]
//movsx ecx,word ptr [esi+0C]
//mov [esp+14],ecx
//fstp st(0)
//fild dword ptr [esp+14]
//fmul dword ptr [game.exe+5CE9E0] { [10.00] }
//fstp dword ptr [edx]
//movsx ecx,word ptr [esi+0E]
//mov [esp+14],ecx
//fild dword ptr [esp+14]
//fmul dword ptr [game.exe+5CE9E0] { [10.00] }
//fstp dword ptr [eax+000000C4]
//movsx ecx,word ptr [esi+10]
//mov [esp+14],ecx
//lea ecx,[eax+00000130]
//mov [eax+00000488],bl
//fild dword ptr [esp+14]
//fmul dword ptr [game.exe+5CE9E0] { [10.00] }
//fstp dword ptr [eax+000000C8]
////////////////////////////////////////////////
//....................
mov ecx,[game.exe+2FF6EAC] { [172A07A0] }
fld dword ptr [ecx+000000C8]
fsub dword ptr [eax+000000C8]
fld dword ptr [ecx+000000C0]
mov ecx,eax   {ptr as this}
fsub dword ptr [edx]
mov edx,[eax]
mov [eax+00000464],5A0E1BCA { 1510874058 }
fld st(0)
fmul st(0),st(1)
fld st(2)
fmul st(0),st(3)
faddp
fstp dword ptr [eax+00000460]
fstp st(0)
fstp st(0)
call dword ptr [edx+10]

add esp, 100

call kernel32.GetTickCount
mov [tick], eax


skip:
popf
popad

originalcode:
add eax, 000000C0

exit:
jmp returnhere
tick:
dd 0
floats:
dd (float)100.00
leveldata:
dd   0
data:
dd   0        //size
              //list

enemies:
dd   0        //size
              //list

"game.exe"+31E4DE:
jmp newmem
returnhere:


 
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
unregisterSymbol(data)
unregisterSymbol(enemies)
dealloc(newmem)
dealloc(enemies)
"game.exe"+31E4DE:
add eax, 000000C0
//Alt: db 05 C0 00 00 00

 

 

ссылка на файл

http://s000.tinyupload.com/?file_id=08064413723196487564

 

Указатель на объект, который используется для спавна npc/врагов (и игрока единожды) 0x033F6EC4

+4 указатель на игрока

+8 максимально возможно количество объектов

+14 - последний созданный объект

в каждом объекте +8 - предыдущий объект

таким образом происходит полный обход всех объектов

 

0x009D3558 класс врага

0x009EF690 класс игрока

 

если кому интересно, допишу подробнее информацию из заметок, что вел

 

*оказалось записывал с отключенной функцией подавления шума, она сильно делала тише запись, но шумов не было. Когда усилил сигнал тут, то шумы очень сильно слышны были, подавил как мог в Audacity. Громкость не повышал аудиозаписи сильно, чтобы шумы не были уж слишком слышны.

Изменено пользователем X86Jumps
  • Понравилось 3
  • Плюс 3
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.