diff --git a/kodiak.tal b/kodiak.tal index 8162321..b0543ea 100644 --- a/kodiak.tal +++ b/kodiak.tal @@ -243,7 +243,6 @@ INC GTHk ?&loop ( lim^ zp+1^ ) &done POP POP2 JMP2r ( ) -( TODO: handle held cards in foundation by drawing one lower, or blank if ace held ) @draw-foundation ( -> ) #0030 ,&y STR2 ( ; y0<-48 ) .foundation #04 OVR ADD SWP ( lim^ zp^ ) @@ -258,7 +257,7 @@ @draw-tableau #0700 &loop DUP draw-column INC GTHk ?&loop POP2 JMP2r -@column-x ( idx^ -> x* ) +@column-x ( col^ -> x* ) #00 SWP #0018 MUL2 #0030 ADD2 JMP2r @column-y ( col^ -> y* ) @@ -304,11 +303,30 @@ DUP #31 LTH #03 MUL ADD #24 SUB JMP2r < DUP #11 LTH #1d MUL ADD #09 ADD JMP2r +@stock-pos ( card^ -> x* y* ) + #00 SWP #0008 SWP2 .stock SUB ( x=8* i* ) + #03 SFT2 #fff8 SUB2 JMP2r ( x*, y=8-i/8* ) + +@waste-pos ( card^ -> x* y* ) + #00 SWP .waste SUB #30 SFT2 ( 8i* ) + #001c ADD2 #0008 JMP2r ( x=28+8i* y=8* ) + +@foundation-pos ( card^ -> x* y* ) + #00 SWP #0008 SWP2 .foundation SUB ( x=8* i* ) + #50 SFT2 #0020 ADD2 #0008 SWP2 JMP2r ( x*, y=48+32i* ) + +@tableau-pos ( card^ -> x* y* ) + STHk #13 DIV STHk column-x ( x* [card^ col^] ) + #00 STH2r #13 MUL SUB #30 SFT2 ( x* 8pos* ) + #0024 ADD2 JMP2r ( x* y=36+8pos* ) + @card-pos-xy ( card^ -> x* y* ) - ( TODO ) - ( - copy from other implementations ) - ( - consider refactoring them to use this intead ) - POP #ffff #ffff JMP2r ( FIXME ) + #00 SWP .stock + #33 ADD GTHk ?{ POP !stock-pos } + #18 ADD GTHk ?{ POP !waste-pos } + #04 ADD GTHk ?{ POP !foundation-pos } + #85 ADD GTHk ?{ POP !tableau-pos } + POP2 #010e DEO #0000 #0000 JMP2r ( ; error, x=0, y=0 ) ( we expect 0 <= time <= 16 ) @move-pos-xy ( -> x* y* ) @@ -338,25 +356,32 @@ .move/src LDZ LDZ !draw-c ( ; draw card ) @end-move ( -> ) - ( TODO ) - ( - copy the card over ) - ( - do any necessary flipping, i.e. remove-card ) - ( - zero out moving ) + .move/src LDZ STH LDZ ( card^ [src^] ) + .move/dst LDZ STZ ( [src^] ; dst<-card ) + STHr remove-card ( ; remove card, flip, etc. ) + .move #0b initialize ( ; zero out move ) + post-move draw ( ; finish move and draw ) + !auto-move ( ; start another auto move maybe? ) @on-refresh ( -> brk ) .move/src LDZ #00 EQU ?{ update-move } + on-refresh-bear ( ; possibly refresh bear ) + .frame LDZk INC SWP STZ ( ; increment frame counter ) + BRK + +@on-refresh-bear ( -> ) .frame LDZ DUP #e8 NEQ ?{ ;sprites #0040 ADD2 !&update } DUP #f0 NEQ ?{ ;sprites #0080 ADD2 !&update } DUP #f8 NEQ ?{ ;sprites #0040 ADD2 !&update } DUP #00 NEQ ?{ ;sprites !&update } - !&done + 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! ) - &done .frame LDZk INC SWP STZ BRK + JMP2r @on-mouse ( -> brk ) on-move @@ -429,6 +454,7 @@ #01 AND ?&ok JMP2r &ok maybe-select-stock ?&skip maybe-select-waste ?&found + ( TODO: maybe-select-foundation ) maybe-select-tableau ?&found ( not found ) .dragging #05 !initialize &found clear-prev-mouse !draw-curr-hold @@ -600,7 +626,6 @@ start-drag draw #01 JMP2r ( 1^ ) &no2 POP2r POPr &no1 #00 JMP2r ( 0^ ) -( TODO: handle empty column ) @maybe-select-tableau ( -> bool^ ) .Mouse/y DEI2 #0024 LTH2 ?&no1 ( ) .Mouse/x DEI2 #0030 LTH2 ?&no1 ( )