-; Title : Wormy
-; Version : 96% (0.96.C21)
-; Release Date : UUHHhhh... soon?!?
-; Filename : wormy.86p (5kb)
-; Author(s) : Shiar
-; Email Address : wormy@shiar.org
-; Web Page : www.shiar.org
-; Description : ruling Nibbles-like game 1-4 players
-; Where to get this game : www.shiar.org (home of Wormy)
-; Other games by author(s) : Nemesis beta
-; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98)
-; Jonah Cohen (helped writing worm)
-
-;-----------------------------
-;----------- TO-DO -----------
-;-----------------------------
-
-; 96% = DONE
-
-; * complete readme
-; 1% * misc (pollish, bugs, &&&)
-; * mem at worm #4 (still 12 bytes or so.....)
-; * fix line proc (+large circles)
+;___����________________________________________________________����____________
+; ���� �����
+; ��� ���� ����
+;��� ����� �������� ����� ���� ���� ��� �����
+;��� ������� ����������� ������� ������������� �� ��� ���
+;�� ��� ��� ����� ���� ���� ��� ��� ���� ��� ��� ���� ���
+;�� �� �� �� � ��� ���� ��� ������ ��� ��� ��� ��
+;�� �� �� �� �� ��� ��� ��� ���� ��� ��� ��� ���� ��
+;�� ��� ��� �� �� �� ��� ������� ��� �� ������� ��
+;�� ��� ��� ��� �� �� �� �� ��� ��� ��� ����� ���
+;��� ��� ��� ��� �� �� ��� �� ���� ���� ��� ���
+;��� ����� ��� ��� ��� ��� �� �������� ��� ���
+; ��� ��� ��� ��� ��� ��� ��� ������ ��� ���
+; ���� ������� ���� ��� ��� ���� ��� ����� ����
+; �������� �������� ��������� ��� ��� ���������������
+; ����� ����� ������� �� ��� �����������
+;_______________________________________________________________________________
+;
+; Version : 97% (0.97.15)
+; Release Date : 2002 January 15
+; Author(s) : Shiar
+; Email Address : wormy@shiar.org
+; Web Page : www.shiar.org
+; Description : ruling Nibbles-like game 1-4 players
+; Where to get this game : www.shiar.org (home of Wormy)
+; Other games by author(s) : Nemesis beta
+; Additional Credits to : Matthew Shepcar : wrote original Peaworm, end'98
+; Jonah Cohen : helped writing worm
+; Files : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca
+; wormy.86p (6532) : efef32a8c541b4585087f55deb31f51d
+;_______________________________________________________________________________
+
+;NOTES:
+;* Use for LEARNING practises ONLY!
+; Don't _ever_ release altered code w/o permission!
+;* Code was originally by Scabby (Matthew Shepcar),
+; a few lines by Jonah Cohen,
+; and everything else by me - Shiar (Mischa Poslawsky).
+;* Although I've commented & labeled quite some stuff, I can't guarantee
+; everybody will understand it. This is probably not the best source
+; to learn z80 from. w00t the Shyer Way (tm).
+;* Don't scroll down if you get scared easily.
+
+;_______________________________________________________________________________
+; _______ _____ ______ _____
+; | | | | \ | |
+; | |_____| _____ |_____/ |_____|
+;_______________________________________________________________________________
+
+; 97% = DONE
+
+; 2% * misc (bugs, &&&, pollish, &&, &)
+; X score >9 dispay [15]
+; * mem at worm #4 (still 12 bytes or so.. or more? or less?)
+; * look at init-z in line routine again
+; X sp modes not configurable [15]
+; * team score
+; * random pixel still occurs
+; * levels: Wormage | Jonah? | 2 | 3 | 4
; * LINK
-; 1% * fix transmit game/level data
+; 1% * fix transmit game/level data (?)
+; * >Somehow do a lot of testing with 2 calcs< *sigh*
;100% = bugs fixed + levels done
-;>110%: sound, startpos
+; * arrow to offscreen peas
+; * multiple peas in sp level
+;>110%: sound, startpos (?)
;>120%: coop (DON'T COUNT ON IT)
-;-----------------------------
-;-----------------------------
-;------- W O R M Y ---------
-;-----------------------------
-;-----------------------------
-
-#define buffer ;use display buffer (otherwise write directly to screen)
-#define readymask ;"greys" out the field before starting a level
-#define coolzgfx ;nice graphics for game over screen
-
-;#define intlevels ;internal levels
-;#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
-#define dnz djnz
+;_______________________________________________________________________________
+; _/_/_____ __ _ _______ _ _ ______ _______
+; _/_/ | | \ | | | | | | \ |______
+; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______
+;_______________________________________________________________________________
#include "asm86.h"
#include "ti86asm.inc"
+
+ #define cal call
+ #define psh push
+ #define dnz djnz
+
_SHRACC = $4383 ;4x srl a
_SHLACC = $438B ;4x sll a
_divHLby10 = $4044 ;hl=hl/10
_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
+_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl
-;-----------------------------
-;------- data storage -------
-;-----------------------------
+ #define buffer ;use display buffer (otherwise write directly to screen)
+ #define readymask ;"greys" out the field before starting a level
+ #define coolzgfx ;nice graphics for game over screen
+ #define spprotect ;options not changable for singleplayer modes
+;#define intlevels ;-internal levels
+;#define readytext ;-displays "prepare" before level starts
+;#define invincible ;-worms cannot die =)
+;#define optdie ;-in race games worms dont die when they run into each other
-;--- permanent
+;_______________________________________________________________________________
+; _______ _______ _____ ______ _______ ______ _______
+; |______ | | | |_____/ |_____| | ____ |______
+; ______| | |_____| | \_ | | |_____| |______
+;_______________________________________________________________________________
+
+;--- permanent ---
ScrBuffer = $8820 ;-A7FF (20*FF=1FE0)
worm2p = $A800 ;-ABFF (400) %10101O00
balls = $AC7C ;-ACFF (3x43d)
SinCosTable = $AD00 ;-AE00 (4*40)
turn10 = $AE01 ;-AE01 (1) (counter)
-peaspos = $AE02 ;-AE05 (4) (peas)
+peaspos = $AE02 ;-AE05 (4+) (peas)
;free = $AE06 ;-AFFF (1FA)
worm1p = $B000 ;-B7FF (800) %1011O000
worm3p = $B800 ;-BBFF (400) %10111O00
;free = $BF91 ;-BFFF (6F)
-;program = $D748 ;-EFFF (186D+4A)
+;program = $D748 ;-EFFF (186D+4A) ;6327
worm4p = $F000 ;-F3FF (400) %11110O00
leveldata = $F400 ;-FA70 (<=671)
;can you believe i actually left $269 bytes of memory unused?!?
-;MEM|8---9---A---B---C---D---E---F---|
-; |..[------]||[]|......[-----]|[].|
-; | SCREEN 2* 13 PRGM 4LV |
+;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong
+; |..[------]||[]|......[-----]|[].| ;if you still understand
+; | SCREEN 2* 13 PRGM 4LV | ;after looking at this
-;--- temporary
+;--- temporary ---
namelength = $BC00 ;(1) @menu
datalink = $BC00 ;(8) @init
#else
DispBuffer = $FC70
#endif
+lefttotalb = $AFFF
+drawctfpea1 = peaspos+4
+drawctfpea2 = peaspos+6
-;-----------------------------
-;------- program start -------
-;-----------------------------
+;_______________________________________________________________________________
+; _____ ______ _____ ______ _______ _______ _______ ______ _______
+; |_____] |_____/ | | | ____ |______ | |_____| |_____/ |
+; | | \_ |_____| |_____| _____ ______| | | | | \_ |
+;_______________________________________________________________________________
.org %1101011101001000
-start:
- nop
+start: ;turn back NOW!
+ nop ;and so it begins...
jp Start
- ld bc,42
- .org $-1 ;3y3 M 1337!
- .dw WormTxt
- .dw WormIcon
-WormTxt:
+ ld bc,$5242
+ rst 10h
+ .dw WormIcon
ld d,a
ld c,a
ld d,d
ld a,c
jr nz,$+$55
ld c,b
- .dw 16713
- .db %1010010
+ .dw 16713
+ .db %1010010
jr nz,$+47
dec l
- .db " 96% C21",0
+ .db " 97% .15",0
WormIcon:
- .db 8,2
- .db %00000000,%00111100
- .db %00000000,%01010010
- .db %00000000,%01100001
- .db %01100011,%10011001
- .db %10010100,%01101001
- .db %10011001,%00011001
- .db %01000010,%11000001
- .db %00111100,%00111110
+ .db 8,2
+ .db %00000000,%00111100
+ .db %00000000,%01010010
+ .db %00000000,%01100001
+ .db %01100011,%10011001
+ .db %10010100,%01101001
+ .db %10011001,%00011001
+ .db %01000010,%11000001
+ .db %00111100,%00111110
levelhead = 'w'
levelhead2 = 95 ;wormy levels header = "95"
inc ix
_searchnext:
cal _RAM_PAGE_7
- jr searchnext
+ jr searchnext
loadgametype:
psh de
jr nz,loadgametype
ret
+;_______________________________________________________________________________
+; _______ _ _ _______ _______ _______ _______ _______
+; | |______ \ / |______ |______ | |______ | |
+; |_____ |______ \/ _____ ______| |______ |_____ |______ |_____ |
+;_______________________________________________________________________________
+
searchcomplete:
ld a,255
ld (ix),a ;end mark
#else
ld ix,templevels-3
#endif
-levelselectmenu:
+ cp (ix+3) ;1st=255
+ jp z,ExitNoStats ;->no lvls
+ cp (ix+6) ;2nd=255
+ jr z,loadlevel1 ;->1 lvl
+levelselectmenu: ;load next page
psh ix ;offset
ld a,-2
ld (availevels),a
ld hl,$0601 ;x=1
ld (_penCol),hl
dispnextlevel:
- ld a,(ix+3)
+ ld de,3
+ add ix,de
+ ld a,(ix)
ld b,a
inc a ;cp 255
jr z,__levselect
ld (hl),a ;y+6
cp 49 ;bottom of screen
jr nc,_levselect
- ld de,3
- add ix,de
ld hl,availevels
inc (hl)
ld a,b ;(ix+0)
cal _vputs
jr dispnextlevel
+loadlevel1:
+ psh ix
+ pop hl
+ ld b,-2
+ jr loadlevel
+
readylevelfile: ;selected level at ahl
; ld hl,templevels-3/0
ld a,b
cal _Get_Word_ahl
ld (leveldataSize),de
- ld d,8 ;counter
+ ld d,9 ;counter
ld bc,datalevels
cal loadgametype
ld (hilvlposa),a ;singleplayer levels
ld (hilvlposhl),hl
- ld d,4
+ ld d,5
cal loadgametype
cal _SET_ABS_SRC_ADDR ;levelsstart
add hl,de ;next
dnz setdeflevels
-;-----------------------------
-;----- build trig tables -----
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _____ ______ _______ _____ __ _ _____ _______
+; | | | | | |_____/ |______ | | \ | | |
+; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ |
+;_______________________________________________________________________________
- ld hl,TrigPrecalc
- ld de,SinCosTable
- psh de
- ld bc,65
- ldir
+;--- trig tables ---
+
+ ld hl,TrigPrecalc ;I believe this
+ ld de,SinCosTable ;is one of the few
+ psh de ;pieces of original
+ ld bc,65 ;Peaworm code still
+ ldir ;left intact..
dec hl
ld b,63
MirrorSineWave:
inc de
dnz NegativeSineWave
-;-----------------------------
-;---------- menu -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _______ _____ __ _ _______ _______ __ _ _ _
+; | | | |_____| | | \ | | | | |______ | \ | | |
+; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____|
+;_______________________________________________________________________________
-DisplayMenu: ;---draw menu---
+;---draw menu---
+
+DisplayMenu:
cal linkok
cal _clrWindow
ld de,$FC40 ;(0,4)
ld hl,$FC00+$3E0 ;(*,62)
cal hr
dispmainmenu:
- ld hl,Gametype
- ld a,(hl)
+ ld a,(Gametype)
dec a ;will be inced @changegame
- and 7
- ld (hl),a
+ cal changedgame
ld hl,changegame ;dispmenusets ;mainMenu
psh hl ;jump here after ret
ld hl,txtMenu
dnz hrloop
ret
-;--- menu loop ---
+;--- options menu ---
dispoptionmenu:
ld hl,txtoMenu
cal dispmenucommon_
dispomenusets:
+#ifdef spprotect
+ ld a,(gameCar)
+ and _datasingl
+ jp nz,LetsGetThisPartyOn
+#endif
cal clrold
ld hl,$1E3E
ld (_penCol),hl
cal loadgamecar
psh hl
- cal cshowA0 ;lives
+ cal cshowA ;lives
ld hl,$2A3E
ld (_penCol),hl
cal _vputs
jr dispspeeddone
dispspeed:
- cal cshowA0
+ cal cshowA
dispspeeddone:
ld hl,$363E
psh hl
ld a,(hl) ;(growth)
inc a ;-1=None; 0..98->1..99
- cal cshowA0
+ cal cshowA
ld hl,$303E
ld (_penCol),hl
cal _vputs
jr dispturndone
dispturn:
- cal cshowA0 ;turn speed
+ cal cshowA ;turn speed
dispturndone:
ld hl,$243E
ld a,(hl) ;(scorelimit)
or a
psh af
- cal cshowA0 ;limit
+ cal cshowA ;limit
pop af ;a==0?
jr z,optionMenu ;do not display 0 behind 'None'
ld a,'0'
jr z,__optionMenu ;<-1
jr changedgrowth
-;---
+;--- main menu ---
mainMenu:
cal menupos
dec a ;6th: controls
jp z,changekeys
jp LetsGetThisPartyOn ;otherwise
+
+changenrworms:
+ cal change4spOnly
+ ld a,(hl) ;hl=nrworms
+ inc a
+ cp 5
+ jr nc,mainMenu ;may not be >4
+changednrworms:
+ ld (hl),a
+ jr _dispmenusets ;mainMenu
+
notselect
cp K_EXIT
jp z,ExitNoStats
jr nz,changedcurworm ;save >0
jr mainMenu
-changenrworms:
- cal change4spOnly
- ld a,(hl) ;hl=nrworms
- inc a
- cp 5
- jr nc,mainMenu ;may not be >4
-changednrworms:
- ld (hl),a
- jr _dispmenusets ;mainMenu
changenrwormsInit:
ld a,(Gametype)
cp 3
jr z,changegame
jr dispmenusets ;mainMenu
changedgame:
- and 7 ;mod 8
+ cp 9
+ jr c,changedgameok
+ sub 255-8 ;-1 -> 8
+ jr nc,changedgameok
+ xor a ;9 -> 0
+changedgameok:
ld (Gametype),a
cal getnrlevels
xor a
cal getcustomkey ;right
; jr dispmenusets
-;---display current settings---
+;--- display current settings ---
dispmenusets:
cal clrold
or a ;gamesingle
jr nz,displvlname
ld a,(Level)
- cal cshowA0
+ cal cshowA00
jr lvldisped
displvlname:
cal _vputs
ld (ix+8),0 ;end mark
jp DisplayMenu
-;-----------------------------
-;------- procs-n-stuff -------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _____ _______ _______ _____ ______ _____ _______ _______
+; | | | | |______ | |_____] |_____/ | | | |______
+; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______|
+;_______________________________________________________________________________
ubergetkey:
halt ;woo hoo
add a,a ;nc
add a,e
add a,a ;8->2bytes
- add a,24+1 ;go to datalevels
+ add a,28+1 ;go to datalevels
ld e,a ;=de
sbc hl,de ;datalevels
cal _ldHLind ;ld hl,(hl)
ld (wormbeglives),a
ret
-;-----------------------------
-;-------- start game ---------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _______ _______ ______ _______ ______ _______ _______ _______
+; |______ | |_____| |_____/ | | ____ |_____| | | | |______
+; ______| | | | | \_ | _____ |_____| | | | | | |______
+;_______________________________________________________________________________
LetsGetThisPartyOn:
ld a,$17 ;no exit
ld a,0
gameCar =$-1
rra ;and _datalink
- jp nc,StartLevel ;&&&jr
+ jr nc,_StartLevel
-;--------- link ------------
+;--- link ---
wormVhost = 095
wormVclient = 195
ex de,hl
ld b,168
cal sendstuff
+_StartLevel:
jr StartLevel
sendstuff:
psh de
ld b,168
cal recvstuff
-;-------- load level ---------
+;--- load level ---
StartLevel:
pop hl ;loadgamecar
inc hl
ld l,(hl)
ld h,0
+ ld a,(gameCar)
+ rla
+ ld a,h ;(Left)=256
+ jr nc,setscorelimit
+ ld a,l
+ ld l,h
+setscorelimit:
+ ld (customleft),a
cal _HLTIMES10 ;hl=10*(hl)
ld (scorelimit),hl
or a ;gamesingle
psh af
cal nz,skiplvltitle
- ld de,Left
- ldi
+ ld a,(hl)
+ and 127
+ jr nz,setleft
+customleft =$+1
+ ld a,0
+setleft:
+ ld (Left),a
+ inc a
+ ld (lefttotal),a
+ dec a
+ xor (hl) ;bit (hl),7
+ ld bc,gameCar
+ ld a,(bc)
+ jr z,leftloaded
+ or 128+32
+leftloaded:
+ ld (bc),a
+ inc de
+ inc hl
ld de,Speed
ld a,0
customspeed =$-1
inc a ;ld a,2
ld (flashtime),a
-;-------- draw level ---------
+;--- draw level ---
initlevel:
ld a,(de)
cal drawstuff
-;--------- prepare -----------
+;--- prepare ---
leveldone:
psh hl ; >> levelp new
#endif
ld a,(gameCar)
- and _datafood
- jr z,nofood
- ld ix,worm1
- cal NewPea
+ rla ;bit _bitmultpeas,a
+ cal c,multnewpea ;a=0
+ rla ;bit _bitfood,a
+ cal nc,NewPea
nofood:
ld bc,(worm1+pos)
cal DisplayField
dnz ReadyDelay
cal releasekeys
-;-----------------------------
-;----------- LOOP ------------
-;-----------------------------
+;_______________________________________________________________________________
+; ______ _______ _______ _______ _____ _____ _____
+; | ____ |_____| | | | |______ | | | | | |_____]
+; |_____| | | | | | |______ _____ |_____ |_____| |_____| |
+;_______________________________________________________________________________
GameLoop:
ld bc,(worm1+pos) ;camera worm #1
inc (hl) ;0..nrworms-1
dnz handleworms
-;-----------------------------
-;---------- keys -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _ _ _______ __ __ _______
+; |____/ |______ \_/ |______
+; | \_ |______ | ______|
+;_______________________________________________________________________________
HandleKeys:
ld a,%10111111
jp c,GameLoop
jp Exit ;jr?
-;------- pause menu -------
+;--- pause menu ---
disppausemenu:
ld hl,txtpMenu
cal releasekeys
jp GameLoop
+;_______________________________________________________________________________
+; ______ _______ _______ _______ _____ _ _ _______ ______
+; | ____ |_____| | | | |______ | | \ / |______ |_____/
+; |_____| | | | | | |______ _____ |_____| \/ |______ | \_
+;_______________________________________________________________________________
+
Exit:
cal releasekeys
ld sp,0 ;pop all
dnz finddmwinner
ld (dmwinner),a
-;---display worms---
+;--- display worms ---
ld a,(nrworms)
ld b,a
psh hl
inc hl ;worm+score
cal _ldHLind
- cal showHL
+ cal _D_HL_DECI
+ cal _puts ;showHL
pop hl
ld bc,worm2-worm1
ld hl,highsave+2
cal _puts
ld hl,(highsave)
- cal showHL
+ cal _D_HL_DECI
+ cal _puts ;showHL
hiscorecheckdone:
waitkey:
ld a,'*'
jp _putc ;..then put *
-;-----------------------------
-;----------- worm ------------
-;-----------------------------
+;_______________________________________________________________________________
+; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______
+; | | | | | |_____/ | | | |______ | | | |______ |______
+; |__|__| |_____| | \_ | | | _____ ______| | |_____| | |
+;_______________________________________________________________________________
respawncheck:
cp respawndelay-1
ld l,c
ret
-;-----------------------------
-;------- handle worm ---------
-;-----------------------------
+;_______________________________________________________________________________
+; _ _ _ _____ ______ _______ _______ _____ _ _ _______
+; | | | | | |_____/ | | | |_____| | | \ / |______
+; |__|__| |_____| | \_ | | | _____ | | |_____ __|__ \/ |______
+;_______________________________________________________________________________
HandleWorm:
xor a
pop hl
#endif
-;-------- move worm ----------
+;--- move worm ---
Wormmove:
psh bc ; >> pos
rl d
jp nc,Drawworm
-;--------- worm hit ----------
+;--- worm hit ---
Hitworm:
ld a,(gameCar)
- ld h,a
#ifdef optdie
- and _datadie
- cal z,checkhitotherworm
+; if race - originally
+ ld h,a
+ cal checkhitotherworm
ld a,h
#endif
- and _datamultpeas ;&&bit
+ bit _bitctfpeas,a
jr nz,chkctfpeas
- ld a,h
- and _datafood
- jp z,WormDead ;no food
+ rla ;and _datamultpeas
+ jp c,chkmultpeas
+ rla ;and _datafood
+ jp c,WormDead ;no food
ld hl,0
PeaY =$-2
PeaX =$-1
cal chkpeahit
jp nc,WormDead
+pickpea:
cal DrawPea ;remove pea
+ cal NewPea
+pickpea_:
ld a,(ix+grow)
add a,15
peagrowth =$-1
jr nc,wormset2grow
inc (ix+grow+1)
wormset2grow:
- cal NewPea
ld hl,Left
- dec (hl)
+ dec (hl) ;dec left before display
psh af
ld e,10
cal IncScore
pop af
jp nz,Drawworm ;continue
- ld a,(gameCar)
- and _datafoodl
- jp z,Drawworm
ld a,(Gametype)
or a
jp nz,Exit ;stack restored
pop af ;which flag? (=and %1)
ld hl,drawctfpea1 ;restore #1
jr z,nottheotherflag
- ld hl,drawctfpea2 ;restore #2
+ inc hl ;ld hl,drawctfpea2
+ inc hl ;restore #2
nottheotherflag:
ld (hl),3 ;draw delay 3 turns
ret
-drawctfpea1: .db 0
-drawctfpea2: .db 0
-
hitflag: ;correct pea hit
ld a,e ;pop a
xor %11 ;invert flag taken + ownflag
ld (drawctfpea2),a ;..both flags
jr Drawworm
-;-----------------------------
+chkmultpeas:
+ ld de,peaspos-1
+ ld hl,lefttotalb
+lefttotal =$+1
+ ld (hl),0
+chkmultpealoop:
+ ex de,hl
+ inc hl
+ ld e,(hl)
+ inc hl
+ ld d,(hl)
+ ex de,hl
+ psh de
+ cal chkpeahit
+ pop de
+ jr c,pickmultpea
+ ld hl,lefttotalb
+ dec (hl)
+ jr nz,chkmultpealoop
+ jp WormDead
+pickmultpea:
+ ld a,247
+ ld (de),a
+ dec de
+ ld (de),a
+ cal DrawPea
+ jp pickpea_
+
+;--- misc ---
+#ifdef optdie
nextotherwormbit:
ld a,c
sub (hl)
cal _cphlde
jr nz,nextotherwormbit
ret ;z
+#endif
checkhitlapline:
ld a,(peaspos) ;63
pop bc
ret
-;-------- draw worm ----------
+;--- draw worm ---
Drawworm:
ld c,(ix+pos)
ld (hl),a
ret
-;-----------------------------
-;---------- ball -------------
-;-----------------------------
+;_______________________________________________________________________________
+; ______ _____ _ _ __ _ _______ __ __ ______ _______
+; |_____] | | | | | \ | | \_/ |_____] |_____| | |
+; |_____] |_____| |_____| | \_| |_____ | |_____] | | |_____ |_____
+;_______________________________________________________________________________
handlethoseneatlittleballs:
ld hl,balls
pop de
ret
-;-----------------------------
-;----------- procs -----------
-;-----------------------------
+;_______________________________________________________________________________
+; _____ ______ _____ _______ _______
+; |_____] |_____/ | | | |______
+; | | \_ |_____| |_____ ______|
+;_______________________________________________________________________________
releasekeys:
halt
inc (ix+died)
dec (ix+lives)
psh af
- ld de,10
ld a,(Gametype)
cp gamectf ;ctf no death penalty
- cal nz,DecScore
+ cal nz,DecScore10
pop af
ret nz ;HandleWorm done
ld a,(wormbeglives)
checkhitotherworm:
.db $dd,$7d ;ld a,lx
cp worm2&255
- psh ix
- jr nz,chkworm2 ; ret nz
+ psh ix
+ jr nz,chkworm2 ;ret nz
ld ix,worm1
- jr chkworm
+ jr chkworm
chkworm2:
- ld ix,worm2
-
+ ld ix,worm2
chkworm:
- ld h,(ix+tail+1)
- ld l,(ix+tail)
- ld e,(ix+head)
- ld d,(ix+head+1)
+ ld h,(ix+tail+1)
+ ld l,(ix+tail)
+ ld e,(ix+head)
+ ld d,(ix+head+1)
cal ChkWorm
- pop ix
+ pop ix
ret z ;not hit
pop bc ;call
-
stopworm:
ld bc,0
previouspos =$-2
jr z,DrawPea
ret
+multnewpea:
+ ld de,peaspos
+ ld a,(Left)
+ ld b,a
+multpealoop:
+ psh bc
+ psh de
+ cal NewPea
+ pop de
+ ld hl,PeaY
+ ldi
+ ldi
+ pop bc
+ dnz multpealoop
+ ld a,-1
+ ret
+
NewPea:
ld a,(FieldWidth)
add a,127-4
dnz sprloopy
ret
-;----------- score -----------
+;_______________________________________________________________________________
+; _______ _______ _____ ______ _______
+; |______ | | | |_____/ |______
+; ______| |_____ |_____| | \_ |______
+;_______________________________________________________________________________
timematchscore:
;piece of crap checking whether you've already won in timematch
inc (ix+lives)
jr scorecommon
-DecScore: ;&&&
- ld h,(ix+score+1)
- ld l,(ix+score)
- or a
- sbc hl,de
- jr c,showstats ;<0=0
+DecScore10:
+ cal ldscoreinhl
+ ld de,-10
+ add hl,de
+ jr nc,showstats ;<0=0
jr scorecommon
IncScore: ;inc score by e
ld d,0
_IncScore ; inc by de
- ld h,(ix+score+1)
- ld l,(ix+score)
+ cal ldscoreinhl
ld a,(Gametype)
or a ;if singleplayer...
jr z,extralives
ld hl,$FC00 ;&&&only necessary in deathmatch
ld b,6*16-1
clearstats:
- ld (hl),a ;=0
+ ; ld (hl),a ;=0
+ ;&&&&&&
inc hl
dnz clearstats
forceshowstats:
cp gamedeathm
jr z,showlives
showscore:
- ld h,(ix+score+1)
- ld l,(ix+score)
+ cal ldscoreinhl
cal _D_HL_DECI
jr __vputs
showlives:
ld a,(ix+lives)
-showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
- cp 10
- jr c,showleastsign
+ jr cshowA00
+
+cshowA: ;small w/ leading 0
+ or a
+ jr nz,cshowA00
+ ld hl,txtNone
+ jp _vputs
+cshowA00:
ld l,a
ld h,0
cal _divHLby10
add a,'0'
cal __vputmap
pop af
-showleastsign:
+cshowA0:
add a,'0'
__vputmap:
psh ix
cal __vputs
ld a,0
Level =$-1
- cal showA
+ cp 10
+ psh af
+ cal c,cshowA0
+ pop af
+ cal nc,cshowA00
- ld a,98
+ ld a,97
ld (_penCol),a
cal showscore
ld a,123
ld (_penCol),a
- cal showlives
+ ld a,(ix+lives)
+ cal cshowA0 ;showlives
ld a,(gameCar)
and _datafoodl
pop ix
ret z
showleft:
- ld a,31
+ ld a,33
ld (_penCol),a
ld a,0
Left =$-1
- cal cshowA0
+ cal cshowA
ld hl,txtLeft
__vputs:
add a,'0'
jp _putc
-cshowA0: ;small w/ leading 0
- or a
- jr nz,cshowavalue
- ld hl,txtNone
- jp _vputs
-cshowavalue:
- ld l,a
- ld h,0
- cal _divHLby10
- psh af
- ld a,l
- add a,'0'
- cal __vputmap
- pop af
- add a,'0'
- jp __vputmap
-
-showHL:
- cal _D_HL_DECI
- jp _puts
-
_D_HL_DECI:
ld de,savestr+4
ld b,5
savestr:
.db "00000",0
-;-----------------------------
+ldscoreinhl:
+ ld h,(ix+score+1)
+ ld l,(ix+score)
+ ret
-DisplayField:
- ld a,c
- sub 29
+;_______________________________________________________________________________
+; ______ _____ _______ _____ _______ __ __
+; | \ | |______ |_____] | |_____| \_/
+; |_____/ __|__ ______| | |_____ | | |
+;_______________________________________________________________________________
+
+DisplayField: ;all done by Jonah Cohen iirc. (-scrolling is scary-)
+ ld a,c ;not the fastest routine outthere, but it does get the job done.
+ sub 29 ;if something doesn't work, I probably _did_ alter it ;)
jr nc,NotMinYScroll
xor a
NotMinYScroll:
ld c,$37 ;scf
ret
-;----------- draw ------------
+;_______________________________________________________________________________
+; ______ ______ _______ _ _ _
+; | \ |_____/ |_____| | | |
+; |_____/ | \_ | | |__|__|
+;_______________________________________________________________________________
;--- pixel ---
FP_Bit =$+1
set 0,a
- psh de ;&&&
+ psh de ;&&& C`MON! THIS IS UGLY! *hit myself*
ld de,ScrBuffer
add hl,de
pop de
; dec a ;4 = circle
; jp z,drawcircle
+;--- circle ---
+
+;IMHO, one weery nice routine. Oh lemme be proud just *once*.
+;Not perfect since it uses a screwy lineroutine to draw stuff
+;but, just _look_ at it. Ain't it grand? Z80 at its best.
+;Nice comments, also. So here we go: Shiar's Circle Routine:
+;(using the Bresenham method)
+
drawcircle: ;(d,e),h ;de=x,y; h=z
ld c,h ;c=yy=z
ld a,h
ld b,c
ld c,a ;ex b,c
pop hl
- ret
+ ret ;thats it
+
+;--- box ---
drawbox: ;(d,e)-(h,l)
ld b,l ;Delta-y
dnz boxloop
ret
+;--- fatline ---
+
drawfatline:
cal drawline
inc d
dec h
; jp drawline
-;LINE (d,e)-(h,l)
-;destroyes a
+;--- line ---
+
+;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it
+;himself tho.) I did make a few optimizations and commented the thing.
+;A nice routine (also Bresenham), but for Wormy not perfect since really
+;large lines (>128 pixels in length or something) won't be flawless.
drawline: ;(d,e)-(h,l)
psh bc ;destr: a
; jr Qsend ;that's why it's here
;..and last but not least..:
-;-----------------------------
-;----------- link ------------
-;-----------------------------
+;_______________________________________________________________________________
+; _____ __ _ _ _ /
+; | | | \ | |____/ /
+; |_____ __|__ | \_| | \_ .
+;_______________________________________________________________________________
timeout = $8000
lossout = 20
-;---- SEND ----
+;--- send ---
Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
nop \ nop
ld (linklosses),a ;reset number of losses
ret ;=ok
-;---- RECV ----
+;--- recv ---
Crecv: ;--- receive 8 bits into A/C --- destr:abCde ---
cal Qrecv
ld (linklosses),a ;reset number of losses
ret
-;---- COMMON ----
+;--- common ---
linkok:
ld a,D0HD1H
jp Exit
#ifdef intlevels
-
-;-----------------------------
-;---------- levels -----------
-;-----------------------------
+;_______________________________________________________________________________
+; _____ __ _ _______ _______ _ _ _______ _______
+; | | \ | | | |______ \ / |______ | |______
+; __|__ | \_| | _____ |_____ |______ \/ |______ |_____ ______|
+;_______________________________________________________________________________
LevelDef:
.db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
LevelDefM:
.db "Empty Arena",0
- .db 8,4,15,15,0,0
+ .db 5,4,15,15,0,0
.db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
.db 128,57
.db 0
.db "Fast Fun :))",0
- .db 8,0,18,12,5
+ .db 8+128,0,18,12,5
.db %1110000,%10001000,%10001000,%10001000,%1110000,0
.db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
.db 128,57
#endif
-;-----------------------------
-;---------- data -------------
-;-----------------------------
+;_______________________________________________________________________________
+; ______ _______ _______ _______
+; | \ |_____| | |_____|
+; |_____/ | | | | |
+;_______________________________________________________________________________
wtPicture: ;title
.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
txtGame2: .db "Tron",0
txtGame3: .db "Deathmatch",0
txtGame4: .db "Foodmatch",0
-txtGame5: .db "Timematch",0
-txtGame6: .db "Race",0
-txtGame7: .db "CTF" ;,0
+txtGame5: .db "Multifoodmatch",0
+txtGame6: .db "Timematch",0
+txtGame7: .db "Race",0
+txtGame8: .db "CTF" ;,0
posGame: .db 0
.db txtGame1-txtGame
.db txtGame5-txtGame
.db txtGame6-txtGame
.db txtGame7-txtGame
+ .db txtGame8-txtGame
txtNone: .db "None",0
txtDef: .db "Default",0
#ifdef intlevels
datalevels: .dw LevelDef, LevelDefM
.dw LevelDefT,LevelDefM
- .dw LevelDefM,LevelDefM
+ .dw LevelDefM,LevelDefM,LevelDefM
.dw LevelDefR,LevelDefC
-nrlevels: .db 0,3,1,3,3,3,3,1 ;=defaults
+nrlevels: .db 2,3,1,3,3,3,3,3,1,0 ;=defaults
#else
-datalevels: .dw 0,0,0,0,0,0,0,0
-nrlevels: .dw 0,0,0,0
+datalevels: .dw 0,0,0,0,0,0,0,0,0
+nrlevels: .dw 0,0,0,0,0
#endif
-_datalink = %0000001 ;linkplay
-_datafoodl = %0000010 ;left=0 limit
-_datasingl = %0000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
-_datamultpeas = %0001000 ;multiple peas=1
-_datatime = %0010000 ;time incs score (timematch)
-_datafood = %0100000 ;food present
-_datadie = %1000000 ;worm dies on impact
-;reserved %10000000 ;for future use
-
-savestart: ; �game info (see above)
- ; | �lives (0=unlimited)
- ; | | �nrworms (can be altered by user)
- ; | | | �level (reset to 1 at startup)
- ; | | | | �speed/delay (-1=def)
- ; | | | | | �grow speed (-1=none; 0=continuous)
- ; | | | | | | �turn speed (8=def)
- ; | | | | | | | �score limit (0=none)
-gamesingle = 0 ;used | | | | | | | |
-datasingle: .db %1100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
+_datalink = %00000001 ;linkplay
+_datafoodl = %00000010 ;left=0 limit
+_datasingl = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
+_datactfpeas = %00001000 ;ctf peas=1
+_bitctfpeas = 3
+_datatime = %00010000 ;time incs score (timematch)
+_datafood = %01000000 ;food present=0
+_bitfood = 6
+_datamultpeas = %10000000 ;multiple peas=1 (no _datafood)
+_bitmultpeas = 7
+;reserved %00100000 ;for future use
+
+savestart: ; �game info (see above)
+ ; | �lives (0=unlimited)
+ ; | | �nrworms (can be altered by user)
+ ; | | | �level (reset to 1 at startup)
+ ; | | | | �speed/delay (-1=def)
+ ; | | | | | �grow speed (-1=none; 0=continuous)
+ ; | | | | | | �turn speed (8=def)
+ ; | | | | | | | �score limit (0=none)
+gamesingle = 0 ; | | | | | | | |
+datasingle: .db %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
gamepeas = 1
-datapeas: .db %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
+datapeas: .db %00000100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
gametron = 2
-datatron: .db %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
-gamedeathm = 3 ;used
-datadeathm: .db %1000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
+datatron: .db %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
+gamedeathm = 3
+datadeathm: .db %01000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
gamefoodm = 4
-datafoodm: .db %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
-gametimem = 5
-datatimem: .db %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
-gamerace = 6 ;used
-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,10 ;CTF (100 score)
+datafoodm: .db %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
+gamemfoodm = 5
+datamfoodm: .db %11000010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas))
+gametimem = 6
+datatimem: .db %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
+gamerace = 7
+datarace: .db %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score)
+gamectf = 8
+datactf: .db %01001000,0,4,1,-1,-1, 8,10 ;CTF (100 score)
worm1set: .dw worm1p,worm1p
.db %11110111,1,-01,K_RIGHT,K_LEFT
#endif
templevels:
-;-----------------------------
-;----------- end -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _ _ _______ _______ . _______ _______
+; | |_____| |_____| | ' |______ |_____| | |
+; | | | | | | ______| _____ | | |_____ |_____
+;_______________________________________________________________________________
.end