( netspeed ) ( m15o@posteo.net ) ( font ) | 0 #0000 #003c #0024 #0024 #0024 #0024 #0024 #003c ; | 1 #0000 #0008 #0008 #0008 #0008 #0008 #0008 #0008 ; | 2 #0000 #003c #0004 #0004 #003c #0020 #0020 #003c ; | 3 #0000 #003c #0004 #0004 #003c #0004 #0004 #003c ; | 4 #0000 #0024 #0024 #0024 #003c #0004 #0004 #0004 ; | 5 #0000 #003c #0020 #0020 #003c #0004 #0004 #003c ; | 6 #0000 #003c #0020 #0020 #003c #0024 #0024 #003c ; | 7 #0000 #003c #0004 #0004 #0004 #0004 #0004 #0004 ; | 8 #0000 #003c #0024 #0024 #003c #0024 #0024 #003c ; | 9 #0000 #003c #0024 #0024 #003c #0004 #0004 #0004 ; ( characters ) | player #0 #0 #ff00 #8100 #813c #813c #813c #813c #8100 #ff00 ; | target #0 #0 #00ff #0081 #0081 #0081 #0081 #0081 #0081 #00ff ; : step #2 ; : xrand #0 #50 rand ; : yrand #0 #50 rand ; : -! ( n adr -- ) dup @ rot - swap ! ; : +! ( n adr -- ) dup @ rot + swap ! ; : -d! ( n adr -- ) dup d@ rot - swap d! ; ( lexicon for characters ) : char/x ( adr -- x ) ; : char/y ( adr -- y ) #1 + ; : char/s ( adr -- 's ) #2 + ; ( keyboard lexicon ) : key #3 d@ ; : =key? key = ; : ?up #57 =key? ; : ?down #53 =key? ; : ?left #41 =key? ; : ?right #44 =key? ; ( selecting a character ) | 'sel #0 ; : select ( c -- ) 'sel ! ; : sel ( -- c ) 'sel @ ; : sel/x ( -- x ) sel char/x ; : sel/y ( -- y ) sel char/y ; : sel/s ( -- s ) sel char/s ; ( interacting with selection ) : go sel/x @ #1 d! sel/y @ #2 d! ; : spawn xrand sel/x ! yrand sel/y ! ; : draw go sel/s sprite ; : up? ?up if step sel/y -! then ; : down? ?down if step sel/y +! then ; : left? ?left if step sel/x -! then ; : right? ?right if step sel/x +! then ; | 'collider #0 ; : collider/x 'collider @ ; : collider/y 'collider @ #1 + ; : ?x-collide sel/x @ #8 + collider/x @ > sel/x @ collider/x @ #8 + < and ; : ?y-collide sel/y @ #8 + collider/y @ > sel/y @ collider/y @ #8 + < and ; : ?collide 'collider ! ?x-collide ?y-collide and ; ( score ) | score #0 ; : num #8 * sprite #8 #1 -d! ; : do. dup #a % num #a / dup ; : .score #ff #1 d! #0 #2 d! score @ ' do. until drop ; ( high level subsystems ) : listen up? down? left? right? ; : init target select spawn player select spawn ; : hit target select spawn #1 score +! ; : collide target ?collide if hit then ; : handle-player player select listen draw collide ; : handle-target target select draw ; : game clear handle-player handle-target .score ; ( setup ) init ' game #0 d!