\ Tegels, leuke cijfers: 15 22 38 44 48 53 75 82 83 

hex v: fresh  inside definitions
0 value RND  23 to rnd              \ any number allowed as seed
: KIES      ( u1 -- u2 )            \ u2 = 0 to u1-1
    rnd dm 31421 * dm 6927 +  FFFF and dup to rnd  * 10 rshift ;

need bitarray
need count*

v: fresh  inside also  definitions
         20 constant MAAT       \ Maat van een zijde van de tegel
    maat 2/ constant VAK        \ Vak grootte
 vak negate constant -VAK       \ Negatieve vak grootte
     vak 1- constant MASK       \ Bitmasker voor een vak
  vak dup * constant MATRIX     \ Punten in een vak
         BL constant PAT        \ Used pattern output

matrix bitarray TEGEL

: RIJ?      ( t -- f )      \ Een van de pixels in een rijtje bezet?
    matrix 1- and  dup tegel get* >r            \ t      b0     Positie gebruikt
    dup mask and >r                             \ t      b0 r
    r@ 0= vak and over +  1-  tegel get*       \ t b1   b0 r
    swap r> mask = -vak and +  1+  tegel get*  \ b1 b2  b0
    r> or or ;                                  \ b3

v: extra definitions
08 value DOTS   ( Aantal punten van het patroon )
: %         ( +n -- )       to dots ;

: P         ( +n -- )
    to rnd                          \ Als de Brody generator gebruikt wordt
    tegel *zero                     \ Tegel begint blauw
    dots 0 ?do                      \ Aantal anders kleurde tegeltjes
        matrix kies                 \ Kies positie
        begin  dup rij? while       \ Is positie bezet?
            drop  matrix kies       \ Kies nieuwe positie
            key? if drop leave then \ Noodknop
        repeat
        tegel *set                  \ Zet anders gekleurd tegeltje
    loop ;

\ 44 = donker blauw, 46 = donker cyaan, 47 = grijs, 104 = paars blauw
\ 106 = cyaan, 107 = helder wit, 0 = standaard kleur
: COLOR     ( +n -- )
    hor >r  dm 27 emit  ch [ emit   \ CSI
    base @ hex  swap  0 .r  base !  \ ASCII waarden van SGR parameters
    ch m emit  r> to hor ;          \ Sluit & corrigeer HOR

v: inside definitions
1 value NAAST       \ Tegels naast elkaar
1 value ONDER       \ Tegels onder elkaar
106 value BASIS     \ Basis kleur tegels
107 value PUNT      \ Patroon tegels
000 value SYM       \ Symmetrie

v: extra definitions
: LB     106 to basis ;  : DB      44 to basis ;
: MB      46 to basis ;  : GR      42 to basis ;
: GRIJS   47 to basis ;  : ANTRA  100 to basis ;
: INV      0 to sym ;    : NEG      1 to sym ;

v: inside definitions
: .TEGEL    ( n -- )
    tegel get* if           \ Lees kleur, en druk tegeltje
        pat dup BL = if punt else basis then
    else bl basis then
    color  dup emit emit ;

: .LINKS    ( r -- )    vak bounds do  i .tegel  loop ;
: .RECHTS   ( r -- )    vak sym - for  dup i + .tegel  next drop ;

: .TOP      ( -- )
    matrix 0 do                     \ Een tegel
        cr  naast
        begin
            i .links  i .rechts  0 color  4 us
        1- ?dup 0= until            \ Rij gedaan?
        sym if  i .tegel  then  0 color
    vak +loop ;                     \ Volgende rij
: .BOT      ( -- )
    0 matrix vak - do
        cr  naast
        begin
            i .links  i .rechts  0 color  4 us
        1- ?dup 0= until            \ Rij gedaan?
        sym if  i .tegel  then  0 color
    vak negate +loop ;

v: extra definitions
: .T        ( -- )  \ Toon tegel wandje met voegen
    onder                           \ Aantal tegels onder elkaar
    begin
        .top  .bot
    1- ?dup 0= until                \ Rij tegels er onder?
    cr 0 color ;

: .P        ( h v -- )  to onder to naast  .t ;
: PP        ( +n -- )   p  ." Done " tegel count* .  .t  cr ;
: PROBEER   ( -- )      begin  hx FFFF kies  dup u.  pp  1000 ms  key? until ;

decimal db  5 %  neg  v: fresh  extra

\ End ;;;
