; Title : Worm
-; Version : 0.986
+; Version : 89%
; Release Date : april 2000???
; Filename : worm.86p (4kb)
; Author(s) : Shiar
;----------- TO-DO -----------
;-----------------------------
-; 86% = DONE
+; 89% = DONE
-; 1% * levelfile select
; 3% * linkplay
; 1% * titlescreen
; 2% * make linkplay available for all gametypes (not just deathmatch)
-; 1% * two worms collide with heads -> both should die
; * game types:
; 1% * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
; 1% * domination?: take control points by running over them and hold them
-; 1% * name change + other options
; * complete readme (+custom level info)
; 2% * ... (pollish, &&&)
_SHRACC = $4383
_SHLACC = $438B
-_divHLby10 = $4044
-_divAby10 = $4DAF
+_divHLby10 = $4044 ;hl=hl/10
+_divAby10 = $4DAF ;a=a/10
+_HLTIMES10 = $41BF ;hl=hl*10
_cphlde = $403C
_clrWindow = $4A86 ;clear screen
_asapvar = $D6FC ;own name (worm)
_swapt_ = $45F3 ;ex_ahl_bde
_Get_Word_ahl = $521D ;ld de,(ahl)
_Set_Word_ahl = $5221 ;ld (ahl),de
+_INC_PTR_AHL = $4637 ;ahl=ahl+1
_AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2
_SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
_LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
_SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
_mm_ldir = $52ED ;24bit ldir
_RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
+_RAM_PAGE_7 = $47F3
+_PTEMP_END = $D29A
+_load_ram_ahl = $462F ;ahl->page+hl
+_writeb_inc_ahl = $5567 ;ld (ahl),c
;-----------------------------
;------- data storage -------
leveldata = $EA00 ;size< $400
ScrBuffer = $8100 ;size=$2000 (32x256)
;->mod$800
+templevels = $BC00 ;size= 3*$10
DispBuffer = $BC00 ;size= $390 (16x57)
SinCosTable = $B500 ;size= $100 (4x64)
worm1 = $B400
-worm2 = $B42A
-worm3 = $B454
-worm4 = $B47E ;-B4A8
+worm2 = $B41E
+worm3 = $B43C
+worm4 = $B45A
+ball1 = $B478
resbit = 2 ;and%11111011
worm1p = $B000 ;%10110000 -$B3FF
worm3p = $F000 ;%11110000 -$F3FF
worm4p = $A800 ;$E800=%11101000 ;$D748+$1000+
-WormVersion = 086
+WormVersion = 088
;-----------------------------
;------- program start -------
.dw WormIcon
WormMsg:
- .db "WORM by SHIAR -- pre-beta 86%",0
+ .db "WORM by SHIAR -- pre-beta 89%",0
WormIcon:
.db 9,2
.db %10010110,%01101111
.db %11101111,%00001111
.db %11000011,%10000000
-levelfile:
- .db 7,"wormlvl"
-levelhead = 'T'
+levelhead = '8'
+levelhead2 = '9' ;worm levels header = "89"
Start:
ld (SpSave),sp
cal _flushallmenus
cal _clrLCD
- ld hl,levelfile-1
- rst 20h ;_ABS_MOV10TOOP1
- rst 10h ;_FINDSYM
- ret c ;not found
- ex de,hl
- ld a,b ;cal _ex_ahl_bde
- cal _AHL_PLUS_2_PG3
+ cal _RAM_PAGE_7
+ ld hl,$BFFF ;VAT start
+ ld bc,templevels
+searchloop:
+ ld de,(_PTEMP_END+1)
+ or a ;nc
+ sbc hl,de ;hl<de?
+ jr c,searchcomplete
+ add hl,de
+ psh hl
+ ld a,(hl)
+ cp $0C ;string
+ jr z,stringfound
+searchnext:
+ pop hl
+ dec hl ;5x
+ dec hl
+ dec hl
+ dec hl
+ dec hl
+ psh bc
+ ld b,(hl) ;name size
+ inc b
+skipname:
+ dec hl
+ dnz skipname
+ pop bc
+ jr searchloop
- cal _Get_Word_ahl
- ld b,a ;psh af
+stringfound:
+ dec hl
+ ld e,(hl)
+ dec hl
+ ld d,(hl)
+ dec hl
+ ld a,(hl)
+ ex de,hl ;ld ahl,(hl)
+ cal _AHL_PLUS_2_PG3 ;string id
+ cal _Get_Word_ahl ;ld de,(ahl)
+ cal _RAM_PAGE_1
+ ld (bc),a
ld a,levelhead
- cp e ;1st byte = w?
- ret nz ;not worm level
- ld a,b ;pop af
- cal _Get_Word_ahl
- ld (leveldataSize),de
+ cp e
+ jr nz,searchnext ;not worm
+ ld a,levelhead2
+ cp d
+ jr nz,searchnext
+
+ inc bc
+ ld a,h
+ ld (bc),a
+ inc bc
+ ld a,l
+ ld (bc),a
+ inc bc
+ cal _RAM_PAGE_7
+ jr searchnext
- ld d,8 ;counter
- ld bc,datalevels-2
loadgametype:
psh de
inc bc
pop de ;counter
dec d ;8x
jr nz,loadgametype
+ ret
+
+searchcomplete:
+ cal _RAM_PAGE_1
+ ld a,255
+ ld (bc),a ;end mark
+ ld hl,templevels
+ psh hl
+ or a
+ sbc hl,bc
+ pop hl
+ jp z,levelloaded ;no ext files
+dispnextlevel:
+ cal _RAM_PAGE_1
+ psh hl
+ cal _clrWindow
+ ld a,4
+ ld (_curRow),a
+ pop hl
+ ld a,(hl)
+ cp 255
+ jr nz,displevel
+ ld hl,templevels
+ ld a,(hl)
+displevel:
+ inc hl
+ ld d,(hl)
+ inc hl
+ ld e,(hl)
+ inc hl ;ade=(hl)
+ psh hl ;HL
+ ld c,a
+ ld h,d
+ ld l,e ;cde=ahl=(hl)
+ cal _load_ram_ahl ;hl=ahl
+ ld b,(hl) ;b=title size
+ psh bc
+ cal _putps ;destr=abchl
+ pop bc ;cde=hl
+ pop hl ;HL
+levselect:
+ halt
+ psh hl
+ psh de
+ psh bc
+ cal GET_KEY
+ pop bc
+ pop de
+ pop hl
+ cp K_RIGHT
+ jr z,dispnextlevel
+ sub K_SECOND
+ jr z,loadlevel
+ dec a ;K_EXIT
+ ret z
+ cp K_ENTER-K_EXIT+256
+ jr nz,levselect
+
+loadlevel:
+ ld a,c
+ ex de,hl ;ahl=cde
+ inc b ;b=titlesize+1
+skiptitle:
+ cal _INC_PTR_AHL
+ dnz skiptitle
+
+ cal _Get_Word_ahl
+ ld (leveldataSize),de
+ ld d,8 ;counter
+ ld bc,datalevels-2
+ cal loadgametype
+ ld (hilvlposa),a
+ ld (hilvlposhl),hl
+ ld d,4
+ cal loadgametype
cal _SET_ABS_SRC_ADDR
xor a
cal _mm_ldir
cal _LOAD_ABS_SRC_ADDR ;->ahl
- ld (hisaveposa),a
- ld (hisaveposhl),hl
+levelloaded:
+ ld (hiscrposa),a
+ ld (hiscrposhl),hl
cal _RAM_PAGE_1 ;&&&
res 2,(iy+13) ;appAutoScroll
;---------- menu -------------
;-----------------------------
+ ld a,1
+ ld (curlevel),a
DisplayMenu:
- ld a,2
- ld (nrworms),a
-gomainMenu:
cal _clrWindow
ld hl,txtWelcome
cal _puts
- ld de,$0205
+ ld de,$0207
+ ld (_curRow),de
+ cal _puts ;---
+ dec e ;$0206
+ ld (_curRow),de
+ cal _puts ;Level
+ dec e ;$0205
ld (_curRow),de
- cal _puts ;txtOptions
+ cal _puts ;Worms: 2
dec e ;$0204
ld (_curRow),de
ld hl,(CURtxtGame)
- cal _puts
+ cal _puts ;Singleplayer
xor a
+ cal menudraw
+ jr howmanyworms
mainMenu:
cal menucall
jr nz,notselect
select:
ld a,b
- or a
- jr nz,gooptionsMenu
- jp LetsGetThisPartyOn
+ dec a ;2nd item
+ jp z,changeworms
+ jp LetsGetThisPartyOn ;1/3/4
notselect
cp K_EXIT
jp z,ExitNoStats
ld a,b
jr nz,mainMenu
or a
- jr z,Variation
+ jr z,changegame
+ dec a
+ jr z,changenrworms
+ dec a
+ jp nz,LetsGetThisPartyOn
-gooptionsMenu:
- cal _clrWindow
- ld hl,txtWelcome
- cal _puts
- ld hl,txtLevel
- ld de,$0205
- ld (_curRow),de
- cal _puts ;txtLevel
- dec e ;$0204
- ld (_curRow),de
- cal _puts ;txtWorms
- ld a,(nrworms)
- add a,'0'
- cal _putc
- xor a
-optionsMenu:
- cal menucall
- jr nz,notopselect
-opselect:
- ld a,b
- or a
- jr nz,changelevel
-changeworms:
- ld hl,nrworms
- inc (hl)
- ld a,4
- cp (hl)
- jr nc,gooptionsMenu
- ld (hl),2
- jr gooptionsMenu
changelevel:
- jr optionsMenu
-notopselect:
- cp K_EXIT
- jr z,gomainMenu
- ld a,b
- jr optionsMenu
+ ld hl,Gametype
+ ld d,0
+ ld e,(hl)
+ ld hl,nrlevels
+ add hl,de
+ ld d,(hl) ;max level for sel.game
+ ld a,1
+curlevel =$-1
+ inc a
+ cp d
+ jr c,changedlevel
+ ld a,1
+changedlevel:
+ ld (curlevel),a
+dispcurlevel:
+ ld hl,$0806
+ ld (_curRow),hl
+ cal showA
+ jr mainMenu
-Variation:
+changegame:
+ ld a,1
+ ld (curlevel),a
ld a,0
Gametype =$-1
ld hl,txtGame2
ld (CURtxtGame),hl
cal _puts
ld (NEXTtxtGame),hl
- ld a,b
- jp mainMenu
+howmanyworms:
+ ld a,(Gametype)
+ cp 2
+ ld a,1
+ jr c,oneworm
+nrworms =$+1
+ ld a,2
+oneworm:
+ jr dispnrworms ;jr mainMenu
-menucall:
- psh af
- ld hl,$0004
- ld (_curRow),hl
- ld a,' '
- cal _putc
- ld hl,$0005
- ld (_curRow),hl
- cal _putc
- pop af
- psh af
- ld h,0
- add a,4
- ld l,a
+changenrworms:
+ ld a,(Gametype)
+ cp 2
+ jr c,mainMenu ;type 0/1
+ ld hl,nrworms
+ ld a,(hl)
+ inc a
+ cp 5
+ jr c,changednrworms
+ ld a,1
+changednrworms:
+ ld (hl),a
+dispnrworms:
+ ld hl,$0905
ld (_curRow),hl
- ld a,'*'
- cal _putc
-menukeys:
+ cal showA
+ ld a,(curlevel)
+ jr dispcurlevel ;mainMenu
+
+menucall:
+ psh bc
+menuwaitkey:
halt \ halt
cal GET_KEY
or a
- jr z,menukeys
+ jr z,menuwaitkey
pop bc ;pop a as b
cp K_UP
- jr nz,notup
-updown:
- ld a,b
- xor 1
- ld b,a
- inc a ;nz
- ret
-notup:
+ cal z,menuup
cp K_DOWN
- jr z,updown
+ cal z,menudown
cp K_ENTER
ret z
cp K_SECOND
ret ;z=select
+menupos:
+ ld a,b
+ add a,4
+ ld h,0
+ ld l,a
+ ld (_curRow),hl
+ ret
+menuclr:
+ cal menupos
+ ld a,' '
+ jp _putc
+menudown:
+ cal menuclr
+ inc b
+ jr menuupdown
+menuup:
+ cal menuclr
+ dec b
+menuupdown:
+ ld a,b
+ and %11 ;4=0;-1=3
+menudraw:
+ ld b,a
+ cal menupos
+ ld a,'*'
+ jp _putc ;a=K_STO
+
+changeworms:
+ cal _clrWindow
+ ld a,(Gametype)
+ cp 2
+ ld a,1
+ jr c,wormnrname
+ ld a,(nrworms)
+wormnrname:
+ add a,a ;2x
+ ld e,a
+ add a,a ;4x
+ add a,a ;8x
+ add a,a ;16x
+ add a,e ;18x
+ ld e,a
+ ld d,0
+ ld ix,worm1name-18
+ add ix,de
+ ld a,maxnamelength
+ cal entername
+ ld (ix),0
+ jp DisplayMenu
+
+entername:
+ ld (namelength),a
+enternameloop:
+ ld a,'_'
+ cal _putc
+ ld hl,_curCol
+ dec (hl)
+nokeypressed:
+ halt
+ cal GET_KEY
+ or a
+ jr z,nokeypressed
+
+ cp K_DEL
+ jr nz,continue
+backspace:
+ ld hl,namelength
+ ld a,(hl)
+ cp maxnamelength
+ jr nc,nokeypressed
+ inc (hl)
+
+ dec ix
+ ld a,' '
+ ld (ix),a
+ cal _putc
+ ld hl,_curCol
+ dec (hl)
+ dec (hl)
+ jr enternameloop
+continue:
+ cp K_ENTER
+ ret z
+ cp K_EXIT
+ ret z
+
+ ld hl,namelength
+ dec (hl)
+ ret z
+
+ ld hl,chartable
+ ld e,a
+ ld d,0
+ add hl,de
+ ld a,(hl)
+ or a
+ jr z,nokeypressed
+
+ ld (ix),a
+ cal _putc
+ inc ix
+ cal waitnokeypressed
+ jr enternameloop
+
+waitnokeypressed:
+ halt
+ cal GET_KEY
+ or a
+ jr nz,waitnokeypressed
+ ret
+
+namelength:
+ .db 0
+chartable:
+ .db 0,"!<>^",0,0,0,0
+ .db 0,"xtoje0",0 ;enter..clear
+ .db " wsnid9",0 ;(-)..custom
+ .db "zvrmhc8",0 ;dot..del
+ .db "yuqlgb7*" ;0..xvar
+ .db 0,"-pkfa6'" ;on..alpha
+ .db "54321.",0,0 ;F5..more
+
+;--proc
+
+skiplevel: ;@hl - destr:ab - alter:hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl ;skip 4
+ ld b,(hl) ;spritesize
+ inc b
+skipsprite:
+ inc hl
+ dnz skipsprite
+ ld b,(hl) ;balls
+ inc b
+ inc b ;skip 6
+ ld a,c
+ and _datasingl
+ jr nz,skipworms
+ inc b ;multiplayer lvl
+ inc b
+ inc b ;skip other 3 worms (9 bytes)
+skipworms:
+ ld a,b
+ add a,a
+ add a,b
+ ld b,a ;3x(balls+2)
+skipballs:
+ inc hl
+ dnz skipballs
+ cal skiplines ;lines
+skiplines: ;boxes
+ ld a,(hl) ;lines/boxes
+ add a,a
+ add a,a
+ inc a
+ ld b,a ;4x(hl)+1
+skiplb
+ inc hl
+ dnz skiplb
+ ret
+
;-----------------------------
;-------- start game ---------
;-----------------------------
LetsGetThisPartyOn:
+ ld a,$17 ;no exit
+ ld (CheckExit),a ;set exit state
+
ld hl,gamesdata
ld a,(Gametype)
ld e,a
ld e,8 ;=de
add hl,de
- ld b,a ;psh af
+ ld c,a
and _datasingl
jr z,notsingle
ld a,1
ld (nrworms),a
notsingle:
- ld a,b ;pop af \push
+ ld a,c
and _datascore
ld de,$FF64 ;virt.infinate
jr z,setscorelimit
ld (scorelimit),de
cal _ldHLind ;ld hl,(hl)
- psh hl
- ld a,b ;pop af
+ ld a,(curlevel)
+ ld (Level),a
+ ld d,a ;begin level
+skiplevelloop:
+ dec d ;levels to skip
+ jr z,levelsskipped
+ cal skiplevel
+ jr skiplevelloop
+levelsskipped:
+
+ psh hl ;1st level
+ ld a,c
and _datalink
jr z,GameOver
ld (worm2+score+1),hl
ld (worm3+score+1),hl
ld (worm4+score+1),hl
- ld a,l
- ld (Level),a
ld hl,worm1set+4
ld de,worm1+lives
;&&&>*
pop hl
;show end msg or smtn
ld bc,Exit
- psh bc ;where to go afterwards
- inc hl ;location of ending-code
+ psh bc ;where to go afterwards
+ inc hl ;location of ending-code
jp (hl) ;go there ("call")
nextlevel:
ldi
inc hl
or a
jr z,defaultsprite
- ld (sprsize),a
ld d,h
ld e,l ;ld de,hl
ld c,a
add hl,bc ;hl=behind sprite
jr setsprite
defaultsprite:
+ ld a,defsprsize
ld de,peasprite
setsprite:
+ ld (sprsize),a
ld (spritepos),de
ld a,(hl)
ld (nrballs),a
or a
jr z,toobad_noballs
- ld de,ballpos
- ldi
- ldi
+ ld c,a
+ add a,a
+ add a,c
+ ld c,a
+ ld b,0
+ ld de,ball1
+ ldir
toobad_noballs:
#ifdef 0
jr nz,Delay
NoDelay:
- cal handlethatneatlittleball
+ cal handlethoseneatlittleballs
ld ix,worm1
ld a,(nrworms)
ld a,%10111111
out (1),a
in a,(1)
- rla ;[MORE]?
- jr c,NotPaused
+ rla ;MORE?
+ jr c,CheckExit
ld bc,$0103
out (c),b
halt ;pause/off
ld b,11
out (c),b
-NotPaused:
- rla ;[EXIT]?
+CheckExit:
+ rla ;=$17 (c=EXIT-key)
+ ;or$A7 (c=0)
jp c,GameLoop
jr Exit
WormDead:
ld a,2
ld (flashtime),a
-
- ld h,(ix+tail+1)
- ld l,(ix+tail)
- ld d,(ix+head+1)
- ld e,(ix+head)
- jr DoesWormTailEqualsWormHead ;chk4 size=0
-removewormloop:
- ld c,(hl)
- inc hl
- ld b,(hl)
- inc hl
- res resbit,h
- psh hl
- cal res4pixels
- pop hl
- inc (ix+grow)
-DoesWormTailEqualsWormHead:
- cal _cphlde
- jr nz,removewormloop
-
- ld a,(gameCar)
- and _datasingl
- jr nz,safewormsizedone
- ld a,0
-beginsize =$-1
- ld (ix+grow),a
-safewormsizedone:
-
- ;de=ix+head
- ld (ix+tail+1),d
- ld (ix+tail),e
- ld a,50
+ ld a,respawndelay
ld (ix+delay),a
thislevel =$+1
ld a,(gameCar)
and _datalivel
ret z
+ ld a,$A7 ;exit@end of turn
+ ld (CheckExit),a ;set exit state
+ ret ;finish turn
Exit:
ld sp,0 ;pop all
xor a
ld (_curCol),a
- ld b,2
-nrworms =$-1
+ ld a,(nrworms)
+ ld b,a
ld hl,worm1+died
displayWormStats:
psh bc
pop bc
dnz displayWormStats
+ ld a,(Gametype)
+ or a ;singleplayer (0) only
+ jr nz,hilevelcheckdone
+checkhilevel:
+ ld hl,nrlevels
+ ld a,(Level)
+ inc a
+ cp (hl)
+ jr c,hilevelcheckdone
+ ld (hl),a ;save local
+ ld c,a
+ ld a,0
+hilvlposa =$-1
+ ld hl,0
+hilvlposhl =$-2 ;save external
+ cal _writeb_inc_ahl ;ld (ahl),c
+hilevelcheckdone:
+
ld a,(gameCar)
and _datasingl
jr z,hiscorecheckdone
loadhiscoreposinahl:
ld a,(Gametype)
- dec a
- jr nz,externalhiscoresavepos
- ld a,0
- ld hl,hipeaworm
- ret
+ or a
externalhiscoresavepos:
ld a,0
-hisaveposa =$-1
+hiscrposa =$-1
ld hl,0
-hisaveposhl =$-2
+hiscrposhl =$-2
+ ret z ;(Gametype)=0
+ cal _INC_PTR_AHL
ret
;-----------------------------
jr inlink
respawncheck:
+ cp respawndelay-1
+ jr nz,unnamedlabel
+removeworm:
+ ld h,(ix+tail+1)
+ ld l,(ix+tail)
+ ld d,(ix+head+1)
+ ld e,(ix+head)
+ jr DoesWormTailEqualsWormHead ;chk4 size=0
+removewormloop:
+ ld c,(hl)
+ inc hl
+ ld b,(hl)
+ inc hl
+ res resbit,h
+ psh hl
+ cal res4pixels
+ pop hl
+ inc (ix+grow)
+DoesWormTailEqualsWormHead:
+ cal _cphlde
+ jr nz,removewormloop
+
+ ld a,(gameCar)
+ and _datasingl
+ jr nz,safewormsizedone
+ ld a,0
+beginsize =$-1
+ ld (ix+grow),a
+safewormsizedone:
+
+ ;de=ix+head
+ ld (ix+tail+1),d
+ ld (ix+tail),e
+
+unnamedlabel:
cp 1
ld h,a
jr nz,saverespawncounter
ld a,(gameCar)
and _datafoodl
jr z,still_alive_not_dead
+ ld a,(Gametype)
+ or a
+ jp nz,Exit ;stack restored
+
ld hl,Level
ld a,(hl)
inc (hl)
+ ld l,a ;hl=Level
+ ld h,0
+ add hl,hl
+ add hl,hl
+ cal _HLTIMES10
+ ex de,hl
+ cal IncScore ;score+(40*level)
pop hl ; << call
pop hl ; << call
pop hl ; << levelp new
- ld a,(gameCar)
- and _datanextl
- jp nz,StartLevel
- jp Exit
+ jp StartLevel
;-----------------------------
;---------- ball -------------
;-----------------------------
-handlethatneatlittleball:
+handlethoseneatlittleballs:
ld a,0
nrballs =$-1
or a
ret z
-ballpos =$+1
- ld bc,$0503
+
+ ld hl,ball1
+ ld b,a
+handleballs
+ psh bc
+ psh hl
+ ld c,(hl)
+ inc hl
+ ld b,(hl)
+ inc hl
+ ld d,(hl)
+ cal handleball
+ dec c
+ pop hl
+ ld (hl),c
+ inc hl
+ ld (hl),b
+ inc hl
+ ld (hl),d
+ inc hl
+ pop bc
+ dnz handleballs
+ ret
+
+handleball:
cal res4pixels
dec c
- ld e,b
+
ballxmove:
- inc b ;=%000100 dec=%000101
+ bit 0,d ;1=L; 0=R
+ jr z,ballright
+ballleft:
+ dec b
cal checkballhit
- jr z,ballxdone
- ld b,e
- ld hl,ballxmove
- cal letsmovetheotherway
-ballxdone:
- ld e,c
+ jr z,ballymove
+ inc b ;undo
+ res 0,d ;go right
+ jr ballymove
+ballright:
+ inc b
+ cal checkballhit
+ jr z,ballymove
+ dec b ;back
+ set 0,d ;>left
+
ballymove:
- inc c ;=%001100 dec=%001101
+ bit 1,d ;1=up; 0=down
+ jr z,balldown
+ballup:
+ dec c
cal checkballhit
jr z,balldone
- ld c,e
- ld hl,ballymove
- cal letsmovetheotherway
+ inc c
+ res 1,d ;go down
+ jr balldone
+balldown:
+ inc c
+ cal checkballhit
+ jr z,balldone
+ dec c
+ set 1,d ;up
balldone:
- ld (ballpos),bc
set4pixels: ;@(b,c)
cal SetPixel
ret
checkballhit:
+ psh de
ld d,0
cal chk4pixels
xor a
cp d
+ pop de
ret
;-----------------------------
;----------- score -----------
+_divHLby1000:
+ psh hl
+ ld b,3
+divideagain: ;3x
+ cal _divHLby10
+ dnz divideagain
+ ld a,l ;a=hl/1000
+ pop hl
+ ret
+
HuntingTimeScore:
.db $dd,$7d ;ld a,lx
cp worm2&255
ret z ;=worm#2
dec (ix+reserv)
ret nz
- ld de,10
+ ld hl,10
IncScore:
ld h,(ix+score+1)
ld l,(ix+score)
+ cal _divHLby1000
+ ld c,a
add hl,de
+ cal _divHLby1000
+ cp c
+ jr z,scorecommon ;hl/1000 not increased
+ inc (ix+lives)
jr scorecommon
DecScore: ;&&&
ld h,(ix+score+1)
ld l,(ix+score)
or a
sbc hl,de
- ret c
+ jr c,showstats ;<0=0
scorecommon:
ld (ix+score+1),h
ld (ix+score),l
txtWelcome: .db "Welcome to Worm!! ",
.db "by Shiar",0
-txtOptions: .db "Options",0
-txtGame: .db "Singleplayer",0 ;0
+ .db "Have fun!",0 ;4th menu item
+ .db "Level 00",0 ;3rd
+ .db "Worms: 0",0 ;2nd
+txtGame: .db "Singleplayer",0 ;0 (1st)
txtGame2: .db "Peaworm ",0 ;1
.db "Deathmatch",0 ;2
.db "Foodmatch ",0 ;3
.dw LevelDefM,LevelDefM
.dw LevelDefM,LevelDefM
.dw LevelDefM,LevelDefM
+nrlevels: .db 1,1,1,1,1,1,1,1
worm1set: .dw worm1p,worm1p
.db 3,0,%01111110,%10,%100 ;< >
-worm1name: .db "Worm #1 ",0
+worm1name: .db "Left ",0
worm2set: .dw worm2p,worm2p
.db 3,0,%00111111,%10000,%1000 ;f1 f2
-worm2name: .db "Worm #2 ",0
+worm2name: .db "Right ",0
worm3set: .dw worm3p,worm3p
.db 3,0,%01011111,%10,%100 ;sto ,
-worm3name: .db "Worm #3 ",0
+worm3name: .db "Top ",0
worm4set: .dw worm4p,worm4p
.db 3,0,%01111101,%10,%1 ;enter +
-worm4name: .db "Worm #4 ",0
+worm4name: .db "Bottom ",0
hipeaworm: .dw 0
end:
-;sprsize = 7
-;peasprite: .db %00111000
-; .db %01110100
-; .db %11111010
-; .db %11111110
-; .db %11111110
-; .db %01111100
-; .db %00111000
-
-sprsize: .db 5
-peasprite: .db %01110000
- .db %11101000
- .db %11111000
- .db %11111000
- .db %01110000
-
- ;set:
-heading = 0 ;level*
-pos = 2 ;level*
-pos2 = 4 ;level
-grow = 6 ;level
-died = 8 ;game
-score = 9 ;game
-delay = 11 ;game
-
-head = 12 ;level
-tail = 14 ;level
-lives = 16 ;game
-reserv = 17 ;loop
+defsprsize = 4
+sprsize: .db 4
+peasprite: .db %01100000
+ .db %11110000
+ .db %11110000
+ .db %01100000
+
+ ;set:
+heading = 0 ;level*
+pos = 2 ;level*
+pos2 = 4 ;level
+grow = 6 ;level
+died = 8 ;game
+score = 9 ;game
+delay = 11 ;game
+
+head = 12 ;level
+tail = 14 ;level
+lives = 16 ;game
+reserv = 17 ;loop
;race:lap
;hunt:time
-input = 18 ;&
-left = 19 ;&
-right = 20 ;&
-name = 21 ;game
+input = 18 ;&
+left = 19 ;&
+right = 20 ;&
+name = 21 ;game
+wormsize = 30
+
+respawndelay = 40
+maxnamelength = 9
;-----------------------------
;----------- end -------------
#include "asm86.h"
#include "ti86asm.inc"
- .org $EA00-20
+ .org $E9E3-16 ;$E9E3-[name size]
- .db 'T',0 ;worm header (Test version)
- .dw hiscore-single ;leveldata size
+ .db "89" ;worm header (version .88)
+ .db 16,"Worm LevelPack I" ;level name
+ .dw hiscore-single ;leveldata size
levelsdata:
- .dw single ;points to singleplayer levels
- .dw 0 ;...peaworm level (0 = no levels/empty level)
- .dw deathmatch ;...deathmatch
- .dw foodmatch ;...foodmatch
- .dw linkmatch ;...linkmatch
- .dw hunting ;...hunting
- .dw race ;...race
- .dw ctf ;...capture the flag
+ .dw single ;points to singleplayer levels
+ .dw 0 ;...peaworm level (0 = no levels/empty level)
+ .dw deathmatch ;...deathmatch
+ .dw foodmatch ;...foodmatch
+ .dw linkmatch ;...linkmatch
+ .dw hunting ;...hunting
+ .dw race ;...race
+ .dw ctf ;...capture the flag
+ .db 2,2,3,2 ;max. choosable level+1 for each gametype
+ .db 2,2,2,2 ;so: 2 = level 1 only; 4 = level 1 to 3 available
single:
- .db 5,4,15 ;peas in level, delay (0=fastest), pea-growth
- .db 15,5 ;begin_size, sprite size (0=use default sprite)
- .db %01110000 ;sprite
+ .db 5,4,15 ;peas in level, delay (0=fastest), pea-growth
+ .db 15,5 ;begin_size, sprite size (0=use default sprite)
+ .db %01110000 ;sprite
.db %10001000
.db %10001000
.db %10001000
.db %01110000
- .db 0 ;balls (0 or 1)
- .db 0,2,63 ;your start d (0=down,$80=up), y, x
- .db 128,57 ;field width (128-255), height (57-255)
- .db 0,0 ;no additional lines, boxes
+ .db 0 ;balls (see below)
+ .db 0,2,63 ;your start d (0=down,$80=up), y, x
+ .db 128,57 ;field width (128-255), height (57-255)
+ .db 0,0 ;no additional lines, boxes
.db 8,4,15,15,0,0
.db $40,14,2
.db 128,57
- .db 1 ;one line:
- .db 28,28,100,28 ;line coords: x1,y1,x2,y2
+ .db 1 ;one line:
+ .db 28,28,100,28 ;line coords: x1,y1,x2,y2
.db 0
.db 9,4,15,15,0,0
.db 28,41,100,41
.db 0
- .db 4,3,15,10,0,1 ;...bouncing ball
- .dw $20F ;ball begin position
- .db 0,2,63
+ .db 4,3,15,10,0,1
+ .db 2,4,0 ;1 bouncing ball, begin y, x, direction (%11=left+up)
+ .db 0,2,124
.db 128,57
.db 2
.db 28,14,100,41
.db 0
.db 12,3,15,15,0,0
- .db $40,4,0
+ .db $40,2,2
.db 128,90
.db 6
.db 20,16,54,16
.db 0
.db 8,2,15,15,0,0
- .db $C0,72,48
+ .db $C0,67,48
.db 128,128
.db 13
.db 34,56,56,34
.db 91,106,115,106
.db 0
- .db 255 ;end marker
+ .db 255 ;end marker
;Code to run when all levels are done:
;Worm waits a second, then screen is cleared and this code will be run.
;If you don't want an ending, simply put <ret>.
ld hl,endtext
- call _puts ;display text
- jp _getkey ;wait for a key
- ;jp ? = call ? + ret
+ call _puts ;display text
+ jp _getkey ;wait for a key
+ ;jp ? = call ? + ret
endtext:
.db " Congratulations!!",0
deathmatch:
.db 8,5,15,31,0,0
- .db $40,28,2 ;begin stats for each player
- .db $C0,28,125 ;player 2 moves left
- .db $00,2,63 ;player 3 moves down
- .db $80,54,63 ;player 4 moves up
+ .db $40,28,2 ;begin stats for each player
+ .db $C0,28,125 ;player 2 moves left
+ .db $00,2,63 ;player 3 moves down
+ .db $80,54,63 ;player 4 moves up
.db 128,57
.db 0
- .db 4 ;4 boxes:
- .db 16,12,48,12 ;x1,y1,x2,ysize(y2-y1)
- .db 80,12,112,12 ;...
+ .db 4 ;4 boxes:
+ .db 16,12,48,12 ;x1,y1,x2,ysize(y2-y1)
+ .db 80,12,112,12 ;...
.db 16,34,48,12
.db 80,34,112,12
+ .db 8,4,18,15,0,0
+ .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
+ .db 128,57
+ .db 0,0
+
foodmatch:
ctf:
hiscore:
- .dw 0 ;singleplayer hiscore will be saved here
+ .dw 0 ;singleplayer hiscore will be saved here
+ .dw 0 ;same for peaworm hiscore
.end