Compare commits

..

20 Commits
v1 ... main

Author SHA1 Message Date
~d6 a32abcdff0 v4 rom 2024-09-03 22:31:03 -04:00
~d6 d0868d6f11 bump metadata to v4 2024-09-03 22:30:02 -04:00
~d6 b60e474afc saved settings + stats 2024-09-03 22:24:24 -04:00
~d6 0e6c0258a7 v3 rom 2024-08-19 13:00:36 -04:00
~d6 a5c00710dc bump to version 3 2024-08-19 13:00:25 -04:00
~d6 aa836737fb fix subtle auto-move bug 2024-08-19 00:15:28 -04:00
~d6 c0443e0b03 more reliable hardware screen detection 2024-08-18 23:46:27 -04:00
~d6 e618a8010a improve cursor offsets 2024-08-18 23:33:48 -04:00
~d6 8db2f9d4ac detect screen sizes; relative drawing 2024-08-18 23:16:08 -04:00
~d6 a345a43ab6 newer rom 2024-08-13 20:41:15 -04:00
~d6 6349b26dfa implement hard/easy mode 2024-08-13 14:09:09 -04:00
~d6 b79b320102 new cursor; thanks neauoire! 2024-08-13 13:54:02 -04:00
~d6 5ba423aa9f some optimizations from neauoire 2024-08-12 21:03:43 -04:00
~d6 db984fbfa4 fix stack underflow 2024-08-12 20:51:48 -04:00
~d6 1c0ac2a42a metadata updates 2024-08-11 20:20:47 -04:00
~d6 3181d664f0 add 24x24 icon, clean up 2024-08-07 22:47:02 -04:00
~d6 92269857a5 fix metadata 2024-08-07 22:11:07 -04:00
~d6 47674008b2 bump to version 2 2024-08-07 22:07:02 -04:00
~d6 412b024b13 more bear animations 2024-08-07 22:03:27 -04:00
~d6 d55b27caab display message on winning 2024-08-07 21:12:17 -04:00
7 changed files with 334 additions and 111 deletions

1
.gitignore vendored
View File

@ -18,3 +18,4 @@ wave
*.wav
*.mp4
scratch
.kodiak.dat

Binary file not shown.

View File

@ -42,17 +42,18 @@
,set-sprite/layer LDR ORA .Screen/sprite DEOk DEOk DEO JMP2r
@draw-background ( -> )
#f2 .Screen/auto DEO
;tiles #0200 ADD2 .Screen/addr DEO2
#0080 .Screen/x DEO2
draw-background/twice
#0000 .Screen/x DEO2
&twice
#01 .Screen/auto DEO
#0000 .Screen/y DEO2
#81 .Screen/sprite
DEOk DEOk DEOk DEOk DEOk DEOk DEOk DEOk
DEOk DEOk DEOk DEOk DEOk DEOk DEOk DEOk
DEOk DEOk DEOk DEOk DEOk DEOk DEOk DEO JMP2r
;tiles #0200 ADD2 .Screen/addr DEO2
.height LDZ2 #03 SFT2 #0000 &yloop
#0000 .Screen/x DEO2
.width LDZ2 #03 SFT2 #0000 &xloop
#81 .Screen/sprite DEO
INC2 GTH2k ?&xloop
POP2 POP2
.Screen/y DEI2 #0008 ADD2 .Screen/y DEO2
INC2 GTH2k ?&yloop
POP2 POP2 JMP2r
@draw-spot-down ( -> )
#16 .Screen/auto DEO ( ; draw 2 tiles, increment x and addr )
@ -159,10 +160,6 @@
( - byte 3: x position )
( - byte 4: y position )
@cursor 80c0 e0f0 f8e0 1000
( @cursox 7f3f 1f0f 071f efff )
@blank 0000 0000 0000 0000
( @rng &x $2 &y $2 )
@rng-x $2
@rng-y $2

Binary file not shown.

View File

