Rev 1545 |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
;╨▓╨╝╨╡╤Б╤В╨╛ dy ╨╝╨╛╨│╤Г╤В ╤Б╤В╨╛╤П╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П:
SPRLIST_STAYING=99 ;╨╝╤С╤А╤В╨▓╤Л╨╣ (xhigh=INVISIBLEX) ╨╕╨╗╨╕ ╤Г╨╢╨╡ ╨▓╨┐╨╡╤З╨░╤В╨░╨╜╨╜╤Л╨╣ ╨▓ ╨║╨░╤А╤В╤Г, ╨╜╨╡ ╨╛╨▒╤А╨░╨▒╨░╤В╤Л╨▓╨░╨╡╤В╤Б╤П ╨╗╨╛╨│╨╕╨║╨╛╨╣
SPRLIST_END=100 ;╨▓ ╨║╨╛╨╜╤Ж╨╡ ╤Б╨┐╨╕╤Б╨║╨░ ╨╡╤Й╤С spritehsb=1!
SPRLIST_PRINTED=101
SPRLIST_IMPOSSIBLE=102
;╨▓ ╨║╨░╨║╨╕╤Е ╤А╨╡╨│╨╕╤Б╤В╤А╨░╤Е ╤Е╤А╨░╨╜╨╕╤В╤М ╨┤╨░╨╜╨╜╤Л╨╡ ╨┐╤А╨╕ ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╡:
;lc=x16 ;XXXXXXXX XXx????? (╨╝╨╛╨│╤Г╤В ╨▒╤Л╤В╤М ╨┐╤А╨╛╨▒╨╗╨╡╨╝╤Л ╤Б ╤В╨╛╤З╨╜╨╛╤Б╤В╤М╤О X ╨┐╤А╨╕ ╤Б╨║╨╛╨╗╤М╨╢╨╡╨╜╨╕╨╕)
;e=dx8 ;sXXXXXXx (╨╜╨╡ ╨▒╨╛╨╗╨╡╨╡ +-4)
;h=y8
;d=dy8
;c=phase5 (╨▓ ╤Д╨╕╨╖╨╕╨║╨╡ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╤О╤В╤Б╤П ╤В╨╛╨╗╤М╨║╨╛ ╨┐╨╡╤А╨▓╤Л╨╡ ╨╜╨╡╤Б╨║╨╛╨╗╤М╨║╨╛ ╤Д╨░╨╖)
NEWREGS=0 ;TODO de=x16 (00XXXXXX XXXXxxxx), l=y8, h=dy8, b=dx8 (sXXXxxxx); c=phase (>600*2 ╤Д╨░╨╖ ╨╜╨╡ ╨▓╨╗╨╡╨╖╨╡╤В! ╨┐╤А╨╕╨┤╤С╤В╤Б╤П ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М ╨┐╨╛╨╗╨╡ dx8 (╨╕╨╗╨╕ ╤Б╤В. ╨▒╨╕╤В╤Л h ╨╕ ╨╝╨╗. ╨▒╨╕╤В╤Л l?) ╤Г ╤Б╤В╨╛╤П╤З╨╕╤Е ╤З╨╡╤А╨▓╨╡╨╣)
;╤Д╨░╨╖╤Л (╤З╨╡╤А╨▓╨╕ ╨╕ ╨╝╨╕╨╜╤Л ╨╛╤В╨╗╨╕╤З╨░╤О╤В╤Б╤П ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨╝ B - ╨░ ╤Г ╨╖╨░╤Д╨╕╨║╤Б╨╕╤А╨╛╨▓╨░╨╜╨╜╤Л╤Е ╤З╨╡╤А╨▓╨╡╨╣ ╨▒╨╛╨╗╤М╤И╨╡ ╨┤╨╛╨┐╤Г╤Б╤В╨╕╨╝╤Л╤Е ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╣ BC):
;0 - ╤Б╤В╨╛╨╕╨╝ (TODO 8 ╨▓ ╨┤╤А╤Г╨│╤Г╤О ╤Б╤В╨╛╤А╨╛╨╜╤Г)
;TODO 1 - ╤Б╨║╨╛╨╗╤М╨╖╨╕╨╝ (TODO 9 ╨▓ ╨┤╤А╤Г╨│╤Г╤О ╤Б╤В╨╛╤А╨╛╨╜╤Г)
;TODO 2..7 - ╨▓╤В╤Л╨║╨░╨╡╨╝╤Б╤П ╨╕ ╨▓╤Л╨╗╨╡╨╖╨░╨╡╨╝ (TODO 10..15 ╨▓ ╨┤╤А╤Г╨│╤Г╤О ╤Б╤В╨╛╤А╨╛╨╜╤Г)
;16..23 - ╨║╤А╤Г╤В╨╕╨╝╤Б╤П (TODO 24..31 ╨▓ ╨┤╤А╤Г╨│╤Г╤О ╤Б╤В╨╛╤А╨╛╨╜╤Г) - ╨╕╨╗╨╕ ╤Б╤В╨╛╨╕╨╝/╨║╤А╤Г╤В╨╕╨╝╤Б╤П/╤Б╤В╨╛╤А╨╛╨╜╨░ - ╤Н╤В╨╛ ╤А╨░╨╖╨╜╤Л╨╡ B? ╤В╨╛╨│╨┤╨░ ╨▓╤Б╨╡╨│╨╛ 3 ╨▒╨╕╤В╨░ ╨╜╨░ ╤Д╨░╨╖╤Г ╨╕ 3 ╨╜╨░ xxx?
;CHECKMASK ╨╜╨╡ ╨┤╨╛╨╗╨╢╨╜╨░ ╨┐╨╛╤А╤В╨╕╤В╤М ╤Н╤В╨╕ ╤А╨╡╨│╨╕╤Б╤В╤А╤Л!
;ADDCOORDS ╨╜╨╡ ╨┤╨╛╨╗╨╢╨╜╨░ ╨┐╨╛╤А╤В╨╕╤В╤М dx,dy!
macro GETCOORDS
if 1
ld c,(hl)
inc l
ld b,(hl)
inc l
push hl
ld e,(hl)
inc l
ld d,(hl)
inc l
ld a,(hl)
inc l
ld h,(hl)
ld l,a
ex de,hl
else
POP BC ;SPRITE
POP HL ;COORDS
POP DE ;SPEED
endif
endm
macro REGETCOORDS
if 1 ;TODO NEWREGS
pop hl
push hl
ld a,(hl)
inc l
ld h,(hl)
ld l,a
else
DUP 4
DEC SP
EDUP
POP HL ;OLD COORDS
pop af ;POP DE ;OLD SPEED
endif
endm
macro PUTCOORDS
if 1
ex (sp),hl
dec l
dec l
ld (hl),c
inc l
ld (hl),b
inc l
pop bc
ld (hl),c
inc l
ld (hl),b
inc l
ld (hl),e
inc l
ld (hl),d
inc l
else
PUSH de
PUSH hl
PUSH BC
DUP 3
POP BC
EDUP
endif
endm
macro ADDCOORDS
if NEWREGS
ld a,l ;dx
or a
jp p,$+4 ;a>=0
;a<0,C: ╨╖╨╜╨░╤З╨╕╤В e>|a|, ╤В.╨╡. ╤Д╨░╨║╤В╨╕╤З╨╡╤Б╨║╨╕ ╨╜╨╡╤В ╨┐╨╡╤А╨╡╨╜╨╛╤Б╨░
dec d ;a<0,NC: d-- (╨╕╨╜╨░╤З╨╡ ╨▒╤Г╨┤╨╡╤В ╨║╨╛╨╝╨┐╨╡╨╜╤Б╨╕╤А╤Г╤О╤Й╨╕╨╣ ╨╕╨╜╨║╤А╨╡╨╝╨╡╨╜╤В) ;+20
add a,e
jr nc,$+3
inc d ;a>=0,C: d++ (╨╕╨╗╨╕ a<0,C: ╨║╨╛╨╝╨┐╨╡╨╜╤Б╨╕╤А╤Г╤О╤Й╨╕╨╣ ╨╕╨╜╨║╤А╨╡╨╝╨╡╨╜╤В) ;+15.5
ld e,a
ld a,h ;dy
add a,l ;y
ld l,a ;y ;+16 = 51.5t (╨╝╨╛╨╢╨╜╨╛ x=de, ╤В╨░╨║ ╨┐╤А╨╛╤Й╨╡ CHECKMASK)
else
ld lx,e
XOR A
SRA E
RRA
SRA E
RRA
sra e
rra
ADD A,C ;xlow, phase
ADC HL,DE ;y,xhigh
ld c,a ;xlow, phase
ld e,lx
endif
endm
macro NEGDX
XOR A
if NEWREGS
sub b ;dx
ld b,a
else
SUB E
LD E,A
endif
endm
macro NEGDY
XOR A
if NEWREGS
sub h ;dy
ld h,a
else
SUB D
LD D,A
endif
endm
macro CHECKMASK
if NEWREGS
;l=y, de=x (00XXXXXX XXXXxxxx) (╤Б╤В. ╨▒╨╕╤В╤Л X ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М ╤В╨╛╨╗╤М╨║╨╛ ╨┤╨╗╤П ╤А╨░╨╖╨╜╤Л╤Е ╤Д╨░╨╖ ╤Б╤В╨╛╤П╤З╨╕╤Е ╤З╨╡╤А╨▓╨╡╨╣)
push hl
ld a,d ;xhigh>>2
ld h,TMASKLN/256
add a,(hl)
inc h
ld h,(hl)
ld l,a
jr nc,$+3
inc h
ld a,(hl) ;mask byte
ld l,e ;xlow>>2
ld h,TABROLL/256
and (hl) ;bit(x)
pop hl
else
;l=xhigh, c=xlow (XXXXXXXX XXx?????), h=y
push hl
ld a,c ;xlow
srl l
rra
srl l
rra
ex af,af' ;' ;xlow>>2
ld a,l ;xhigh>>2
LD L,h ;y
LD H,TMASKLN/256
ADD A,(HL)
INC H
LD H,(HL)
LD L,A
JR NC,$+3
INC H
ex af,af' ;' ;xlow>>2
LD h,(HL) ;mask byte
ld l,a ;xlow>>2
ld a,h ;mask byte
LD H,TABROLL/256
AND (HL) ;bit(x)
pop hl
endif
endm
macro CHECKX deadaddr
if NEWREGS
ld a,d ;x HSB
else
LD A,L ;x HSB
endif
CP XWID-2;╨┤╨╕╨░╨┐╨░╨╖╨╛╨╜ x ╨╜╨░ 1 ╨╖╨╜╨░╨║╨╛╨╝╨╡╤Б╤В╨╛ ╨╝╨╡╨╜╤М╤И╨╡, ╤З╨╡╨╝ ╨║╨░╤А╤В╨░
JP NC,deadaddr;WMDEAD
endm
WRMOVEQ
pop hl
RET
WRMOVE
ld hl,WORMXY
call SetPgMask
DOGRAVa=$+1
LD A,0
ADD A,64
LD (DOGRAVa),A
SBC A,A
and 20 ;"inc d"
LD (WMGRAV_patch),A
WM0
GETCOORDS
ld a,d ;dy
cp SPRLIST_PRINTED
jp z,NEWSPD_nogravity;WM0 ;╤Б╤В╨╛╤П╤З╨╕╨╣ ╤З╨╡╤А╨▓╤М (╤Г╨╢╨╡ ╨╜╨░╨┐╨╡╤З╨░╤В╨░╨╜╨╜╤Л╨╣) ╨╕╨╗╨╕ ╨┐╤Г╤Б╤В╤Л╤И╨║╨░
cp SPRLIST_END
jr z,WRMOVEQ ;╨║╨╛╨╜╨╡╤Ж ╤Б╨┐╨╕╤Б╨║╨░
cp SPRLIST_STAYING
jp z,NEWSPD_nogravity;WM0 ;╤Б╤В╨╛╤П╤З╨╕╨╣ ╤З╨╡╤А╨▓╤М ╨╕╨╗╨╕ ╨┐╤Г╤Б╤В╤Л╤И╨║╨░
ADDCOORDS
BIT 7,D
jp NZ,WMGOUP
JP C,WMDEAD
;╨┤╨▓╨╕╨╢╨╡╨╜╨╕╨╡ ╨▓╨╜╨╕╨╖
CHECKX WMDEAD
CHECKMASK
JP Z,NEWSPD ;╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨▓╤Л╤Е╨╛╨┤╨╕╨╝ ╤Б ╨╜╨╛╨▓╤Л╨╝╨╕ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░╨╝╨╕
REGETCOORDS
NEGDX ;╨╜╨╡╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨┤╨╡╨╗╨░╨╡╨╝ dx=-dx
ADDCOORDS
JP C,WMDEAD
CHECKX WMDEAD
CHECKMASK
JP Z,NEWSPD_rotate ;╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨▓╤Л╤Е╨╛╨┤╨╕╨╝ ╤Б ╨╜╨╛╨▓╤Л╨╝╨╕ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░╨╝╨╕
;╤Б dx=-dx ╤В╨╛╨╢╨╡ ╨╜╨╡╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛
REGETCOORDS
DEC d ;╨┤╨╡╨╗╨░╨╡╨╝ dy=1 ╨╕╨╗╨╕ ╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝, ╨╡╤Б╨╗╨╕ ╤Г╨╢╨╡ dy=1
LD de,256
jp nz,NEWSPD_nogravity
ld a,c
and 7
jp nz,NEWSPD_nogravity;nostoprot
ld a,c
and 0xe8 ;8=right
;or 0;16
ld c,a
;nostoprot
LD de,SPRLIST_STAYING*256 ;╨║╨╛╨│╨┤╨░ ╨╜╨░╨┐╨╡╤З╨░╤В╨░╨╡╤В╤Б╤П, ╨▒╤Г╨┤╨╡╤В e!=0
jp NEWSPD_nogravity
WMGOUP
;╨┤╨▓╨╕╨╢╨╡╨╜╨╕╨╡ ╨▓╨▓╨╡╤А╤Е
jp NC,WMDEAD
CHECKX WMDEAD
CHECKMASK
JP Z,NEWSPD ;╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨▓╤Л╤Е╨╛╨┤╨╕╨╝ ╤Б ╨╜╨╛╨▓╤Л╨╝╨╕ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░╨╝╨╕
REGETCOORDS
NEGDX ;╨╜╨╡╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨┤╨╡╨╗╨░╨╡╨╝ dx=-dx
ADDCOORDS
jp NC,WMDEAD
CHECKX WMDEAD
CHECKMASK
JP Z,NEWSPD ;╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨▓╤Л╤Е╨╛╨┤╨╕╨╝ ╤Б ╨╜╨╛╨▓╤Л╨╝╨╕ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░╨╝╨╕
REGETCOORDS
NEGDX ;dx ╨║╨░╨║ ╨▒╤Л╨╗╨╛
ld d,0;NEGDY ;╨╜╨╡╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨┤╨╡╨╗╨░╨╡╨╝ dy=-dy (╨╛╤В╤Б╨║╨╛╤З╨╕╨╗╨╕ ╨╛╤В ╨┐╨╛╤В╨╛╨╗╨║╨░)
ADDCOORDS
;JR C,WMDEAD
CHECKX WMDEAD
CHECKMASK
JR Z,NEWSPD_rotate ;╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨▓╤Л╤Е╨╛╨┤╨╕╨╝ ╤Б ╨╜╨╛╨▓╤Л╨╝╨╕ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░╨╝╨╕
REGETCOORDS
LD de,0 ;╤Б dy=-dy ╤В╨╛╨╢╨╡ ╨╜╨╡╨┐╤А╨╛╤Е╨╛╨┤╨╕╨╝╨╛, ╨┤╨╡╨╗╨░╨╡╨╝ dx=0, dy=0
;JR NEWSPDgode
NEWSPD
WMGRAV_patch=$
INC d ;/nop ;dy
NEWSPD_nogravity
bit 4,c
jr z,NEWSPD_skiprot
ld a,c
inc a
xor c
and 7
xor c
ld c,a
NEWSPD_skiprot
PUTCOORDS
JP WM0
NEWSPD_rotate
ld a,c
and 0xe8 ;8=right
or 16
ld c,a
;set 4,c
jp NEWSPD
WMDEAD
if 1
pop hl
push hl
ld a,l
add a,4
ld l,a
else
ld hl,0
add hl,sp
LD (WMsp),HL
ld d,SPRLIST_STAYING ;don't move
push de
ld e,INVISIBLEX ;invisible x
push de
;ld a,-1
;push af ;╨┐╤Г╤Б╤В╤Л╤И╨║╨░
endif
ld a,b
cp sprmine_0/256
jp z,WMDEAD_noworm
ld h,0
add hl,hl
LD DE,NAMES
ADD HL,DE ;name+12
if 1
else
LD SP,iy
endif
CALL MTIDEAD
WMDEAD_noworm
if 1
ld d,SPRLIST_STAYING ;don't move
ld l,INVISIBLEX ;invisible x
jp NEWSPD_nogravity
else
WMsp=$+1
LD SP,0
JP WM0
endif
ControlCurWorm ;╨▓ ╤Н╤В╨╛ ╨▓╤А╨╡╨╝╤П logic ╨▓╤Л╨╖╤Л╨▓╨░╤В╤М ╨╜╨╡ ╨╜╨░╨┤╨╛
ld a,(cursorkeys) ;11LRDUef cursor
ld b,a
ld hl,crossalpha ;-64..+64 ╨▓╨┐╤А╨░╨▓╨╛ (-64 ╤Б╨░╨╝╤Л╨╣ ╨╜╨╕╨╢╨╜╨╕╨╣)
bit 2,b
jr nz,ControlCurWorm_noup
ld a,(hl)
add a,64
jp m,ControlCurWorm_noup
inc (hl)
ControlCurWorm_noup
bit 3,b
jr nz,ControlCurWorm_nodown
ld a,(hl)
add a,64-1
jp m,ControlCurWorm_nodown
dec (hl)
ControlCurWorm_nodown
ld hl,(curwormxy)
bit 5,b
jr nz,ControlCurWorm_noleft
call UnDrawCurWorm_ifprinted ;nz=not printed
ret nz
res 3,(hl)
ret
ControlCurWorm_noleft
bit 4,b
jr nz,ControlCurWorm_noright
call UnDrawCurWorm_ifprinted ;nz=not printed
ret nz
set 3,(hl)
ret
ControlCurWorm_noright
bit 1,b
ret nz ;no jump
call UnDrawCurWorm_ifprinted ;nz=not printed
ret nz
GETCOORDS
ld d,-5 ;dy
ld e,1 ;dx
bit 3,c
jr nz,$+5
dec d ;NEWREGS=0
ld e,-1 ;dx
PUTCOORDS
call DrawCurWormData
ld a,STATE_FLYCURWORM
ld (gamestate),a
ret
WormsVsMines
ret
StayingWormsVsMovingWorms ;╤Б╤В╨╛╨╗╨║╨╜╨╛╨▓╨╡╨╜╨╕╨╡ ╨╗╨╡╤В╤П╤Й╨╡╨│╨╛ ╤Б╨╛ ╤Б╤В╨╛╤П╤Й╨╕╨╝
ret
CheckFlyingWorms
;╨┐╤А╨╛╨▓╨╡╤А╨╕╤В╤М, ╨╡╤Б╤В╤М ╨╗╨╕ ╨╢╨╕╨▓╤Л╨╡ ╨╜╨╡ ╤Б╤В╨╛╤П╤Й╨╕╨╡ (╨╗╨╛╨│╨╕╨║╨░ ╨╜╨╡ ╨┤╨╛╨╢╨╜╨░ ╨╖╨░╨▓╨╕╤Б╨╡╤В╤М ╨╛╤В ╤А╨░╨╖╨╜╨╕╤Ж╤Л STAYING/PRINTED!)
;z=╨╜╨╡╤В╤Г
ld hl,WORMXY
CheckFlyingWorms0
;POP BC ;SPRITE (lsb=xlow*64;32)
;POP HL ;COORDS
;POP DE ;SPEED
inc l
inc l
ld a,(hl) ;xhigh
inc l
inc l
inc l
cp XWID
jr nc,CheckFlyingWorms_skip
ld a,(hl) ;dy
cp SPRLIST_END
ret z
cp SPRLIST_PRINTED
jr z,CheckFlyingWorms_skip
cp SPRLIST_STAYING
ret nz
CheckFlyingWorms_skip
inc l
jr CheckFlyingWorms0