PDA

Просмотр полной версии : Маленькие патчи



TomCaT
22.04.2018, 22:42
Привет, многоуважемый All.

Решил создать тему на распутье Тем "Игры", "Софт" и "Программирование". Давайте собирать сюда кусочки кода, которое (будучи внесенными в существующие программы) дают, на ваш взгляд, какие-либо улучшения в их работе. Конечно, может быть задан вопрос: "А что, на релиз не хватило <подставить что-нибудь>?" :) Ответим тогда: "Пока не хватило. Сделаем по возможности, даже еще лучше, чем просто с эдаким микропатчем :) . А пока - желающие могут уже пользоваться, а новички - потренироваться в обращении с отладчиками."

Для затравки: если в Professional Ski Simulator (в процессе работы программы) по адресу "67E8" заменить код

ld a,(633D)
на

call F7D0

а по адресу F7D0 добавить следующую подпрограмму

ld hl,(7106)
ld a,(7C22)
cp 02
jr c,F7E4
ld de,(712D)
sbc hl,de
ex de,hl
jr nc,F7E4
add hl,de
ld a,l
rr h
rra
rr h
rra
rr h
rra
rr h
rra
sub 08
ld c,a
ld a,(633D)
ret c
cp c
ret nc
ld a,06
ret


то тогда "камера" не будет обгонять спортсмена, оставляя его безнадежно падать, натыкаясь вслепую на флажки. Конечно, при игре вдвоем "камера" будет ориентироваться только на лидера. При игре против компьютера - будет смотреть за человеком. Ну, и если пойти на рекорд и "выехать за кадр", то быстрее "оператор" "камеру" не сдвинет. Но, имхо, так все же лучше, чем было.
З.Ы. : константа 8 в команде 'sub 08' регулирует, насколько камере позволяется уйти вперед. Чем меньше число, тем меньше трассы будет видно впереди в момент остановки камеры. Наиболее приемлемые числа - в районе от 06 до 0c
З.З.Ы. : почему-то мысль сделать патч появилась только после беглого просмотра версий под смежные платформы, где встречался гораздо более вменяемый скроллинг ...

З.З.З.Ы. : по просьбам трудящихся, добавляем ответ для задачки №1 из серии "патчумелые ручки" (см. вложение). Т.к. это ответ, то по традиции отображаться он на экране будет в перевернутом виде :) .
65150

Destr
23.04.2018, 17:54
POKE тоже микропатч!

- - - Добавлено - - -

Затея хорошая, бывают интересные подпрограммки.

TomCaT
24.04.2018, 20:12
POKE тоже микропатч!

Конечно. Но если имеются в виду POKE для патча. А POKE для читов и трейнеров - для них уже есть множество центров сбора и баз. Не исключая их подмножества (о как :) ) как такового из сабжа, все-таки не стоит специально собирать их сюда. "Патч", который переводится "заплатой", призван улучшать и устранять недостатки.

ZX_NOVOSIB
25.04.2018, 08:39
то тогда "камера" не будет обгонять спортсмена, оставляя его безнадежно падать, натыкаясь вслепую на флажки. Конечно, при игре вдвоем "камера" будет ориентироваться только на лидера. При игре против компьютера - будет смотреть за человеком. Ну, и если пойти на рекорд и "выехать за кадр", то быстрее "оператор" "камеру" не сдвинет. Но, имхо, так все же лучше, чем было.
Ещё бы всё это в виде TRD... )) На крайний случай в виде SNA.

