( teatimer )

|00 @System &vector $2 &expansion $2 &wst $1 &rst $1 &metadata $2 &r $2 &g $2 &b $2 &debug $1 &state $1
|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
|80 @Controller &vector $2 &button $1 &key $1
|90 @Mouse &vector $2 &x $2 &y $1 &ylb $1 &state $1 &chord $1 &pad $4 &scrolly &scrolly-hb $1 &scrolly-lb $1
|c0 @DateTime &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1

|000

	@timeleft $2
	@height $2

|100

@on-reset ( -> )
	( | meta )
	;meta #06 DEO2
	( | theme )
	#f0f7 .System/r DEO2
	#f0fc .System/g DEO2
	#f0f8 .System/b DEO2
	( | vector )
	;on-frame .Screen/vector DEO2
	;on-mouse .Mouse/vector DEO2
	( | screen size )
	#0078 .Screen/width DEO2
	#0110 .Screen/height DEO2
	<redraw>
	BRK

@on-frame-freeze ( -> )
	[ LIT &lock $1 ] INCk ,&lock STR
	?{ ;on-frame .Screen/vector DEO2 }
	BRK

@on-frame ( -> )
	.timeleft LDZ2 ORAk ?{ POP2 BRK }
	[ LIT2 40 &f $1 ] INCk ,&f STR
	NEQ ?{
		[ LIT2 00 _&f ] STR
		#0001 SUB2 DUP2 <set-seconds>
		ORAk ?{ <ring> } }
	POP2 BRK

@on-mouse ( -> )
	#4100 [ LIT2 00 -Mouse/state ] DEI NEQ #30 SFT2 ;hand-icn ADD2 <update-cursor>
	.Mouse/state DEI ?{ BRK }
	( | down )
	<freeze-timer>
	.Mouse/y DEI2 #0010 SUB2 DUP2 #00f0 GTH2 ?{ DUP2 #22 SFT2 <set-height> }
	POP2 BRK

@meta 00
	( name ) "Teatime 0a
	( details ) "A 20 "Countdown 20 "Timer 0a
	( author ) "By 20 "Dave 20 "Van 20 "Ee 0a
	( date ) "24 20 "Jul 20 "2024 $1
	( elements ) 00

(
@|core )

@<ring> ( -- )
	( bell ) #0718 DEO
	JMP2r

@<freeze-timer> ( -- )
	;on-frame-freeze .Screen/vector DEO2
	#c0 ;on-frame-freeze/lock STA
	JMP2r

@<set-height> ( distance* -- )
	#00f0 SWP2 SUB2 #02 SFT2 #000f MUL2

@<set-seconds> ( seconds* -- )
	DUP2 .timeleft LDZ2 EQU2 ?{ .timeleft STZ2
		<draw-remains> !<redraw-bar> }
	POP2 JMP2r

(
@|drawing )

@<redraw> ( -- )
	<redraw-bar>
	<draw-labels>
	( >> )

@<draw-markers> ( -- )
	[ LIT2 00 -Screen/auto ] DEO
	#00f1 #0000
	&>l ( -- )
		( | every 5th )
		DUP #03 AND ?{
			DUP2 #0009 ADD2 .Screen/y DEO2
			#0030 .Screen/x DEO2
			DUP #02 SFT #03 AND #00 EQU #00 SWP #30 SFT2 ;mark-icn ADD2 .Screen/addr DEO2
			[ LIT2 05 -Screen/sprite ] DEO }
		INC2 GTH2k ?&>l
	POP2 POP2 JMP2r

@<draw-labels> ( -- )
	#003c .Screen/x DEO2
	#00a9 .Screen/y DEO2
	;dict/min5 <draw-uf2>
	#003c .Screen/x DEO2
	#0059 .Screen/y DEO2
	;dict/min10 <draw-uf2>
	#003c .Screen/x DEO2
	#000d .Screen/y DEO2
	;dict/min15
	( >> )

@<draw-uf2> ( addr* -- )
	[ LIT2 15 -Screen/auto ] DEO
	&>while ( -- )
		LDAk <draw-char>
		INC2 LDAk ?&>while
	POP2 JMP2r

@<draw-remains> ( -- )
	#003c .Screen/x DEO2
	#00f5 .Screen/y DEO2
	[ LIT2 15 -Screen/auto ] DEO
	.timeleft LDZ2 ORAk ?{ POP2 ;dict/min0 !<draw-uf2> }
	( | minutes )
	( x0 ) DUP2 #0258 DIV2 NIP DUP #00 EQU ?{
		DUP [ LIT "0 ] ADD <draw-char> }
	POP
	( 0x ) DUP2 #003c DIV2 NIP <draw-uf2-dec>
	( : ) [ LIT ": ] <draw-char>
	( | seconds )
	( x0 ) DUP2 #003c DIV2k MUL2 SUB2 #000a DIV2 NIP <draw-uf2-dec>
	( 0x ) #000a DIV2k MUL2 SUB2 NIP
	( >> )

@<draw-uf2-dec> ( -- )
	#0a DIVk MUL SUB [ LIT "0 ] ADD
	( >> )

@<draw-char> ( char -- )
	#20 SUB #00 SWP
	( addr ) DUP2 #50 SFT2 ;font/glyphs ADD2 .Screen/addr DEO2
	( move ) ;font ADD2 LDA #00 SWP .Screen/x DEI2 ADD2
	( draw ) [ LIT2 01 -Screen/sprite ] DEOk DEO
	.Screen/x DEO2
	JMP2r

@<redraw-bar> ( -- )
	;halftone-icn .Screen/addr DEO2
	( | top )
	#0010 .Screen/x DEO2
	#0010 .Screen/y DEO2
	[ LIT2 f1 -Screen/auto ] DEO
	[ LIT2 01 -Screen/sprite ] DEOk DEOk DEOk DEO
	( | bottom )
	#0010 .Screen/x DEO2
	#0090 .Screen/y DEO2
	[ LIT2 d1 -Screen/auto ] DEO
	[ LIT2 01 -Screen/sprite ] DEOk DEOk DEOk DEO
	( >> )

@<draw-bar> ( -- )
	( y2 ) .Screen/height DEI2 #0010 SUB2
	( y1 ) #0100 .timeleft LDZ2 #000f DIV2 #20 SFT2 SUB2
	( | paint )
	[ LIT2 32 -Screen/auto ] DEO
	;line-icn .Screen/addr DEO2
	#0010 .Screen/x DEO2
	( | fill )
	[ LIT2r 05 -Screen/sprite ]
	&>l ( -- )
		DUP2 .Screen/y DEO2
		DEOkr
		INC2 GTH2k ?&>l
	POP2 POP2 POP2r JMP2r

@<update-cursor> ( color addr* -- )
	[ LIT2 00 -Screen/auto ] DEO
	;fill-icn .Screen/addr DEO2
	#40 <draw-cursor>
	.Screen/addr DEO2
	.Mouse/x DEI2 ,<draw-cursor>/x STR2
	.Mouse/y DEI2 ,<draw-cursor>/y STR2
	( >> )

@<draw-cursor> ( color -- )
	[ LIT2 &x $2 ] .Screen/x DEO2
	[ LIT2 &y $2 ] .Screen/y DEO2
	.Screen/sprite DEO
	JMP2r

(
@|assets )

@dict
	&min0 "Done. $1
	&min5 "5 20 "Min $1
	&min10 "10 20 "Min $1
	&min15 "15 20 "Min $1

~assets.tal