' nitpick
' Programmed by Seymour Shlien 18-Feb-93
' 624 Courtenay Avenue
' Ottawa, Canada, K2A 3B5
' in GFA Basic 3.5 for the Atari 1040
DIM board&(1000)
DIM char1%(10),char2%(10)
DIM deskcolors%(4)
rez%=XBIOS(4)
DEFMOUSE 0
IF rez%=0
  ALERT 3," Please switch  to | medium  resolution! ",1,"Oops",b%
  STOP
ENDIF
@instructions
@get_deskcolors
VSETCOLOR 0,0,0,0
VSETCOLOR 1,15,15,15
VSETCOLOR 2,15,0,0
level%=0
@initialize_char
@control_menu
@make_board(char1%(level%),char2%(level%))
REPEAT
  IF restart%=1
    @make_board(char1%(level%),char2%(level%))
  ENDIF
  @nitpick(char1%(level%),char2%(level%))
  IF nits%=0
    @very_good
  ENDIF
UNTIL quit%=1
@restore_deskcolors
END
> PROCEDURE make_board(s1%,s2%)
  LOCAL k%,ix%,iy%,i%,j%,r%
  nits%=0
  restart%=0
  IF (level% MOD 2)=1
    blank_threshold%=30
  ELSE
    blank_threshold%=200
  ENDIF
  BOX 48,12,402,156
  FOR k%=0 TO 999
    i%=MOD(k%,50)
    j%=(k% DIV 50)
    ix%=i%*7+50
    iy%=j%*7+20
    r%=RANDOM(100)
    IF r%<2
      TEXT ix%,iy%,CHR$(s1%)
      board&(i%+50*j%)=1
      INC nits%
    ELSE IF r%<blank_threshold%
      TEXT ix%,iy%,CHR$(s2%)
      board&(i%+50*j%)=2
    ELSE
      board&(i%+50*j%)=0
      TEXT ix%,iy%," "
    ENDIF
  NEXT k%
  LOCATE 1,26
  PRINT "Find all the ";CHR$(s1%);"'s";
RETURN
> PROCEDURE get_deskcolors
  LOCAL i%
  FOR i%=0 TO 3
    deskcolors%(i%)=XBIOS(7,i%,-1)
  NEXT i%
RETURN
> PROCEDURE restore_deskcolors
  LOCAL i%,j%
  FOR i%=0 TO 3
    j%=XBIOS(7,i%,deskcolors%(i%))
  NEXT i%
RETURN
> PROCEDURE control_menu
  LOCAL i%
  FOR i%=0 TO 2
    BOX 480,40+i%*20,560,50+i%*20
    SELECT i%
    CASE 0
      TEXT 481,48+i%*20,"level "+STR$(level%)
    CASE 1
      TEXT 481,48+i%*20,"restart"
    CASE 2
      TEXT 481,48+i%*20,"quit"
    ENDSELECT
  NEXT i%
RETURN
> PROCEDURE nitpick(s1%,s2%)
  LOCAL i%,j%
  IF MOUSEK<>0
    i%=(MOUSEX-50)/7
    j%=(MOUSEY-14)/7
    LOCATE 1,26
    '    PRINT i%,j%,board&(i%+50*j%);
    IF (i%<50) AND (j%<20) AND (i%>=0) AND (j%>=0)
      IF board&(i%+50*j%)=1
        @sound_effects(CHR$(s1%),i%,j%)
        TEXT i%*7+50,j%*7+20,CHR$(s2%)
        DEC nits%
        PRINT SPACE$(16);
        LOCATE 1,26
        PRINT nits%;" left";
        board&(i%+50*j%)=2
      ENDIF
    ELSE IF MOUSEX>480
      i%=(MOUSEY-40) DIV 20
      '      LOCATE 70,20
      '      PRINT i%
      IF i%=0
        INC level%
        IF level%>9
          level%=0
        ENDIF
        TEXT 481,48+i%*20,"level "+STR$(level%)
        PAUSE 30
      ELSE IF i%=1
        restart%=1
      ELSE IF i%=2
        quit%=1
      ENDIF
    ENDIF
  ENDIF
RETURN
> PROCEDURE sound_effects(charact$,col%,row%)
  LOCAL i%
  DEFTEXT 2
  TEXT col%*7+50,row%*7+20,charact$
  DEFTEXT 1
  i%=RANDOM(10)
  SELECT i%
  CASE 0
    WAVE 512*7+8,1,1,2000,20
    SOUND 0,0
  CASE 1
    WAVE 512*15+8,1,1,20000,20
    SOUND 0,0
  CASE 2
    WAVE 512*3+8,1,1,20000,20
    SOUND 0,0
  CASE 3
    WAVE 512*3+8,1,15,2000,30
    SOUND 0,0
  CASE 4
    WAVE 512*3+8,1,8,200,30
    SOUND 0,0
  CASE 5
    WAVE 512*3+8,1,8,50,30
    SOUND 0,0
  CASE 6
    WAVE 256*30+8,1,8,50,30
    SOUND 0,0
  CASE 7
    WAVE 512*3+8,1,1,200,30
    SOUND 0,0
  CASE 8
    SOUND 0,12,1,1,20
    WAVE 1,1,0,50,3
    SOUND 0,0
  CASE 9
    SOUND 1,12,1,2,0
    WAVE 7,7,9,10000,30
    SOUND 0,0
  ENDSELECT
RETURN
> PROCEDURE initialize_char
  LOCAL i%
  FOR i%=0 TO 9
    READ char1%(i%),char2%(i%)
  NEXT i%
  DATA 99,101
  DATA 99,101
  DATA 98,100
  DATA 98,100
  DATA 111,101
  DATA 111,101
  DATA 199,200
  DATA 199,200
  DATA 197,213
  DATA 197,213
RETURN
> PROCEDURE instructions
  CLS
  PRINT "Using the mouse, click on all the designated characters"
  PRINT "displayed on the screen. If you change levels, please"
  PRINT "click on restart when you are ready. Higher levels are"
  PRINT "more difficult."
  PRINT
  PRINT "Turn up the volume if you wish to hear the sound effects."
  PRINT
  PRINT "The program was written in GFA Basic 3.5 by Seymour Shlien."
  PRINT "The program and its GFA sources may be treated as public"
  PRINT "domain."
  PRINT
  PRINT "...click mouse button when ready."
  REPEAT
  UNTIL MOUSEK<>0
  CLS
RETURN
> PROCEDURE very_good
  LOCATE 1,26
  PRINT SPACE$(16);
  LOCATE 1,26
  PRINT "Very good";
  DEC nits%
RETURN