А нет случайно патча, чтобы пофиксить управление в Escape from the Planet of the Robot Monsters (https://vtrd.in/gamez/e/EFTPTRM_.ZIP)? )

TomCaT
26.04.2018, 22:21
Эх! Вот SNA добавил.

А насчет Escape - управление там довольно бодрое. Если менять повороты на направления - так местами кнопка "вперед" нужна, чтобы вскарабкаться на стену, если свалиться за край. Да, и как быть с кнопкой "назад"? Чем же тогда бомбить?

ZX_NOVOSIB
27.04.2018, 14:05
А насчет Escape - управление там довольно бодрое. Если менять повороты на направления - так местами кнопка "вперед" нужна, чтобы вскарабкаться на стену, если свалиться за край. Да, и как быть с кнопкой "назад"? Чем же тогда бомбить?
Управление там ужасное. Что-то с опросом клавиш, из-за чего поведение ГГ напоминает поведение курицы с отрубленной головой. Вот нажал чуть клавишу, хотел чуток повернуться, а игра распознала как-будто ты 2 или 3 раза нажал.

Можно не менять повороты на направления, можно просто сделать как например в la abadia сделано, т.е.: идём, приспичило повернуть, жмём поворот, ГГ сделает ровно один поворот, независимо от того, сколько микросекунд длилось нажатие на клавишу. Одно нажатие - один поворот, даже если клавишу поворота вообще не отпускать. А для того, чтобы ГГ сделал ещё один поворот, нужно отпустить клавишу и ещё раз нажать.

Вот и тут неплохо хотя бы так сделать (про переназначение клавиш на qaop/space даже мечтать не приходиться, хотя было бы неплохо). Для сравнения снапшоты этих двух игр в аттаче, в la abadia движение A, повороты K, L. В Escape - 67890)

В играх на 3dgm тоже управление "куринное", но krt17 сумел победить это управление и сделал идеальное управление в нескольких таких играх, за что собственно мы его и ценим (и не только за это).

TomCaT
30.04.2018, 21:47
Ключевое место около B0B0.

Там проверяются биты 1 и 0 аккумулятора, и в соответствии изменяется направление игрока по (IX+0E). IX бывает 9F08 или 9F1F.

Что-то такое могло бы работать:

код по адресу B0B1 заменить на


ld h,ff
bit 1,a
jr nz,B0BE
ld h,1
bit 0,a
jr nz,B0BE
dec h
push bc
call A25A
pop bc
jr nc,B0D1


а по адресу A25A добавить



ld c,a
ld a,xl
and 01
or 58
ld l,a
ld a,c
ld b,h
ld h,A2
ld c,(hl)
ld (hl),b
ld h,b
rr b
ret nc
rr c
ccf
ret


то в управлении поворотами должен срабатывать только "1 поворот на 1 нажатие".

Но это не работает - после перехода на соседний экран патч по адресу A25A затирается, и игра чудом не вылетает.

Можно по адресу 9718 заменить команду на


ld bc,0320

Это не даст затереть патч, но остается неизвестным - используется ли это временное место для чего-то (например, в экранах, забитых техникой). Нужен долгий тест.
65190

goodboy
02.05.2018, 10:26
Это не даст затереть патч, но остается неизвестным - используется ли это временное место для чего-то (например, в экранах, забитых техникой). Нужен долгий тест.
проверяется элементарно.
делаешь в эмуле BreakPoint на запись/чтение в эту область памяти
и (поставив полную неуязвимость) быстренько проходишь игру

ZX_NOVOSIB
02.05.2018, 10:37
TomCaT, добавлять новую инфу путем редактирования своих старых постов - не лучшая идея. Редко кто перечитывает старые темы и все посты в них ))

Новая инфа - новый пост! :)

TomCaT
02.05.2018, 21:04
проверяется элементарно.
делаешь в эмуле BreakPoint на запись/чтение в эту область памяти
и (поставив полную неуязвимость) быстренько проходишь игру

Это да. Вопрос в том, как быстренько :) . В Prof Ski Sim семь трасс, ни одна не дольше минуты. А тут чуть дольше *оглядываясь в поисках добровольцев* .



Новая инфа - новый пост!
Добро.

TomCaT
21.03.2019, 21:53
Если в Cauldron (в процессе работы программы) по адресу "8628" заменить код на такой


ld hl,003C
call 627E
ld de,0017
add hl,de
push hl
ld hl,(A22D)
ld de,00FD
call 6194
ld a,h
or l
pop hl
jr z,8644