@ -1,8 +1,6 @@
( kodiak.tal )
( TODO )
( * display message on win )
( * make bear react to moving cards )
( * buttons, stock flash when clicked )
( * save game file? stats? )
( * card sounds? )
@ -35,7 +33,7 @@
( - #6c queen of hearts, face down )
( - #93 three of diamonds, held )
( zero page - currently using 232 of 256 bytes )
( zero page - currently using 254 of 256 bytes )
|0000
@stock $34 ( draw pile - 52 bytes, 24 bytes at start )
@waste $18 ( face up pile - 24 bytes )
@ -62,6 +60,12 @@
@about $1 ( is about screen visible? 01 start, ff resume )
@audio [ $1 ( is audio enabled? )
&pos $2 ] ( position in music )
@easy $1 ( true: draw 1 card false: draw 3 cards )
@width $2 ( screen width )
@height $2 ( screen height )
@seconds $1 ( when to count time )
@tick $1 ( already counted? )
( 256 bytes )
|0100
( metadata )
@ -72,9 +76,8 @@
#8d12 .System/g DEO2
#4d12 .System/b DEO2
( 256x192 )
#0100 .Screen/w DEO2
#00c0 .Screen/h DEO2
load-scores
init-screen
( set up vectors )
;on-mouse .Mouse/vect DEO2
@ -91,6 +94,9 @@
#0231 #0580 ;triangle #0004 #64 .Audio3 setup-audio
#011f #00b0 ;noise #0200 #44 .Audio4 setup-audio
.DateTime/sec DEI .seconds STZ
#00 .tick STZ
start-audio
( display about window when first starting )
@ -100,17 +106,58 @@
@metadata 00
( title ) "kodiak 0a
( details ) &details "klondike 20 "solitaire 20 "game 0a
( author ) "by 20 "d_m 0a
( version ) "version 20 "0 0a
( date ) "5 20 "aug 20 2024 00
00
( author ) "by 20 "d6 0a
( version ) "version 20 "4 0a
( date ) "03 20 "sep 20 "2024 00
01 ( 1 extended field )
( icon ) 83 =icon-24
@icon-24x24
00 00 03 02 00 01 01 01 03 07 07 07 03 03 06 06
00 00 00 00 00 c3 c3 c3 00 81 81 ff ff ff bd bd
00 00 c0 40 00 80 80 8e c0 e0 e0 e0 c0 c0 60 6e
00 00 00 00 00 00 00 00 07 07 07 03 03 01 00 00
( tbc... )
@score-file ".kodiak.dat 00
@score-data $a
@save-scores ( -> )
LIT2r =score-data
LIT2 "ko STH2kr STA2 INC2r INC2r
;draw-scores/games LDA2 STH2kr STA2 INC2r INC2r
;draw-scores/wins LDA2 STH2kr STA2 INC2r INC2r
;draw-scores/time LDA2 STH2kr STA2 INC2r INC2r
.easy LDZ #01 AND #00 STH2r STA2
;score-file .File1/name DEO2
#000a .File1/len DEO2
;score-data .File1/w DEO2
JMP2r
@load-scores ( -> )
;score-file .File1/name DEO2
#000a .File1/len DEO2
;score-data .File1/r DEO2
( dat file should be exactly 10 bytes )
.File1/ok DEI2 #000a NEQ2 ?&invalid
( first two bytes must be "ko" )
;score-data LDA2 LIT2 "ko NEQ2 ?&invalid
( next 6 bytes contains 3 shorts )
;score-data INC2 INC2
LDA2k ;draw-scores/games STA2 INC2 INC2
LDA2k ;draw-scores/wins STA2 INC2 INC2
LDA2k ;draw-scores/time STA2 INC2 INC2
( next byte contains easy/hard bit )
LDA #01 AND .easy STZ
( last byte ignored, for now )
JMP2r
&invalid
#0000 ;draw-scores/games STA2
#0000 ;draw-scores/wins STA2
#0000 ;draw-scores/time STA2
#00 .easy STZ
JMP2r
@setup-audio ( adsr* sample* slen* dur* vol^ dev^ -> )
STHk #0e ORA DEO ( [dev^] ; <-vol )
@ -120,6 +167,13 @@
STHr #08 ORA DEO2 ( ; <-adsr )
JMP2r
@inc-games ( -> )
;draw-scores/games LDA2k INC2 SWP2 STA2 JMP2r
@restart
is-game-won ?{ inc-games save-scores }
( >> )
@reset
init-rng-from-datetime
init-stock
@ -140,6 +194,25 @@
.about LDZ ?draw-about
draw !auto-move
@init-screen ( -> )
( our target resolution is 256x192. )
( )
( if the emulator's screen is more than twice that in )
( either dimension we'll request a resize to 256x192. )
( )
( this will faciliate zooming, which is better for )
( high resolution screens. )
.Screen/w DEI2 #0200 LTH2
.Screen/h DEI2 #0180 LTH2 AND ?&save
( resize to 256x192 )
#0100 .Screen/w DEO2 #00c0 .Screen/h DEO2
( save screen dimensions for future use )
&save
.Screen/w DEI2 .width STZ2
.Screen/h DEI2 .height STZ2 JMP2r
@clear-fg ( -> )
#0000 .Screen/x DEO2
#0000 .Screen/y DEO2
@ -147,10 +220,10 @@
JMP2r
@quit ( -> brk )
#010f DEO BRK ( TODO: save game? save stats? )
is-game-won ?{ inc-games } save-scores #010f DEO BRK
@dump-byte ( byte^ -- )
DUP #04 SFT ,&hex JSR #0f AND ,&hex JMP
DUP #04 SFT /hex #0f AND ( >> )
&hex #30 ADD DUP #39 GTH #27 MUL ADD .Console/w DEO
JMP2r
@ -203,17 +276,17 @@
@draw ( -> )
draw-background
draw-scores
draw-buttons
draw-decorations
draw-stock
draw-waste
draw-foundation
draw-tableau
draw-curr-mouse
JMP2r
!draw-curr-mouse
@initialize ( start^ count^ -> )
OVR ADD SWP STH2 #00 ( 0^ [lim=start+count^ start^] )
OVR ADD STH STH #00 ( 0^ [lim=start+count^ start^] )
&loop DUP STHkr STZ INCr GTHkr STHr ?&loop ( 0^ [lim^ pos^] )
POP POP2r JMP2r ( )
@ -318,9 +391,7 @@
#0030 .Screen/x DEO2 #00a8 .Screen/y DEO2 #14 draw-horiz
#0028 .Screen/x DEO2 #0018 .Screen/y DEO2 #12 draw-vert
#00d0 .Screen/x DEO2 #0018 .Screen/y DEO2 #12 draw-vert
JMP2r
#00d0 .Screen/x DEO2 #0018 .Screen/y DEO2 #12 !draw-vert
@draw-logo ( -> )
#0054 .Screen/x DEO2
@ -330,12 +401,19 @@
#80 .Screen/sprite DEOk DEO
JMP2r
@draw-face ( x* y* addr* -> )
( @draw-face ( x* y* addr* -> )
.Screen/addr DEO2
.Screen/y DEO2
.Screen/x DEO2
#16 .Screen/auto DEO
#80 .Screen/sprite DEOk DEO JMP2r
#80 .Screen/sprite DEOk DEO JMP2r )
@draw-mouth ( x* y* addr* -> )
#0020 ADD2 .Screen/addr DEO2
#0008 ADD2 .Screen/y DEO2
.Screen/x DEO2
#16 .Screen/auto DEO
#80 .Screen/sprite DEO JMP2r
@draw-about-content ( -> )
@ -347,10 +425,10 @@
#0078 #0048 #3b draw-xyc
#0060 #0038 #80 draw-bear
#0060 #0038 ;sprites #00c0 ADD2 draw-face
#0060 #0038 ;sprites #00c0 ADD2 draw-mouth
#00a8 #0038 #90 draw-bear
#0090 #0038 ;sprites #0100 ADD2 draw-face
#0090 #0038 ;sprites #0100 ADD2 draw-mouth
#0038 #0070 ;line1 print-str
#0040 #0078 ;line2 print-str
@ -358,11 +436,11 @@
#0070 #0094 resume-button-addr draw-button
POP2 POP2 JMP2r
JMP2r
@line1 "klondike 20 "solitaire 00
@line2 "version 20 "1 20 "by 20 "d_m 00
@line3 "august 20 "6 20 "2024 00
@line2 "version 20 "4 20 "by 20 "d6 00
@line3 "september 20 "3 20 "2024 00
@print-str ( x* y* s* -> )
STH2 .Screen/y DEO2 ( x* [s*] )
@ -372,6 +450,18 @@
LDAk load-ch #00 .Screen/sprite DEO ( s* )
INC2 !&loop ( s+1* )
@print-dec ( x* y* n* -> )
#01 ,pr-digit/a STR
STH2 .Screen/y DEO2 .Screen/x DEO2
#01 .Screen/auto DEO
STH2r #2710 pr-digit #03e8 pr-digit #0064 pr-digit #000a pr-digit !pr-digit/emit
@pr-digit ( n* d* -> n%d* )
DIV2k STH2k MUL2 SUB2 STH2r
DUP2 #0000 EQU2 LIT [ &a 01 ] AND ?&leading-zero
&emit #00 ,&a STR NIP LIT "0 ADD load-ch #00 .Screen/sprite DEO JMP2r
&leading-zero POP2 #20 load-ch #00 .Screen/sprite DEO JMP2r
@load-ch ( c^ -> )
#00 SWP #30 SFT2 ;font ADD2 .Screen/addr DEO2 JMP2r
@ -403,22 +493,63 @@
#8a .Screen/sprite DEO JMP2r
@restart-button-addr ( -> addr* )
game-won ?&won ;restart-button JMP2r
is-game-won ?&won ;restart-button JMP2r
&won ;new-game-button JMP2r
@audio-button-addr ( -> addr* )
.audio LDZ ?&on ;audio-off-button JMP2r
&on ;audio-on-button JMP2r
@draw-buttons ( -> )
#0008 #00b4 restart-button-addr draw-button
#0030 #00b4 ;quit-button draw-button
#0058 #00b4 audio-button-addr draw-button
#0080 #00b4 ;about-button draw-button
@difficulty-button-addr ( -> addr* )
.easy LDZ ?&easy ;hard-button JMP2r
&easy ;easy-button JMP2r
@draw-scores ( -> )
.width LDZ2 #002c SUB2 #0029 ;text/games print-str
.width LDZ2 #002c SUB2 #0032 LIT2 [ &games $2 ] print-dec
.width LDZ2 #002c SUB2 #0041 ;text/wins print-str
.width LDZ2 #002c SUB2 #004a LIT2 [ &wins $2 ] print-dec
.width LDZ2 #002c SUB2 #0059 ;text/time print-str
.width LDZ2 #002c SUB2 #0062 LIT2 [ &time $2 ] print-dec
JMP2r
@text [ &n "12345 00 &games "games 00 &wins 20 "wins 00 &time 20 "time 00 ]
@draw-buttons ( -> )
.height LDZ2 #000c SUB2
#0008 OVR2 restart-button-addr draw-button
#0030 OVR2 ;quit-button draw-button
#0058 OVR2 audio-button-addr draw-button
#0080 OVR2 ;about-button draw-button
#00a8 SWP2 difficulty-button-addr !draw-button
@draw-bear-smile ( -> )
.width LDZ2 #0018 SUB2 .height LDZ2 #0028 SUB2 ;sprites #00c0 ADD2 !draw-mouth
@draw-bear-oh ( -> )
.width LDZ2 #0018 SUB2 .height LDZ2 #0028 SUB2 ;sprites #0100 ADD2 !draw-mouth
@draw-you-win ( -> )
draw-bear-smile
#0048 .Screen/x DEO2
#c6 .Screen/auto DEO
#8f #0008 draw-you-win/draw
#80 #0020 draw-you-win/draw
#85 #0038 draw-you-win/draw
#8a #0050 draw-you-win/draw
#85 #0068 draw-you-win/draw
#80 #0080 draw-you-win/draw
#8f #0098 !draw-you-win/draw
&draw ( tint^ y* -> )
.Screen/y DEO2 ;you-win .Screen/addr DEO2
.Screen/sprite DEOk DEO JMP2r
@draw-decorations ( -> )
#00e8 #0098 #80 !draw-bear
.width LDZ2 #0018 SUB2 .height LDZ2 #0028 SUB2 #80 draw-bear
is-game-won ?draw-you-win JMP2r
@draw-stock ( -> )
.stock LDZk #00 EQU ?&empty ( stock^ )
@ -474,7 +605,7 @@
@column-y ( col^ -> y* )
bot-column DUP #13 find-top SWP SUB
#00 SWP #0008 MUL2 #0024 ADD2 JMP2r
#00 SWP #30 SFT2 #0024 ADD2 JMP2r
@draw-column ( idx^ -> )
DUP column-x ,&x STR2 ( idx^ ; x<-32+24*idx )
@ -491,7 +622,7 @@
&done POP POP2 JMP2r ( )
@maybe-draw-c ( card^ -> )
DUP ?{ POP !draw-spot-down } !draw-c
DUP ?{ POP !draw-spot-down } ( >> )
( assumes x/y already set )
@draw-c ( card^ -> )
@ -555,10 +686,10 @@
.move/y1 LDZ2 .move/y0 LDZ2 !scale
@max ( x* y* -> max* )
GTH2k JMP SWP2 POP2 JMP2r
GTH2k [ JMP SWP2 POP2 ] JMP2r
@dist ( a* b* -> |a-b|* )
GTH2k JMP SWP2 SUB2 JMP2r
GTH2k [ JMP SWP2 SUB2 ] JMP2r
@move-duration ( -> duration* )
.move/x1 LDZ2 .move/x0 LDZ2 dist ( dx* )
@ -630,8 +761,15 @@
@on-audio ( -> brk )
.audio LDZ ?{ BRK } play-audio BRK
@update-time ( -> )
.DateTime/sec DEI .seconds LDZ EQU STHk
.tick LDZ AND ?{ STHr #00 EQU .tick STZ JMP2r }
;draw-scores/time LDA2k INC2 SWP2 STA2
#00 .tick STZ !draw
@on-refresh ( -> brk )
.move/card LDZ #00 EQU ?{ update-move }
update-time
#00 .move/card LDZ EQU ?{ update-move }
on-refresh-bear ( ; possibly refresh bear )
.frame LDZk INC SWP STZ ( ; increment frame counter )
BRK
@ -641,7 +779,7 @@
DUP #e8 NEQ ?{ POP ;sprites #0040 ADD2 JMP2r }
DUP #f0 NEQ ?{ POP ;sprites #0080 ADD2 JMP2r }
DUP #f8 NEQ ?{ POP ;sprites #0040 ADD2 JMP2r }
DUP #00 NEQ ?{ POP ;sprites JMP2r }
DUP ?{ POP ;sprites JMP2r }
POP #0000 JMP2r
@draw-bear-eyes ( addr* x* y* -> )
@ -658,13 +796,9 @@
@on-refresh-bear ( -> )
.about LDZ ?on-refresh-about-bears
load-bear-frame ORAk ?&update POP2 JMP2r
&update .Screen/addr DEO2 ( ; s/addr<-addr )
#0098 .Screen/y DEO2 ( ; s/x<-0x98 )
#00e8 .Screen/x DEO2 ( ; s/y<-0xe8 )
#16 .Screen/auto DEO ( ; draw 2 tiles, inc addr and y )
#80 .Screen/sprite DEO ( ; draw it! )
JMP2r
#00 .dragging LDZ EQU ?{ draw-bear-oh }
load-bear-frame ORAk ?{ POP2 JMP2r }
.width LDZ2 #0018 SUB2 .height LDZ2 #0028 SUB2 !draw-bear-eyes
@on-mouse ( -> brk )
on-move
@ -677,6 +811,7 @@
@on-move ( -> )
.Mouse/x DEI2 .prev/mouse-x LDZ2 NEQ2 ?draw-mouse
.Mouse/y DEI2 .prev/mouse-y LDZ2 NEQ2 ?draw-mouse
[ LIT &last $1 ] .Mouse/state DEI DUP ,&last STR EQU ?{ draw-mouse }
JMP2r
@draw-mouse ( -> )
@ -718,23 +853,25 @@
&done POP2 POP2r POP2r !set-bg ( )
@clear-prev-mouse ( -> )
#00 .Screen/auto DEO
;blank .Screen/addr DEO2
.prev/mouse-x LDZ2 .Screen/x DEO2
.prev/mouse-y LDZ2 .Screen/y DEO2
#41 .Screen/sprite DEO JMP2r
.prev/mouse-x LDZ2 #0004 SUB2 .Screen/x DEO2
.prev/mouse-y LDZ2 #0005 SUB2 .Screen/y DEO2
[ LIT2 12 -Screen/auto ] DEO
#41 .Screen/sprite DEOk DEO JMP2r
@draw-curr-mouse ( -> )
.Mouse/x DEI2 DUP2 .prev/mouse-x STZ2 .Screen/x DEO2
.Mouse/y DEI2 DUP2 .prev/mouse-y STZ2 .Screen/y DEO2
.Mouse/x DEI2 DUP2 .prev/mouse-x STZ2 #0004 SUB2 .Screen/x DEO2
.Mouse/y DEI2 DUP2 .prev/mouse-y STZ2 #0005 SUB2 .Screen/y DEO2
.dragging LDZ ?&skip
;cursor .Screen/addr DEO2
.about LDZ ?{ #43 .Screen/sprite DEO !&skip } #41 .Screen/sprite DEO
( | draw )
[ LIT2 16 -Screen/auto ] DEO
;touch-chr #00 [ LIT2 00 -Mouse/state ] DEI NEQ #60 SFT2 ADD2 .Screen/addr DEO2
#cf .Screen/sprite DEOk DEO
&skip JMP2r
@on-click-down ( -> )
.Mouse/state DEI ( state^ )
.prev/mouse-state LDZ #ff EOR AND ( down^ )
#ff .prev/mouse-state LDZ EOR AND ( down^ )
#01 AND ?&ok JMP2r &ok
.about LDZ ?on-click-down-about
maybe-select-button ?&skip
@ -882,7 +1019,7 @@
inc-unless-empty STH ( root^ src^ [dst^] )
LDZk #40 EOR STHkr STZ #00 OVR STZ ( root^ src^ [dst^] ; dst<-src, src<-0 )
EQUk ?&done #01 SUB INCr ( root^ src-1^ [dst+1] )
EQUk ?&done .easy LDZ ?&done #01 SUB INCr ( root^ src-1^ [dst+1] )
LDZk #40 EOR STHkr STZ #00 OVR STZ ( root^ src-1^ [dst+1^] ; dst+1<-src-1, src-1<-0 )
EQUk ?&done #01 SUB INCr ( root^ src-2^ [dst+2] )
@ -894,6 +1031,7 @@
.Mouse/x DEI2 #0008 LTH2 ?&no ( ; x<8 )
.Mouse/x DEI2 #0017 GTH2 ?&no ( ; x>=23 )
.Mouse/y DEI2 #0020 GTH2 ?&no ( ; y>=32 )
.waste LDZ .stock LDZ ORA #00 EQU ?&no
deal-from-stock draw #01 JMP2r ( 1^ )
&no #00 JMP2r ( 0^ )
@ -925,17 +1063,18 @@
ROT2 NIP DUP start-drag draw #01 JMP2r
@maybe-select-waste ( -> bool^ )
.Mouse/y DEI2 #0008 LTH2 ?&no1 ( )
.Mouse/y DEI2 #0020 GTH2 ?&no1 ( )
top-waste STHk #00 EQU ?&no2 ( [t^] )
#001c #00 STHkr .waste SUB #0008 MUL2 ADD2 ( w=0x1c+8*index* [t^ w*] )
DUP2 ,&dx STR2 ( w* [t^ w*] ; dx<-w )
.Mouse/x DEI2 GTH2 ?&no2 ( [t^ w*] )
#002c #00 STHkr .waste SUB #0008 MUL2 ADD2 ( 0x2c+8*index* [t^ w*] )
.Mouse/x DEI2 LTH2 ?&no2 ( [t^] )
LIT2 [ &dx $2 ] #0008 STHr DUP ( dx* dy=8* t^ t^ )
start-drag draw #01 JMP2r ( 1^ )
&no2 POP2r POPr &no1 #00 JMP2r ( 0^ )
.waste LDZ #00 EQU ?&no1
.Mouse/y DEI2 #0008 LTH2 ?&no1 ( )
.Mouse/y DEI2 #0020 GTH2 ?&no1 ( )
top-waste STHk #00 EQU ?&no2 ( [t^] )
#001c #00 STHkr .waste SUB #30 SFT2 ADD2 ( w=0x1c+8*index* [t^ w*] )
DUP2 ,&dx STR2 ( w* [t^ w*] ; dx<-w )
.Mouse/x DEI2 GTH2 ?&no2 ( [t^ w*] )
#002c #00 STHkr .waste SUB #30 SFT2 ADD2 ( 0x2c+8*index* [t^ w*] )
.Mouse/x DEI2 LTH2 ?&no2 ( [t^] )
LIT2 [ &dx $2 ] #0008 STHr DUP ( dx* dy=8* t^ t^ )
start-drag draw #01 JMP2r ( 1^ )
&no2 POP2r POPr &no1 #00 JMP2r ( 0^ )
@maybe-select-tableau ( -> bool^ )
.Mouse/y DEI2 #0024 LTH2 ?&no1 ( )
@ -950,7 +1089,7 @@
INCr GTHkr STHr ?&loop ( y2 [lim i+1^] )
&no2 POP2 POP2r &no1 #00 JMP2r ( 0^ )
&col ( x* [lim^ i^] )
POP2 NIPr STHr !maybe-select-column ( bool^ )
POP2 NIPr STHr ( >> )
@maybe-select-column ( i^ -> bool^ )
.Mouse/y DEI2 #0024 LTH2 ?&no ( i^ )
@ -960,27 +1099,27 @@
GTHk ?&next !&done ( i^ top^ row^ [n*] )
&next ( i^ top^ row^ [n*] )
.Mouse/y DEI2 ( i^ top^ row^ y* [n*] )
STH2kr #0008 MUL2 #0024 ADD2 ( i^ top^ row^ y* lim=36+8n* [n*] )
STH2kr #30 SFT2 #0024 ADD2 ( i^ top^ row^ y* lim=36+8n* [n*] )
LTH2 ?&match INC INC2r !&loop ( i^ top^ row+1^ [n+1*] )
&done ( i^ top^ row^ [n*] )
.Mouse/y DEI2 ( i^ top^ row^ y* [n*] )
STH2kr #0008 MUL2 #0034 ADD2 ( i^ top^ row^ y* lim=52+8n* [n*] )
STH2kr #30 SFT2 #0034 ADD2 ( i^ top^ row^ y* lim=52+8n* [n*] )
LTH2 ?&match ( i^ top^ row^ [n*] )
POP2r POP2 &no POP #00 JMP2r ( 0^ )
&match ( i^ top^ row^ [n*] )
LDZk #00 EQU ?&cancel ( i^ top^ row^ [n*] )
LDZk #40 AND ?&cancel ( i^ top^ row^ [n*] )
STH2 SWP2r column-x ( x* [top^ row^ n*] )
STH2r #0008 MUL2 #001c ADD2 ( x* y=28+8n* [top^ row^] )
STH2r SWP ( x* y* row^ top^ )
STH2r #30 SFT2 #001c ADD2 ( x* y=28+8n* [top^ row^] )
STHr STHr ( x* y* row^ top^ )
start-drag draw #01 JMP2r ( 1^ )
&cancel ( i^ top^ row^ [n*] )
POP2 POP POP2r #00 JMP2r ( 0^ )
@maybe-select-button ( -> bool^ )
.Mouse/y DEI2
DUP2 #00b4 LTH2 ?&no
DUP2 #00bb GTH2 ?&no
DUP2 .height LDZ2 #000c SUB2 LTH2 ?&no
DUP2 .height LDZ2 #0005 SUB2 GTH2 ?&no
POP2 .Mouse/x DEI2
DUP2 #0008 LTH2 ?&no
DUP2 #0028 LTH2 ?&restart
@ -990,13 +1129,21 @@
DUP2 #0078 LTH2 ?&audio
DUP2 #0080 LTH2 ?&no
DUP2 #00a0 LTH2 ?&about
DUP2 #00a8 LTH2 ?&no
DUP2 #00c8 LTH2 ?&difficulty
&no POP2 #00 JMP2r
&restart POP2 reset #01 JMP2r
&restart POP2 restart #01 JMP2r
&quit POP2 quit #01 JMP2r
&audio POP2 toggle-audio #01 JMP2r
&about POP2 open-about #01 JMP2r
&difficulty POP2 toggle-difficulty #01 JMP2r
@game-won ( -> bool^ )
@on-game-win ( -> )
;draw-scores/games LDA2k INC2 SWP2 STA2
;draw-scores/wins LDA2k INC2 SWP2 STA2
save-scores !draw-buttons
@is-game-won ( -> bool^ )
.foundation #04 OVR ADD SWP ( lim^ start^ )
&loop ( lim^ pos^ )
LDZk #0f AND #0d NEQ ?&no ( lim^ pos^ )
@ -1010,15 +1157,31 @@
&disable stop-audio
&done !draw-buttons
@toggle-difficulty ( -> )
.easy LDZk #00 EQU SWP STZ !draw-buttons
@min ( x^ y^ -> min[x,y]^ )
LTHk JMP SWP POP JMP2r
( to automatically move a card, we need to know that )
( the alternate suits are both within 2 of its face )
( value, and that its "parallel" suit is within 3 )
( )
( for example, its not safe to auto-play 4h if it )
( might be needed for 3s, 3c, or 2d. )
@check-auto ( card^ -> ok^ )
DUP #30 AND ( card^ suit^ )
#04 SFT .auto ADD LDZ INC ( card^ base+1^ )
OVR #0f AND EQU ?&ok ( card^ ; base+1=face? )
POP #00 JMP2r ( 0^ )
&ok DUP #30 AND ( card^ suit^ )
&ok ( card^ suit^ )
DUP #30 AND ( card^ )
#04 SFT INC INC #03 AND ( card^ par^ )
.auto ADD LDZ #04 ADD ( card^ pface+4^ )
OVR #0f AND GTH ?&ok2 ( card^ )
POP #00 JMP2r ( 0^ )
&ok2 ( card^ )
DUP #30 AND ( card^ suit^ )
#04 SFT INC #03 AND ( card^ alt1^ )
INCk INC #03 AND ( card^ alt1^ alt2^ )
.auto ADD LDZ SWP ( card^ face2^ alt1^ )
@ -1066,10 +1229,10 @@
SWP #0f AND SWP STZ JMP2r ( ; zp<-face )
@post-move ( -> )
auto-move game-won ?draw-buttons JMP2r
auto-move is-game-won ?on-game-win JMP2r
@on-click-up ( -> )
.Mouse/state DEI #ff EOR ( not-state^ )
#ff .Mouse/state DEI EOR ( not-state^ )
.prev/mouse-state LDZ AND ( up^ )
#01 AND ?&ok JMP2r &ok
.dragging LDZ ?release
@ -1080,12 +1243,9 @@
.Controller/button DEI .prev/button STZ
BRK
@on-release ( -> )
JMP2r
@on-press ( -> )
.Controller/key DEI #0d EQU ?dump-state ( ; 0x0d: return )
.Controller/key DEI #1b EQU ?reset ( ; 0x1b: esc )
.Controller/key DEI #1b EQU ?restart ( ; 0x1b: esc )
.Controller/key DEI #20 EQU ?auto-move ( ; 0x20: space )
JMP2r
@ -1093,55 +1253,81 @@
@sprites ~sprites.tal
@restart-button
@cursor 80c0 e0f0 f8e0 1000
@blank 0000 0000 0000 0000
@touch-chr [
0000 0000 0814 1417 0000 0000 0008 0808
0000 0000 0000 00c0 0000 0000 0000 0000
1010 2010 1008 0700 0f0f 1f0f 0f07 0000
2010 1010 2020 c000 c0e0 e0e0 c0c0 0000 ]
&down [
0000 0000 0000 0817 0000 0000 0000 0008
0000 0000 0000 00c0 0000 0000 0000 0000
1010 2010 1008 0700 0f0f 1f0f 0f07 0000
2010 1010 2020 c000 c0e0 e0e0 c0c0 0000 ]
@restart-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f ce d5 cc d5 d6 ff 7f
ff ff ff ff ff ff ff ff ff 62 df 67 fb 47 ff ff
ff ff ff ff ff ff ff ff ff 36 6a 62 6a 6a ff ff
fe ff ff ff ff ff ff fe fe 63 b7 77 b7 b7 ff fe
@quit-button
@quit-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f ff ff ff ff ff ff 7f
ff ff ff ff ff ff ff ff ff cd b5 b5 b5 cc f7 ff
ff ff ff ff ff ff ff ff ff 51 5b 5b 5b 5b ff ff
fe ff ff ff ff ff ff fe fe ff ff ff ff ff ff fe
@audio-off-button
@audio-off-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f da aa 8a aa a8 ff 7f
ff ff ff ff ff ff ff ff ff 9b aa aa aa 9b ff ff
ff ff ff ff ff ff ff ff ff 3e d5 dd d5 3e ff ff
fe ff ff ff ff ff ff fe fe c9 5b 49 5b db ff fe
@audio-on-button
@easy-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f ff ff ff ff ff ff 7f
ff ff ff ff ff ff ff ff ff 1b 75 11 75 15 ff ff
ff ff ff ff ff ff ff ff ff 8a 7a 98 ed 1d ff ff
fe ff ff ff ff ff ff fe fe ff ff ff ff ff ff fe
@hard-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f ff ff ff ff ff ff 7f
ff ff ff ff ff ff ff ff ff 5b 55 11 55 55 ff ff
ff ff ff ff ff ff ff ff ff 33 55 35 55 53 ff ff
fe ff ff ff ff ff ff fe fe ff ff ff ff ff ff fe
@audio-on-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f da aa 8a aa a8 ff 7f
ff ff ff ff ff ff ff ff ff 9b aa aa aa 9b ff ff
ff ff ff ff ff ff ff ff ff 3e d5 dd d5 3e ff ff
fe ff ff ff ff ff ff fe fe cf 57 57 57 d7 ff fe
@about-button
@about-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f fe fd fc fd fd ff 7f
ff ff ff ff ff ff ff ff ff ce 55 4d 55 4e ff ff
ff ff ff ff ff ff ff ff ff d4 56 56 56 c6 ff ff
fe ff ff ff ff ff ff fe fe 7f ff ff ff ff ff fe
@new-game-button
@new-game-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f 99 ab a9 ab a9 ff 7f
ff ff ff ff ff ff ff ff ff 57 56 56 56 af ff ff
ff ff ff ff ff ff ff ff ff 37 ea a2 aa 2a ff ff
fe ff ff ff ff ff ff fe fe 59 ab a9 ab a9 ff fe
@start-button
@start-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f fe fd fe ff fc ff 7f
ff ff ff ff ff ff ff ff ff 23 f6 76 b6 76 ff ff
ff ff ff ff ff ff ff ff ff 66 ab 27 ab ab ff ff
fe ff ff ff ff ff ff fe fe 3f 7f 7f 7f 7f ff fe
@resume-button
@resume-button ( 4x1 tiles )
7f ff ff ff ff ff ff 7f 7f e7 ea e6 ea eb ff 7f
ff ff ff ff ff ff ff ff ff 31 ef 33 fd 23 ff ff
ff ff ff ff ff ff ff ff ff 5a 55 55 55 15 ff ff
fe ff ff ff ff ff ff fe fe e7 5f 47 5f 67 ff fe
@logo
@logo ( 11x2 tiles )
6c fe 38 38 38 39 3b 7f 48 a4 20 20 20 21 22 40
6c fe 38 70 e0 c0 80 00 48 a4 20 40 80 00 00 00
00 07 1c 38 38 38 38 7c 00 04 10 20 20 20 20 40
@ -1165,6 +1351,45 @@
3f 3b 39 38 38 38 fe 6c 20 22 21 20 20 20 a4 48
00 80 c0 e0 70 38 fe 6c 00 00 00 80 40 20 a4 48
@you-win ( 13x2 tiles )
6c fe 38 1c 0e 07 03 03 24 5a 18 0c 06 03 01 01
6c fe 38 70 e0 c0 80 80 24 5a 18 30 60 c0 80 80
00 07 1c 38 38 38 38 7c 00 03 0c 18 18 18 18 3c
00 c0 70 38 38 38 38 7c 00 c0 30 18 18 18 18 3c
6c fe 38 38 38 38 38 7c 24 5a 18 18 18 18 18 3c
6c fe 38 38 38 38 38 7c 24 5a 18 18 18 18 18 3c
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
6c fe 38 38 38 38 38 7c 24 5a 18 18 18 18 18 3c
6c fe 38 38 38 38 38 7c 24 5a 18 18 18 18 18 3c
6c fe 38 38 38 38 38 7c 24 5a 18 18 18 18 18 3c
6c fe 38 38 38 38 38 7c 24 5a 18 18 18 18 18 3c
6c fe 3c 3e 3f 3b 39 38 24 5a 1c 1e 1b 19 18 18
6c fe 38 38 38 b8 f8 f8 24 5a 18 18 18 98 d8 78
03 03 03 03 03 03 0f 06 01 01 01 01 01 01 05 02
80 80 80 80 80 80 e0 c0 80 80 80 80 80 80 a0 40
38 38 38 38 38 1c 07 00 18 18 18 18 18 0c 03 00
38 38 38 38 38 70 c0 00 18 18 18 18 18 30 c0 00
38 38 38 38 38 1c 07 00 18 18 18 18 18 0c 03 00
38 38 38 38 38 70 c0 00 18 18 18 18 18 30 c0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
38 38 1c 0e 07 03 0f 06 18 18 0c 06 03 01 05 02
38 38 7c ee c7 83 ef c6 18 18 3c 66 c3 81 a5 42
38 38 70 e0 c0 80 e0 c0 18 18 30 60 c0 80 a0 40
38 38 38 38 38 38 fe 6c 18 18 18 18 18 18 5a 24
38 38 38 38 38 38 fe 6c 18 18 18 18 18 18 5a 24
78 38 38 38 38 38 fe 6c 38 18 18 18 18 18 5a 24
@icon-24 ( 3x3 tiles )
00 00 03 02 00 01 01 01 03 07 07 07 03 03 06 06
00 00 00 00 00 c3 c3 c3 00 81 81 ff ff ff bd bd
00 00 c0 40 00 80 80 8e c0 e0 e0 e0 c0 c0 60 6e
00 00 00 00 00 00 00 00 07 07 07 03 03 01 00 00
3c 18 00 18 00 00 00 00 ff ff ff ff ff ff ff ff
01 08 04 00 00 00 00 00 ef ef ef cf cf 8f 0f 1f
00 00 00 00 00 00 00 00 01 03 07 1f 3f 3f 7f 7f
00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 ff fe fe fc fc f8 f0 f0
@corner 00 00 00 1f 1f 18 18 18
@vert 18 18 18 18 18 18 18 18
@horiz 00 00 00 ff ff 00 00 00

BIN
logo.chr

Binary file not shown.

BIN
logo.chr.nmt Normal file

Binary file not shown.