давай сначала определимся, что значит 'сжать'?
Вид для печати
Товарищи кодеры, помогите разобраться! Решил я значит подредактировать карты обоих левелов в REX, чтобы можно было свободно гулять по комнатам. Но прежде чем начать, хотелось бы понять, как сделать возможным возврат в нулевую комнату? Ведь в игре 0 - это запрет перехода.
char справился с этой проблемой. Он дал какой-то код, но как мне применить этот код к кодовым блокам рекса? Как этим кодом пропатчить те блоки, которые мне нужно? (хочу править русифицированую версию)
Вот несколько цитат с темы про правку карты рекса:
либо запрет на вход меняй на любой другой неюзаный, либо нулевой экран перенумеруй....
rasmer, как поменять запрет на вход с #00 на #FF?
Как перенумеровать нулевой экран? Я нифига не понимаю ))
Просто я подумал, что раз char выложил патч, то этот патч можно как-то применить, а если его нельзя приментить, тогда нафига его выкладывать. Вот я и хочу понять, как применять этот патч или какой-либо другой.
ну раз тебе char выложил, то и попроси его применить...
ты здесь спросил как сделать возможным возврат, я тебе объяснил... а как и где менять - это сам ковыряй код игры... почитай капульцевича "как написать игру на асме" и инфоркомовский справочник по машкодам, я думаю через полгода-год найдёшь ответ в них... :)
А что там про взлом игр?
Оптимистичненько так...
На самом деле стоит почитать Капульцевича - появится представление об ассемблере. Но это займет не год и не пол года, за месяц даже с разбором примеров (благо они уже есть в сорцах) можно управиться.
хорошо, набросал патчилку на бейсике, проверяй:
можно патчить что-угодно, в операторах data указывая стартовый адрес, пробел, и дальше - последовательность байт для poke (1 байт = 2 символа в шестнадцатеричном)
Код:10 goto 30
20 rem h= HexToDec(h$)
21 let h=0:let p=1:for L=len h$ to 1 step -1:let k=code h$(L)-48
23 if k>10 then let k=k-7:if k>15 then let k=k-32:if k<0 or k>15 then print "error!":stop
25 let h=k*p+h:let p=p*16:next L: return
30 read a$:if len a$>0 then print inverse 1;" #";a$:let h$=a$(to 4):gosub 20: let adr=h:let a$=a$(6 to):for i=1 to len a$/2:let h$=a$(i*2-1 to i*2):gosub 20:poke adr+i-1,h:print adr+i-1;" ";h:next i:goto 30
1000 data "d0a4 f8"
1010 data "d0b5 f8"
1020 data "d13c f8"
1030 data "d19f fa"
1040 data "B133 ff01ffff"
1050 data "B139 ff0F0200"
1060 data "B13F 0103ffff"
...
1999 data ""
пора открывать тендер "Поможем Новосибу!":)
Спасибо! Код бейсика у тебя на высшем уровне :v2_thumb:
Когда я задавал вопрос, про то как ты изменил запрет на вход, то я неправильно выразился. Я затупил и поэтому не разглядел, что измена запрета входа с 00 на ff это: poke 53412,248/ 53429,248/ 53564,248/ 53663,250. Именно про это я и спрашивал. Я не имел ввиду как ты вышел на эти адреса, понятно, что для этого надо как минимум, фигурально выражаясь, "полгода читать капульцевича" )))
Так бывает, что человек спрашивает одно, а ему отвечают другое, ибо никто не допускает даже мысли, что человек, задавая вопрос, элементарно затупил, или упустил что-то из виду.
P.S. Эту замечательную универсальную патчилку на бейсике я еще не проверял на рексе, но есть опасения, что для бейсика не хватит места, ибо распакованный кодовый блок рекса занимает довольно много места в памяти, бейсик-патчилка тоже не маленькая. Может статься, что в случае с рексом проще поменять значения в дебаггере эмулятора. Посмотрим.
---------- Post added at 19:04 ---------- Previous post was at 18:57 ----------
И по горячим следам у меня еще один вопрос. Как юзать патчилку на бейсике - это понятно. Загружаем патчилку, загружаем блок, запускаем патчилку, она патчит. А как юзать патчилку на асме, которую ты выкладывал? Я правильно понял, что нужно открыть редактор ассемблера, вбить туда код (а скопипастить как-нибудь можно?), потом это всё надо скомпилровать в машинный код, а дальше уже юзать этот код как бейсик-патчилку? Или я что-то напутал?
на асме примерно так:
Код:org #4000 ;16384
;
PATCH
ld hl,P_DATA
patchlp
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld a,e
or d
ret z ;de=#0000=exit
ld c,(hl)
inc hl
ld b,#00
ldir
jr patchlp
;
P_DATA
dw #d0a4
db 1,#f8
dw #d0b5
db 1,#f8
dw #d13c
db 1,#f8
dw #d19f
db 1,#fa
dw #B133
db 4,#ff,#01,#ff,#ff
dw #B139
db 4,#ff,#0F,#02,#00
dw #B13F
db 4,#01,#03,#ff,#ff
dw #B145
db 4,#0f,#04,#ff,#02
;...
dw #0000 ;finish
;
P_LEN equ $-PATCH ; for save "mypatch" code 16384,P_LEN