3 ; Release Date : summer 2001
4 ; Filename : wormy.86p (5kb)
6 ; Email Address : shiar0@hotmail.com
8 ; Web Page : www.shiar.org
9 ; Description : ruling Nibbles-like game 1-4 players
10 ; Where to get this game : www.shiar.org (home of Wormy)
11 ; Other games by author(s) : Nemesis beta
12 ; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98)
13 ; Jonah Cohen (helped writing worm)
15 ;-----------------------------
16 ;----------- TO-DO -----------
17 ;-----------------------------
21 ; [* internal levels ]
22 ; [ * check levels/gametype ]
23 ; [ * enough hiscore saves! ]
24 ; [* complete readme ]
25 ; 1% * misc (pollish, bugs, &&&)
27 ; 0% * fix first packet loss
28 ; 1% * transmit game/level data
29 ; 1% * get g/o signal (l&l) working
30 ; 2% * send new peas' positions
32 ; 1% * fix pea XOR problem in ctf
33 ; 1% * fix wormstop in race
35 ;100% = bugs fixed + levels done
37 ;-----------------------------
38 ;-----------------------------
39 ;--------- W O R M ---------
40 ;-----------------------------
41 ;-----------------------------
43 #define buffer ;use display buffer (otherwise write directly to screen)
44 #define readymask ;"greys" out the field before starting a level
45 ;#define hlines ;horizontal-line routine for more speed drawing boxes
46 ;^^(doesn't work properly)^^
47 ;#define readytext ;displays "prepare" before level starts
48 ;#define invincible ;worms cannot die =)
49 ;#define optdie ;in race games worms don't die when they run into each other
56 #include "ti86asm.inc"
58 _SHRACC = $4383 ;4x srl a
59 _SHLACC = $438B ;4x sll a
60 _divHLby10 = $4044 ;hl=hl/10
61 _divAby10 = $4DAF ;a=a/10
62 _HLTIMES10 = $41BF ;hl=hl*10
63 _cphlde = $403C ;cp hl,de
64 _clrWindow = $4A86 ;clear screen
65 _asapvar = $D6FC ;own name (worm)
66 _MOV4B = $429B ;4x ld (de),(hl)
67 _MOV5B = $4297 ;5x ld (de),(hl)
68 _mov9b = $4283 ;9x ld (de),(hl)
69 _ldHLind = $4010 ;ld hl,(hl)
70 _swapt_ = $45F3 ;ex_ahl_bde
71 _Get_Word_ahl = $521D ;ld de,(ahl)
72 _Set_Word_ahl = $5221 ;ld (ahl),de
73 _INC_PTR_AHL = $4637 ;ahl=ahl+1
74 _AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2
75 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
76 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
77 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
78 _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
79 _mm_ldir = $52ED ;24bit ldir
80 _MM_LDIR_SET_SIZE = $524D ;_SET_MM_NUM_BYTES + _mm_ldir
81 _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
82 _RAM_PAGE_7 = $47F3 ;"""" 7
83 _PTEMP_END = $D29A ;end of VAT
84 _load_ram_ahl = $462F ;ahl->page+hl
85 _writeb_inc_ahl = $5567 ;ld (ahl++),c
86 _jforce = $409C ;TI-OS stack restored
87 _EXLP = $4493 ;swap (hl),(de) b times
88 _GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl
90 ;-----------------------------
91 ;------- data storage -------
92 ;-----------------------------
96 ScrBuffer = $8820 ;-A7FF (20*FF=1FE0)
97 worm2p = $A800 ;-ABFF (400) %10101O00
98 worm1 = $AC00 ;-AC1D (31d)
99 worm2 = $AC1F ;-AC3B (1F)
100 worm3 = $AC3E ;-AC59 (1F)
101 worm4 = $AC5D ;-AC77 (1F)
102 balls = $AC7C ;-ACFF (3x43d)
103 SinCosTable = $AD00 ;-AE00 (4x40)
104 ;free $AE01 ;-AFFF (1FF)
105 worm1p = $B000 ;-B7FF (800) %1011O000
106 worm3p = $B800 ;-BBFF (400) %10111O00
107 ;free $BF91 ;-BFFF (6F)
109 ;program $D748 ;-E7FF (106D+4A)
110 ;free $E800 ;-EFFF (800)
111 worm4p = $F000 ;-F3FF (400) %11110O00
112 leveldata = $F400 ;-FA70 (<=671)
119 namelength = $BC00 ;(1) @menu
121 DispBuffer = $BC00 ;(10x57d) @game
126 ;-----------------------------
127 ;------- program start -------
128 ;-----------------------------
143 .db "WORMY by SHIAR -- beta 93%",0
146 .db %00110000,%00111100
147 .db %01110000,%00111110
148 .db %11100000,%00000111
149 .db %11000011,%11000011
150 .db %11000111,%11100011
151 .db %11101110,%01100111
152 .db %01111100,%01111110
153 .db %00111000,%00111100
156 levelhead2 = 94 ;wormy levels header = "93"
187 ld bc,int_end-int_handler
194 ld hl,$BFFF ;VAT start
197 ld de,(_PTEMP_END+1) ;VAT end
227 ex de,hl ;ld ahl,(hl)
228 cal _AHL_PLUS_2_PG3 ;string id
229 cal _Get_Word_ahl ;ld de,(ahl)
233 jr nz,_searchnext ;not worm
237 inc ix ;save level's ahl
252 cal _Get_Word_ahl ;ld de,(ahl++)
257 ld a,e ;set new level
280 cal _vputs ;"< Select levels: >"
296 ex de,hl ;ahl=ade=(hl)
297 cal _load_ram_ahl ;hl=ahl
298 ld b,(hl) ;b=title size
331 ld b,-3 ;level selected
337 pop bc ;GET_KEY destr. b
352 add a,3 ;sellev+3 (#0==-3)
361 or a ;levelfile on page 0 (=internal)
372 cal _GETB_AHL ;ld a,(ahl)
377 cal _INC_PTR_AHL ;ahl++
379 jr nz,skiptitle ;goto #0-terminator
382 ld (leveldataSize),de
391 cal _SET_ABS_SRC_ADDR ;levelsstart
394 cal _SET_ABS_DEST_ADDR ;store in mem.
397 cal _MM_LDIR_SET_SIZE
399 cal _LOAD_ABS_SRC_ADDR ;->ahl
406 ldi ;(de),(hl)\inc hl
411 res 2,(iy+13) ;appAutoScroll
419 ld (hl),1 ;def=level#1
423 ;-----------------------------
424 ;----- build trig tables -----
425 ;-----------------------------
450 ;-----------------------------
451 ;---------- menu -------------
452 ;-----------------------------
454 DisplayMenu: ;---draw menu---
466 ld hl,dispmenusets ;mainMenu
467 psh hl ;jump here after ret
470 ;Mode|Level|Limit|Worms|worm #|controls
471 ; jr dispmenucommon ;cal
474 ld de,$FD80 ;begin pos
498 hr: ;draw horizontal line at hl
507 ;Back|Lives|Limit|Speed|Rotation|Growth
522 inc hl \ inc hl \ inc hl
540 inc a ;-1=None; 0..98->1..99
555 cal cshowA ;turn speed
562 ld a,(hl) ;(scorelimit)
567 jr z,optionMenu ;do not display 0 behind 'None'
579 jp z,dispmainmenu ;mainMenu
623 cal loadgamecar ;a=(hl)
626 jr nc,optionMenu ;>99
630 jp dispomenusets ;optionMenu
633 sub 1 ;dec does not set cf
641 jr nc,optionMenu ;>99
644 jr _dispomenusets ;optionMenu
647 sub 1 ;dec does not set cf
654 ld a,(hl) ;(scorelimit)
661 jr nc,_optionMenu ;>98
665 jr _dispomenusets ;optionMenu
671 jr z,_optionMenu ;<-1
678 inc hl ;=saves 2 bytes :P
687 jr nc,_optionMenu ;>25
690 jr _dispomenusets ;optionMenu
705 jr nc,_optionMenu ;>98
708 jr _dispomenusets ;optionMenu
714 jr z,__optionMenu ;<-1
726 dec a ;2nd item: level
728 sub 3 ;5th item: wormname
732 jp LetsGetThisPartyOn ;otherwise
763 jr nc,mainMenu ;may not become >(nrworms)
767 jr _dispmenusets ;mainMenu
780 ; jr z,bchangecurworm
785 jr nz,changedcurworm ;save >0
790 ld a,(hl) ;hl=nrworms
793 jr nc,mainMenu ;may not be >4
797 jr dispmenusets ;mainMenu
801 ld a,(hl) ;hl=nrworms
805 ld a,(hl) ;hl=nrworms
808 jr nc,changednrworms ;save >=2
817 jr _mainMenu ;don't change for singleplayer
822 dec hl ;inced earlier
824 ld a,1 ;change LS-bit (=link)
827 jr dispmenusets ;mainMenu
836 jr dispmenusets ;mainMenu
843 inc hl ;hl=loadgamecar+2
845 ld a,(hl) ;(curlevel)
851 cp (hl) ;max level for sel.game
857 jr dispmenusets ;mainMenu
860 ld a,(hl) ;(curlevel)
885 cal getcustomkey ;left
886 cal getcustomkey ;right
889 ;---display current settings---
899 add hl,de ;hl=posGame+(Gametype)
900 ld a,(hl) ;str.offset
904 ld (CURtxtGame),hl ;save for g/o
905 cal _vputs ;Singleplayer
927 pop hl ;loadgamecar; hl++
929 ld a,(hl) ;(curlevel)
944 ld hl,$363E ;controls
950 ;--- handle menukeys ---
959 pop bc ;GET_KEY destr. b
969 menupos: ;highlight #b
982 add hl,hl ;$FD20+item*96
1012 ;--- change name ---
1015 getwormname: ;of (curworm)
1043 ld hl,$FF07 ;begin pos
1077 dec (hl) ;(namelength)
1092 .db 0,".<>!",0,0,0,0 ;down,L,R,up
1093 .db 0,"XTOJE0",0 ;enter..clear
1094 .db " WSNID9",0 ;(-)..custom
1095 .db "ZVRMHC8",0 ;dot..del
1096 .db "YUQLGB7#" ;0..xvar
1097 .db $D9,"-PKFA6'" ;on..alpha
1098 .db "54321*",0,$D0 ;F5..more
1102 ld (ix+8),0 ;end mark
1108 ld hl,$FD97 ;begin pos
1109 ld a,35 ;nr of lines
1111 ld de,7 ;bytes to add
1113 ld c,9 ;bytes to clear
1118 jr nz,clroldsetsloop
1121 jr nz,clroldsettings
1124 skiplevel: ;@hl - destr:ab - alter:hl
1129 ld b,(hl) ;spritesize
1140 inc b ;multiplayer lvl
1142 inc b ;skip other 3 worms (9 bytes)
1176 ;build: c=(gameCar)=(hl-1)
1177 ; a=(wormbeglives)=(hl)
1183 add a,a ;8 bytes per mode
1195 ;-----------------------------
1196 ;-------- start game ---------
1197 ;-----------------------------
1201 ld (CheckExit),a ;set exit state
1219 ld (turnright),a ;more efficient
1223 cal _HLTIMES10 ;hl=10*(hl)
1228 ld a,(Gametype) ;8bytes -> 7bytes
1233 add a,24+1 ;go to datalevels
1235 sbc hl,de ;datalevels
1237 cal _ldHLind ;ld hl,(hl)
1238 pop de ;de=loadgamecar
1240 ld a,(de) ;(curlevel)
1244 dec d ;levels to skip
1268 jp DisplayMenu ;return to menu
1287 ;-----------------------------
1288 ;--------- game over ---------
1289 ;-----------------------------
1294 ld a,4 ;4x (all worms)
1304 ld (hl),b ;score+1=0
1311 ex de,hl ;de=wormX+head
1315 jr nz,createwormsloop
1319 pop hl ;begin of current level
1327 dec (hl) ;curlevel-- (not beyond last lvl)
1330 ;show end msg or smtn
1332 psh bc ;where to go afterwards
1333 inc hl ;location of ending-code
1334 jp (hl) ;go there ("call")
1342 ld (hl),a ;store new speed
1363 ld b,0 ;bc=sprite size
1364 add hl,bc ;hl=behind sprite
1371 setsprite: ;de=@sprite ;a=sprsize
1404 ld a,SinCosTable/256
1415 ld bc,(worm2-worm1)-5
1425 ;-------- draw level ---------
1451 add hl,hl ;32=scr.width
1519 ;-----------------------------
1521 psh hl ; >> levelp new
1556 ld hl,4+(txtposReady*256)
1567 jr nc,initfinished ;no link
1569 SwapPos: ;$18 xx -> $E6 xx
1573 ld (worm1+left),a ;worm 1...
1574 ld (worm3+left),a ;and worm 3 via link
1592 ld (worm2+left),a ;worm 2+4..
1593 ld (worm4+left),a ;..over link
1612 ;-----------------------------
1613 ;----------- LOOP ------------
1614 ;-----------------------------
1617 ld bc,(worm1+pos) ;camera worm #1
1619 or a ;if #1 not over link
1621 ld bc,(worm2+pos) ;otherwise view from #2
1623 cal DisplayField ;display piece of level
1638 jr nz,screeninvertloop
1651 ld (handledworm),a ;reset
1669 jr nz,nodispupdate ;just once every 10 turns
1670 ld (hl),10 ;reset counter
1671 cal forceshowstats ;update score
1678 cal nz,handlethoseneatlittleballs
1691 inc (hl) ;1..nrworms
1694 ;-----------------------------
1695 ;---------- keys -------------
1696 ;-----------------------------
1711 rla ;=$17 (c=EXIT-key)
1722 ld (ix+delay),respawndelay
1741 ld (ix+pos2+1),a ;x2
1749 ret nz ;HandleWorm done
1751 or a ;0=no live limit
1752 ret z ;don't end game
1755 jr z,anyworm ;quit at any worm's death
1756 ld a,(nrworms) ;livematch: all worms must've died
1758 ld hl,worm1+lives-(worm2-worm1)
1760 xor a ;check for 0 lives
1762 add hl,de ;next worm
1764 ret nz ;any >0: don't exit
1767 ld a,$A7 ;exit@end of turn
1768 ld (CheckExit),a ;set exit state
1777 out (7),a ;both wires low = game over signal
1783 cal menuinvloop ;invert
1785 cal hr ;menuinvloop w/ b=16
1806 cal _vputs ;Died Score
1821 jr c,nonewwinner ;h<d
1822 jr nz,newwinner ;h>d
1825 jr nc,nonewwinner ;l<e
1836 cpl ;high value (>$FB)
1841 ld a,(hl) ;less deaths
1848 ;---display worms---
1860 cp (hl) ;input=0 = link
1877 ld a,(hl) ;worm+died
1886 jr nz,nodmwinner ;deathmatch?
1887 ld a,0 ;winner's deaths
1889 cp (hl) ;equals this worm?
1893 jr c,notwinner ;no singleplayer winners
1895 cal _ldHLind ;ld hl,(hl)
1898 cal _cphlde ;==highest score..
1902 cal _putc ;..then put *
1916 dnz displayWormStats
1919 or a ;singleplayer (0) only
1920 jr nz,hilevelcheckdone
1925 jr c,hilevelcheckdone
1926 ld (hl),a ;save local
1931 hilvlposhl =$-2 ;save external
1932 cal _writeb_inc_ahl ;ld (ahl),c
1937 jr z,hiscorecheckdone ;no SP
1939 cal loadhiscoreposinahl
1940 cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
1943 cal _SET_ABS_DEST_ADDR ;to local
1945 cal _MM_LDIR_SET_SIZE ;get old score+name
1948 ld de,(highsave) ;de=prev. hiscore
1949 ld hl,(worm1+score) ;hl=worm1's score
1950 cal _cphlde ;sub hl,de
1951 jr c,NotNewHigh ;new<old
1952 jr z,NotNewHigh ;new<=old
1954 ld (highsave),hl ;store new hiscore
1955 ld de,highsave+2 ;to
1956 ld hl,worm1+name ;from
1958 ldir ;store new hiname
1959 cal loadhiscoreposinahl
1960 cal _SET_ABS_DEST_ADDR ;to ahl
1963 cal _SET_ABS_SRC_ADDR ;from local
1965 cal _MM_LDIR_SET_SIZE ;save new
1992 ;x123456789012345678901
1993 ;>>>>>> GAME OVER <<<<<
1998 ;6Worm#02 @ 05 00120
2005 rst 20h ;_ABS_MOV10TOOP1
2007 ld hl,savestart-_asm_exec_ram+4
2011 cal _SET_ABS_DEST_ADDR
2015 cal _SET_ABS_SRC_ADDR
2016 ld hl,saveend-savestart
2017 cal _MM_LDIR_SET_SIZE
2025 loadhiscoreposinahl:
2029 ld l,h ;hl=0 for peaworm and singleplayer
2032 ld l,a ;skip peaworm slots for tron mode
2034 add hl,hl ;one WORD per hiscore
2036 ld b,0 ;offset 0 for SP
2039 ld b,a ;levels to skip (including 1 for singleplayer)
2042 inc hl ;add one word per level
2045 inc hl ;plus 3 bytes for name
2046 dnz addlevelposition
2053 adc a,0 ;ahl=saveloc
2058 ;-----------------------------
2059 ;----------- worm ------------
2060 ;-----------------------------
2065 cal saverespawncounter
2071 jr DoesWormTailEqualsWormHead ;chk4 size=0
2082 DoesWormTailEqualsWormHead:
2084 jr nz,removewormloop
2088 jr nz,safewormsizedone
2096 ld (ix+tail),e ;head=tail/size=0
2102 jr nz,saverespawncounter
2126 ld a,%01111111 ;default
2129 dnz bitmask ;a/8 times
2130 out (1),a ;send bitmask
2131 in a,(1) ;input keys
2136 dnz keybit ;check match (cf set)
2139 inkeys: ;use jp not call!
2158 jr z,inlink ;input by link
2159 cal inkeys ;input by keys
2163 ld c,l ;send our keys
2170 ;------- handle worm ---------
2221 ;-------- move worm ----------
2249 notmoveY: ;bc=newpos
2256 pop hl ; << pos (old)
2274 ;--------- worm hit ----------
2281 cal z,checkhitotherworm
2284 and _datamultpeas ;&&bit
2288 jp z,WormDead ;no food
2295 cal DrawPea ;remove pea
2307 jp nz,Drawworm ;continue
2313 jp nz,Exit ;stack restored
2324 cal IncScore ;score+(40*level)
2331 chkpeahit: ;hl=peapos
2360 ld hl,(peaspos) ;1st pea
2366 ld hl,(peaspos+2) ;2nd pea
2369 pop hl ;(peapos) 1st pea
2370 jp c,WormDead ;stopworm ;own pea hit
2372 ld a,e ;peek a (that's x86 asm for pop\push ;)
2375 ld hl,(peaspos+2) ;2nd pea
2388 cal DrawPea ;restore own flag
2389 jr sillylabel ;inv both\die
2391 hitflag: ;correct pea hit
2409 ret ;Z=yes: no flag taken
2411 ;-----------------------------
2430 jr nz,nextotherwormbit
2456 .db $dd,$7d ;ld a,lx
2459 jr nz,chkworm2 ; ret nz
2485 ;-------- draw worm ----------
2493 cal z,checkhitlapline
2499 ret z ;keep tail in "Tron"
2542 ;-----------------------------
2543 ;---------- ball -------------
2544 ;-----------------------------
2546 handlethoseneatlittleballs:
2592 bit 1,d ;1=up; 0=down
2622 letsmovetheotherway:
2637 ;-----------------------------
2638 ;----------- procs -----------
2639 ;-----------------------------
2643 ld a,%10000000 ;all key-masks
2646 inc a ;cp %11111111 (no keys pressed)
2647 jr nz,releasekeys ;keep waitin
2648 cal GET_KEY ;clear buffer
2694 jr nz,NewPea ;pixel found
2701 ;all ok; empty space
2710 ;----------- score -----------
2730 jr z,scorecommon ;hl/1000 not increased
2738 jr c,showstats ;<0=0
2746 jr z,showstats ;de=0=no limit
2753 ret nz ;no disp for timematches
2770 shownameloop: ;1st 3 chars
2799 showstat: ;(multiplayer)
2817 showstatsS: ;(singleplayer)
2911 ;-----------------------------
3029 ld (ShiftRightCounter),a
3031 ld (ShiftRightChunk),a
3045 ShiftRightCounter = $-1
3067 ld (ShiftLeftCounter),a
3069 ld (ShiftLeftChunk),a
3071 jr nc,ShiftLeftSameByte
3090 ShiftLeftCounter = $-1
3101 jr nz,ShiftRowsRight
3135 ;----------- draw ------------
3149 CheckPixel: ;at bc in d
3156 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
3157 ;(b,c) to hl:a; "destroyes" ahl
3159 FindPixel: ;(b,c) to hl:a
3192 PutSprite: ;||@(b,c)
3193 ;by SHIAR only ix saved
3268 drawbox: ;(d,e)-(h,l)
3276 drawhline: ;(d,e)-(h,e)
3282 ld c,a ;starting mask
3324 drawline: ;(d,e)-(h,l)
3425 drawcircle: ;(d,e),h ;de=x,y; h=z
3436 ex (sp),hl ;push zz \ pop x,y
3437 cal circledraw ;(x-xx,y+yy)-(x+xx,y+yy)
3438 ;(x-xx,y-yy)-(x+xx,y-yy)
3439 cal circledraw ;(x-yy,y+xx)-(x+yy,y+xx)
3440 ;(x-yy,y-xx)-(x+yy,y-xx)
3442 ex (sp),hl ;push x,y \ pop zz
3445 dec a ;-256<h<0 = $FF**
3447 jr z,circlenext ;jump if zz<0
3451 add a,a ;a=2yy-2 ;nc
3453 sbc hl,de ;zz=zz-2yy+2
3461 add hl,de ;zz=zz+2xx+3
3470 circledraw: ;destr:de
3475 add hl,bc ;h=x+xx; l=y+yy
3477 cal drawline ;(h-b,l+c)-(h+b,l+c)
3483 cal drawline ;(h-b,l-c)-(h+b,l-c)
3484 ld a,b ;swap xx and yy
3491 ;-----------------------------
3492 ;----------- link ------------
3493 ;-----------------------------
3497 out (7),a ;raise both wires = link ok
3503 checklink: ;load wires in A and check for timeout
3504 dec de ;decrease timer
3507 jr nz,linkfine ;ok if de>0
3510 ld a,0 ;losses so far
3512 inc a ;and this is another one
3514 pop de ;return from link
3515 cp lossout ;quit if too many errors
3516 ret c ;otherwise just continue
3537 Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde
3540 and %11 ;both wires low = exit signal
3541 jr z,linkerr ;error otherwise
3542 ld b,8 ;bits to send
3545 rl c ;bit to send in cf
3546 ld a,D0LD1H ;0: lower white
3548 ld a,D0HD1L ;1: lower red
3550 out (7),a ;lower one (send bit)
3552 cal checklink ;other calc must lower other wire
3554 ld a,D0HD1H ;raise one, ok to raise other
3558 cp %11 ;both raised (by other calc)
3561 dnz sendloop ;repeat for all bits
3563 ld (linklosses),a ;reset number of losses
3570 Crecv: ;--- receive 8 bits into A/C --- destr:abcdehl ---
3572 ret nc ;return if all went ok
3573 jr Crecv ;and try again
3575 Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcde ---
3578 jr z,linkerr ;both low = error, quit
3579 ld b,8 ;bits to receive
3585 jr z,recvwait ;both high = nothing sent (yet)
3586 rra ;received bit in cf
3588 jr c,received ;lower white wire as well
3589 ld a,D0HD1L ;lower red
3592 out (7),a ;both wires low
3595 jr z,recvwaitack ;same wire will be raised again by other calc
3597 out (7),a ;raise both
3599 dnz recvloop ;repeat for all bits
3601 ld (linklosses),a ;reset number of losses
3605 ;-----------------------------
3606 ;---------- levels -----------
3607 ;-----------------------------
3610 .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
3611 .db 0,2,63 ;start d, y, x
3612 .db 128,57 ;field width (128-255), height (57-255)
3613 .db 0 ;no additional lines, boxes
3619 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
3624 .db %1110000,%10001000,%10001000,%10001000,%1110000,0
3625 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
3630 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
3635 LevelDefT: ;tron=no delay
3637 .db %1110000,%10001000,%10001000,%10001000,%1110000,0
3638 .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
3644 .db %1110000,%10001000,%10001000,%10001000,%1110000,0
3645 .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
3650 ;-----------------------------
3651 ;---------- data -------------
3652 ;-----------------------------
3656 .db %00000000,%00000000,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%00000000,%00000000
3657 .db %00000000,%00000000,%00001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000110,%01111011,%00100000
3658 .db %00000000,%00000000,%00011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00001001,%00010011,%01000000
3659 .db %00000000,%00000000,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%10100111,%00110000,%10000000
3660 .db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%00000000,%10100001,%00001001,%01100000
3661 .db %00000000,%00000000,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%01001110,%01110010,%01100000
3662 .db %00000000,%00000000,%00110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
3663 .db %00000000,%00000000,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
3664 .db %00000000,%00000000,%00110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10000000,%00000000,%00000000,%00000000
3665 .db %00000000,%00000000,%00110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10000000,%00000000,%00000000,%00000000
3666 .db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00110101,%01001001,%10000000,%00000000
3667 .db %00000000,%00000000,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%01000101,%00010101,%01000011,%01100011
3668 .db %00000000,%00000000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%01100101,%01010101,%01000101,%01010100
3669 .db %00000000,%00000000,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00110111,%01011101,%10010101,%01100101
3670 .db %00000000,%00000000,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00010101,%01010101,%01000101,%01010101
3671 .db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%01100101,%01010101,%01000110,%01010011
3673 txtMenu: .db "Mode",0 ;1st menu item
3679 posMenu: .dw $2418,$231E,$2824,$1F2A,$1730,$1936
3680 txtMenuR: .db "controls",0
3681 txtoMenu: .db "Back",0 ;1st menu item
3687 posoMenu: .dw $2618,$251E,$2524,$222A,$1A30,$1C36
3688 txtGame: .db "Singleplayer",0
3689 txtGame1: .db "Peaworm",0
3690 txtGame2: .db "Tron",0
3691 txtGame3: .db "Deathmatch",0
3692 txtGame4: .db "Foodmatch",0
3693 txtGame5: .db "Timematch",0
3694 txtGame6: .db "Race",0
3695 txtGame7: .db "CTF" ;,0
3697 posGame: .db 0,txtGame1-txtGame
3698 .db txtGame2-txtGame
3699 .db txtGame3-txtGame
3700 .db txtGame4-txtGame
3701 .db txtGame5-txtGame
3702 .db txtGame6-txtGame
3703 .db txtGame7-txtGame
3705 txtNone: .db "None",0
3706 txtDef: .db "Default",0
3709 txtKeyleft: .db ":left",0
3710 txtKeyright:.db "/right",0
3711 txtLevsel: .db $CF," Select levels ",5,0
3712 txtWaiting: .db "Waiting...",0
3713 txtReceive: .db "Receiving..." ;,0
3716 .db 0, 3, 6, 9, 12, 15, 18, 21
3717 .db 24, 27, 30, 33, 36, 39, 42, 45
3718 .db 48, 51, 54, 57, 59, 62, 65, 67
3719 .db 70, 73, 75, 78, 80, 82, 85, 87
3720 .db 89, 91, 94, 96, 98,100,102,103
3721 .db 105,107,108,110,112,113,114,116
3722 .db 117,118,119,120,121,122,123,123
3723 .db 124,125,125,126,126,126,126,126
3726 txtLevel: .db "Level ",0
3727 txtWorms: .db "Worms: 0",0 ;follows txtLevel
3728 txtName: .db "Name",0
3729 txtWinner: .db "Wins " ;follows txtName
3730 txtDied: .db "Died " ;follows txtWinner
3731 txtScore: .db "Score",0 ;follows txtDied
3732 txtLeft: .db " left",0 ;follows txtScore
3733 txthiscore:.db "HiScore:",0
3734 txtReady: .db "Prepare!",0
3736 txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
3738 datalevels: .dw LevelDef, LevelDefM
3739 .dw LevelDefT,LevelDefM
3740 .dw LevelDefM,LevelDefM
3741 .dw LevelDefM,LevelDefC
3742 nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults
3744 _datalink = %0000001 ;linkplay
3745 _datafoodl = %0000010 ;left=0 limit
3746 _datasingl = %0000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
3747 _datamultpeas = %0001000 ;multiple peas=1
3748 _datatime = %0010000 ;time incs score (timematch)
3749 _datafood = %0100000 ;food present
3750 _datadie = %1000000 ;worm dies on impact
3751 ;reserved %10000000 ;for future use
3753 savestart: ; �game info (see above)
3754 ; | �lives (0=unlimited)
3755 ; | | �nrworms (can be altered by user)
3756 ; | | | �level (reset to 1 at startup)
3757 ; | | | | �speed/delay (-1=def)
3758 ; | | | | | �grow speed (-1=none; 0=continuous)
3759 ; | | | | | | �turn speed (8=def)
3760 ; | | | | | | | �score limit (0=none)
3761 gamesingle = 0 ;used | | | | | | | |
3762 datasingle: .db %1100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
3764 datapeas: .db %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
3766 datatron: .db %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
3767 gamedeathm = 3 ;used
3768 datadeathm: .db %1000001,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
3770 datafoodm: .db %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
3772 datatimem: .db %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
3774 datarace: .db %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision)
3776 datactf: .db %1001000,0,4,1,-1,-1, 8, 9 ;CTF (90 score)
3778 worm1set: .dw worm1p,worm1p
3779 .db %11110111,%00,-01,K_RIGHT,K_LEFT
3780 worm1name: .db "WORMY ",0
3781 worm2set: .dw worm2p,worm2p
3782 .db %11111011,%11,-01,K_F2,K_F1
3783 worm2name: .db "VIPER ",0
3784 worm3set: .dw worm3p,worm3p
3785 .db %11111011,%00,-01,K_COMMA,K_STO
3786 worm3name: .db "NIBBLER ",0
3787 worm4set: .dw worm4p,worm4p
3788 .db %11111011,%00,-01,K_PLUS,K_ENTER
3789 worm4name: .db "JIM ",0
3810 head = 13 ;4B (head=tail)
3811 tail = 15 ;also@next level
3813 reserv = 18 ;loop (race:lap|ctf:pea)
3824 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3825 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3826 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3827 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3828 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3829 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3830 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3831 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3832 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
3833 .db " shiar0@hotmail.com",0
3836 defspriteimg: .db %01100000
3842 .db "Internal Levels" ;,0
3844 .db 0,deflevels/256,deflevels&255
3847 ;-----------------------------
3848 ;----------- end -------------
3849 ;-----------------------------