-;___����________________________________________________________����____________
-; ���� �����
-; ��� ���� ����
-;��� ����� �������� ����� ���� ���� ��� �����
-;��� ������� ����������� ������� ������������� �� ��� ���
-;�� ��� ��� ����� ���� ���� ��� ��� ���� ��� ��� ���� ���
-;�� �� �� �� � ��� ���� ��� ������ ��� ��� ��� ��
-;�� �� �� �� �� ��� ��� ��� ���� ��� ��� ��� ���� ��
-;�� ��� ��� �� �� �� ��� ������� ��� �� ������� ��
-;�� ��� ��� ��� �� �� �� �� ��� ��� ��� ����� ���
-;��� ��� ��� ��� �� �� ��� �� ���� ���� ��� ���
-;��� ����� ��� ��� ��� ��� �� �������� ��� ���
-; ��� ��� ��� ��� ��� ��� ��� ������ ��� ���
-; ���� ������� ���� ��� ��� ���� ��� ����� ����
-; �������� �������� ��������� ��� ��� ���������������
-; ����� ����� ������� �� ��� �����������
+;___▄███________________________________________________________▄▄▄▄____________
+; ███▀ ████▌
+; ███ ▀███ ▐██▄
+;▐██ ▄███▄ ▄▄████▄▄ ▄████ ▄██▄ ▄██▄ ▐██ █████
+;██▌ ███████ ▄██████████ ███████ ████████████▄ ██ ███ ███
+;██ ██▀ ▀██ ▐██▀▀ ▀███ ███▀ ██▌ ██▀ ████ ▀██ ██▌ ▐██▌ ▐██
+;██ ██ ██ ██ ▄ ██▌ ▐██▌ ▐██ ██████ ██▌ ███ ███ ██
+;██ ██ ██ ██ ██ ▐██ ███ ██▌ ███▀ ▐██ ▀██ ███ ▐███ ██
+;██ ██▌ ▐██ ██ ██ ██ ██▌ ██▌▐██▌ ██▌ ██ ██████▀ ██
+;██ ▐██ ██▌ ▐██ ██ ██ ██ ██ ▐██ ██▌ ██▌ ▀███▀ ▐██
+;██▌ ██▄ ▄██ ██▌ ██ ██ ██▌ ██ ▐██▌ ▐██▌ ██▌ ██▌
+;▐██ █████ ▐██ ██▌ ▐██ ██▌ ██ ▀██▄▄██▀ ███ ▐██
+; ███ ███ ██▌ ▐██ ██▌ ███ ██▌ ▀████▀ ▐██ ███
+; ███▄ ▄█████▄ ▄███ ██▌ ███ ▐██▌ ██▌ ███▄▄ ▄███
+; ███████▀ ▀███████ ▐██▄▄███▌ ███ ▐██ ██████████████▌
+; ▀███▀ ▀██▀▀ ▀█████▀ ██ ██▌ ▀█████████▀
;_______________________________________________________________________________
;
-; Version : 97% (0.97.116)
-; Release Date : 2002 January 16
+; Version : 100% (1.00.36)
+; Release Date : 2002 March 6
; Author(s) : Shiar
; Email Address : wormy@shiar.org
-; Web Page : www.shiar.org
-; Description : perfect Nibbles game with free movement, nine
-; game modes, for 1-4 players
-; Where to get this game : www.shiar.org
+; Web Page : http://shiar.nl
+; License: : GNU General Public License version 3
+; Description : perfect Nibbles game with free movement, nine game
+; modes, for 1-4 players, many levels and editor
; 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 (6512) : efef32a8c541b4585087f55deb31f51d
;_______________________________________________________________________________
-;--- notes ---
-
-; * Use for LEARNING practises ONLY!
-; Don't _ever_ release altered code w/o permission!
-; Please notify me of using code, and give me credits!
-; * 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).
-; * Also read wormy.txt please, thank you
-; * Don't scroll down if you get scared easily.
+;--- notes ---------------------------------------------------------------------
+
+; * Game README is wormy.txt
+; * All code under the GPL version 3
+; * You may alter and redistribute (parts of) this code
+; but only under the same license; credits would be appreciated
+; * I'm not responsible for any damage this might cause, yada yada...
+; * Although I've commented & labeled quite some stuff, due to
+; crazy optimizations and weird coding, it may be harder to
+; understand than the average blob of code. This is probably _not_
+; the best source to learn z80 from. w00t the Shyer Way (tm).
+; * Email me. If you've got suggestions|patches|questions: tell me.
+; * Don't scroll down if you get scared easily.
+
+;--- index ---------------------------------------------------------------------
+
+; * TO_DO : future features
+; * #INCLUDE
+; * STORAGE : permanent; temporary; layout
+; * PROG_START : search levels
+; * LEV_SELECT
+; * MORE_INIT : trig tables
+; * MAIN_MENU : draw menu; options menu; main menu; display
+; current settings; handle menukeys; change name
+; * MISC_PROCS
+; * START_GAME : link; client; set/send worms; host; load game;
+; draw level; prepare
+; * GAME_LOOP
+; * KEYS : pause menu
+; * GAME_OVER : who won?; display worms; quit
+; * WORM_STUFF
+; * WORM_ALIVE : move worm; draw worm
+; * BOUNCYBALL
+; * WORMY_HIT : multifood; ctf; main; foodmatch|SP; take pea;
+; misc
+; * PROCS
+; * SCORE
+; * DISPLAY
+; * DRAW : pixel; findpixel; objects; circle; box;
+; fatline; line
+; * LINK! : multiple bytes; foo; send; recv; common
+; * INT_LEVELS
+; * DATA : graphics; menus; text; foo; game settings
+; * THAT'S_ALL
;_______________________________________________________________________________
; _______ _____ ______ _____
; | |_____| ____ |_____/ |_____|
;_______________________________________________________________________________
-; 97% = DONE
-; X [15] lives >9 dispay
-; X [15] sp modes not configurable
-; X [16] LVL: episode #2: 10 sp levels
-; X [17] lives stats for every liveslimited game (also !dm)
-; X [18] LINK: fix transmit game/level data
-; X [19] datalevels+nrlevels not in program if !intlevels
-; X [19] mem at worm #4 (still 12 bytes or so.. or more? or less?)
-; X [19] alter level editor to use new address and set level id #97
-; X [19A] team score!
-; X [19A] autogrowth doesn't always work -> init (turn)
-; X [111] ED: disabled objects counted causing CRASH when writing hiscore!
-; X [111] LINK: init+multiple pea transmit seems to work..
-; X [111] LINK: host/client swapped (host now sends level config)
-; X [111] LINK: optimize transmit (most initcode same for client+host)
-; X [113] menu limit in multifm not x10
-; X [113] wormhit procedure seperate (called now)
-; X [114] LINK: peas sent again :P
-; X [114] internal level check and sprite storage removed
-; X [115] layout data stuff at bottom
-; X [115] ED: init place bar fixed
-; X [115] ED: keys also usable together with mouse
-; X [115] ED: improved version handling
-; X [115] LINK: receive message not needed anymore afaik
-; X [115A] $D8 used for spacing at g/o screen. i rule B)
-; X [115A] exit at g/o goes back to menu
-; X [115A] more in menu lets you reselect the levelfile
-; X [115A] LINK: fixed waiting mode (minor display problem)
-; X [116] incs at skiplevels effectively replaced by add (-4 bytes)
-; X [116] another 2 bytes shaved off
-; X [116] LINK: received gamemode now displayed correctly at g/o
-; X [116] gamecar right after gametype saves about 20 bytes
-; X [116] LINK: minimize sent data
-; X [116] remove +input in worm storage
-; X [116] head position init uses same data as tail (-4 bytes)
-; * word-value display storage in chartable hole??
-; 1% * misc (bugs, &&&, pollish, &&, &)
-; * look at init-z in line routine again
-; * rare pea|wall overwrite <- apply stopworm fix?
-; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh*
-; * LVL: episode #3: at least 5 lvls for each mp mode
-; * LVL: episode #4: 10 sp levels, including multipeas
-; 1% * LVL: episode #5: ...
-; * LVL: Wormage
-; * LVL: Free Bird
-; * LVL: Jonah?
+; 99% = PREVIOUS
+; X [34] freeze when no space left to place pea (break after 10k tries)
+; X [34] wow another bit of code 'reniced' (easter egg or something :)
+; X [34] two more jp to jr
+; X [34] highly improved randomizer (values >127 were rare)
+; X [36] replace 'left' at the change-control prompt
+; X [36] ED: fixed immediate exit at level preview when using enter key
+; X [36] bouncies drawn after placing peas (causing overwrites)
+; X [36] FIX: skip string length bytes when running from yas
+; X [36] ED: pointer to ending message realigned
+; X [36] LVL: end messages fixed in affected episodes
+;100% = CURRENT
+; * scorebar last digit (at 128-3) not displayed by _vputs :(
+; * save last played level (in levelfile prolly)
+; * automatically start players in multiplayer games after certain time
+; * muliplayer bonuses/powerups (shrink, lives, stun, inverse, etc.)
+; * levels with random pixels appearing during game
+; * no borders (move players from one side to another)
+; * hiding levels crashes?? (ishell 2.01 rom 1.6)
+; * use selected player on main menu as first player in singleplayer games
+
+
+;--- future features -----------------------------------------------------------
+
+;just a maybe-list; NO guarantees!
;
-;100% = bugs fixed + levels done
-; * correct team winners
-; * arrow to offscreen peas
-;110% * sound
-; * startpos
-;120% * coop (DON'T COUNT ON IT)
-; * pause in linkplay
+; * correct team winners
+; * level compression
+; * ubersized bouncies (sprites)
+; * arrow to offscreen peas
+; * w00t AI
+; * sound
+; * startpos
+; * pause in linkplay
+; * coop (DON'T COUNT ON IT)
;_______________________________________________________________________________
; _/_/_____ __ _ _______ _ _ ______ _______
_MOV5B = $4297 ;5x ld (de),(hl)
_mov9b = $4283 ;9x ld (de),(hl)
_ldHLind = $4010 ;ld hl,(hl)
-_swapt_ = $45F3 ;ex_ahl_bde
+_swapt_ = $45F3 ;ex ahl,bde (doesn't work?)
_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
+_INC_PTR_AHL = $4637 ;inc ahl
+_AHL_PLUS_2_PG3 = $4C3F ;add ahl,2
_SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl
_LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
_SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
_jforce = $409C ;TI-OS stack restored
_EXLP = $4493 ;swap (hl),(de) b times
_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl
+_OP1TOOP6 = $4263
- #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 id2 ;yas2 level identifier - this'll add (65) bytes
+ #define buffer ;use display buffer, otherwise write directly to screen (11)
+ #define readymask ;"greys" out the field before starting a level (20)
+;#define readytext ;-displays "prepare" before level starts (42)
+ #define coolzgfx ;nice graphics for game over screen (98)
#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
+ ;-to become invincible, define the magic word :D
+
+levelhead = 'w'
+levelhead2 = 97 ;wormy levels header = "0"
;_______________________________________________________________________________
; _______ _______ _____ ______ _______ ______ _______
; ______| | |_____| | \_ | | |_____| |______
;_______________________________________________________________________________
-;--- permanent ---
+;--- permanent -----------------------------------------------------------------
ScrBuffer = $8420 ;-A3FF (20*FF=1FE0)
worm4p = $A400 ;-A5FF (200) %101001O0
worm4 = $AD5B ;-AD78 (1E)
balls = $AD79 ;-AE00 (<=3x2D) (bb<=45)
turn10 = $AE01 ;-AE01 (1) (counter)
-peaspos = $AE02 ;-AF05 (4-260) (peas)
+peaspos = $AE02 ;-AF05 (4-104) (peas)
;free = $AF06 ;-AFFF (F9)
worm1p = $B000 ;-B7FF (800) %1011O000
worm3p = $B800 ;-BBFF (400) %10111O00
; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED <
; | SCREEN 2* 13 PRGM 4LV | ;after looking at this
-;--- temporary ---
+;--- temporary -----------------------------------------------------------------
namelength = $BC00 ;(1) @menu
datalink = $BC00 ;(8) @init
drawctfpea1 = peaspos+4
drawctfpea2 = peaspos+6
-;--- layout ---
+;--- layout --------------------------------------------------------------------
-;(wormN) set:
+;(wormN) offs: set:
heading = 0 ;level*
pos = 2 ;level*
pos2 = 4 ;level
grow = 6 ;level
died = 8 ;game:
score = 9
-delay = 11
+wdelay = 11
lives = 12
head = 13
- ; �15B (wormNset)
-tail = 15 ; |also@next level
-storepos = 17 ; |
-reserv = 18 ; |loop (race:lap|ctf:pea)
-left = 19 ; |
-right = 20 ; |
-name = 21 ; |_
+ ; ┌15B (wormNset)
+tail = 15 ; │also@next level
+storepos = 17 ; │
+reserv = 18 ; │loop (race:lap|ctf:pea)
+wleft = 19 ; │
+wright = 20 ; │
+name = 21 ; │_
wormsize = 30 ;^mark^
start: ;turn back NOW!
nop ;and so it begins...
- jp Start
+ jp codestart
+#ifndef id2
ld bc,$5242
rst 10h
.dw WormIcon
+#else
+ ld (bc),a
+ nop
+ ld d,h
+ rst 10h
+ .dw WormIcon
+ .dw WormData
+#endif
ld d,a
ld c,a
ld d,d
.db %1010010
jr nz,$+47
dec l
- .db " 97% .116",0
+ .db " v1.00.36",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
-
-levelhead = 'w'
-levelhead2 = 97 ;wormy levels header = "97"
+ .db 8,2 ;Rkaydees' icon:
+ .db %00000000,%00111100 ; XX
+ .db %00000000,%01010010 ; XXX
+ .db %00000000,%01100001 ; XX
+ .db %01100011,%10011001 ; XX
+ .db %10010100,%01101001 ; XX
+ .db %10011001,%00011001 ; XX
+ .db %01000010,%11000001 ; X XX
+ .db %00111100,%00111110 ; XXXX
+#ifdef id2
+WormData:
+ .db 1
+ .dw wormlevel
+wormlevel:
+ .db 4 ;priority
+ .db 12 ;string
+ .db "wor" ;description
+ .dw yasexec ;execution routine
+ .dw yascomment-yasdetect
+ .dw yasdetect-$-1 ;detection routine
+ .dw yasicon-yascomment
+ .dw yascomment-$-1 ;comment routine
+ .dw yasdataend-yasicon
+ .dw yasicon-$-1 ;icon routine
+yasexec:
+ rst 10h
+ ex de,hl
+ ld a,b
+ cal _AHL_PLUS_2_PG3 ;skip past length bytes
+ cal skiptitle ;title (plus size+header <- all non-0)
+; cal skiptitle ;description
+ jp leveldataAHL-3
+yasdetect:
+ cal _AHL_PLUS_2_PG3 ;skip past length bytes
+ cal _Get_Word_ahl
+ ld hl,levelhead+(levelhead2*256)
+ cal _cphlde
+ ret z
+ scf
+ ret
+yascomment:
+ inc hl
+ inc hl ;skip header
+ ret
+yasicon:
+ ld hl,$F400+levelicon-yasicon
+ ld bc,6+(256*1)
+ or a
+ ret
+levelicon:
+ .db %00011100 ;..XXX... ...XXX..
+ .db %00011110 ;.X...X.. ...XXXX.
+ .db %00000011 ;.X..X... ......XX
+ .db %10000001 ;X..X..XX X......X
+ .db %01011011 ;X..X..XX .X.XX.XX
+ .db %01101110 ;X...XXX. .XX.XXX.
+yasdataend:
+#endif
int_handler:
ex af,af'
jp $0039
int_end:
-Start:
- ld (SpSave),sp
+;--- search levels -------------------------------------------------------------
+
+codestart:
cal _runindicoff
cal _flushallmenus
- im 1
- ld a,$D4
- ld h,a
- ld l,0 ;ld hl,$D400
- ld d,a
- ld e,1 ;ld de,$D401
- ld b,e
- ld c,l ;ld bc,$0100
- dec a ;ld a,$D3
- ld (hl),a
- ldir
- ld hl,int_handler
- ld d,a
- ld e,a ;ld de,$D3D3
- ld bc,int_end-int_handler
- ldir
- inc a ;ld a,$D4
- ld i,a
- im 2 ;...it *does* work ;)
-
-restart:
cal _RAM_PAGE_7
ld hl,$BFFF ;VAT start
ld ix,templevels
cp e
jr nz,_searchnext ;not worm
ld a,levelhead2
- cp d
+ cp d ;=0
jr nz,_searchnext
- inc ix ;save level's ahl
- ld a,h
- ld (ix),a
- inc ix
- ld a,l
- ld (ix),a
- inc ix
+ ld (ix+1),h ;save level's ahl
+ ld (ix+2),l
+ ld de,3 ;&&&d=0
+ add ix,de
_searchnext:
cal _RAM_PAGE_7
jr searchnext
cal menuinvloop
ld hl,$FC00+$380 ;(*,56)
cal hr
- ld hl,$0601 ;x=1
+ ld hl,$0C01 ;x=1
ld (_penCol),hl
dispnextlevel:
ld de,3
- add ix,de
+ add ix,de ;goto next
ld a,(ix)
- ld b,a
+ ld h,(ix+1)
+ ld l,(ix+2)
+ cal _load_ram_ahl ;hl=ahl
+ cal _vputs
+ ld hl,availevels
+ inc (hl)
+ ld a,(ix+3) ;next
inc a ;cp 255
jr z,__levselect
-displevel:
ld hl,_penCol
ld (hl),$01 ;x=1
inc hl
ld (hl),a ;y+6
cp 49 ;bottom of screen
jr nc,_levselect
- ld hl,availevels
- inc (hl)
- ld a,b ;(ix+0)
- ld h,(ix+1)
- ld l,(ix+2) ;ahl=(ix)
- cal _load_ram_ahl ;hl=ahl
- cal _vputs
jr dispnextlevel
loadlevel1:
cp d ;de>$FFFF (offscreen)
jr nz,levdescclearloop
cal _vputs
- jr levselectmenu+1
+ jr levselectmenuloop+1
__levselect:
#ifdef intlevels
ld ix,templevels-6 ;reset 2 1st page
_levselect:
ld b,-2 ;level selected
jr levselect
-levselectmenu:
+levselectmenuloop:
psh hl
psh bc
cal ubergetkey
sub K_EXIT-K_RIGHT
jp z,ExitNoStats
inc a ;cp K_SECOND
- jr nz,levselectmenu
+ jr nz,levselectmenuloop
; jr z,loadlevel
loadlevel:
jr z,levelloaded
#endif
cal skiptitle ;skip description
-
+leveldataAHL:
cal _Get_Word_ahl
ld (leveldataSize),de
levelloaded:
cal _RAM_PAGE_1
+;_______________________________________________________________________________
+; _______ _____ ______ _______ _____ __ _ _____ _______
+; | | | | | |_____/ |______ | | \ | | |
+; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ |
+;_______________________________________________________________________________
+
+; cal _runindicoff ;this is after level selection (run from yas1 or restart)
+; cal _flushallmenus ;so this stuff should already be done earlier or by yas
+ ld (SpSave),sp
+
+ im 1
+ ld a,$D4
+ ld h,a
+ ld l,0 ;ld hl,$D400
+ ld d,a
+ ld e,1 ;ld de,$D401
+ ld b,e
+ ld c,l ;ld bc,$0100
+ dec a ;ld a,$D3
+ ld (hl),a
+ ldir
+ ld hl,int_handler
+ ld d,a
+ ld e,a ;ld de,$D3D3
+ ld bc,int_end-int_handler
+ ldir
+ inc a ;ld a,$D4
+ ld i,a
+ im 2 ;...it *does* work ;)
+
res 2,(iy+13) ;appAutoScroll
ld a,r
ld (Seed),a
add hl,de ;next
dnz setdeflevels
-;_______________________________________________________________________________
-; _______ _____ ______ _______ _____ __ _ _____ _______
-; | | | | | |_____/ |______ | | \ | | |
-; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ |
-;_______________________________________________________________________________
-
-;--- trig tables ---
+;--- trig tables ---------------------------------------------------------------
ld hl,trigtable ;I believe this
ld de,SinCosTable ;is one of the few
; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____|
;_______________________________________________________________________________
-;---draw menu---
+;--- draw menu -----------------------------------------------------------------
DisplayMenu:
cal linkok
cal _clrWindow
ld de,$FC40 ;(0,4)
ld hl,wtPicture
- ld bc,16*16
+ ld a,3
+optimize__w00t: ;may look like crap, but actually saves 3 bytes!
+ ldi
+ ld bc,6
+ ex de,hl
+ add hl,bc
+ ex de,hl ;add de,6
+ ld c,16-7 ;=bc
+ ldir
+ dec a
+ jr nz,optimize__w00t
+ ld c,13*16 ;=bc
ldir
ld hl,$FC00+$010 ;(*,01)
cal hr
ld de,$FD80 ;begin pos
xor a
clroldmenuloop:
+ ld c,4
ld (de),a
inc de
- ld (de),a
- inc de
- ld (de),a
- inc de
- ld (de),a
- inc de
+ dec c
+ jr nz,clroldmenuloop+2
dnz clroldmenuloop
ld b,(ix)
dnz hrloop
ret
-;--- options menu ---
+;--- options menu --------------------------------------------------------------
dispoptionmenu:
ld hl,txtoMenu
#ifdef spprotect
ld a,(gamecar)
and _datasingl
- jp nz,LetsGetThisPartyOn
+ jp nz,LetsGetThisPartyOn ;SP -> start game
#endif
cal clrold
jr nz,optionMenu
seloright:
- dec a
+ dec a ;Lives
jr z,changelives
- dec a
+ dec a ;Limit
jr z,changelimit
- dec a
+ dec a ;Speed
jr z,changespeed
- dec a
+ dec a ;Rotation
jr z,changeturn
- dec a
+ dec a ;Growth
jr z,changegrowth
-
+ ;Back
seloleft:
ld a,b
- dec a
+ dec a ;Lives
jr z,bchangelives
- dec a
+ dec a ;Limit
jr z,bchangelimit
- dec a
+ dec a ;Speed
jr z,bchangespeed
- dec a
+ dec a ;Rotation
jr z,bchangeturn
- dec a
+ dec a ;Growth
jr z,bchangegrowth
-_optionMenu:
+_optionMenu: ;Back
jr optionMenu
changelives:
jr z,__optionMenu ;<-1
jr changedgrowth
-;--- main menu ---
+;--- main menu -----------------------------------------------------------------
mainMenu:
cal menupos
cp K_EXIT
jp z,ExitNoStats
cp K_MORE
- jp z,restart
+ jp z,codestart
psh af
cal menupos
cal loadgamecar
jr nz,mainMenu
selright:
- or a
+ or a ;Mode
jr z,changegame
- dec a
+ dec a ;Level
jr z,changelevel
- dec a
+ dec a ;Link
jr z,changelink
- dec a
+ dec a ;Worms
jr z,changenrworms
-; dec a
+; dec a ;worm#
; jr z,changecurworm
changecurworm:
selleft:
ld a,b
- or a
+ or a ;Mode
jr z,bchangegame
- dec a
+ dec a ;Level
jr z,bchangelevel
- dec a
+ dec a ;Link
jr z,bchangelink
- dec a
+ dec a ;Worms
jr z,bchangenrworms
-; dec a
+; dec a ;worm#
; jr z,bchangecurworm
bchangecurworm:
or a
jr z,waitcustomkey
cp K_EXIT
- ret z
+ ret z ;cancel
cp K_MORE
- jr z,waitcustomkey
+ jr z,waitcustomkey ;ignore
ld (ix),a
ret
cal getwormname
ld hl,txtKleft
cal getcustomkey ;left
+ ld a,93
+ ld (_penCol),a
cal getcustomkey ;right
; jr dispmenusets
-;--- display current settings ---
+;--- display current settings --------------------------------------------------
dispmenusets:
ld de,$183E
cal _vputs
jp mainMenu
-;--- handle menukeys ---
+;--- handle menukeys -----------------------------------------------------------
menucall:
psh bc
ld b,a
jr menupos
-;--- change name ---
-; of worm#(curworm)
+;--- change name ---------------------------------------------------------------
getwormname: ;of (curworm)
ld a,(curworm)
ld (_penCol),hl
pop hl
psh hl
- ld (ix),0
+ ld (ix),a ;clroldcustom -> a=0
cal __vputs
- ld (ix),' '
ld a,'_'
cal __vputmap
nokeypressed:
dec ix
jr enternameloop
continue:
+ ld d,0
cp K_ENTER
jr z,nameentered
cp K_EXIT
dec (hl) ;(namelength)
jr z,nameentered
- ld hl,chartable
- ld e,a
- ld d,0
+ ld hl,chartable-1
+ ld e,a ;d=0
add hl,de
ld a,(hl)
or a
cal releasekeys
jr enternameloop
-savestr:
- .db "00000" ;,0 ;&&&somehow put in chartable's 5-byte hole
chartable:
- .db 0,".<>!",0,0,0,0 ;down|L|R|up|-|-|-|-
- .db -1,"XTOJE0",0 ;enter|+|-|*|/|^|clear|-
- .db " WSNID9",0 ;(-)|3|6|9|)|tan|custom|-
- .db "ZVRMHC8",-1 ;.|2|5|8|(|cos|prgm|del
- .db "YUQLGB7#" ;0|1|4|7|ee|sin|table|xvar
- .db $D9,"-PKFA6'" ;on|sto|,|x2|ln|log|graph|alpha
- .db "54321*",-1,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more
-
-nameentered:
+ .db ".<>!" ;down|L|R|up|-|-|-|-|[enter]
+ .db "w00t!" ;(makes code look way better)
+ .db "XTOJE0",'w' ;+|-|*|/|^|clear|- w
+ .db " WSNID9",$F8 ;(-)|3|6|9|)|tan|custom|- o
+ .db "ZVRMHC8",$A7 ;.|2|5|8|(|cos|prgm|[del] o
+ .db "YUQLGB7#",$C2 ;0|1|4|7|ee|sin|table|xvar|[on] t
+ .db "-PKFA6'" ;sto|,|x2|ln|log|graph|alpha
+ .db "54321*",$AE,$D0 ;F5|F4|F3|F2|F1|2nd|[exit]|more
+
+nameentered: ;d=0
pop ix ;stringbegin
- ld (ix+8),0 ;end mark
+ ld (ix+8),d ;end mark
jp DisplayMenu
;_______________________________________________________________________________
ld (hl),b ;+score+1=0
inc hl
ld c,2
- ld (hl),c ;+delay=2
+ ld (hl),c ;+wdelay=2
inc hl
ld (hl),3 ;+lives=x
wormbeglives =$-1
rra ;and _datalink
jr nc,_StartLevel
-;--- link ---
+;--- link ----------------------------------------------------------------------
wormVhost = 095
wormVclient = 195
cp wormVclient
jr nz,host
-;--- client ---
+;--- client --------------------------------------------------------------------
client:
; ld hl,txtReceiv
; 2 = link = 0 + link (name1)
; 3 = worm #2 = #2 + local(name2)
; 4 = link = 0 + link (name2)
- ld e,worm3+left&255
+ ld e,worm3+wleft&255
cal moveworm2 ;3=2
ld l,worm1+name&255
cal sendworm
- ld l,worm2+left&255
+ ld l,worm2+wleft&255
cal linkworm ;worm2+4 over link
pop hl ;loadgamecar
pop de ;leveldata
pop hl ;error
jp DisplayMenu ;return to menu
-;--- set/send worms ---
+;--- set/send worms ------------------------------------------------------------
moveworm2:
- ld hl,worm2+left
-moveworm: ;hl=wormN+left
+ ld hl,worm2+wleft
+moveworm: ;hl=wormN+wleft
ld d,worm1/256
ld bc,11
ldir ;keys+name worm(de) = worm(hl)
ret
-linkworm: ;hl=wormN+left
- ld (hl),0 ;worm1|2+left
+linkworm: ;hl=wormN+wleft
+ ld (hl),0 ;worm1|2+wleft
inc hl
inc hl ;+name
ld b,9
cal recvstuff
ld bc,worm3-worm1-11 ;+2
add hl,bc ;b=0
- ld (hl),b ;worm3|4+left
+ ld (hl),b ;worm3|4+wleft
inc hl
inc hl ;+name
ld b,9
ld b,9
jp sendstuff
-;--- host ---
+;--- host ----------------------------------------------------------------------
host:
cp wormVhost
; 2 = worm #1 = #1 + local(name1)
; 3 = link = 0 + link (name2)
; 4 = worm #2 = #2 + local(name2)
- ld e,worm4+left&255
+ ld e,worm4+wleft&255
cal moveworm2 ;4=2
- ld e,worm2+left&255
- ld hl,worm1+left
+ ld e,worm2+wleft&255
+ ld hl,worm1+wleft
cal moveworm ;2=1
- ld l,worm1+left&255
+ ld l,worm1+wleft&255
cal linkworm ;worm1+3 over link
ld l,worm2+name&255
cal sendworm
ld b,168
cal sendstuff ;level
-;--- load level ---
+;--- load level ----------------------------------------------------------------
StartLevel:
pop hl ;loadgamecar
ld l,(hl)
ld h,0
ld a,(gamecar)
- rla
+ rla ;and _dataPmult
ld a,h ;(Left)=256
jr nc,setscorelimit
ld a,l
inc hl ;location of ending-code
jp (hl) ;go there ("call")
donextlevel:
- ld bc,gametype
- ld a,(bc)
+ ld de,gametype
+ ld a,(de)
or a ;gamesingle
psh af
- cal nz,skiplvltitle
+ jr nz,customnrpeas
+;--sp--
+ inc de
+ ld a,(de) ;gamecar
+ rla ;prepare a
+ rlc (hl) ;bit 7 of (hl)...
+ rra ;...to bit 7 of (gamecar)
+ rrc (hl) ;restore (hl)
+ ld (de),a
ld a,(hl)
- and 127
- jr nz,setleft
-customleft =$+1
+ and 127 ;actual #peas
+ jr setnrpeas
+;--!sp--
+customnrpeas:
+ cal skiplvltitle
ld a,0
-setleft:
+customleft =$-1
+
+setnrpeas:
ld (Left),a
inc a
ld (lefttotal),a
- dec a
- xor (hl) ;bit (hl),7
- inc 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
inc hl
ld de,peagrowth
ldi
- ld a,(hl)
- ld (worm1+grow),a ;&&sh
- ld (worm2+grow),a
- ld (worm3+grow),a
- ld (worm4+grow),a
- ld (beginsize),a
- inc hl
+ ld de,growsize
+ ldi
ld a,(hl)
inc hl
worminit:
psh bc ;>1
ex de,hl
- ldi ;d
+ ldi ;+d
ld a,SinCosTable/256
ld (de),a
inc de
- ldi ;y
- ldi ;x
+ ldi ;+y
+ ldi ;+x
ex de,hl
xor a
- ld (hl),a ;y2
+ ld (hl),a ;+y2
inc hl
- ld (hl),a ;x2
+ ld (hl),a ;+x2
inc hl
+ ld a,(growsize)
+ ld (hl),a ;+growL
inc hl
- ld (hl),a ;growH=0
+ xor a
+ ld (hl),a ;+growH=0
ld bc,(worm2-worm1)-7
add hl,bc
inc a ;ld a,1
ld (turn10),a
- inc a ;ld a,2
ld (flashtime),a
-;--- draw level ---
+;--- draw level ----------------------------------------------------------------
initlevel:
ld a,(de)
psh de ; >> levelp
ld a,l ;pop
sub 5
- ld l,a
- ld h,0
- add hl,hl
- add hl,hl
- add hl,hl
- add hl,hl
- add hl,hl ;32=scr.width
+ cal ldhl32a
ex de,hl
ld hl,ScrBuffer
cal drawstuff
-;--- prepare ---
+;--- prepare -------------------------------------------------------------------
leveldone:
psh hl ; >> levelp new
cal forceshowstats
+ cal handlethoseneatlittleballs
+
+ ld a,(gamecar)
+ rla ;and _dataPmult
+ cal c,multnewpea ;a=0
+ rla ;and _datafood
+ cal nc,NewPea
+nofood:
+ ld bc,(worm1+pos)
+ cal DisplayField
#ifdef readymask
ld hl,$FC70
- ld d,%10101010
- ld c,56
+ ld de,57*256+%10101010
maskloop:
- ld a,d
- xor %11111111
- ld d,a
+ ld a,e
+ cpl
+ ld e,a
ld b,$10
maskline:
ld a,(hl)
- or d
+ and e
ld (hl),a
inc hl
dnz maskline
- dec c
+ dec d
jr nz,maskloop
#endif
#ifdef readytext
res 3,(iy+5)
#endif
- ld a,(gamecar)
- rla ;bit __bitPmult,a
- cal c,multnewpea ;a=0
- rla ;bit __bitfood,a
- cal nc,NewPea
-nofood:
- ld bc,(worm1+pos)
- cal DisplayField
-
ld b,startdelay
ReadyDelay:
halt
GameLoop:
ld bc,(worm1+pos) ;camera worm #1
- ld a,(worm1+left)
+ ld a,(worm1+wleft)
or a ;if #1 not over link
jr nz,showfield
ld bc,(worm2+pos) ;otherwise view from #2
cal tryDrawPea ;pea#2
noctfpeas2draw:
-
- ld a,0
-nrballs =$-1
- or a
- cal nz,handlethoseneatlittleballs
+ cal handlethoseneatlittleballs
ld ix,worm1
ld a,1
rla ;=$17 (c=EXIT-key)
;or$A7 (c=0)
jp c,GameLoop
- jp Exit ;jr?
+ jr Exit
-;--- pause menu ---
+;--- pause menu ----------------------------------------------------------------
disppausemenu:
ld hl,txtpMenu
ld de,$0004
ld (_curRow),de
-;--- who won? ---
+;--- who won? ------------------------------------------------------------------
findwinner:
ld hl,(worm1+score)
dnz finddmwinner
ld (dmwinner),a
-;--- display worms ---
+;--- display worms -------------------------------------------------------------
;x123456789012345678901
;>>>>>> GAME OVER <<<<<
psh bc
psh hl
- ld bc,left-died
- add hl,bc ;+left
+ ld bc,wleft-died
+ add hl,bc ;+wleft
xor a
- cp (hl) ;left=0 = link
+ cp (hl) ;wleft=0 = link
jr nz,NoLinkIndic
ld a,9
ld (_curCol),a
and _datasingl
jr z,hiscorecheckdone ;no SP
checkhiscore:
- cal loadhiscoreposinahl
+ cal loadhiscoreposinahl ;cf=0 (and)
cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
+;-wild insertation-
xor a
- ld hl,highsave
+ ;Be Root to fix a Unix problem
+ ld hl,savestr
+ ;ReBoot to fix a Windows problem
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
-
- ld de,(highsave) ;de=prev. hiscore
+ ;W00t W00t to fix an assembly problem
+ cal mmldir5 ;get old score+name
+ ld de,(savestr) ;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
+newhigh: ;New>Old
+ ld (savestr),hl ;store new hiscore
+ ld de,savestr+2 ;to
ld hl,worm1+name ;from
ld bc,3 ;3 chars
ldir ;store new hiname
- cal loadhiscoreposinahl
+ cal loadhiscoreposinahl ;cf=0 (jr c)
cal _SET_ABS_DEST_ADDR ;to ahl
xor a
- ld hl,highsave
+ ld hl,savestr
cal _SET_ABS_SRC_ADDR ;from local
- ld hl,5
- cal _MM_LDIR_SET_SIZE ;save new
- cal _RAM_PAGE_1
+ cal mmldir5 ;save new score+name
ld hl,_curRow
dec (hl)
cal iswinner
cal _vputs
ld hl,$0C07
ld (_curRow),hl
- ld hl,highsave+2
+ ld hl,savestr+2
cal _puts
- ld hl,(highsave)
+ ld hl,_curCol
+ inc (hl)
+ ld hl,(savestr)
cal _D_HL_DECI
cal _puts ;showHL
hiscorecheckdone:
ret
loadhiscoreposinahl:
- ld hl,0 ;for peaworm and singleplayer
+ sbc hl,hl ;cf=0
ld a,(gametype)
or a ;Singleplayer?
jr z,hi__
hiscrposa =$+1
adc a,0 ;ahl=saveloc
ret
-highsave:
- .db 0,0,"SHI ",0
+savestr: ;hiscore (01ABC) _D_HL_DECI (01234)
+ .db $BB,"w00t",0
iswinner:
ld a,10
ld a,'*'
jp _putc ;..then put *
-;--- quit ---
+;--- quit ----------------------------------------------------------------------
ExitNoStats:
cal linkok
jr nz,unnamedlabel
cal saverespawncounter
removeworm:
- ld h,(ix+tail+1) ;&
+ 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
- cal resbit
- psh hl
- cal res4pixels
- pop hl
+ cal removetailbit
inc (ix+grow)
jr nz,DoesWormTailEqualsWormHead
inc (ix+grow+1) ;+256
DoesWormTailEqualsWormHead:
cal _cphlde
- jr nz,removewormloop
+ jr nz,removewormloop ;head=tail/size=0
ld a,(gamecar)
and _datasingl
- jr nz,safewormsizedone
+ jr nz,savetailpos
+ ld (ix+grow+1),a ;=0
ld a,0
-beginsize =$-1
+growsize =$-1
ld (ix+grow),a
- ld (ix+grow+1),0 ;high
-safewormsizedone:
- ;de=ix+head
- ld (ix+tail+1),d
- ld (ix+tail),e ;head=tail/size=0
+savetailpos:
+ ld (ix+tail+1),h
+ ld (ix+tail),l
ret
unnamedlabel:
ld a,h ;previous
cp l ;changed?
ret z
- ld (ix+delay),a ;=0
+ ld (ix+wdelay),a ;=0
ret
saverespawncounter:
- ld (ix+delay),a
+ ld (ix+wdelay),a
jr inputcall
chkkey: ;key=a
turnright =$-1
ld l,a
notright:
- ld a,(ix+right)
+ ld a,(ix+wright)
cal chkkey
ret nc
ld a,l
ld l,a
ret
inputcall:
- ld a,(ix+left)
+ ld a,(ix+wleft)
or a
jr z,inlink ;input by link
cal inkeys ;input by keys
or a
ret nz ;live limit
alive:
- ld a,(ix+delay)
+ ld a,(ix+wdelay)
dec a
jp nz,respawncheck
ld e,(ix+pos2)
ld d,(ix+pos2+1)
-#ifdef optdie
- psh hl
- ld hl,previouspos
- ld (hl),c
- inc hl
- ld (hl),b
- inc hl
- inc hl
- ld (hl),e
- inc hl
- ld (hl),d
- pop hl
-#endif
+;--- move worm -----------------------------------------------------------------
-;--- move worm ---
-
-Wormmove:
+wormmove:
psh bc ;pos
ld a,(hl)
add a,a
jr nc,notmoveY
inc c
notmoveY: ;bc=newpos
- ld (ix+pos),c
- ld (ix+pos+1),b
ld (ix+pos2),e
ld (ix+pos2+1),d
;-check-
pop hl ;pos (old)
ld a,h
- sub b
- and 1
+ sub b ;Xold-Xnew
+ and 1 ;abs
ld h,a
ld a,l
sub c
- and 1
- add a,h
- ld d,4
+ and 1 ;|Yold-Ynew|
+ add a,h ;pixels moved |Dx|+|Dy|
+ ld d,4 ;same pos = 4of4 bytes drawn
jr z,GotFour
- xor 3
- ld d,a
+ xor 3 ;1 pixel = 2of4 blank; 2 pixels = 3of4 blank
+ ld d,a ;#pixels that should be drawn
GotFour:
- cal chk4pixels
- rl d
- cal c,hitworm
+ cal chk4pixels ;d-=pixels at b,c
+ rl d ;<0 meaning there were >d pixels
+ cal c,hitworm ;so that wasn't us
-;--- draw worm ---
+;--- draw worm -----------------------------------------------------------------
-Drawworm:
- ld c,(ix+pos)
- ld b,(ix+pos+1)
+drawworm:
+ ld (ix+pos),c
+ ld (ix+pos+1),b
ld a,(gametype)
cp gamerace
inc hl
ld (hl),b
inc hl
- cal resbit
+ ;(resbit)
+ ld a,h
+ and (ix+storepos)
+ ld h,a
ld (ix+head),l
ld (ix+head+1),h
removetail:
ld l,(ix+tail)
ld h,(ix+tail+1)
+ cal removetailbit
+ cal savetailpos ;ld (ix+tail),hl
ld c,(hl)
inc hl
ld b,(hl)
- inc hl
- cal resbit
- ld (ix+tail),l
- ld (ix+tail+1),h
- psh hl
- cal res4pixels
- pop hl
+ jr set4pixels ;redraw new last bit
+
+removetailbit:
ld c,(hl)
inc hl
ld b,(hl)
- jr set4pixels
+ inc hl
+ ;(resbit)
+ ld a,h
+ and (ix+storepos)
+ ld h,a
+ psh hl
+ cal res4pixels ;rm last bit
+ pop hl
+ ret
res4pixels:
cal ResPixel
;_______________________________________________________________________________
handlethoseneatlittleballs:
+ ld a,0
+nrballs =$-1
+ or a
+ ret z ;no bouncies to handle
+ ld b,a ;(nrballs)
ld hl,balls
- ld b,a ;a=(nrballs)
handleballs
psh bc
psh hl
; |__|__| |_____| | \_ | | | | _____ | | __|__ |
;_______________________________________________________________________________
+;--- multifood -----------------------------------------------------------------
+
+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
+ jr _wormdead
+pickmultpea:
+ ld a,247
+ ld (de),a
+ dec de
+ ld (de),a
+ jp pickedpea
+
+;--- ctf -----------------------------------------------------------------------
+
+chkctfpeas: ;ctf
+ ld hl,(peaspos) ;1st pea
+ ld a,(ix+reserv)
+ ld e,a ;push a
+ and %01 ;ourpea (0|1)
+ jr z,sel_otherpea
+ ld hl,(peaspos+2) ;2nd pea
+sel_otherpea:
+ cal chkpeahit
+ jr c,hitflag
+;no peas hit:
+ ld a,e ;peek a (that's x86asm for pop\push ;)
+ bit 1,a ;%1O = carrying flag?
+ jr z,_wormdead ;if not just die
+ and %1 ;which flag?
+ ld hl,drawctfpea1 ;restore #1
+ jr nz,nottheotherflag
+ inc hl ;ld hl,drawctfpea2
+ inc hl ;restore #2
+nottheotherflag:
+ ld (hl),3 ;draw delay 3 turns
+_wormdead:
+ jp wormdead
+
+hitflag: ;correct pea hit
+ ld a,e ;pop a
+ xor %11 ;invert flag taken + ownflag
+ ld (ix+reserv),a
+ and %10 ;just returned?
+ psh bc ;safe position
+ psh af ;safe z-flag
+ cal DrawPea ;remove
+ pop af
+ pop bc
+ ret nz ;flag taken: continue game ;drawworm
+ ld e,20 ;flag captured+returned
+ psh bc
+ cal IncScore
+ pop bc
+ ld a,3 ;draw delay
+ ld (drawctfpea1),a ;redraw..
+ ld (drawctfpea2),a ;..both flags
+ ret ;drawworm
+
+;--- main ----------------------------------------------------------------------
+
hitworm:
-#ifdef optdie
-; if race - originally
- cal checkhitotherworm
-#endif
ld a,(gamecar)
bit __bitPctf,a
jr nz,chkctfpeas
rla ;and _dataPmult
- jp c,chkmultpeas
+ jr c,chkmultpeas
rla ;and _datafood
- jp c,wormdead ;no food
+ jr c,_wormdead ;no food
+
+;--- foodmatch|SP --------------------------------------------------------------
ld hl,0
PeaY =$-2
PeaX =$-1
cal chkpeahit
jp nc,wormdead
-pickpea:
- cal DrawPea ;remove pea
+
+;--- take pea ------------------------------------------------------------------
+
+ psh hl
cal NewPea
-pickpea_:
- ld a,(ix+grow)
+ pop hl
+pickedpea:
+ cal DrawPea ;remove pea
+ ld a,(ix+grow) ;grow
add a,15
peagrowth =$-1
ld (ix+grow),a
inc (ix+grow+1)
wormset2grow:
ld hl,Left
- dec (hl) ;dec left before display
+ dec (hl) ;dec left _before_ display
psh af
ld e,10
cal IncScore
pop af
- jp nz,Drawworm ;continue
+ ld c,(ix+pos) ;same position
+ ld b,(ix+pos+1) ;we'll just leave pos2 - doubt anybody will care|notice..
+ ret nz ;(Left)>0 ;drawworm
ld a,(gametype)
or a
jp nz,Exit ;stack restored
ex de,hl
cal _IncScore ;score+(40*level)
cal removeworm
- pop hl ;<<$some call
- pop hl ;<<call HandleWorm
pop hl ;<<call hitworm
- ld (ix+delay),2
+ pop hl ;<<call HandleWorm
+ pop hl ;<<$some other call
+ ld (ix+wdelay),2
jp Nextlevel
chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
cp d
ret ;c=pea
-;--- other modes ---
-
-chkctfpeas:
- ld hl,(peaspos) ;1st pea
- ld a,(ix+reserv)
- ld e,a ;push a
- and %01 ;ourpea (0|1)
- jr z,sel_otherpea
- ld hl,(peaspos+2) ;2nd pea ;&&&ex de,hl?
-sel_otherpea:
- cal chkpeahit
- jr c,hitflag
-;no peas hit:
- ld a,e ;peek a (that's x86asm for pop\push ;)
- bit 1,a ;%10 = carrying flag?
- jp z,wormdead ;if not just die
- xor %11 ;drop flag
- ld (ix+reserv),a
- psh af
- cal wormdead
- pop af ;which flag? (=and %1)
- ld hl,drawctfpea1 ;restore #1
- jr z,nottheotherflag
- inc hl ;ld hl,drawctfpea2
- inc hl ;restore #2
-nottheotherflag:
- ld (hl),3 ;draw delay 3 turns
- ret
-
-hitflag: ;correct pea hit
- ld a,e ;pop a
- xor %11 ;invert flag taken + ownflag
- ld (ix+reserv),a
- and %10 ;just returned?
- psh af ;safe z-flag
- cal DrawPea ;remove
- pop af
- ret nz ;flag taken, continue game
- psh hl
- ld e,20 ;flag captured+returned
- cal IncScore
- pop hl
- ld a,3 ;draw delay
- ld (drawctfpea1),a ;redraw..
- ld (drawctfpea2),a ;..both flags
- ret ;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)
- inc hl
- inc a
- cp 4
- jr nc,nothit1 ;no
- ld a,b
- sub (hl)
- inc a
- cp 4
- ret c ;nz ;yes
-nothit1:
- inc hl
- cal resbit
-ChkWorm:
- cal _cphlde
- jr nz,nextotherwormbit
- ret ;z
-#endif
+;--- misc ----------------------------------------------------------------------
checkhitlapline:
- ld a,(peaspos) ;63
+ ld a,(peaspos) ;63 usually
sub b ;x==63
jr z,nextlaphalf
- inc a
- ret nz
-nextlaphalf:
+ inc a ;(more checkin' since wormies just have those _huge_ heads ;)
+ ret nz ;x!=62
+nextlaphalf: ;x==62|63; a=0
ld a,(peaspos+1) ;yline
cp c ;ypos
ld a,1
; | | \_ |_____| |_____ ______|
;_______________________________________________________________________________
-releasekeys:
- halt
+releasekeys: ;---------->promise me you'll never let go...
+ halt ;-------------------->i won't let go....
ld a,%10000000 ;all key-masks
out (1),a
- in a,(1)
+ in a,(1) ;--------------->i'll never let go.....
inc a ;cp %11111111 (no keys pressed)
jr nz,releasekeys ;keep waitin
cal GET_KEY ;clear buffer
- ret
-
-resbit:
- ld a,h
- and (ix+storepos)
- ld h,a
- ret
+ ret ;--------------------->*die* (we are VICTORIOUS! muha)
randompos:
ld b,a
Random: ;(2..b+2)
- ld a,r
+ ld a,r ;0..127
+ scf ;not just even values:
+ rla ;6543210C
Seed =$+1
add a,0
ld (Seed),a
- and %01111110
cp b
jr nc,Random
add a,2
ret
+ldhl32a:
+ ld l,a
+ ld h,0 ;=hl
+ add hl,hl
+ add hl,hl
+ add hl,hl
+ add hl,hl
+ add hl,hl ;32=scr.width
+ ret ;ld hl,32*a
+
+mmldir5:
+ ld hl,5 ;=ahl
+ cal _MM_LDIR_SET_SIZE
+ jp _RAM_PAGE_1
+
wormdead:
pop hl ;<<call
-WormDead:
-#ifdef invincible
- jp stopworm
-#endif
ld a,2
ld (flashtime),a
- ld (ix+delay),rspawndelay
+#ifdef w00t
+ ld h,201
+ .org $-2
+ nop
+ .org $+1
+#endif
+ ld (ix+wdelay),rspawndelay
thislevel =$+1
ld hl,0
ld (ix+pos2),a ;y2
ld (ix+pos2+1),a ;x2
+ ld a,(handledworm) ;who are we? (1-4)
+ cpl ;invert (just bit 0 actually)
+ and 1 ;group 1 (1,3) or 0 (2,4)
+ ld (ix+reserv),a ;reset halflap|flags to starting settings
+
inc (ix+died)
dec (ix+lives)
psh af
- ld a,(gametype)
- cp gamectf ;ctf no death penalty
+ ld a,(gamecar)
+ and _datadecs ;ctf and race no death penalty
cal nz,DecScore10
pop af
ret nz ;HandleWorm done
ld (CURtxtGame),hl ;save for g/o
ret
-#ifdef optdie
-checkhitotherworm:
- .db $dd,$7d ;ld a,lx
- cp worm2&255
- psh ix
- jr nz,chkworm2 ;ret nz
- ld ix,worm1
- jr chkworm
-chkworm2:
- ld ix,worm2
-chkworm:
- ld h,(ix+tail+1)
- ld l,(ix+tail)
- ld e,(ix+head)
- ld d,(ix+head+1)
- cal ChkWorm
- pop ix
- ret z ;not hit
- pop bc ;call
-stopworm:
- ld bc,0
-previouspos =$-2
- ld de,0
- ld (ix+pos),c
- ld (ix+pos+1),b
- ld (ix+pos2),e
- ld (ix+pos2+1),d
- ret
-#endif
-
CheckPea: ;@hl; destr:abcde
ld c,l
ld a,(sprsize)
ret
NewPea:
+ ld de,$293A ;counter :)
+newpealoop:
+ dec de
+ ld a,d
+ or e
+ jp z,Exit ;break after 10554 tries to prevent freeze when field filled
ld a,(FieldWidth)
- add a,127-4
+ add a,126
cal randompos
ld h,a
ld a,(FieldHeight)
- add a,56-4
+ add a,55
cal randompos
ld l,a
+ psh de
cal CheckPea
- jr nz,NewPea
+ pop de ;counter
+ jr nz,newpealoop
cal sendnewpeaoverlink
ld (PeaY),hl
DrawPea: ;hl=(PeaY)
ld a,(gamecar)
and _datatime
jr nz,timematchscore ;no disp for timematches
- ld hl,$FC00 ;&&&only necessary in deathmatch
- ld b,6*16-1
-clearstats:
- ; ld (hl),a ;=0
- ;&&&&&&
- inc hl
- dnz clearstats
forceshowstats:
psh ix
- ld h,0
- ld l,h
+ and a
+ sbc hl,hl ;hl=0
ld (_penCol),hl
ld a,(nrworms)
ld b,a
and _datasingl
jr nz,showstatsS
showstatloop:
- psh bc
+#ifdef gamenames
#ifdef longnames
+ psh bc
ld b,3
psh ix
shownameloop: ;1st 3 chars
ld a,':'
cal _vputmap
pop ix
+ pop bc
#else
ld a,(ix+name)
cal __vputmap
ld a,':'
cal __vputmap
#endif
- cal showstat
+#endif
+ ld a,(wormbeglives)
+ or a
+ cal nz,showlives ;lives when initlives>0
+ ld a,' '
+ cal __vputmap ;small div
+ ld a,(gametype)
+ cp gamedeathm
+ cal nz,showscore ;score in !dm
+ ld a,$D8
+ cal __vputmap ;div
+
ld de,worm2-worm1
add ix,de ;next
- ld hl,_penCol
- ld a,(hl)
- add a,4 ;div
- ld (hl),a
- pop bc
dnz showstatloop
pop ix
ret
-showstat: ;(multiplayer)
- ld a,(wormbeglives)
- or a
- jr nz,showlives
showscore:
cal ldscoreinhl
+ psh bc
cal _D_HL_DECI
+ pop bc
jr __vputs
-showlives:
- ld a,(ix+lives)
- jr cshowA00
-cshowA: ;small w/ leading 0
+cshowA: ;small w/ leading 0; 0='none'
or a ;destr. ahl
jr nz,cshowA00
ld hl,txtNone
jp _vputs
-cshowA00:
+
+showlives:
+ ld a,(ix+lives)
+cshowA00: ;small w/ leading 0
ld l,a
ld h,0
cal _divHLby10
jr c,NotMaxYScroll
ld a,(FieldHeight)
NotMaxYScroll:
- ld l,a
- ld h,0
- add hl,hl
- add hl,hl
- add hl,hl
- add hl,hl
- add hl,hl
+ cal ldhl32a
psh bc ; >> 1
psh de ; >> 2
ld de,ScrBuffer
; |_____/ | \_ | | |__|__|
;_______________________________________________________________________________
-;--- pixel ---
+;--- pixel ---------------------------------------------------------------------
-chk4pixels: ;&&
+chk4pixels:
cal CheckPixel
inc b
cal CheckPixel
dec d
ret
-;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
-;(b,c) to hl:a; "destroyes" ahl
+;--- findpixel -----------------------------------------------------------------
+;Based on Snake86's findpixel
+;160-262 cycles; 31 bytes
FindPixel: ;(b,c) to hl:a
+ psh bc
ld h,0
- ld l,c ;hl=y
+ ld l,c ;hl=y
add hl,hl
add hl,hl
- ld a,b ;a=x
+ ld a,b ;a=x
rra
add hl,hl
rra
add hl,hl
- add hl,hl ;hl=32*y
- rra ;a=x/8
+ add hl,hl ;hl=32y
+ rra ;a=x/8
or l
ld l,a
- ld a,b
+ ld a,b ;x
and 7
- cpl
- rlca
- rlca
- rlca
- ld (FP_Bit),a
- xor a
-FP_Bit =$+1
- set 0,a
-
- psh de ;&&& C`MON! THIS IS UGLY! *hit myself*
- ld de,ScrBuffer
- add hl,de
- pop de
+ inc a
+ ld b,a
+ ld a,1
+pixelloop:
+ rrca
+ dnz pixelloop
+ ld bc,ScrBuffer
+ add hl,bc
+ pop bc ;destr:none
ret
-;--- objects ---
+;--- objects -------------------------------------------------------------------
drawstuff:
ld a,(hl)
; dec a ;4 = circle
; jp z,drawcircle
-;--- circle ---
+;--- circle --------------------------------------------------------------------
;IMHO, one weery nice routine. Oh lemme be proud just *once*.
;Not perfect since it uses a screwy lineroutine to draw stuff
psh hl
ld a,h ;hl=x,y
sub b ;bc=xx,yy
+ jr nc,$+3 ;x<xx
+ xor a ;left of screen -> x=0
ld d,a ;d=x-xx
add hl,bc ;h=x+xx; l=y+yy
ld e,l ;e=y+yy
ld a,l
sub c ;a=y again
sub c
+ jr nc,$+3 ;y<yy
+ xor a ;above screen -> y=0
ld l,a ;l=y-yy
ld e,l ;e=l=y-yy
cal drawline ;(h-b,l-c)-(h+b,l-c)
pop hl
ret ;thats it
-;--- box ---
+;--- box -----------------------------------------------------------------------
drawbox: ;(d,e)-(h,l)
ld b,l ;Delta-y
dnz boxloop
ret
-;--- fatline ---
+;--- fatline -------------------------------------------------------------------
drawfatline:
cal drawline
dec h
; jp drawline
-;--- line ---
+;--- 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.
pop hl ; :<hl
linedrawxloop:
- psh af ;init z=dy-dx
+ psh af ;init z=2dy-dx
ld a,(hl)
or c ;|c:hl
ld (hl),a
ret
SteepLine:
- ld h,a ;h=deltay
- neg ;a=-deltay
- ld (line3sm+1),a
+ ld l,a
+ neg
+ ld (line3sm+1),a ;=-deltay
+ rra
+ ld h,a ;h=-deltay/2
ld a,b
- ld (line4sm+1),a ;a=deltax
- sub h ;a=deltax-deltay
- ld b,h ;b=deltay
+ ld (line4sm+1),a ;=deltax
+ add a,h ;a=deltax-deltay/2
+ ld b,l ;b=deltay
pop hl ; :<hl
linedrawyloop:
- psh af ;init z=2(dx-dy)
+ psh af ;init z=2dx-dy
ld a,(hl)
or c ;|c:hl
ld (hl),a
timeout = $8000
lossout = 20
-;--- multiple bytes ---
+;--- multiple bytes ------------------------------------------------------------
sendstuff:
psh de
pop de
ret
-;--- foo ---
+;--- foo -----------------------------------------------------------------------
receivenewpeaoverlink:
cal Qrecv ;Crecv
ld a,(gamecar)
rra ;and _datalink
ret nc ;no link
- ld a,(worm1+left)
+ ld a,(worm1+wleft)
or a
jr z,receivenewpeaoverlink
ld c,l ;send pea's pos
ld c,h
; jr Qsend ;that's why it's here
-;--- 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
out (1),a ;select keys
in a,(1) ;input
bit 6,a ;exit key
- jp z,Exit ;break!
+ jr z,linkerr ;break!
linkfine:
in a,(7)
and %11
; |_____/ | | | | |
;_______________________________________________________________________________
-;--- graphics ---
+;--- graphics ------------------------------------------------------------------
wtPicture: ;title
-.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
-.db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000
-.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000
+; %00000000,%00000000,%00000000,%00000000,%00000000,%00000000,
+.db %00011110, %00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
+.db %00111110, %00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000
+.db %01110000, %00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000
.db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000
.db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000
.db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000
.db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101
.db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011
+#ifdef coolzgfx
wtWormy: ;g/o
.db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000
.db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000
.db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010
.db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010
.db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100
-
;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
-
-#ifndef coolzgfx
+#else
txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
#endif
-;--- menus ---
+;--- menus ---------------------------------------------------------------------
txtMenu: .db "Mode",0 ;1st menu item
.db "Level",0 ;2nd
pospMenu: .db 4
.dw $3418,$331E,$2F24,$3A2A
-;--- text ---
+;--- text ----------------------------------------------------------------------
txtGame: .db "Singleplayer",0
txtGame1: .db "Peaworm",0
txtYes: .db "Yes",0
txtNo: .db "No",0
txtKleft: .db ":left",0
-txtKright: .db "/right",0
+txtKright: .db "right",0
posLevsel = $0320
txtLevsel: .db $CF," SELECT LEVELS ",5,0
txtWaitn: .db "Waiting";"...",0
txtLeft: .db " left",0 ;follows txtScore
txthiscore:.db "HiScore:";,0
-;--- foo ---
+;--- foo -----------------------------------------------------------------------
trigtable: .db 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45
.db 48, 51, 54, 57, 59, 62, 65, 67, 70, 73, 75, 78, 80, 82, 85, 87
.db 127
#ifdef intlevels
-datalevels:.dw LevelDef,LevelDefM,LevelDefT,LevelDefM,LevelDefM
- .dw LevelDefM,LevelDefM,LevelDefR,LevelDefC
-nrlevels: .db 2,3,1,3,3,3,3,3,1,0 ;=defaults
+datalevels:.dw LevelDef,LevelDefM,LevelDefT,LevelDefM,LevelDefM
+ .dw LevelDefM,LevelDefM,LevelDefR,LevelDefC
+nrlevels: .db 2,3,1,3,3,3,3,3,1,0
defhiscrpos:
- .db 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI"
+ .db 0,0,"SHI",0,0,"SHI",0,0,"SHI",0,0,"SHI",0,0,"SHI"
#else
-defhiscrpos = 0
+defhiscrpos = -42
#endif
-;--- game settings ---
-
-_datalink = %00000001 ;linkplay (1!)
-_datafoodl = %00000010 ;left=0 limit
-_datasingl = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel) &&1?
-_dataPctf = %00001000 ;ctf peas=1
-__bitPctf = 3
-_datatime = %00010000 ;time incs score (timematch)
-;reserved %00100000 ;for future use
-_datafood = %01000000 ;food present=0 (6!)
-_dataPmult = %10000000 ;multiple peas=1 (no _datafood) (7!)
+;--- game settings -------------------------------------------------------------
savestart:;---
.db %11111101,0,K_PLUS,K_ENTER
worm4name: .db "JIM ",0
- ; �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)
+_datalink = %00000001 ;linkplay (1!)
+_datafoodl = %00000010 ;left=0 limit
+_datasingl = %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
+_dataPctf = %00001000 ;ctf peas=1
+__bitPctf = 3
+_datatime = %00010000 ;time incs score (timematch)
+_datadecs = %00100000 ;decrease score on death=1
+_datafood = %01000000 ;food present=0 (6!)
+_dataPmult = %10000000 ;multiple peas=1 (no _datafood) (7!)
+
+ ; ┌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 %00100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
gamepeas = 1
-datapeas: .db %00000100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
+datapeas: .db %00100100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
gametron = 2
-datatron: .db %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
+datatron: .db %01110100,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)
+datadeathm:.db %01100000,3,2,1,-1,42, 8, 0 ;Deathmatch (3 lives, 50 growth)
gamefoodm = 4
-datafoodm: .db %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
+datafoodm: .db %00100000,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)
+datamfoodm:.db %11100010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)
gametimem = 6
-datatimem: .db %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth)
+datatimem: .db %01110000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth)
gamerace = 7
datarace: .db %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score)
gamectf = 8
saveend:;---
-startdelay = 17
+startdelay = 42
rspawndelay = 31
maxnamesize = 8+1
.end
-.end
\ No newline at end of file
+.end