то тогда "нечисть" взлетающая в ночной воздух, не сможет сразу броситься на ГГ. Константой 0017 можно регулировать минимальное время "страха".

Bedazzle
21.03.2019, 22:22
проверяется элементарно.
делаешь в эмуле BreakPoint на запись/чтение в эту область памяти
и (поставив полную неуязвимость) быстренько проходишь игру

я гонял rzx на максимальной скорости, а потом вручную проходил те ветки, которых не было в прохождении (к примеру, когда геймовер, или когда в менюшке выбираются разные пункты)

TomCaT
24.03.2019, 19:24
Если в Cauldron (в процессе работы программы) по адресу "8C35-8D18" заменить код на такой




ld hl,(A237)
ld de,0005
call 6194
ld a,h
or l
jr z,8C8F
ld hl,(A197)
ld a,h
or l
jr z,8C8F
ld hl,(A245)
ex de,hl
ld hl,(A247)
ld a,h
or d
jr nz,8C8F
ld a,l
cp 05
ld a,e
jr z,8C66
ex de,hl
cp 05
ld hl,(A243)
inc hl
inc hl
jr z,8C71
jr 8C8F
; 8C66
cp 05
ld hl,(A243)
inc hl
dec hl
jr nz,8C71
jr 8C8F
; 8C71
ex de,hl
push hl
ld hl,(A241)
dec hl
call 6201
ld de,0005
call 6194
ld a,h
or l
pop hl
jr z,8C8F
ld a,42
cp l
jr nz,8C8C
ld l,45
ld (A237),hl
; 8C8F
ld hl,(A195)
ld de,0017
call 6194
ld a,h
or l
jr z,8CBC
ld hl,(A237)
ld a,h
and a
ld a,l
jr nz,8CB2
cp 41
jr c,8CB2
cp 43
jr nc,8CB2
ld hl,0001
ld (A231),hl
; 8CB2
cp 44
jr nz,8CBC
ld hl,0005
ld (A239),hl
; 8CBC
ld hl,(A239)
ld de,0005
call 619D
ld a,h
or l
jr z,8CF5
ld hl,(A237)
ld a,h
and a
ld a,l
jr nz,8CF5
cp 42
jr z,8CEF
cp 45
jr z,8CEF
cp 44
jr nz,8CF5
ex de,hl
ld hl,(A23B)
call 6194
ld a,h
or l
jr z,8CF5
ld hl,(A197)
ld a,h
or l
jr nz,8CF5
ld hl,0005
ld (A237),hl
; 8CF5
; это место освободилось
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0
db 0,0,0,0




то тогда прыгать под землей станет проще - можно подбегать к самому краю перед прыжком, или, приземляясь и зацепившись за краешек, так же быстро добежать до середины площадки. Чтобы в тех же местах, где с площадки можно было спрыгнуть на площадку прямо вниз - эта возможность не исчезла, патч работает только в движении. Остановившись на краю площадки, можно обнаружить, что падение произойдет, как и раньше. В итоге патч значительно облегчает перемещения, делая доступными несколько новых проходов - например, в склепе при дальних прыжках.

TomCaT
26.05.2019, 23:07
Если в Cauldron (в процессе работы программы) по адресу "64AC" записать 04, по адресу A542 записать D4, CE, 10, 02, 06, по адресу "A9DA" записть 04, C7, 5F, по адресу "A9CD" записать 04, а затем по адресам "9818-985F" заменить код на такой



; 9818
ld hl,(A287)
ld a,h
and a
ld a,l
ld hl,1
jr nz,9866
cp 0E
jr nz,982A
ld (A149),hl
; 982A
cp 0C
jr nz,9837
ld (A145),hl
call 764f
jp 994a
; 9837
cp 0D
jr nz,9844
ld (A147),hl
call 764f
jp 994a
; 9844
cp 04
jr nz,9866
call 984e
jp 994a
; 984e
ld hl,(9C82)
ex de,hl
ld hl,(A161)
xor a
sbc hl,de
ret nc
ex de,hl
ld (A161),hl
jp 76A7



