OBJTYPE:ARRAY[0..4]OF STRING[8] =
('NONE','LINE','FAT LINE','BAR','CIRCLE');
- ENDTYPE:ARRAY[-1..0]OF STRING[8] =
- ('MESSAGE','NONE');
+ ENDTYPE:ARRAY[0..1]OF STRING[8] =
+ ('NONE','MESSAGE');
HEAD86S:STRING[53] =
('**TI86**'+#$1A+#$A+#0+ {HEADER}
- 'Levelfile for Worm 0�93 made with WormEdit'); {COMMENT}
+ 'Levelfile for Worm 0�94 made with WormEdit'); {COMMENT}
- HEADEDIT = ('WormEdit�93'+#0+'LVL');
- HEADVERSION = 93;
+ HEADEDIT = ('WormEdit�94'+#0+'LVL');
+ HEADVERSION = 94;
B:RECORD
HEAD:ARRAY[1..15]OF CHAR;
SPRITE:ARRAY[1..8]OF BYTE;
ENDTYPE:INTEGER;
ENDDATA:STRING[255];
+ HINAME:ARRAY[1..3]OF CHAR;
END {B} =
(HEAD:HEADEDIT;
VERSION:HEADVERSION;
11110000
11110000
01100000}
- ENDTYPE:0);
+ ENDTYPE:1;
+ ENDDATA:'';
+ HINAME:'WOR');
LVLPOS:BYTE = 1;
OBJPOS:BYTE = 1;
LTEMP:ONELEVEL;
FILENAME:STRING[8];
+ LVLDISP:BYTE;
PROCEDURE MAINTITLE;
BEGIN
TEXTCOLOR(1); WRITE('>�����������������������������');
WINDOW(41,2,41,25); TEXTCOLOR(7); TEXTBACKGROUND(0); WRITE(CC('�',23));
WINDOW(1,25,80,25); TEXTBACKGROUND(1); CLRSCR;
- GOTOXY(75,1); TEXTCOLOR(0); WRITE('v0.93'); TEXTBACKGROUND(0);
+ GOTOXY(75,1); TEXTCOLOR(0); WRITE('v0.94'); TEXTBACKGROUND(0);
END; {MAINTITLE}
PROCEDURE CIRCLE(X,Y,Z,COL:BYTE);
PROCEDURE DISPLEVELS;
BEGIN
- WINDOW(42,3,80,13); TEXTBACKGROUND(0); CLRSCR;
+ WINDOW(42,3,80,13); TEXTCOLOR(7); TEXTBACKGROUND(0); CLRSCR;
IF B.LTOTAL<1THEN WRITELN('NONE PRESENT')ELSE
FOR II:=LVLPOS TO MIN(B.LTOTAL,LVLPOS+9)DO BEGIN
- WRITE(II); TEXTCOLOR(3); WRITELN(': '+L[II].NAME); TEXTCOLOR(7);
+ IF LVLDISP=1THEN WRITE(II) {CONTINOUS}
+ ELSE IF II>B.LSINGLE THEN WRITE(II-B.LSINGLE)ELSE WRITE(II); {SEPERATE}
+ TEXTCOLOR(3); WRITELN(': '+L[II].NAME); TEXTCOLOR(7);
END; {DISP LEVELS}
END; {DISPLEVELS}
BEGIN
EDITOK:=0; REPEAT
WINDOW(39,1,39,1); GOTOXY(1,1); REPEAT UNTIL KEYPRESSED; C:=READKEY;
- IF C=' 'THEN EDITOK:=10; {10}
- IF(C>='1')AND(C<=CHR(EDITMENUMAX+48))THEN EDITOK:=ORD(C)-48; {1..<=9}
- IF(C=#27)OR(C='-')OR(C='+')THEN EDITOK:=-1; {EXIT}
+ IF C=' 'THEN EDITOK:=10 {10} ELSE
+ IF(C>='1')AND(C<=CHR(EDITMENUMAX+48))THEN EDITOK:=ORD(C)-48 {1..<=9} ELSE
+ IF(C=#27)OR(C='-')OR(C='+')THEN EDITOK:=-1 {EXIT} ELSE
+ IF UPCASE(C)='H'THEN HELPBAR(HELPPAGE) ELSE
IF C=#0THEN BEGIN C:=READKEY;
- IF(C=#80)AND(LVLPOS<B.LTOTAL-9)THEN BEGIN INC(LVLPOS); DISPLEVELS; END; {DOWN}
- IF(C=#72)AND(LVLPOS>1)THEN BEGIN DEC(LVLPOS); DISPLEVELS; END; {DOWN}
+ IF HELPPAGE=5THEN BEGIN
+ IF(C=#80)AND(LVLPOS<B.LTOTAL-9)THEN BEGIN INC(LVLPOS); DISPLEVELS; END {DOWN} ELSE
+ IF(C=#72)AND(LVLPOS>1)THEN BEGIN DEC(LVLPOS); DISPLEVELS; END {UP} ELSE
+ END; {LEVELS DISPED}
IF C=#59THEN HELPBAR(HELPPAGE);
END; {EXTENDED}
- IF UPCASE(C)='H'THEN HELPBAR(HELPPAGE);
UNTIL EDITOK<>0; EDITMENU:=EDITOK;
END; {EDITMENU}
FUNCTION COMPSIZE:WORD;
BEGIN
- I:=$32+B.SPRSIZE+ORD(B.NAME[0])+2;
- IF B.LFROM[2]>0THEN I:=I+((1+B.LTO[2]-B.LFROM[2])SHL 1);
- IF B.LFROM[3]>0THEN I:=I+((1+B.LTO[3]-B.LFROM[3])SHL 1);
+ I:=$32+B.SPRSIZE+ORD(B.NAME[0])+5;
+ IF B.LFROM[2]>0THEN I:=I+((1+B.LTO[2]-B.LFROM[2])*5);
+ IF B.LFROM[3]>0THEN I:=I+((1+B.LTO[3]-B.LFROM[3])*5);
FOR II:=1TO B.LTOTAL DO BEGIN
INC(I,L[II].SIZE);
FOR I4:=1TO L[II].NROBJ DO IF L[II].OBJ[I4].TYP<=0THEN DEC(I,5);
TEXTCOLOR(15); TEXTBACKGROUND(1);
CASE BAR OF
1:BEGIN
- WRITE('LEVELS',' ':39-6); DISPLEVELS;
+ WRITE('LEVELS',' ':39-6); LVLDISP:=1; DISPLEVELS;
END; {1:SINGLVLS}
2:BEGIN
WRITE('LEVEL OBJECTS',' ':39-13); TEXTCOLOR(7); TEXTBACKGROUND(0);
WRITE(' BYTES');
END; {4:FILE}
5:BEGIN
- WRITE('LEVELS',' ':39-6); TEXTCOLOR(7); TEXTBACKGROUND(0);
- IF B.LTOTAL<1THEN WRITELN('NONE PRESENT')ELSE
- FOR II:=1TO B.LTOTAL DO BEGIN
- IF II>B.LSINGLE THEN WRITE(II-B.LSINGLE)ELSE WRITE(II);
- TEXTCOLOR(3); WRITELN(': '+L[II].NAME); TEXTCOLOR(7);
- END; {DISP LEVELS}
+ WRITE('LEVELS',' ':39-6); LVLDISP:=2; DISPLEVELS;
END; {5:LEVELS}
END; {BAR}
WINDOW(1,2,40,24);
TEXTCOLOR(7); WRITE('8: CTF '); TEXTCOLOR(3);
IF B.LCTF=0THEN WRITE('(NO LEVELS)')ELSE WRITE('(',B.LCTF,')');
- III:=EDITMENU(8,0);
+ III:=EDITMENU(8,5);
IF III=1THEN BEGIN
B.LFROM[1]:=INPUTINT('ENTER LEVELS TO SKIP','USE THIS TO TEMPORARILY REMOVE THE FIRSTFEW LEVELS',
0,0,B.LSINGLE-1); INC(B.LFROM[1]);
END; {}
END; {DELETE}
5:BEGIN
- INC(B.LSINGLE); INC(B.LTOTAL); II:=B.LSINGLE;
+ INC(B.LSINGLE); INC(B.LTOTAL); II:=B.LSINGLE;
+ IF B.LFROM[1]=0THEN B.LFROM[1]:=1;
FOR I:=B.LTOTAL DOWNTO II+1DO L[I]:=L[I-1];
L[II].NAME:='Level #'+NR(II);
L[II].PEAS:=8; L[II].DELAY:=4; L[II].GROWTH:=15; L[II].BSIZE:=15;
UNTIL III=-1; III:=0;
END; {EDITLVL}
-PROCEDURE EDITDSPR;
+PROCEDURE EDITSETS;
BEGIN
REPEAT
- TITLEBAR(0,'EDIT DEFAULT SPRITE');
- TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': SPRITE SIZE ');
- TEXTCOLOR(3); WRITELN('(',B.SPRSIZE,')');
- FOR I:=1TO B.SPRSIZE DO BEGIN
- TEXTCOLOR(14); WRITE(I+1); TEXTCOLOR(7); WRITE(': EDIT '); TEXTCOLOR(3);
- WRITELN(BYTE2STR(B.SPRITE[I],B.SPRSIZE));
- END; {DISP SPRITE}
-
- III:=EDITMENU(1+B.SPRSIZE,0);
- IF III=1THEN BEGIN
- I:=INPUTINT('ENTER THE DEFAULT SPRITE SIZE','CAN BE CHANGED PER LEVEL',1,B.SPRSIZE,8);
- IF I>B.SPRSIZE THEN FOR I4:=B.SPRSIZE+1TO I DO B.SPRITE[I4]:=0;
- B.SPRSIZE:=I;
- END {SIZE} ELSE IF III>1THEN BEGIN
- S:=INPUTSTR('ENTER NEW LINE #'+NR(III-1)+' OF SPRITE','EXAMPLE: 100101 = X��X�X',
- ZERO(BYTE2BIN(B.SPRITE[III-1]),8),8);
- B.SPRITE[III-1]:=STR2BYTE(S);
- END; {APP}
- UNTIL III=-1; III:=0;
-END; {EDITDSPR}
-
-PROCEDURE EDITSPEND;
-BEGIN
- REPEAT
- TITLEBAR(0,'SINGLEPLAYER ENDING');
- TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': END TYPE ');
- TEXTCOLOR(3); WRITELN(' (',ENDTYPE[B.ENDTYPE],')'); TEXTCOLOR(14);
+ TITLEBAR(0,'CHANGE DEFAULTS');
+ TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': HISCORE NAME ');
+ TEXTCOLOR(3); WRITELN('(',B.HINAME,')');
+ TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITE(': END TYPE ');
+ TEXTCOLOR(3); WRITELN('(',ENDTYPE[B.ENDTYPE],')');
CASE B.ENDTYPE OF
- -1:BEGIN
- WRITE('2'); TEXTCOLOR(7); WRITE(': EDIT MESSAGE');
- TEXTCOLOR(3); WRITE(' (',COPY(B.ENDDATA,1,18));
+ 1:BEGIN
+ TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITE(': EDIT MESSAGE ');
+ TEXTCOLOR(3); WRITE('(',COPY(B.ENDDATA,1,18));
IF LENGTH(B.ENDDATA)>18THEN WRITELN('...)')ELSE WRITELN(')');
END; {MSG}
+ ELSE BEGIN TEXTCOLOR(7); WRITELN('3: CONFIGURE END'); END; {NOTN}
END; {TYPE}
+ TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': SPRITE SIZE ');
+ TEXTCOLOR(3); WRITELN('(',B.SPRSIZE,')');
+ FOR I:=1TO B.SPRSIZE DO BEGIN
+ TEXTCOLOR(14); WRITE(I+4); TEXTCOLOR(7); WRITE(': EDIT '); TEXTCOLOR(3);
+ WRITELN(BYTE2STR(B.SPRITE[I],B.SPRSIZE));
+ END; {DISP SPRITE}
- III:=EDITMENU(2,0);
+ III:=EDITMENU(4+B.SPRSIZE,0);
CASE III OF
1:BEGIN
- FOR II:=0TO 1DO WRITE(NR(II)+': '+ENDTYPE[-II]+CC(' ',40-ORD(ENDTYPE[-II,0])));
+ S:=INPUTSTR('DEFAULT NAME OF HISCORES','LENGTH 3 CHARS',B.HINAME,3);
+ FOR I:=1TO 3DO B.HINAME[I]:=S[I];
+ END; {HINAME}
+ 2:BEGIN
+ FOR II:=0TO 1DO WRITE(NR(II)+': '+ENDTYPE[II]+CC(' ',40-ORD(ENDTYPE[II,0])));
B.ENDTYPE:=INPUTINT('ENTER NEW END TYPE',S,0,0,1);
- IF B.ENDTYPE=-1THEN B.ENDDATA:='Congratulations!!';
+ IF B.ENDTYPE=1THEN B.ENDDATA:='Congratulations!!';
END; {TITLE}
- 2:IF B.ENDTYPE=-1THEN
+ 3:IF B.ENDTYPE=1THEN
B.ENDDATA:=INPUTSTR('ENTER NEW END MESSAGE','MAX 255 CHARS','Congratulations!!',255);
+ 4:BEGIN
+ I:=INPUTINT('ENTER THE DEFAULT SPRITE SIZE','CAN BE CHANGED PER LEVEL',1,B.SPRSIZE,8);
+ IF I>B.SPRSIZE THEN FOR I4:=B.SPRSIZE+1TO I DO B.SPRITE[I4]:=0;
+ B.SPRSIZE:=I;
+ END; {SPRSIZE}
+ ELSE IF III>4THEN BEGIN
+ S:=INPUTSTR('ENTER NEW LINE #'+NR(III-4)+' OF SPRITE','EXAMPLE: 100101 = X��X�X',
+ ZERO(BYTE2BIN(B.SPRITE[III-4]),8),8);
+ B.SPRITE[III-4]:=STR2BYTE(S);
+ END; {SPREDIT}
END; {HANDLE}
UNTIL III=-1; III:=0;
-END; {EDITSPEND}
-
+END; {EDITSETS}
PROCEDURE EDITMAIN;
BEGIN
REPEAT
TITLEBAR(4,UPCS(B.NAME));
TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITELN(': EDIT TITLE');
- TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITE(': DEFAULT SPRITE');
- TEXTCOLOR(3); WRITELN(' (',B.SPRSIZE,')');
+ TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITELN(': DEFAULTS');
TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITELN(': GAME TYPES');
- TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': SP ENDING');
- TEXTCOLOR(3); WRITELN(' (',ENDTYPE[B.ENDTYPE],')');
- TEXTCOLOR(14); WRITE('5'); TEXTCOLOR(7); WRITE(': LEVELS');
+ TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': LEVELS');
TEXTCOLOR(3); WRITE(' (',B.LTOTAL,')');
- III:=EDITMENU(5,3);
+ III:=EDITMENU(4,3);
CASE III OF
1:B.NAME:=INPUTSTR('ENTER NEW TITLE FOR THIS LEVELFILE','NOTE TI-86 DISPLAYS ONLY 22 CHARS ON THEFIRST LINE',
B.NAME,32); {TITLE}
- 2:EDITDSPR;
+ 2:EDITSETS;
3:EDITGAME;
- 4:EDITSPEND;
- 5:EDITLVL;
+ 4:EDITLVL;
END; {HANDLE}
UNTIL III=-1; III:=0;
END; {EDITMAIN}
TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7);
WRITELN('FAILED OPENING LEVEL FILE!'); WRITELN('RUNTIME ERROR #',I); HALT;
END; {CAN'T OPEN}
- {$I-} BLOCKREAD(F,B,SIZEOF(B)); BLOCKREAD(F,L,SIZEOF(L)); {$I+}
+ {$I-} BLOCKREAD(F,B,SIZEOF(B));
+ FOR I:=1TO B.LTOTAL DO BLOCKREAD(F,L[I],SIZEOF(L[I])); {$I+}
IF(IORESULT<>0)OR(B.HEAD<>HEADEDIT)THEN BEGIN
TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7);
WRITELN('ERROR READING LEVEL FILE!');
PROCEDURE FILESAVE;
BEGIN
ASSIGN(F,FILENAME+'.LVL'); REWRITE(F,1);
- BLOCKWRITE(F,B,SIZEOF(B)); BLOCKWRITE(F,L,SIZEOF(L)); CLOSE(F);
+ BLOCKWRITE(F,B,SIZEOF(B));
+ FOR I:=1TO B.LTOTAL DO BLOCKWRITE(F,L[I],SIZEOF(L[I])); CLOSE(F);
END; {FILESAVE}
PROCEDURE FILECOMP;
BLOCKWRITE(FF,B.SPRSIZE,1);
BLOCKWRITE(FF,B.SPRITE,B.SPRSIZE);
- FOR II:=B.LFROM[1]TO B.LSINGLE DO SAVELEVEL(1); {LEVELS SINGLEPL}
+ IF B.LFROM[1]>0THEN
+ FOR II:=B.LFROM[1]TO B.LSINGLE DO SAVELEVEL(1); {LEVELS SINGLEPL}
I:=255; BLOCKWRITE(FF,I,1); {END}
I:=$C9; BLOCKWRITE(FF,I,1); {RET}
- FOR II:=B.LSINGLE+1TO B.LSINGLE+B.LMULTI DO SAVELEVEL(4); {LEVELS MULTIPL}
+ IF B.LMULTI>0THEN
+ FOR II:=B.LSINGLE+1TO B.LSINGLE+B.LMULTI DO SAVELEVEL(4); {LEVELS MULTIPL}
I:=0; I2:=1; IF B.LFROM[2]>0THEN I2:=I2+1+B.LTO[2]-B.LFROM[2];
IF B.LFROM[3]>0THEN I2:=I2+1+B.LTO[3]-B.LFROM[3];
- FOR II:=1TO I2 DO BLOCKWRITE(FF,I,2); {HI}
+ FOR II:=1TO I2 DO BEGIN BLOCKWRITE(FF,I,2); BLOCKWRITE(FF,B.HINAME,3); END; {HI}
SEEK(FF,$37); I2:=0; I:=0;
REPEAT INC(I,I2); BLOCKREAD(FF,I2,1,ISTACK); UNTIL ISTACK<>1;
; 93% = DONE
-; * internal levels
-; * check levels/gametype
-; * enough hiscore saves!
-; * complete readme
+; [* internal levels ]
+; [ * check levels/gametype ]
+; [ * enough hiscore saves! ]
+; [* complete readme ]
; 1% * misc (pollish, bugs, &&&)
; * LINK
-; 2% * fix deaths linkplay and transmit game/level data
-; 2% * make linkplay available for all gametypes (not just deathmatch)
+; 0% * fix first packet loss
+; 1% * transmit game/level data
+; 1% * get g/o signal (l&l) working
+; 2% * send new peas' positions
; * CTF
-; 1% * fix pea XOR problem in ctf (+dom?)
-; * fix wormstop
-; 1% * domination?: take control points by running over them and hold them
+; 1% * fix pea XOR problem in ctf
+; 1% * fix wormstop in race
;100% = bugs fixed + levels done
#define buffer ;use display buffer (otherwise write directly to screen)
#define readymask ;"greys" out the field before starting a level
;#define hlines ;horizontal-line routine for more speed drawing boxes
- ;(doesn't work properly)
-
+ ;^^(doesn't work properly)^^
;#define readytext ;displays "prepare" before level starts
;#define invincible ;worms cannot die =)
+;#define optdie ;in race games worms don't die when they run into each other
#define cal call
#define psh push
_SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
_SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl
_mm_ldir = $52ED ;24bit ldir
+_MM_LDIR_SET_SIZE = $524D ;_SET_MM_NUM_BYTES + _mm_ldir
_RAM_PAGE_1 = $47E3 ;set $8000+ to page 1
_RAM_PAGE_7 = $47F3 ;"""" 7
_PTEMP_END = $D29A ;end of VAT
_load_ram_ahl = $462F ;ahl->page+hl
-_writeb_inc_ahl = $5567 ;ld (ahl),c
+_writeb_inc_ahl = $5567 ;ld (ahl++),c
_jforce = $409C ;TI-OS stack restored
_EXLP = $4493 ;swap (hl),(de) b times
_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl
WormTxt:
.db "WORMY by SHIAR -- beta 93%",0
WormIcon:
- .db 9,2
- .db %10010110,%01101111
- .db %10110101,%01001011
- .db %01110011,%01001001
- .db %00000011,%10000000
- .db %00000001,%11100000
- .db %00111000,%11111000
- .db %01111110,%00111111
- .db %11101111,%00001111
- .db %11000011,%10000000
+ .db 8,2
+ .db %00110000,%00111100
+ .db %01110000,%00111110
+ .db %11100000,%00000111
+ .db %11000011,%11000011
+ .db %11000111,%11100011
+ .db %11101110,%01100111
+ .db %01111100,%01111110
+ .db %00111000,%00111100
levelhead = 'w'
-levelhead2 = 93 ;wormy levels header = "93"
+levelhead2 = 94 ;wormy levels header = "93"
int_handler:
ex af,af'
cp K_SECOND-1
jr z,loadlevel
cp K_EXIT-1
- ret z
+ jp z,ExitNoStats
cp K_ENTER-1
jr nz,levselect
; jr z,loadlevel
cal _SET_ABS_DEST_ADDR ;store in mem.
ld hl,0
leveldataSize =$-2
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir
+ cal _MM_LDIR_SET_SIZE
cal _LOAD_ABS_SRC_ADDR ;->ahl
ld (hiscrposa),a
ld hl,$303E
ld (_penCol),hl
cal getwormname
- ld hl,worm1name-18
- add hl,de
+ psh ix ;wormNname
+ pop hl ;ld hl,ix
cal _vputs
ld hl,$363E ;controls
ld (_penCol),hl
ret
changeworms:
- cal _clrWindow
- ld hl,txtEName
- cal _puts ;"Enter name player "
- ld a,(curworm)
- add a,'0'
- cal _putc
-
cal getwormname
+ psh ix
+ pop hl ;ld hl,ix
+ psh hl
+ ld b,8
+emptyname:
+ ld (hl),' '
+ inc hl
+ dnz emptyname
ld a,maxnamelength
- cal entername
- ld (ix),0 ;end mark
- jp DisplayMenu
-
-entername:
- ld h,1
- ld l,h ;)
- ld (_curRow),hl
ld (namelength),a
enternameloop:
+ ld hl,$FF07 ;begin pos
+ ld a,6 ;nr of lines
+ cal clroldcustom
+ ld hl,$303E
+ ld (_penCol),hl
+ pop hl
+ psh hl
+ ld (ix),0
+ cal __vputs
+ ld (ix),' '
ld a,'_'
- cal _putc
- ld hl,_curCol
- dec (hl)
+ cal __vputmap
nokeypressed:
halt
cal GET_KEY
or a
jr z,nokeypressed
+ ld hl,namelength
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
+ jr z,nameentered
cp K_EXIT
- ret z
-
- ld hl,namelength
- dec (hl)
- ret z
+ jr z,nameentered
+ dec (hl) ;(namelength)
+ jr z,nameentered
ld hl,chartable
ld e,a
ld d,0
ld a,(hl)
or a
jr z,nokeypressed
-
ld (ix),a
- cal _putc
inc ix
cal releasekeys
jr enternameloop
-
chartable:
.db 0,".<>!",0,0,0,0 ;down,L,R,up
.db 0,"XTOJE0",0 ;enter..clear
.db $D9,"-PKFA6'" ;on..alpha
.db "54321*",0,$D0 ;F5..more
+nameentered:
+ pop ix ;stringbegin
+ ld (ix+8),0 ;end mark
+ jp DisplayMenu
+
;--proc
clrold:
ld hl,$FD97 ;begin pos
- ld de,7 ;bytes to add
ld a,35 ;nr of lines
+clroldcustom:
+ ld de,7 ;bytes to add
clroldsettings:
ld c,9 ;bytes to clear
clroldsetsloop:
ld b,(hl) ;balls
inc b
inc b ;skip 6
- ld a,c
- cp _datasingle
+ ld a,(Gametype)
+ cp gamesingle
jr z,skipworms
inc b ;multiplayer lvl
inc b
;-----------------------------
GameOver:
- cal _clrLCD
ld hl,worm1set
ld de,worm1
ld a,4 ;4x (all worms)
dec a ;loop
jr nz,createwormsloop
- pop hl ;begin of current level
StartLevel:
+ cal _clrWindow
+ pop hl ;begin of current level
ld de,Left
ld a,(hl)
inc a ;=255?
ld hl,Level
dec (hl) ;curlevel-- (not beyond last lvl)
cal releasekeys
- cal _clrWindow
pop hl
;show end msg or smtn
ld bc,Exit
jr z,hiscorecheckdone ;no SP
checkhiscore:
cal loadhiscoreposinahl
- cal _Get_Word_ahl ;de=old_hi
- psh de
- cal _RAM_PAGE_1 ;&&
- pop de
- ld hl,(worm1+score)
-
- ld a,h ;New
- cp d ;Old
- jr c,NotNewHigh ;New<Old
- jr nz,newhigh ;New>Old
-
- ld a,e ;old
- cp l ;new
- jr nc,NotNewHigh ;new<old
+ cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
+ xor a
+ ld hl,highsave
+ cal _SET_ABS_DEST_ADDR ;to local
+ ld hl,5 ;5 bytes
+ cal _MM_LDIR_SET_SIZE ;get old score+name
+ cal _RAM_PAGE_1
-newhigh: ;New>=Old
- ex de,hl
+ ld de,(highsave) ;de=prev. hiscore
+ ld hl,(worm1+score) ;hl=worm1's score
+ cal _cphlde ;sub hl,de
+ jr c,NotNewHigh ;new<old
+ jr z,NotNewHigh ;new<=old
+newhigh: ;New>Old
+ ld (highsave),hl ;store new hiscore
+ ld de,highsave+2 ;to
+ ld hl,worm1+name ;from
+ ld bc,3 ;3 chars
+ ldir ;store new hiname
cal loadhiscoreposinahl
- cal _Set_Word_ahl ;de->(ahl)
- cal _RAM_PAGE_1
+ cal _SET_ABS_DEST_ADDR ;to ahl
+ xor a
+ ld hl,highsave
+ cal _SET_ABS_SRC_ADDR ;from local
+ ld hl,5
+ cal _MM_LDIR_SET_SIZE ;save new
+ cal _RAM_PAGE_1
-NotNewHigh: ;de=current hiscore
- ld hl,$0807
- ld (_curRow),hl
+NotNewHigh:
+ ld hl,$3149
+ ld (_penCol),hl
ld hl,txthiscore
+ cal _vputs
+ ld hl,$0C07
+ ld (_curRow),hl
+ ld hl,highsave+2
cal _puts
- ex de,hl ;pop
+ ld hl,(highsave)
cal showHL
hiscorecheckdone:
ld hl,savestart
cal _SET_ABS_SRC_ADDR
ld hl,saveend-savestart
- cal _SET_MM_NUM_BYTES
- cal _mm_ldir
+ cal _MM_LDIR_SET_SIZE
cal releasekeys
res 4,(iy+9)
ld a,(nrlevels+1)
ld l,a ;skip peaworm slots for tron mode
hi_:
+ add hl,hl ;one WORD per hiscore
or a ;Singleplayer?
ld b,0 ;offset 0 for SP
jr z,hi__
ld a,(Level)
ld b,a ;levels to skip (including 1 for singleplayer)
addlevelposition:
+ inc hl
inc hl ;add one word per level
+ inc hl
+ inc hl
+ inc hl ;plus 3 bytes for name
dnz addlevelposition
hi__:
- add hl,hl ;one WORD per hiscore
xor a ;ahl=0(+hl)
ld bc,defhiscrpos
hiscrposhl =$-2
hiscrposa =$+1
adc a,0 ;ahl=saveloc
ret
+highsave:
+ .db 0,0,"WOR ",0
;-----------------------------
;----------- worm ------------
Hitworm:
ld a,(gameCar)
ld h,a
+#ifdef optdie
and _datadie
cal z,checkhitotherworm
ld a,h
+#endif
and _datamultpeas ;&&bit
jr nz,multiple_peas
ld a,h
cal removeworm
pop hl ; << call
pop hl ; << call
- pop hl ; << levelp new
ld (ix+delay),2
jp StartLevel
ld (ix+reserv),a
ret
+#ifdef optdie
checkhitotherworm:
.db $dd,$7d ;ld a,lx
cp worm2&255
pop ix
ret z ;not hit
pop bc ;call
+#endif
stopworm:
ld bc,0
previouspos =$-2
ret
-
-
-
-
-
-
;-----------------------------
;----------- link ------------
;-----------------------------
txtKeyleft: .db ":left",0
txtKeyright:.db "/right",0
txtLevsel: .db $CF," Select levels ",5,0
-txtEName: .db "Enter name player ",0
txtWaiting: .db "Waiting...",0
txtReceive: .db "Receiving..." ;,0
datarace: .db %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision)
gamectf = 7 ;used
datactf: .db %1001000,0,4,1,-1,-1, 8, 9 ;CTF (90 score)
-_datasingle = %1100110 ;(datasingle) usable like gamesingle
worm1set: .dw worm1p,worm1p
.db %11110111,%00,-01,K_RIGHT,K_LEFT
-worm1name: .db "Wormy ",0
+worm1name: .db "WORMY ",0
worm2set: .dw worm2p,worm2p
.db %11111011,%11,-01,K_F2,K_F1
-worm2name: .db "Viper ",0
+worm2name: .db "VIPER ",0
worm3set: .dw worm3p,worm3p
.db %11111011,%00,-01,K_COMMA,K_STO
-worm3name: .db "Nibbler ",0
+worm3name: .db "NIBBLER ",0
worm4set: .dw worm4p,worm4p
.db %11111011,%00,-01,K_PLUS,K_ENTER
-worm4name: .db "Jim ",0
+worm4name: .db "JIM ",0
defhiscrpos:
- .dw 0,0,0,0,0,0
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
+ .db 0,0,"SHI"
saveend: