PROC myfirst:
      LOCAL i%,j%,image%  rem Counters used in number selection loop
      GLOBAL numbers%(6) rem Array to store picked numbers
      GLOBAL sound%   rem 1=On, 2=Off
      GLOBAL archive$(128),setting$(128) rem filenames used

     archive$="archive.dat"
     setting$="milo.ini"
     
     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
     gCLOSE image%

     IF EXIST(setting$)<>0
       OPEN setting$,A,sound%
       sound%=A.sound%
       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,"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%=%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*50)+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 set of 6 unique, random lottery numbers and display!
LOCAL i%
     setup:

     i%=1
     WHILE i%<=6
        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%<=6
        gSTYLE 41
        gAT 60+(i%-1)*50,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%
     ELSE
       OPEN archive$,A,num1%,num2%,num3%,num4%,num5%,num6%
     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)
     APPEND
     CLOSE

RETURN
ENDP

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

CREATE setting$,A,sound%
A.sound%=sound%
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%<=5  rem 5 possible comparisons between the 6 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:
dINIT "Preferences"
dCHOICE sound%,"Sound","On,Off"
dBUTTONS "OK",13
DIALOG

RETURN
ENDP