то тогда в подземельях появятся источники магии для пополнения сил.

TomCaT
20.11.2024, 10:10
Если в Cauldron II (в процессе работы программы) в трех местах сделать такие замены кода:



;magic pushes for playable jumps

equ 0xfd97
;
mpush:
;
cp 3
ret z
; no roll - so no loss of control
ld a,(ix-57)
xor (ix-61)
and 0x0c
ld c,a
ld b,(ix+3)
xor b
and 0x0c
ret z
; dirs mismatch - trying to change dir
ld a,b
and 0x03
or c
ld c,a
; new dir prepared
ld a,(0xe5f0)
ld b,0
cp 0x32
jr c,mpchk
; magic no less than 20% - first magic push per jump
inc b
cp 0x35
jr c,mpchk
; magic no less then 50% - more magic pushes
inc b
;
mpchk:
ld a,(mpushes)
cp b
ret nc
; have the push power yet
inc a
ld (mpushes),a
ld (ix+3),c
ret
;
; fddb
;
mpushes db 0

;53 bytes

;____________________
;add magic push check at every movement

;...
equ 0xd517
;
jp z,0xcfe5
call mpush
;...

;6 bytes

;____________________

;reset magic push counter at landing

equ 0xd00b
;...
xor (ix-61)
and 0c
or (ix-46)
ld c,a
; got new horizontal movement
ld a,(ix+3)
and 03
or c
; mixed with old vertical movement
ld (ix-48),a
xor a
ld (mpushes),a
nop
;...

;23 bytes



то тогда "заряженная" тыква станет куда управляемей. с 20% магии и выше получит право изменить направление в полете, а с 50% - дважды.

ZXMAK
20.11.2024, 10:41
Патч JETPAC (https://worldofspectrum.net/item/0009362/) для управления стандартными кнопками:
Q - вверх
A - вниз
O - лево
P - право
SPACE - огонь

Патч накладывать по брейкпоинту на #6000 при загрузке.



org $7345
ld a,$df ; Row: P,O,I,U,Y
out ($fd),a ; Set port for reading keyboard
in a,($fe) ; ...and read that row of keys
bit 0,a
jr z,right
bit 1,a
jr z,left
jr nokey
left:
ld a,$fd ; #REGa=LEFT_KEY : 1111 1101
ret ;
right:
ld a,$fe ; #REGa=RIGHT_KEY : 1111 1110
ret ;
nokey:
ld a,$ff ; #REGa=No input detected
ret ;
;#7374 len=0x7374-0x7345=47

org $737d
ld a,$7f ; Row: Space,Sym,M,N,B
loop_1:
out ($fd),a ; Set port for reading keyboard
in a,($fe) ; ...and read that row of keys
and $01
jr z,fire
ld a,$7f ; Row: Space,Sym,M,N,B
djnz loop_1 ; Loop back and read input again
ld a,$ff ; Still no input detected
ret ;
fire:
ld a,$ef ; #REGa=FIRE : 1110 1111
ret ;
;#7393 len=0x7393-0x737d=22


org $739c
ld a,$fb ; Row: Q,W,E,R,T
loop_2:
out ($fd),a ; Set port for reading keyboard
in a,($fe) ; ...and read that row of keys
and $01 ;
jr z,up
ld a,$fb ; Row: Q,W,E,R,T
djnz loop_2 ; Loop back and read input again
ld a,$ff ; Still no input detected
ret ;
up:
ld a,$f7 ; #REGa=UP (thrust) : 1111 1110
ret ;
;#73b2 len=0x73b2-0x739c=22

Bedazzle
20.11.2024, 11:55
А какие эмули позволяют удобно патчить?

goodboy
20.11.2024, 12:14
Патч JETPAC для управления стандартными кнопками
подобное уже было

https://spectrumcomputing.co.uk/SCRtoImage.php?SCR=zxdb/sinclair/entries/0037431/0037431-run-1.scr&border=0