( "happy" demo 11/14/83 )

forget it

: it ;

4 mode
17 0 3 color
10 vtab 10 htab
print "  ... "

500 string balloon
30 string positions
10 string colors
10 variable height
0 variable size
0 variable fill.size
0 variable x
0 variable y
0 variable char.seg
0 variable char.addr
0 variable char.offset
0 variable key.pressed

: clrkey begin getkey 0 = until ;

: check.key getkey if 1 -> key.pressed then ;

: charprint
  8 * char.offset + -> char.addr
  char.seg segment
  y dup size 8 * + swap do char.addr peek
  x dup size 8 * + swap do dup 128 and if
      i j move i fill.size + j fill.size + fill
    then
  2 * size +loop drop char.addr 1 + -> char.addr
  size +loop local segment x size 8 * + -> x ;

: gr.print
  4 -> size 3 -> fill.size
  61440 -> char.seg
  64110 -> char.offset
  begin dup peek 13 <> while
  dup peek charprint
  1 + repeat drop y size 8 * + -> y ;

: top.line
  3 gcolor 16 -> x 32 -> y pad assign " Happiness "
  pad gr.print ;

: definition
  17 0 1 color 1 gcolor 10 vtab
  print " [1] : , 㭠;      " cr
  print " [2] : ﭨ  " cr
  print " [2b] : ⭮ 㤮⢮७ " cr
  print " [3]  ,   " cr
  print " [4]   筮  ࠔ/87  "
  0 72 move 319 136 box ;

: setup
  10 0 do rnd abs 300 mod i 2 * positions pokew loop
  10 0 do rnd abs 3 mod 1 + i colors poke loop ;

: load.balloon 0 balloon 499 memory read " balloon.blk " ;

: one.balloon
  i colors peek gcolor
  i 32 * 4 +            ( x )
  i 2 * positions peekw ( y )
  move 0 balloon putblk ;

: move.up
  one.balloon
  i 2 * positions dup peekw height - dup -36 < if 250 + then
  swap pokew
  one.balloon ;

: first 10 0 do one.balloon loop ;

: rise
  first
  0 begin 1 + 10 0 do move.up loop
   check.key dup 300 > key.pressed 
  or until drop ;

: happy
  load.balloon
  setup 4 mode
  exmode 17 0 3 color
  top.line 
  definition
  rise
  pad 127 + peek 68 = if 
   key.pressed if read " menu " else read " life " then
  else 
   4 mode
  then ;
close run
