--- /dev/null
+; *** WORM LEVELFILE ***
+; example #1
+; by SHIAR
+
+;Sample levelfile with everything commented.
+;Teaches you everything to build your own level.
+
+
+;-----------------------------------------------------------------------------
+
+;Standard 128x57 FIELD:
+; +-----------------+
+;(0,0)> |####(BORDER)#####|
+; |#*(2,2) #|
+; |# #|
+; |#(63,28)*(64,28)#|
+; |# #|
+; |# (125,54)*#|
+; |#################| <(127,56)
+; +-----------------+
+;Drawable screen is (2,2)-(125,54); center is (63.5,28)
+;
+;Screen will scroll with screensizes above 128x57 (max.256x256)
+;Example 256x80 FIELD (use 0,80):
+; +-----------------------------------+
+;(0,0)> |#############(BORDER)##############|
+; |#*(2,2) : #|
+; |# : #|
+; |# : #|
+; |# : #|
+; |# (125,54)*: #|
+; |#"""""""""""""""":""""""""""""""""#|
+; |# : (253,253)*#|
+; |###################################| <(255,255)
+; +-----------------------------------+
+
+
+;-----------------------------------------------------------------------------
+
+;DOUBLE CHECK THE FOLLOWING THINGS:
+; * correct name size at .org
+; * max. choosable level doesn't exeed actual levels present
+; * enough hiscore space (two bytes for each peaworm level!)
+
+
+;------------------------------- HEADER --------------------------------------
+
+;#include "asm86.h" ;use include files to make your own
+;#include "ti86asm.inc" ;singleplayer ending (just like normal asm)
+
+
+ .org $F3E3-10 ;$F3E3-[name size]
+ ;^^ <-MUST EQUAL NAME SIZE BELOW!!! If not, Worm will crash!
+
+ .db 'w',90 ;wormLevel header (version .90)
+ .db 10,"Example #1" ;name size (UPDATE .ORG!!!); level name
+ .dw hiscore-single ;leveldata size
+
+
+levelsdata:
+
+ .dw single ;points to singleplayer levels below
+ .dw peaworm ;...peaworm level
+ .dw deathmatch ;...deathmatch
+ .dw foodmatch ;...foodmatch
+ .dw linkmatch ;...linkmatch
+ .dw race ;...race
+ .dw ctf ;...capture the flag
+ .dw domination ;...domination
+
+;note: use <.dw 0> if no levels present (empty level will be used).
+
+ .db 2,3,4,2 ;max. choosable level+1 for each gametype
+ .db 2,2,2,2 ;so: 2 = level 1 only; 4 = level 1 to 3 available
+
+;again .db 0 indicates no levels present.
+
+
+;------------------------------- LEVELS --------------------------------------
+
+;LEVEL-FORMAT:
+;------------
+; .db 5 ;nr. of peas in level
+; .db 4 ;delay (0=fastest, 4=normal)
+; .db 15 ;growth per pea
+; .db 15 ;begin size
+; .db 4 ;sprite size (1-8; 0=use default sprite)
+; .db %01100000 ;the sprite
+; .db %11110000
+; .db %11110000
+; .db %01100000
+; .db 2 ;bouncing balls (0-40)
+; .db 2 ;BALL #1: begin y-position
+; .db 4 ; begin-x
+; .db %00 ; direction (%00=right+down, %11=left+up)
+; .db 2,7,%00 ;BALL #2: y,x,direction
+; .db 0 ;your start direction (0=up,$40=right,$80=down,$C0=left)
+; .db 2 ;your y-position (2=at top)
+; .db 63 ;your x-position (63=center)
+; ;IN MULTIPLAYER LEVELS also set positions for worm 2-4:
+;(.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 ;field size: width (128-255), height (57-255)
+; ; screen will SCROLL if size is more than 128,57
+; .db 2 ;number of lines:
+; .db 28,14,100,41 ;LINE #1 coordinates: (x1,y1)-(x2,y2)
+; .db 28,41,100,14 ;LINE #2: the same
+; .db 1 ;number of boxes:
+; .db 16,12,48,12 ;BOX #1: x1,y1,x2,ysize(y2-y1)
+;------------ ;THAT'S ALL; repeat for all levels
+
+
+single: ;singleplayer levels start here
+
+ .db 5,4,15
+ .db 15,5
+ .db %01110000
+ .db %10001000
+ .db %10001000
+ .db %10001000
+ .db %01110000
+ .db 0
+ .db 0,2,63
+ .db 128,57
+ .db 0,0 ;no lines/boxes
+
+ .db 8,4,15,15,0
+ .db 0
+ .db $40,14,2
+ .db 128,57
+ .db 1 ;one horizontal line
+ .db 28,28,100,28
+ .db 0
+
+ .db 255 ;end marker: no more levels
+
+;Code to run when all levels are done:
+;Worm waits a second, then screen is cleared and this code will be run.
+
+ ret ;no end, quit and continue with stats-screen
+
+;This is a sample ending displaying "Congratulations!!" to use instead of RET:
+; ld hl,endtext
+; call _puts ;display text
+; jp _getkey ;wait for a key and return (jp = call+ret)
+;endtext:
+; .db " Congratulations!!",0
+
+
+peaworm: ;peaworm levels (2)
+ .db 5,4,15
+ .db 15,5
+ .db %01110000
+ .db %10001000
+ .db %10001000
+ .db %10001000
+ .db %01110000
+ .db 0
+ .db 0,2,63
+ .db 128,57
+ .db 0,0
+
+ .db 5,4,15,15,0,0
+ .db 0,2,63
+ .db 128,57
+ .db 0,0
+
+
+deathmatch: ;deathmatch levels
+ .db 8,5,15,31,0,0
+ .db $40,28,2 ;begin stats for each player
+ .db $C0,28,125
+ .db $00,2,63
+ .db $80,54,63
+ .db 128,57 ;field size
+ .db 0
+ .db 4 ;4 boxes
+ .db 16,12,48,12
+ .db 80,12,112,12
+ .db 16,34,48,12
+ .db 80,34,112,12
+
+
+foodmatch:
+ctf:
+domination:
+ .db 8,5,18,15,0,0
+ .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
+ .db 128,57
+ .db 0,0
+
+
+linkmatch:
+ .db 8,0,15,15,0,0
+ .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
+ .db 228,157
+ .db 0,0
+
+
+race:
+ .db 8,4,15,10,0,0
+ .db $40,3,2,$40,6,2, $40,9,2,$40,12,2
+ .db 128,57
+ .db 0
+ .db 2
+ .db 22,21,104,15
+ .db 52,10,74,37
+
+
+hiscore: ;space reserved to store hi-scores
+ .dw 0 ;singleplayer hiscore will be saved here
+ .dw 0,0 ;peaworm hiscore for each peaworm-level
+
+
+ .end
+.end
\ No newline at end of file
psh hl ; >> levelp new
cal showstats
+ ld a,(Gametype)
+ cp gamectf
+ jr nz,noctf
+ ld hl,$1010
+ ld (peaspos),hl
+ cal DrawPea
+ ld hl,$2010
+ ld (peaspos+3),hl
+ cal DrawPea
+noctf:
ld a,(gameCar)
and _datafood
jr z,nofood
ld hl,0
PeaY =$-2
PeaX =$-1
- ld a,(sprsize)
- inc a
- ld d,a
- ld a,b
- sub h
- inc a
- cp d ;=(sprsize)+1
- jp nc,WormDead
- ld a,c
- sub l
- inc a
- cp d
+ cal chkpeahit
jp nc,WormDead
cal DrawPea ;remove pea
ld a,(ix+grow)
ld de,10
cal IncScore
pop af
- jp nz,still_alive_not_dead
+ jp nz,Drawworm ;continue
ld a,(gameCar)
and _datafoodl
- jp z,still_alive_not_dead
+ jp z,Drawworm
ld a,(Gametype)
or a
jp nz,Exit ;stack restored
pop hl ; << levelp new
jp StartLevel
-multiple_peas:
- ld hl,(peaspos)
+chkpeahit: ;hl=peapos
ld a,(sprsize)
inc a
ld d,a
sub h
inc a
cp d ;=(sprsize)+1
- jp nc,peaaction
+ ret nc ;nc=no pea
ld a,c
sub l
inc a
cp d
- ret c
-peaaction:
- ret
+ ret ;c=pea
+
+flagcaptured:
+ psh hl
+ ld de,30
+ cal IncScore
+ pop hl
+ cal WormDead
+DrawAllPeas:
+ ld hl,(peaspos)
+ cal DrawPea
+ ld hl,(peaspos+3)
+ jp DrawPea
+
+multiple_peas:
+ ld hl,(peaspos)
+ ld a,(ix+reserv)
+ ld e,a ;push a
+ and %01
+ jr nz,corrrectpea
+ ld hl,(peaspos+3)
+corrrectpea:
+ cal chkpeahit
+ jp nc,WormDead
+ ld a,e ;pop a
+ xor %01 ;0=1;1=0
+ ld (ix+reserv),a
+ and %01
+ add a,a
+ ld b,a
+ ld a,e
+ and %10
+ cp b
+ psh af ;safe z-flag
+ cal DrawPea ;remove
+ pop af
+ jr z,flagcaptured
+ jr Drawworm
;-----------------------------
ld (ix+pos2),e
ld (ix+pos2+1),d
ret
-still_alive_not_dead:
;-------- draw worm ----------
ld c,l
ld de,peasprite
spritepos =$-2
- cal PutSprite ;||-ed
- ret
+ jp PutSprite ;||-ed
;----------- score -----------
_________ = %00100000 ;
_datadie = %01000000 ;worm dies on impact
_datascore = %10000000 ;score>=100 limit
-_datamultpeas = 0
+_datamultpeas = %00100000
gamesingle = 0
datasingle: .db %01011110
gamerace = 5
datarace: .db %10000000
gamectf = 6
-datactf: .db %01000000
+datactf: .db %11100000
gamedomin = 7
datadomin: .db %01000000 ;==(8 modes)
nrlevels: .db 2,2,2,2,2,2,2,2
worm1set: .dw worm1p,worm1p
- .db %11110111,3,0,%01111110,%10,%100 ;< >
+ .db %11110111,3,%00,%01111110,%10,%100 ;< >
worm1name: .db "worm #01",0
worm2set: .dw worm2p,worm2p
- .db %11111011,3,0,%00111111,%10000,%1000 ;f1 f2
+ .db %11111011,3,%11,%00111111,%10000,%1000 ;f1 f2
worm2name: .db "worm #02",0
worm3set: .dw worm3p,worm3p
.db %11111011,3,0,%01011111,%10,%100 ;sto ,
lives = 17
reserv = 18 ;loop
;race:lap
- ;hunt:time
+ ;ctf:pea
input = 19
left = 20
right = 21
-;128x57 FIELD:
-; +-----------------+
-;(0,0)> |####(BORDER)#####|
-; |#*(2,2) #|
-; |# #|
-; |#(63,28)*(64,28)#|
-; |# #|
-; |# (125,54)*#|
-; |#################| <(127,56)
-; +-----------------+
;Drawable screen is (2,2)-(125,54); center is (63.5,28)
-
#include "asm86.h"
#include "ti86asm.inc"
;---------- HEADER ----------
- .org $F3E3-16 ;$F3E3-[name size]
- ;^^ <-MUST EQUAL NAME SIZE BELOW!!! If not, Worm will crash!
+ .org $F3E3-16
- .db 'w',90 ;wormLevel header (version .90)
- .db 16,"Worm LevelPack I" ;name size (UPDATE .ORG!!!); level name
- .dw hiscore-single ;leveldata size
+ .db 'w',90
+ .db 16,"Worm LevelPack I"
+ .dw hiscore-single
levelsdata:
- .dw single ;points to singleplayer levels below
- .dw peaworm ;...peaworm level
- .dw deathmatch ;...deathmatch
- .dw foodmatch ;...foodmatch
- .dw linkmatch ;...linkmatch
- .dw race ;...race
- .dw ctf ;...capture the flag
- .dw domination ;...domination
-
-;note: use <.dw 0> if no levels present (empty level will be used).
+ .dw single
+ .dw peaworm
+ .dw deathmatch
+ .dw foodmatch
+ .dw linkmatch
+ .dw race
+ .dw ctf
+ .dw domination
- .db 2,3,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
-
-;again .db 0 indicates no levels present.
+ .db 2,3,4,2
+ .db 2,2,2,2
;---------- LEVELS ----------
-;LEVEL-FORMAT:
-;------------
-; .db 5 ;nr. of peas in level
-; .db 4 ;delay (0=fastest, 4=normal)
-; .db 15 ;growth per pea
-; .db 15 ;begin size
-; .db 4 ;sprite size (1-8; 0=use default sprite)
-; .db %01100000 ;the sprite
-; .db %11110000
-; .db %11110000
-; .db %01100000
-; .db 2 ;bouncing balls (0-40)
-; .db 2 ;BALL #1: begin y-position
-; .db 4 ; begin-x
-; .db %00 ; direction (%00=right+down, %11=left+up)
-; .db 2,7,%00 ;BALL #2: y,x,direction
-; .db 0 ;your start direction (0=down,$40=right,$80=up,$C0=left)
-; .db 2 ;your y-position (2=at top)
-; .db 63 ;your x-position (63=center)
-; ;IN MULTIPLAYER LEVELS also set positions for worm 2-4:
-;(.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 ;field size: width (128-255), height (57-255)
-; ; screen will SCROLL if size is more than 128,57
-; .db 2 ;number of lines:
-; .db 28,14,100,41 ;LINE #1 coordinates: (x1,y1)-(x2,y2)
-; .db 28,41,100,14 ;LINE #2: the same
-; .db 1 ;number of boxes:
-; .db 16,12,48,12 ;BOX #1: x1,y1,x2,ysize(y2-y1)
-;------------ ;THAT'S ALL; repeat for all levels
-
-
-single: ;singleplayer levels start here
+single:
.db 5,4,15 ;peas/delay/growth
.db 15,5 ;size/spritesize
.db 91,106,115,106
.db 0
- .db 255 ;end marker: no more levels
-
-;Code to run when all levels are done:
-;Worm waits a second, then screen is cleared and this code will be run.
-;End with <ret> (stats-screen will then be displayed.)
-;If you don't want an ending, simply put <ret>.
+ .db 255
ld hl,endtext
call _puts ;display text
jp _getkey ;wait for a key
- ;jp ? = call ? + ret
+
endtext:
.db " Congratulations!!",0
.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 $20,2,2,$A0,54,125, $E0,2,125,$60,54,2
.db 128,57
- .db 0,0
+ .db 1
+ .db 35,28,92,28
+ .db 4
+ .db 2,20,18,17
+ .db 109,20,125,17
+ .db 48,2,79,10
+ .db 48,47,79,55
foodmatch:
hiscore:
- .dw 0 ;singleplayer hiscore will be saved here
- .dw 1,2 ;peaworm hiscore for each peaworm-level
+ .dw 0
+ .dw 1,2
.end