use sprites to draw cursor and board this is a bit more code, but ten times less cycles to draw the board and the cursor. the latter now looks slightly different, this is somewhat unintentional, but only slightly. also board is now drawn at the background layer, while everything else is on foreground. doesn't matter much, but makes more sense. in uxn32 redrawing the cursor erases figures. looks awful and is a bug. but this happens probably because uxn32 lacks the recent update to a screen device.
la-ninpre aaoth@aaoth.xyz
Tue, 29 Aug 2023 17:54:41 +0300
1 files changed,
58 insertions(+),
44 deletions(-)
jump to
M
tictactoe.tal
→
tictactoe.tal
@@ -25,26 +25,31 @@ ( | size )
#0050 .Screen/width DEO2 #0050 .Screen/height DEO2 ( | draw board ) - ( len 0x30 col 3 foreground ) #3043 - ( horizontal, start at 000f ) #010f - ( multiplier ) LIT2r 0404 + ;line-h .Screen/addr DEO2 + [ LIT2 52 -Screen/auto ] DEO + [ LIT2r 0f -Screen/sprite ] #04 &hor ( -- ) - OVR2 OVR2 - ( x ) #0010 .Screen/x DEO2 - ( y ) STHrk #01 SUB #40 SFT ADD #00 SWP .Screen/y DEO2 - ( ) draw-line - ( ) LITr 01 SUBr STHrk ?&hor - POPr #0010 .Screen/y DEO2 - ( shadow ) OVR2 OVR2 POP INC draw-line - ( vertical ) SWP INC SWP + #0010 .Screen/x DEO2 + DUP #01 SUB #00 SWP #40 SFT2 #000f ADD2 .Screen/y DEO2 + DEOrk + #01 SUB DUP ?&hor + POP #0010 .Screen/x DEO2 + #0040 .Screen/y DEO2 + DEOrk + ;line-v .Screen/addr DEO2 + [ LIT2 51 -Screen/auto ] DEO + #04 &ver ( -- ) - OVR2 OVR2 - ( y ) #0010 .Screen/y DEO2 - ( x ) STHrk #01 SUB #40 SFT ADD #00 SWP .Screen/x DEO2 - ( ) draw-line - ( ) LITr 01 SUBr STHrk ?&ver - POPr #0010 .Screen/x DEO2 - ( shadow ) POP2 #01 draw-line + #0010 .Screen/y DEO2 + DUP #01 SUB #00 SWP #40 SFT2 #000f ADD2 .Screen/x DEO2 + DEOrk + #01 SUB DUP ?&ver + POP #0010 .Screen/y DEO2 + #0040 .Screen/x DEO2 + DEOr + ( | what is that? :} ) + #fe ;line-h STA + #00 ;line-v/e STA &restart ( -> ) ;on-controller .Controller/vector DEO2 init-game BRK@@ -71,10 +76,9 @@ &commit ( x y addr -> )
( save move ) .game/current-player LDZk ROT STZk ( display ) POP STHk SWP2 STH2k draw-move-at ( swap player ) ROTr STHr #03 EOR SWPk STZ - ( update cursor ) STH2r ROT draw-cursor-at POP - ( ) .game/moves LDZk INC SWP STZk - POP - ( game can't be ended before 5 moves ) #05 LTH ?&end + ( update cursor ) STH2r ROT #05 MUL draw-cursor-at POP + ( if moves<5 => skip check ) .game/moves LDZk INC SWP STZk + POP #05 LTH ?&end check-win BRK &up ( x y key -> ) POP clear-cursor move/- !&redraw@@ -88,7 +92,7 @@ ( >> )
&redraw ( x y -> ) ( save x y ) SWPk .game/x STZk NIP INC STZ - .game/current-player LDZ draw-cursor-at + .game/current-player LDZ #05 MUL draw-cursor-at &end ( -> ) BRK@@ -109,19 +113,30 @@ POP
( | clear screen ) #0010 .Screen/x DEO2k INC2 INC2 DEO2 - [ LIT2 80 -Screen/pixel ] DEO - ( cursor draw ) #0101 #01 + [ LIT2 c0 -Screen/pixel ] DEO + ( cursor draw ) #0101 #05 ( >> ) @draw-cursor-at ( x y col -- ) - STH pos-to-xy OVR2 OVR2 .Screen/y DEO2 - .Screen/x DEO2 - ( top ) #0e STHrk #01 draw-line - ( right ) #0e STHrk #02 draw-line - ( reset pos ) .Screen/y DEO2 - .Screen/x DEO2 - ( left ) #0e STHrk #02 draw-line - ( bottom ) #0f STHr #01 !draw-line + #40 ORA STH pos-to-xy + ( ) .Screen/y DEO2k + POP SWP2 .Screen/x DEO2k + POP ;line-h .Screen/addr DEO2 + [ LIT2 12 -Screen/auto ] DEO + ( top ) LITr -Screen/sprite DEOrk + .Screen/x DEO2k + POP SWP2 #000e ADD2k NIP2 .Screen/y DEO2 + ( bottom ) DEOrk + ;line-v .Screen/addr DEO2 + [ LIT2 11 -Screen/auto ] DEO + .Screen/y DEO2k + POP SWP2 .Screen/x DEO2k + ( left ) POP DEOrk + #000e ADD2 .Screen/x DEO2 + .Screen/y DEO2 + ( right ) DEOr + [ LIT2 00 -Screen/auto ] DEO + JMP2r @draw-move-at ( player x y -- ) pos-to-xy@@ -159,11 +174,11 @@ POP
( align ) .Screen/x DEI2k #0008 SUB2 ROT DEO2 [ LIT2 05 -Screen/auto ] DEO ;tie DUP2 .Screen/addr DEO2 - [ LIT2 01 -Screen/sprite ] DEOk + [ LIT2 41 -Screen/sprite ] DEOk DEO .Screen/addr DEO2 [ LIT2 00 -Screen/auto ] DEO - [ LIT2 11 -Screen/sprite ] DEO + [ LIT2 51 -Screen/sprite ] DEO JMP2r &x ( fig -- ) ;x .Screen/addr DEO2@@ -172,16 +187,9 @@ &o ( fig -- )
;o .Screen/addr DEO2 ( >> ) &end ( col -- ) - .Screen/sprite DEO + #40 ORA .Screen/sprite DEO JMP2r - -@draw-line ( len col dir -- ) - .Screen/auto DEO - SWP &while SWP .Screen/pixel DEOk - POP SWP #01 SUB DUP ?&while - POP2 [ LIT2 00 -Screen/auto ] DEO - JMP2r - + ( @|utils )@@ -219,3 +227,9 @@ @tie
[ 0000 e010 1008 0807 0824 1410 0146 3800 ] +@line-h + [ ff00 0000 0000 0000 ] + +@line-v + [ 8080 8080 8080 80 &e 80 ] +