PROC myfirst:
      LOCAL i%,j%,image%  rem Counters used in number selection loop
      GLOBAL numbers%(8) rem Array to store picked numbers
      GLOBAL sound%   rem 1=On, 2=Off
      GLOBAL archive$(128),setting$(128) rem filenames used
      GLOBAL maxnum%  rem Max number that can be on a ball
      GLOBAL nballs% rem Number of balls to be drawn

     archive$="archive.dat"
     setting$="milo.ini"
     maxnum%=40
     nballs%=8 rem Minimum of 2 and maximum of 8 balls
     
     sound%=1   rem default ON

     RANDOMIZE MINUTE + SECOND

     DEFAULTWIN 1  rem Enables use of greyscale on 3a/3c

     image%=gLOADBIT("\front.mbm")
     gUSE 1
     gAT 0,0
     gCOPY image%,0,0,480,160,0
     i%=1
     WHILE i%<=50
       gAT rnd*10,rnd*10
       gCOPY image%,0,0,100,120,3
       i%=i%+1
     ENDWH
     gCLOSE image%

     IF EXIST(setting$)<>0
       OPEN setting$,A,sound%,nballs%,maxnum%
       sound%=A.sound%
       nballs%=A.nballs%
       maxnum%=A.maxnum%
       CLOSE
     ENDIF

     WHILE 1
       gIPRINT "Press the Menu key to proceed"
       i%=GET
       IF i%=290 rem The Menu key
         mINIT
         mCARD "Milo","Generate numbers",%g,"List previous",%l,"Exit",%x
         mCARD "Info","Help",%h,"About",%a,"Preferences",%p
         j%=MENU
         IF j%=%g
           generate:
           IF sound%=1
             BEEP 10,300
           ENDIF
         ELSEIF j%=%l
           listprev:
         ELSEIF j%=%p
           prefs:
         ELSEIF j%=%x
           shutdown:
         ELSEIF j%=%h
           help:
         ELSEIF j%=%a
           about:
         ENDIF
       ENDIF      
     ENDWH
ENDP


PROC picknum:(number%)
rem To choose a unique ball number for position no. number%
LOCAL j%

picknum::
numbers%(number%)=INT(RND*maxnum%)+1 rem add 1 to take the number into the 1 to 50 range
j%=1
WHILE j%<=(number%-1)
  IF numbers%(number%)=numbers%(j%)
     GOTO picknum::    rem Duplicate number, so go and try again!
  ENDIF
  j%=j%+1
ENDWH

RETURN
ENDP


PROC setup:
rem Graphics stuff done at the start of the program
gCLS rem Clear screen
gGREY 1
gAT 0,0
gFILL gWIDTH,gHEIGHT,0
gGREY 0
gSTYLE 41 rem Bold, Double height, Italic
gAT 50,40
gPRINT "Milo v0.1 (C) Fred Bloggs 1998"
gSTYLE 33 rem Bold, Italic
gAT 50,65
gPRINT "Here are the numbers for the next lottery:"
gAT 50,80
gFILL 300,70,1
gGREY 1 :gFILL 300,70,1 :gGREY 0
RETURN
ENDP

PROC generate:
REM Generate a set of unique, random lottery numbers and display!
LOCAL i%
     setup:

     i%=1
     WHILE i%<=nballs%
        picknum:(i%) rem Pick a unique number for the i%-th ball   
        i%=i%+1
     ENDWH

     sort:  rem Sort the numbers into numerical order

     i%=1
     WHILE i%<=nballs%
        gSTYLE 41
        gAT 60+(i%-1)*(300/nballs%),130
        gPRINT numbers%(i%)
        i%=i%+1
     ENDWH

     REM Save the generated numbers to an archive file for posterity
     IF EXIST(archive$)=0
       CREATE archive$,A,num1%,num2%,num3%,num4%,num5%,num6%,num7%,num8%
     ELSE
       OPEN archive$,A,num1%,num2%,num3%,num4%,num5%,num6%,num7%,num8%
     ENDIF
     A.num1%=numbers%(1)
     A.num2%=numbers%(2)
     A.num3%=numbers%(3)
     A.num4%=numbers%(4)
     A.num5%=numbers%(5)
     A.num6%=numbers%(6)
     A.num7%=numbers%(7)
     A.num8%=numbers%(8)
     APPEND
     CLOSE

RETURN
ENDP

PROC shutdown:
REM Shutdown the program nicely
IF EXIST(setting$)<>0
  DELETE setting$
ENDIF  

CREATE setting$,A,sound%,nballs%,maxnum%
A.sound%=sound%
A.nballs%=nballs%
A.maxnum%=maxnum%
APPEND
CLOSE
STOP
ENDP

PROC help:
LOCAL i%
dINIT "Help"
dTEXT "","This is a very simple help screen."
dTEXT "","Use the -Generate Numbers- menu command"
dTEXT "","as required and then use -Exit- to quit MiLo."
dBUTTONS "OK",13
i%=DIALOG
RETURN
ENDP

PROC about:
LOCAL i%
dINIT "About MiLo"
dTEXT "","This is an example OPL program,"
dTEXT "","designed to run on OPL/16 and OPL/32,"
dTEXT "","from the 3-Lib web site."
dBUTTONS "OK",13
i%=DIALOG
RETURN
ENDP

 
PROC sort:
LOCAL i%,flag%,temp%

flag%=1 rem set Non-zero to make sure loop starts!

WHILE flag%<>0
  flag%=0 rem reset the flag
  i%=1 :WHILE i%<=(nballs%-1)  rem (nballs%-1) possible comparisons between the ball numbers
    if numbers%(i%)>numbers%(i%+1)
      temp%=numbers%(i%)
      numbers%(i%)=numbers%(i%+1)
      numbers%(i%+1)=temp%
      flag%=1
    endif
    i%=i%+1
  ENDWH
ENDWH
RETURN
ENDP


PROC prefs:
LOCAL number&

number&=maxnum%
dINIT "Preferences"
dCHOICE sound%,"Sound","On,Off"
dCHOICE nballs%,"Number of balls to be drawn","1,2,3,4,5,6,7,8"
dLONG number&,"Maximum number on each ball?",10,80
dBUTTONS "OK",13
DIALOG

maxnum%=number&

RETURN
ENDP

PROC listprev:
REM To read back values from the archive file
LOCAL k%

IF EXIST(archive$)=0
  gIPRINT "No previous numbers to list!"
ELSE
  CLS
  OPEN archive$,A,num1%,num2%,num3%,num4%,num5%,num6%,num7%,num8%
  WHILE 1 REM Do loop until exited with ESC or Cancel button
    dINIT "Number archive"
    dTEXT "",gen$(A.num1%,2)+" "+gen$(A.num2%,2)+" "+gen$(A.num3%,2)+" "+gen$(A.num4%,2)+" "+gen$(A.num5%,2)+" "+gen$(A.num6%,2)+" "+gen$(A.num7%,2)+" "+gen$(A.num8%,2)
    dBUTTONS "Previous",%p,"Cancel",27,"Next",%n
    k%=DIALOG
    IF k%=27 OR k%=0
      BREAK
    ELSEIF k%=%p
      IF POS=1
        gIPRINT "Already showing first set of numbers!"
      ELSE
        BACK
      ENDIF
    ELSEIF k%=%n
      NEXT
      IF EOF
        gIPRINT "Already showing last set of numbers!"
        BACK
      ENDIF
    ENDIF
  ENDWH
  CLOSE
ENDIF
RETURN
ENDP