.Top:
; *-----------------------------------------------------------*
; * A_Sweeper : by Jean-Marc GIGANDET : 17th of January 2001  *
; *      version 1.06beta                                     *
; *      Mine Sweeper for Workbench                           *
; *      Written  in Amiga BlitzBasic II. Compilateur V2.10   *
; *-----------------------------------------------------------*
DateCompile$  = "17/01/2001"
Version$      = "1.06beta"

; |----------|------------------------|-----------|------------|
; |Window No | Utilisation            | Gadget No | GadList No |
; |----------|------------------------|-----------|------------|
; |    0     | Main                   |  50 a  59 |  0         |
; |    1     | Version    (Request)   |    ---    | ---        |
; |    2     | Settings               |  60 a  69 |  2         |
; |----------|------------------------|-----------|------------|


SetErr
  PutReg d0,err.l
  err$=Mki$(40)+Chr$(12)+Peek$(err)+Mki$(0)
  DisplayAlert_ 0,&err$,20
  End
End SetErr                 ; to avoid crashes


WBStartup                             ; Start from Workbench
NoCli                                 ; No Cli window

.Definitions:
;-----------------------------------------------------
; ********** Definition : constants used *************
;-----------------------------------------------------

NULLS.s      = Chr$(0)
#WdwRedraw   = $4
#MouseClic   = $8
#MouseMove   = $10
#GadDwn      = $20
#GadHit      = $40
#MnuHit      = $100
#WdwClosed   = $200
#KeyPress    = $400
#IntuiTick   = $400000
#GA_Immediate= $80
#MnuBar      = $80

#NumScn0  =  0    ; Screen No
#NumWdw0  =  0    ; Main window Number
#GadLst0  =  0    ; Main window GadgetList Number
#NumBmp0  =  0    ; Main window bitmap Number
#NumWdw2  =  2    ; Settings window Number
#GadLst2  =  2    ; Settings window GadgetList Number

#WbFont   =  0    ;                                / Worbench
#SysFont  =  1    ; For use with DefaultFontHeight - System
#ScnFont  =  2    ;                                \ Screen

#ShClc    =  0
#Sh1Mi    =  1
#Sh2Mi    =  2
#Sh3Mi    =  3
#Sh4Mi    =  4
#Sh5Mi    =  5
#Sh6Mi    =  6
#Sh7Mi    =  7
#Sh8Mi    =  8
#ShUCl    =  9
#ShFlg    = 10
#ShQst    = 11
#ShMin    = 12
#LogoShp  = 14

#Drawer1  = 13
#Drawer2  = 14

#GStpU    = 15
#GStpD    = 16
#GPauU    = 17
#GPauD    = 18
#GStaU    = 19
#GStaD    = 20

#SndWin   = 0
#SndLoo   = 1

#FilParms = 0
#FilRecord= 1

;------------------------------------------------------
; ********** Definition : variables used **************
;------------------------------------------------------

XWdw.w    =  0    ; Coord X str   opening window
YWdw.w    =  0    ; Coord Y end   opening window
LWdw.w    =  0    ; Width         opening window
HWdw.w    =  0    ; Height        opening window
XWdw0.w   = 10    ; Coord X str   window 0 \
YWdw0.w   = 10    ; Coord Y str   window 0  \
LWdw0.w   =400    ; Width         window 0   \
HWdw0.w   =240    ; Height        window 0    window generale
XGad0.w   =  0    ; Coord X Gadg. window 0   /
YGad0.w   =  0    ; Coord Y Gadg. window 0  /
LGad0.w   =  0    ; Width Gadg.   window 0 /
XWdw2.w   = 20    ; Coord X str   window 2 \
YWdw2.w   = 20    ; Coord Y str   window 2  \
LWdw2.w   = 10    ; Width         window 2   \
HWdw2.w   = 10    ; Height        window 2    window Parametrage
XGad2.w   =  0    ; Coord X Gadg. window 2   /
YGad2.w   =  0    ; Coord Y Gadg. window 2  /
LGad2.w   =  0    ; Width Gadg.   window 2 /
LGadB.w   =  0    ; Width Button  window 2 /

NbLin.b   = 10    ; Nbr of lines   (default is 10)
NbCol.b   = 10    ; Nbr of columns (default is 10)
NbMin.w   = 10    ; Nbr of mines   (default is 10)
OldNbLin.b=  0    ; Saves old nbr of lines
OldNbCol.b=  0    ; Saves old nbr of columns
OldNbMin.b=  0    ; Saves old nbr of mines
SndFxOn.b =  0    ; Sound effects  On/Off
SavHiSon.b=  0    ; Save Hi-Scores On/Off
SavLin.b  =  0
SavCol.b  =  0
SavMin.w  =  0
SavSnd.b  =  0
SavHiS.b  =  0
SavTir.s  = " "


MineHit.b = False ; Game running ?
TimEla.l  =  0    ; Time elapsed
EnrRcd.l  =  0    ; Enreg Nbr record file
BestTime.l=  9999 ; Current best time
NamScorer$=  ""   ; Name of player with Hi-score
Bid.l     =  0    ; Dummy : just to get system date and hour


Mnusel.b  =  0    ; Store : - Selected Menu
Optsel.b  =  0    ;         - Selected option
SubOpt.b  =  0    ;         - Selected suboption


OldWin.l  =  0    ; Previous window
ActWin.l  =  0    ; Current  window
WdwOpn.l  =  0    ; Window opening result
ActGad.l  =  0    ; Current GadList
WdwTit$   = ""    ; Opening window Title
Ev.l      =  0    ; = WaitEvent
EvtCod.l  =  0    ; = EventCode
GadSel.l  =  0    ; = GadGetHit

LGadTir.l =  0    ; Length : icons drawer gadget
DGad.l    =  0    ; Horizontal position : Start of Gadgets
Ht.l      =  0    ; Height : of gadget (depends on Font)
LeftOff.l =  0    ; Grid Offset from left of window
TopOff.l  =  0    ; Grid Offset from top  of window
LgWb.w    = WBWidth  ; Workbench width
HtWb.w    = WBHeight ; Workbench height
x.w       =  0    ; Coord X : Shape
y.w       =  0    ; Coord Y : Shape
n.w       =  0    ;
Test.l    =  0    ; Tested cell value
Winner.b  = False ; Winner ?
NbCases.w =  0    ; Total number of cells
NbCasTst.l=  0    ; Tested cells number
NbCasFlg.l=  0    ; Flaged cells number (all flags)
NbCasFnd.l=  0    ; Flaged cells number (good flags)
ChgSize.b = False ; Grid size changed ?
MaxTxtSiz.l= 0
gadget$   = NULLS
R.l       =  0    ; Return code
Existe.b  =  0    ; All Shapes exist ?
BtnShp.b  =  0    ; All GtShapes OK ?

Dim Table.w(NbLin,NbCol)       ; dim the table


; English built-in strings when no locale is available
MnuFile$  = "File            "
MnuClear$ = "Clear Scores    "
MnuParms$ = "Settings        "
MnuAbout$ = "About           "
MnuTrait$ = "----------------"
MnuQuit$  = "Quit            "


; Messages
GamePaused$ = "Game Paused ... Menus are ON"
GameStopped$= "Game Stopped ... Menus are ON"
GameRunning$= "Running ... Hurry Up !"
GameLoosed$ = "Oops ... Beautiful puzzle ..."
GameWon$    = "Wonderful, you did it !"
ErrNbLin$   = "Too many lines for screen"
ErrNbCol$   = "Too many colons for screen"
ErrNbMin$   = "Too many mines for grid"
ErrAddIt$   = "AddItem failure. Exiting, sorry ..."

ScnTit$     = "A_Sweeper, (c) Jean-Marc Gigandet" + NULLS


PgmNam$     = "A_Sweeper"
WdwTit0$    = "A_Sweeper"          + NULLS
WdwTit1$    = "A_Sweeper About"    + NULLS
WdwTit2$    = "A_Sweeper settings" + NULLS

ErrOpnSett$ =               " I can't write to the " + Chr$(10)
ErrOpnSett$ = ErrOpnSett$ + " parameters file ...  " + Chr$(10)
ErrOpnSett$ = ErrOpnSett$ + " Prefs won't be saved." + NULLS

CompilLe$   = "Compiled On "
AskForName$ = "Name of scorer"

Dir$        = StripTrail$(ProgDir$,32)
MaxLen NamScorer$     =  20
MaxLen GfxPath$       = 256
MaxLen DirBtnShp$     = 256
MaxLen PathChosen$    = 256
MaxLen TitPathReq$    = 256
MaxLen TitAslPathReq$ = 256
MaxLen FilSett$ =240    ; File name
MaxLen TypParm$ =1      ; Parameter type
MaxLen Param$   =120    ; Parameter
If Right$(Dir$,1) <> "/" AND Right$(Dir$,1) <> ":"
  Dir$ = Dir$ + "/"
EndIf
FilSett$    = Dir$ + "A_Sweeper.parms"   + Chr$(0)
FilRecord$  = Dir$ + "A_Sweeper.records" + Chr$(0)
GfxPath$    = Dir$ + "Icons/1x1/"
DirBtnShp$  = Dir$ + "Gadgets/Tape_MWB/"
TitPathReq$ = "Where can I find the brushes ?"
SndWin$   = Dir$ + "Sounds/" + "Win.8svx"
SndLoo$   = Dir$ + "Sounds/" + "Loose.8svx"

; -------------------------- Tagitem for asl and gadtools
NEWTYPE.tags
a.l
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
End NEWTYPE

NEWTYPE .Coord
  XP.w
  YP.w
End NEWTYPE

DEFTYPE .TagItem        It
DEFTYPE .tags           tags
DEFTYPE .EasyStruct     easy
DEFTYPE .Locale         *Local
DEFTYPE .LocaleBase     *LocBas
DEFTYPE .Catalog        *Cat
DEFTYPE .FileRequester  *FilReq
DEFTYPE .w

; Gadgets numbers (Use No > 50 to avoid system bug)

#Gen_Messag = 51    ; Information or help message
#Gen_NbLeft = 52    : Gen_NbLeft$ = "Nb Left"
#Gen_Elapse = 53    : Gen_Elapse$ = "Elapsed"
#Gen_Stop   = 54    : Gen_Stop$   = "Stop"
#Gen_Pause  = 55    : Gen_Pause$  = "Pause"
#Gen_Start  = 56    : Gen_Start$  = "Start"


#Set_NbCols = 60    : Set_NbCols$ = "Number of columns .."
#Set_NbLins = 61    : Set_NbLins$ = "Number of lines ...."
#Set_NbMins = 62    : Set_NbMins$ = "Number of mines ...."
#Set_ShpDrw = 63    : Set_ShpDrw$ = "Shapes Drawer ......"
#Set_SndFx  = 64    : Set_SndFx$  = "Sound effects ......"
#Set_SavHiS = 65    : Set_SavHiS$ = "Save Hi-Scores ....."
#Set_DrwBsh = 66
#Gad_OK     = 67    : Gad_OK$     = "  Ok  "
#Gad_Cancel = 68    : Gad_Cancel$ = "Cancel"
#Gad_Save   = 69    : Gad_Save$   = " Save "



;-------------------------------------------------------------
; ******************* End Of Definitions *********************
;-------------------------------------------------------------
.Start:



Gosub InitScreen




.Main:
;-------------------------------------------------------------
; *********************** Main loop **************************
;-------------------------------------------------------------
Repeat
  Ev.l = WaitEvent
  Select Ev
    Case #WdwRedraw       ; Need to redraw window
;      GTSetString #GadLst0,#Gen_Messag,"Need to redraw window"
    Case #MouseClic       ; Mouse button has been clicked
      If NOT MenOn
        Gosub TrtMousePos
      EndIf
    Case #GadDwn          ; One gadget has been selected
      Gosub TrtGadgetDwn
    Case #GadHit          ; One gadget has been released
      Gosub TrtGadgetHit
    Case #MnuHit          ; One menu option has been selected
      Gosub TraiteMenu
    Case #WdwClosed       ; Close gadget has been clicked
      Select EventWindow
      Case #NumWdw0
        Gosub Quit
      Case #NumWdw2
        Gosub CloseSettings
      End Select
    Case #IntuiTick       ; Intuiticks (every 1/10 s)
      If NOT MenOn
        TimEla + 1
        Gosub ShowTime
      EndIf
    Default               ; But what's that ?
      MsgSpe$="Ev:"+UStr$(Ev)+"---Code:"+UStr$(EventCode)+"---Qualifier:"+UStr$(EventQualifier)+"---Gadget:"+UStr$(GadgetHit)
      GTSetString #GadLst0,#Gen_Messag,MsgSpe$
  End Select

Forever



.TraiteMenu:
  Mnusel=MenuHit        ; Store : - Menu      selected
  Optsel=ItemHit        ;         - option    selected
  SubOpt=SubHit         ;         - suboption selected
  Select Mnusel
  Case 0
    Select Optsel
    Case 0                ; Settings
      Gosub OpenSettings
    Case 1                ; Clear Hi-Scores
      Gosub ClearScore
    Case 2                ; About
      Gosub SeeAbout
    Case 3                ; Nothing (Bar)
      ;
    Case 4                ; Quit
      Gosub Quit
    End Select
  End Select
Return


Function.l LengthText{Text.s}
  Function Return TextLength_(RastPort(#NumWdw0),Text,Len(Text))
End Function

Function.l MaxTextSize{Text.s, MaxAct.l}
  Function Return Largest(LengthText{Text},MaxAct)
End Function

Function.w CalcPosVert{AncPos.w, NbLigAdd.w}
  SHARED Ht
  Function Return (AncPos + (Ht + #INTERHEIGHT) * NbLigAdd)
End Function



.OpenSettings:
  XWdw0=WindowX
  YWdw0=WindowY
  SavLin    = NbLin
  SavCol    = NbCol
  SavMin    = NbMin
  SavSnd    = SndFxOn
  SavHiS    = SavHiSOn
  SavTir    = GfxPath$
  Menus Off
  ErrParms  = False
  Gosub Busy_Pointer
  MaxTxtSiz = 0
  LGadB     = MaxTextSize{Gad_OK$        ,MaxTxtSiz}
  LGadB     = MaxTextSize{Gad_Save$      ,MaxTxtSiz}
  LGadB     = MaxTextSize{Gad_Cancel$    ,MaxTxtSiz}
  LGadB     = LGadB + LengthText{"  "}    + 4
  LGad2     = LengthText{String$("W",5)}  + 4
  LGadTir   = LengthText{String$("W",50)} + 4
  MaxTxtSiz = 0
  MaxTxtSiz = MaxTextSize{Set_NbCols$    ,MaxTxtSiz}
  MaxTxtSiz = MaxTextSize{Set_NbLins$    ,MaxTxtSiz}
  MaxTxtSiz = MaxTextSize{Set_NbMins$    ,MaxTxtSiz}
  MaxTxtSiz = MaxTextSize{Set_ShpDrw$    ,MaxTxtSiz}
  LWdw2     = (LeftOff * 2) + MaxTxtSiz + (#INTERWIDTH * 3) + LGadTir + ShapeWidth(#Drawer1)
  HWdw2     = CalcPosVert{TopOff, 7} + 4
  XGad2     = MaxTxtSiz + LeftOff + #INTERWIDTH
  YGad2     = #INTERHEIGHT
  XWdw2     = WindowX
  YWdw2     = WindowY
  If (XWdw2+LWdw2) > LgWb
    XWdw2=LgWb-LWdw2
  EndIf
  If (YWdw2+HWdw2) > HtWb
    YWdw2=HtWb-HWdw2
  EndIf
;  ShapeGadget #GadLst2,XGad2+LGadTir+#INTERWIDTH,(5*(Ht+#INTERHEIGHT))+TopOff,0,#Set_DrwBsh,#Drawer1,#Drawer2
  R.l=Window(#NumWdw2,XWdw2,YWdw2,LWdw2,HWdw2,$2|$4|$1000|$200000,WdwTit2$,1,0,#GadLst2)
  If R
    GTInteger  #GadLst2,#Set_NbLins,XGad2,YGad2,LGad2  ,Ht,Set_NbLins$,#PLACETEXT_LEFT+#GA_Immediate,NbLin
    YGad2 = CalcPosVert{YGad2, 1}
    GTInteger  #GadLst2,#Set_NbCols,XGad2,YGad2,LGad2  ,Ht,Set_NbCols$,#PLACETEXT_LEFT+#GA_Immediate,NbCol
    YGad2 = CalcPosVert{YGad2, 1}
    GTInteger  #GadLst2,#Set_NbMins,XGad2,YGad2,LGad2  ,Ht,Set_NbMins$,#PLACETEXT_LEFT+#GA_Immediate,NbMin
    YGad2 = CalcPosVert{YGad2, 1}
    GTCheckBox #GadLst2,#Set_SndFx ,XGad2,YGad2,LGad2  ,Ht,Set_SndFx$ ,#PLACETEXT_LEFT+#GA_Immediate
    If SndFxOn
      GTToggle #GadLst2,#Set_SndFx ,On
    Else
      GTToggle #GadLst2,#Set_SndFx ,Off
    EndIf
    YGad2 = CalcPosVert{YGad2, 1}
    GTCheckBox #GadLst2,#Set_SavHiS,XGad2,YGad2,LGad2  ,Ht,Set_SavHiS$,#PLACETEXT_LEFT+#GA_Immediate
    If SavHiSOn
      GTToggle #GadLst2,#Set_SavHiS,On
    Else
      GTToggle #GadLst2,#Set_SavHiS,Off
    EndIf
    YGad2 = CalcPosVert{YGad2, 1}
    GTText     #GadLst2,#Set_ShpDrw,XGad2,YGad2,LGadTir,Ht,Set_ShpDrw$,#PLACETEXT_LEFT+#GA_Immediate,GfxPath$
    GTShape    #GadLst2,#Set_DrwBsh,XGad2+LGadTir+#INTERWIDTH,YGad2,#GA_Immediate,#Drawer1,#Drawer2
    Espac = (LWdw2 - ((LeftOff + #INTERWIDTH) * 2) - (LGadB * 3)) / 4
    XGad2 = #INTERWIDTH + Espac
    YGad2 = CalcPosVert{YGad2, 1}
    GTButton   #GadLst2,#Gad_OK    ,XGad2,YGad2,LGadB  ,Ht,Gad_OK$    ,#PLACETEXT_IN
    XGad2 = XGad2 + #INTERWIDTH + Espac + LGadB
    GTButton   #GadLst2,#Gad_Save  ,XGad2,YGad2,LGadB  ,Ht,Gad_Save$  ,#PLACETEXT_IN
    XGad2 = XGad2 + #INTERWIDTH + Espac + LGadB
    GTButton   #GadLst2,#Gad_Cancel,XGad2,YGad2,LGadB  ,Ht,Gad_Cancel$,#PLACETEXT_IN
    AttachGTList #GadLst2,#NumWdw2
  EndIf
Return

.CloseSettings:
    DetachGTList  #GadLst2
    CloseWindow   #NumWdw2
    Free GTList   #GadLst2
    Activate      #NumWdw0
    Use Window    #NumWdw0
    Menus On
    Gosub Standard_Pointer
    FlushEvents
    If ChgSize = True           ; If grid settings changed
      Gosub ChangeWdwSize       ;   calc and redraw window
    EndIf

Return


.ReDrawGad:
  Redraw      #NumWdw0,#Gen_Start
  Redraw      #NumWdw0,#Gen_Pause
  Redraw      #NumWdw0,#Gen_Stop
Return

.MsgWhite:
  GTSetAttrs  #GadLst0,#Gen_Messag,#GTTX_FrontPen,2
Return
.MsgBlack:
  GTSetAttrs  #GadLst0,#Gen_Messag,#GTTX_FrontPen,1
Return


.GameNew:
  MineHit = False             ; Game running
  Winner  = False             ; No winner yet
  NbCasTst= 0                 ; No cell tested
  NbCasFlg= 0                 ; No mine flaged
  NbCasFnd= 0                 ; No mine detected
  TimEla  = 0                 ; Time start
  MenOn   = False             ; No Menus
  Gosub MakeGrid              ; Draw grid
  Gosub PlaceMines            ; Place Mines
  Menus Off
  FlushEvents #IntuiTick
  GTToggle    #GadLst0,#Gen_Start,On
  GTToggle    #GadLst0,#Gen_Pause,Off
  GTToggle    #GadLst0,#Gen_Stop ,Off
  Gosub ReDrawGad
  Gosub ShowTime
  Gosub ShowLeft
  Gosub MsgBlack
  GTSetString #GadLst0,#Gen_Messag,GameRunning$
Return


.GameEnd:
  For x = 0 To NbCol - 1
    For y = 0 To NbLin - 1
      Test = Table(x,y)
      If Winner = True
        If Test < 10
          If Test = 9
            Test = 10
          EndIf
          WBlit Test,x*(ShapeWidth(Test)-1)+LeftOff,y*(ShapeHeight(Test)-1)+TopOff
        EndIf
      Else
        If Test = 9 OR Test = 19 OR Test = 29 OR Test = 39
          Test = 12
          WBlit Test,x*(ShapeWidth(Test)-1)+LeftOff,y*(ShapeHeight(Test)-1)+TopOff
        EndIf
      EndIf
    Next y
  Next x
  If SndFxOn
    If Winner = True
      Sound #SndWin ,15
    Else
      Sound #SndLoo ,15
    EndIf
  EndIf
  If SavHiSOn
    If Winner = True AND TimEla < BestTime
      Gosub AskForName
    EndIf
  EndIf
  Gosub GameStopped
Return

GameStopped
  MineHit = True              ; Game stopped
  MenOn   = True              ; Menu is active
  Menus On
  GTToggle    #GadLst0,#Gen_Start,Off
  GTToggle    #GadLst0,#Gen_Pause,Off
  GTToggle    #GadLst0,#Gen_Stop ,On
  Gosub ReDrawGad
  Gosub MsgWhite
  GTSetString #GadLst0,#Gen_Messag,GameStopped$
Return


.GamePause:
  If MineHit = False
    If MenOn
      GTToggle    #GadLst0,#Gen_Pause,Off
      Menus Off
      Gosub MsgBlack
      GTSetString #GadLst0,#Gen_Messag,GameRunning$
    Else
      GTToggle    #GadLst0,#Gen_Pause,On
      Menus On
      Gosub MsgWhite
      GTSetString #GadLst0,#Gen_Messag,GamePaused$
    EndIf
    Redraw        #NumWdw0,#Gen_Pause
    MenOn = NOT MenOn
  EndIf
Return

.AskForName:
  NamScorer$=RTEZGetString(PgmNam$,AskForName$,20,NamScorer$)
  BestTime=TimEla
  If OpenFile(#FilRecord,FilRecord$)
    Fields #FilRecord,NamScorer$,BestTime
    Put    #FilRecord,EnrRcd
    CloseFile #FilRecord
  EndIf
Return

.ClearScore:
  BestTime = 9999
Return


.MakeGrid:
  Dim Table(NbCol,NbLin)       ; New table dim
  Dim List Pile.Coord(NbLin*NbCol)
  NbCases = NbLin * NbCol

 ; -------------------
  ; Dessine grille vide
  ; -------------------
  InnerCls 0
  Redraw #NumWdw0,#Gen_Elapse
  Redraw #NumWdw0,#Gen_NbLeft
  Redraw #NumWdw0,#Gen_Messag
  For x = 0 To NbCol - 1
    For y = 0 To NbLin - 1
      Table(x,y)=0
      WBlit #ShUCl,x*(ShapeWidth(#ShUCl)-1)+LeftOff,y*(ShapeHeight(#ShUCl)-1)+TopOff
    Next y
  Next x
Return



.SeeAbout:
  Gosub Busy_Pointer
  Author$="Jean-Marc GIGANDET"
  MaxLen Chaine$ = 400
  Chaine$ = PgmNam$ + " " + Version$ + Chr$(10)
  Chaine$ = Chaine$ + " " + Chr$(10)
  Chaine$ = Chaine$ + Author$ + Chr$(10)
  Chaine$ = Chaine$ + " " + Chr$(10)
  Chaine$ = Chaine$ + CompilLe$ + " " + DateCompile$ + Chr$(10)
  Request WdwTit1$,Chaine$,Gad_OK$
  Gosub Standard_Pointer
Return


.CaseTestee:
Statement CaseTestee{XR.w,YR.w}
  SHARED Table(),NbCasTst, Test, TopOff, LeftOff
  WBlit Test,XR*(ShapeWidth(Test)-1)+LeftOff,YR*(ShapeHeight(Test)-1)+TopOff
  Table(XR,YR) + 10
  NbCasTst + 1
End Statement


.NeighbourSearch:
Statement NeighbourSearch{XC.w,YC.w}
  SHARED Table(), Pile(), NbLin, NbCol, Test
  DEFTYPE  .w    XT,YT,XL1,XL2,YL1,YL2
  ClearList Pile()
  If Test = 0
    If AddLast(Pile())
      Pile()\XP = XC
      Pile()\YP = YC
    Else
      Request WdwTit$,ErrAddIt$,Gad_OK$
      End
    EndIf
    Repeat
      XC = Pile()\XP
      YC = Pile()\YP
      XL1= Max(0,XC-1)
      XL2= Min(NbCol-1,XC+1)
      YL1= Max(0,YC-1)
      YL2= Min(NbLin-1,YC+1)
      KillItem  Pile()
      For XT = XL1 To XL2
        For YT = YL1 To YL2
          Test = Table(XT,YT)
          If Test < 10
            If Test = 0
              If AddLast(Pile())
                Pile()\XP = XT
                Pile()\YP = YT
              Else
                Request WdwTit$,ErrAddIt$,Gad_OK$
                End
              EndIf
            EndIf
            CaseTestee{XT,YT}
          EndIf
        Next  YT
      Next XT
    Until (FirstItem(Pile()) = False)
  Else
    CaseTestee{XC,YC}
  EndIf
End Statement



.TrtMousePos:
  MBClic  = MButtons
  XM.w    = WMouseX
  YM.w    = WMouseY
  XC.w    = (XM - LeftOff)/ (ShapeWidth(#ShUCl) -1)
  YC.w    = (YM - TopOff) / (ShapeHeight(#ShUCl)-1)
  XS.w    = XC*(ShapeWidth (#ShUCl)-1)+LeftOff
  YS.w    = YC*(ShapeHeight(#ShUCl)-1)+TopOff

  If XC >= 0 AND XC < NbCol AND (NOT MineHit)
    If YC >= 0 AND YC < NbLin
      Test = Table(XC,YC)
      Select MBClic
      Case 1
        If Test < 10
          If Test < 9
            NeighbourSearch{XC,YC}
          Else
            WBox XS,YS,XS+ShapeWidth(#ShUCl)-1,YS+ShapeHeight(#ShUCl)-1,0
            WBlit #ShMin,XS,YS
            Gosub GameEnd
            GTSetString #GadLst0,#Gen_Messag,GameLoosed$
          End If
        EndIf
      Case 2
        If Test < 10
          Table(XC,YC) + 20
          NbCasFlg + 1
          Gosub ShowLeft
          If Test = 9
            NbCasFnd + 1
          EndIf
          WBox XS,YS,XS+ShapeWidth(#ShUCl)-1,YS+ShapeHeight(#ShUCl)-1,0
          WBlit #ShFlg,XS,YS
        Else
          If Test >= 20 AND Test < 30
            Table(XC,YC) + 10
            NbCasFlg - 1
            Gosub ShowLeft
            If Test = 29
              NbCasFnd - 1
            EndIf
            WBox XS,YS,XS+ShapeWidth(#ShUCl)-1,YS+ShapeHeight(#ShUCl)-1,0
            WBlit #ShQst,XS,YS
          Else
            If Test >= 30
              Table(XC,YC) - 30
              WBox XS,YS,XS+ShapeWidth(#ShUCl)-1,YS+ShapeHeight(#ShUCl)-1,0
              WBlit #ShUCl,XS,YS
          EndIf
          EndIf
        EndIf
      End Select
      If ((NbCasFnd = NbMin) AND (NbCasFlg = NbMin)) OR (NbCases - NbCasTst) <= NbMin
        Winner=True
        Gosub GameEnd
        GTSetString #GadLst0,#Gen_Messag,GameWon$
      EndIf
    EndIf
  EndIf
Return


.TrtGadgetDwn:
  GadSel = GadgetHit
  EvtCod = EventCode
  Select GadSel
  Case #Set_NbLins
    OldNbLin = GTGetInteger(#GadLst2,#Set_NbLins)
  Case #Set_NbCols
    OldNbCol = GTGetInteger(#GadLst2,#Set_NbCols)
  Case #Set_NbLins
    OldNbMin = GTGetInteger(#GadLst2,#Set_NbMins)
  End Select
Return



.TrtGadgetHit:
  GadSel = GadgetHit
  EvtCod = EventCode
  Select GadSel
  Case #Gad_OK          ; Use modified settings
    Gosub TestNbLin
    Gosub TestNbCol
    If NOT ErrParms
      Gosub CloseSettings
    Else
      ErrParms=False
    EndIf
  Case #Gad_Save        ; Save and use modified settings
    Gosub TestNbLin
    Gosub TestNbCol
    If NOT ErrParms
      Gosub SauveParms
      Gosub CloseSettings
    Else
      ErrParms=False
    EndIf
  Case #Gad_Cancel      ; Cancel modifications
    NbLin      = SavLin
    NbCol      = SavCol
    NbMin      = SavMin
    SndFxOn    = SavSnd
    SavHiSOn   = SavHiS
    GfxPath$   = SavTir
    Gosub CloseSettings
  Case #Gen_Stop
    Gosub GameEnd
  Case #Gen_Pause
    Gosub GamePause
  Case #Gen_Start
    Gosub GameNew
  Case #Set_NbLins
    NbLin = GTGetInteger(#GadLst2,#Set_NbLins)
  Case #Set_NbCols
    NbCol = GTGetInteger(#GadLst2,#Set_NbCols)
  Case #Set_NbMins
    NbMin = GTGetInteger(#GadLst2,#Set_NbMins)
    If NbMin >= (NbLin * NbCol)
      Request        WdwTit2$,ErrNbMin$,Gad_OK$
      NbMin = OldNbMin
      GTSetInteger   #GadLst2,#Set_NbMins,NbMin
      ActivateString #GadLst2,#Set_NbMins
    Else
      ChgSize = True
    EndIf
  Case #Set_SndFx
    SndFxOn  = GTGetAttrs(#GadLst2,#Set_SndFx ,#GTCB_Checked)
  Case #Set_SavHiS
    SavHiSOn = GTGetAttrs(#GadLst2,#Set_SavHiS,#GTCB_Checked)
  Case #Set_DrwBsh
    Gosub GetPath
  End Select
Return



.TestNbLin
  YGad0 = Ht + 4
  YMsg.w= (NbLin * (ShapeHeight(#ShUCl) - 1)) + 5
  HWdw0 = YMsg + Ht + TopOff + 4
  If HWdw0 > HtWb
    If begin
      NbLin=(HtWb-Ht-TopOff-9) / (ShapeHeight(#ShUCl) - 1)
      Goto TestNbLin
    EndIf
    Request        WdwTit2$,ErrNbLin$,Gad_OK$
    NbLin=OldNblin
    GTSetInteger   #GadLst2,#Set_NbLins,NbLin
    ActivateString #GadLst2,#Set_NbLins
    ErrParms=True
  Else
    ChgSize = True
    If HWdw0 + YWdw0 > HtWb
      YWdw0 = HtWb-HWdw0
    EndIf
  EndIf
Return

.TestNbCol
  LGad0 = LengthText{String$("W",8)} + 4
  XGad0 = WLeftOff + NbCol * (ShapeWidth(#ShUCl) - 1) + 4
  XMsg.w= 2
  LWdw0 = XGad0 +LGad0 + LeftOff + 4
  If LWdw0 > LgWb
    If begin
      NbCol=(LgWb-LGad0-LeftOff-8) / (ShapeWidth(#ShUCl) - 1)
      Goto TestNbCol
    EndIf
    Request        WdwTit2$,ErrNbCol$,Gad_OK$
    NbCol=OldNbCol
    GTSetInteger   #GadLst2,#Set_NbCols,NbCol
    ActivateString #GadLst2,#Set_NbCols
    ErrParms=True
  Else
    ChgSize = True
    If LWdw0 + XWdw0 > LgWb
      XWdw0 = LgWb-LWdw0
    EndIf
  EndIf
Return

.GetPath
*FilReq=AllocAslRequest_ (#ASL_FileRequest,0)
  If *FilReq
    PathChosen$   =GfxPath$    + Chr$(0)
    TitAslPathReq$=TitPathReq$ + Chr$(0)
    tags\a=#ASL_Dir
    tags\b=&PathChosen$
    tags\c=#ASL_Hail
    tags\d=&TitAslPathReq$
    tags\e=#ASLFR_DrawersOnly
    tags\f=True
    tags\g=0
    If AslRequest_(*FilReq,tags)
      PathChosen$=Peek$(*FilReq\fr_Drawer)
      If Right$(PathChosen$,1)<>"/" AND Right$(PathChosen$,1)<>":"
        PathChosen$=PathChosen$+"/"
      EndIf
      GfxPath$=PathChosen$
      GTSetString #GadLst2,#Set_ShpDrw,GfxPath$+Chr$(0)
    EndIf
    FreeAslRequest_ *FilReq
  EndIf
  Gosub FreeShapes
  Gosub LoadIconShapes
  ChgSize = True
Return

Function.s TimShow{TimEla}
  SHARED TimEla
  TimAff.q=TimEla/10
  Format "####0.0"
  Function Return Str$(TimAff)
End Function

.ShowTime:
  GTSetString  #GadLst0,#Gen_Elapse,TimShow{TimEla}
Return

.ShowLeft:
  GTSetInteger #GadLst0,#Gen_NbLeft,(NbMin - NbCasFlg)
Return

.NeighbourCalc
Statement NeighbourCalc {x,y}
  SHARED Table(), NbLin, NbCol
  DEFTYPE  .w    XT,YT
  For XT = (x - 1) To (x + 1)
    If XT >= 0 AND XT < NbCol
      For YT = (y - 1) To (y + 1)
        If YT >= 0 AND YT < NbLin
          If Table(XT,YT) < 8
            Table(XT,YT) + 1
          EndIf
        EndIf
      Next  YT
    EndIf
  Next XT
End Statement


.PlaceMines:
  ; -------------------
  ; Places Mines
  ; -------------------
  For n=1 To NbMin             ; All the mines will have a position
    MineOk = False               ; mine not in place
    Repeat                       ; while mine not in the grid
      x = Rnd(NbCol)               ; Random column
      y = Rnd(NbLin)               ; Random line
      If Table(x,y) <> 9           ; Is Position free ?
        Table(x,y) =    9            ; Mined cell
        NeighbourCalc {x,y}             ; Add mine to neighbours infos
        MineOk  = True               ; mine placed on grid
      EndIf                        ;
    Until MineOk                 ; mine placed ?
  Next                         ; All mines on the grid ?
Return



.InitScreen:

  begin = True
  WBenchToFront_
  WbToScreen #NumScn0

  BitMap #NumBmp0,196,61,2
  DecodeILBM #NumBmp0,?Logo

  Window #NumWdw0,1,1,1,1,$400|$800,"",1,0
  WWdw.w= 196
  HWdw.w=  61
  WMove (LgWb-WWdw)/2,(HtWb-HWdw)/2
  WSize WWdw , HWdw

  BitMaptoWindow #NumBmp0,#NumWdw0
  VWait 50

  Gosub GetSettings

  Gosub LoadIconShapes
  Gosub LoadButtonShapes

  R.l = OpenFontPrefs
  Ht  = DefaultFontHeight(#SysFont)+4 ; Hauteur gadget
  LoadFont 0,DefaultFontName(#SysFont),Ht-4
  CloseFontPrefs
  Use IntuiFont 0


  Gosub LoadLocaleStr

  CloseWindow #NumWdw0
  Free BitMap #NumBmp0

  DefaultIDCMP #MouseClic|#GadDwn|#GadHit|#MnuHit|#WdwClosed|#IntuiTick

  R.l=Window(#NumWdw0,XWdw0,YWdw0,LWdw0,HWdw0,$2|$4|$8|$1000|$200000,WdwTit0$,1,0,#GadLst0)
  If R
    LoadSound #SndWin,SndWin$
    LoadSound #SndLoo,SndLoo$
    DecodeShapes #Drawer1,?Drw1
    DecodeShapes #Drawer2,?Drw2
    LeftOff= WLeftOff + 1
    TopOff = WTopOff  + 1
    Gosub TestNbLin
    Gosub TestNbCol
    ChgSize=False
    Gosub Busy_Pointer
    SetWindowTitles_ Peek.l(Addr Window(#NumWdw0)),-1,&ScnTit$
    Gosub LoadMenus
    Gosub ChangeWdwSize
    Gosub GameNew
    Gosub GameStopped
    Gosub Standard_Pointer
    begin =False
  EndIf
Return

.GetSettings:
  If OpenFile(#FilParms,FilSett$)
    NumPar = 0
    Fields 0,TypParm$,Param$
    While NOT Eof(#FilParms)
      Get #FilParms, NumPar
      Select TypParm$
      Case "C"                    ; Columns number
        NbCol      = Val(Param$)
      Case "L"                    ; Lines   number
        NbLin      = Val(Param$)
      Case "M"                    ; Mines   number
        NbMin      = Val(Param$)
      Case "S"                    ; Grid   Icons Path
        GfxPath$   = StripTrail$(Param$,32)
      Case "T"                    ; Button Icons Path
        DirBtnShp$ = StripTrail$(Param$,32)
      Case "X"                    ; Sound effects  On/Off
        SndFxOn    = Val(Param$)
      Case "Y"                    ; Save Hi-Scores On/Off
        SavHiSOn   = Val(Param$)
      End Select
      NumPar + 1
    Wend
    CloseFile #FilParms
  Else
    If WriteFile(#FilParms,FilSett$)
      CloseFile #FilParms
    EndIf
  EndIf
Return

SauveParms:
  If OpenFile(#FilParms,FilSett$)
    Fields #FilParms,TypParm$,Param$
; Columns number setting                    Parameter type C
    TypParm$ = LSet$("C",1)
    Param$   = LSet$(Str$(NbCol)   ,120)
    Put #FilParms, 0
; Lines   number setting                    Parameter type L
    TypParm$ = LSet$("L",1)
    Param$   = LSet$(Str$(NbLin)   ,120)
    Put #FilParms, 1
; Mines   number setting                    Parameter type M
    TypParm$ = LSet$("M",1)
    Param$   = LSet$(Str$(NbMin)   ,120)
    Put #FilParms, 2
; Grid Icons Path                           Parameter type S
    TypParm$ = LSet$("S",1)
    Param$   = LSet$(GfxPath$      ,120)
    Put #FilParms, 3
; Button Icons Path                         Parameter type T
    TypParm$ = LSet$("T",1)
    Param$   = LSet$(DirBtnShp$    ,120)
    Put #FilParms, 4
; Sound effects On/Off                      Parameter type X
    TypParm$ = LSet$("X",1)
    Param$   = LSet$(Str$(SndFxOn) ,120)
    Put #FilParms, 5
; Save Hi-Scores On/Off                     Parameter type Y
    TypParm$ = LSet$("Y",1)
    Param$   = LSet$(Str$(SavHiSOn),120)
    Put #FilParms, 6
    CloseFile #FilParms
  Else
    reqtext$ = ErrOpnSett$
    gadget$=Gad_OK$
    Gosub Requester
  EndIf
Return

Function.b IconShape {sh.w,iconname$,selected.b}
; (the function that does the cool stuff (by D McMinn) )

  *do.DiskObject = GetDiskObject_(&iconname$)
  If *do

    If selected
      *im.Image = *do\do_Gadget\SelectRender
    Else  *im.Image = *do\do_Gadget\GadgetRender
    EndIf

    InitShape sh,*im\Width,*im\Height,*im\_Depth
    *sh.shape = Addr Shape(sh)

    DEFTYPE._RastPort rp
    DEFTYPE._BitMap bmp

    InitRastPort_ &rp
    InitBitMap_ &bmp,*im\_Depth,*im\Width,*im\Height

    For i.w=0 To *im\_Depth-1
      bmp\Planes[i] = *sh\_data + i * (*im\Height) * ((((*im\Width) + 15) LSR 3) & $FFFE)
    Next i

    rp\_BitMap = &bmp
    DrawImage_ &rp,*im,0,0

    MakeCookie sh

    FreeDiskObject_ *do

    Function Return True
  Else
    Function Return False
  End If

End Function

.FreeShapes:
  Free Shape #Sh1Mi
  Free Shape #Sh2Mi
  Free Shape #Sh3Mi
  Free Shape #Sh4Mi
  Free Shape #Sh5Mi
  Free Shape #Sh6Mi
  Free Shape #Sh7Mi
  Free Shape #Sh8Mi
  Free Shape #ShUCl
  Free Shape #ShFlg
  Free Shape #ShQst
  Free Shape #ShMin
  Free Shape #ShClc
Return

.FreeButtonShapes:
  Free Shape #GStpU
  Free Shape #GStpD
  Free Shape #GPauU
  Free Shape #GPauD
  Free Shape #GStaU
  Free Shape #GStaD
Return

.LoadIconShapes:
  Existe = Exists(GfxPath$+"1_Mine.info")
  If Existe = 0
    GfxPath$ = Dir$ + "Icons/"
  EndIf
  norm.b=IconShape {#Sh1Mi,GfxPath$+"1_Mine",0}
  norm.b=IconShape {#Sh2Mi,GfxPath$+"2_Mine",0}
  norm.b=IconShape {#Sh3Mi,GfxPath$+"3_Mine",0}
  norm.b=IconShape {#Sh4Mi,GfxPath$+"4_Mine",0}
  norm.b=IconShape {#Sh5Mi,GfxPath$+"5_Mine",0}
  norm.b=IconShape {#Sh6Mi,GfxPath$+"6_Mine",0}
  norm.b=IconShape {#Sh7Mi,GfxPath$+"7_Mine",0}
  norm.b=IconShape {#Sh8Mi,GfxPath$+"8_Mine",0}
  norm.b=IconShape {#ShUCl,GfxPath$+"UnClic",0}
  norm.b=IconShape {#ShFlg,GfxPath$+"Flaged",0}
  norm.b=IconShape {#ShQst,GfxPath$+"QuestM",0}
  norm.b=IconShape {#ShMin,GfxPath$+"Mined!",0}
  norm.b=IconShape {#ShClc,GfxPath$+"Clickd",0}
Return

.LoadButtonShapes:
  BtnShp = Exists(DirBtnShp$+"Stop.info")
  norm.b=IconShape {#GStpU,DirBtnShp$+"Stop" ,0}
  seld.b=IconShape {#GStpD,DirBtnShp$+"Stop" ,-1}
  norm.b=IconShape {#GPauU,DirBtnShp$+"Pause",0}
  seld.b=IconShape {#GPauD,DirBtnShp$+"Pause",-1}
  norm.b=IconShape {#GStaU,DirBtnShp$+"Start",0}
  seld.b=IconShape {#GStaD,DirBtnShp$+"Start",-1}
Return


.ChangeWdwSize:
  WMove XWdw0,YWdw0
  WSize LWdw0,HWdw0
  InnerCls
  If ChgSize
    DetachGTList #GadLst0
    Free  GTList #GadLst0
  EndIf
  GTTags     #GTTX_Justification,#GTJ_RIGHT,#GTTX_Clipped,True
  GTText     #GadLst0,#Gen_Elapse,XGad0,YGad0,LGad0,Ht,Gen_Elapse$,#PLACETEXT_ABOVE ,TimShow{TimEla}
  YGad0 = CalcPosVert{YGad0, 2}
  GTTags     #GTNM_Justification,#GTJ_RIGHT
  GTNumber   #GadLst0,#Gen_NbLeft,XGad0,YGad0,LGad0,Ht,Gen_NbLeft$,#PLACETEXT_ABOVE ,(NbMin - NbCasFlg)
  YGad0 = CalcPosVert{YGad0, 1}
  ;Shapes were loaded
  If BtnShp
    GTShape   #GadLst0,#Gen_Stop   ,XGad0,YGad0,0,#GStpU,#GStpD
    YGad0 = YGad0 + ShapeHeight(#GStpU) + #INTERHEIGHT
    GTShape   #GadLst0,#Gen_Pause  ,XGad0,YGad0,0,#GPauU,#GPauD
    YGad0 = YGad0 + ShapeHeight(#GPauU) + #INTERHEIGHT
    GTShape   #GadLst0,#Gen_Start  ,XGad0,YGad0,0,#GStaU,#GStaD
  ;Shapes were not loaded
  Else
    GTButton   #GadLst0,#Gen_Stop  ,XGad0,YGad0,LGad0,Ht,Gen_Stop$  ,#PLACETEXT_IN
    YGad0 = CalcPosVert{YGad0, 1}
    GTButton   #GadLst0,#Gen_Pause ,XGad0,YGad0,LGad0,Ht,Gen_Pause$ ,#PLACETEXT_IN
    YGad0 = CalcPosVert{YGad0, 1}
    GTButton   #GadLst0,#Gen_Start ,XGad0,YGad0,LGad0,Ht,Gen_Start$ ,#PLACETEXT_IN
  EndIf
  GTText     #GadLst0,#Gen_Messag,XMsg ,YMsg ,LWdw0-18,Ht,""      ,PLACETEXT_LEFT   ,""
  R   = LengthText{"W"}               ; width 1 character
  AttachGTList #GadLst0,#NumWdw0
  ChgSize = False
  If OpenFile(#FilRecord,FilRecord$)
    Fields #FilRecord,NamScorer$,BestTime
    EnrRcd  = 0
    If NOT Eof(#FilRecord)
      Get    #FilRecord,EnrRcd
    Else
      EnrRcd = 0
    EndIf
    CloseFile #FilRecord
  EndIf
Return


.LoadMenus:
  GTMenuTitle 0,0,LSet$(MnuFile$,16)
    GTMenuItem  0,      0,0,0,LSet$(MnuParms$,16),"P"
    GTMenuItem  0,      0,0,1,LSet$(MnuClear$,16),"C"
    GTMenuItem  0,      0,0,2,LSet$(MnuAbout$,16),"B"
    GTMenuItem  0,      0,0,3
    GTMenuItem  0,      0,0,4,LSet$(MnuQuit$ ,16),"Q"
  CreateMenuStrip 0
  GTSetMenu 0
Return


              
.LoadLocaleStr:
;**** Chargement de toutes les variables chaines localisees ****
LocaleLib$="locale.library"
*LocBas=OpenLibrary_(&LocaleLib$,38)  ; Ouvre Locale si possible
If *LocBas
  *Local=OpenLocale_(0)
  If *Local
    Ca$="A_Sweeper.catalog" + NULLS
    Ca.l=&Ca$
    tags\a=TAG_USER + $90000 + 4
    tags\b=*Local\loc_LanguageName
    tags\c=0
    *Cat=OpenCatalogA_(*Local,Ca,tags)
    If *Cat
      Gosub ChargeCatalog
      CloseCatalog_(*Cat)
    EndIf
    CloseLocale_(*Local)
  EndIf
  CloseLibrary_(*LocBas)
EndIf
Return

ChargeCatalog:

  ; ------- General program infos --------------------------------
PgmNam$       = Peek$(GetCatalogStr_(*Cat,  $1,&PgmNam$))
Version$      = Peek$(GetCatalogStr_(*Cat,  $5,&Version$))

  ; ------- Menus ------------------------------------------------

MnuFile$      = Peek$(GetCatalogStr_(*Cat, $10,&MnuFile$))
MnuClear$     = Peek$(GetCatalogStr_(*Cat, $15,&MnuClear$))
MnuParms$     = Peek$(GetCatalogStr_(*Cat, $20,&MnuParms$))
MnuAbout$     = Peek$(GetCatalogStr_(*Cat, $30,&MnuAbout$))
MnuTrait$     = Peek$(GetCatalogStr_(*Cat, $40,&MnuTrait$))
MnuQuit$      = Peek$(GetCatalogStr_(*Cat, $50,&MnuQuit$))

  ; ------- Messages displayed in the message gadget -------------
GamePaused$   = Peek$(GetCatalogStr_(*Cat,$100,&GamePaused$))
GameStopped$  = Peek$(GetCatalogStr_(*Cat,$110,&GameStopped$))
GameRunning$  = Peek$(GetCatalogStr_(*Cat,$120,&GameRunning$))
GameLoosed$   = Peek$(GetCatalogStr_(*Cat,$130,&GameLoosed$))
GameWon$      = Peek$(GetCatalogStr_(*Cat,$140,&GameWon$))
ErrNbMin$     = Peek$(GetCatalogStr_(*Cat,$150,&ErrNbMin$))
ErrNbLin$     = Peek$(GetCatalogStr_(*Cat,$160,&ErrNbLin$))
ErrNbCol$     = Peek$(GetCatalogStr_(*Cat,$170,&ErrNbCol$))
ErrAddIt$     = Peek$(GetCatalogStr_(*Cat,$180,&ErrAddIt$))

  ; ------- Window and screen titles -----------------------------
WdwTit0$      = Peek$(GetCatalogStr_(*Cat,$500,&WdwTit0$))
WdwTit1$      = Peek$(GetCatalogStr_(*Cat,$510,&WdwTit1$))
WdwTit2$      = Peek$(GetCatalogStr_(*Cat,$520,&WdwTit2$))
ScnTit$       = Peek$(GetCatalogStr_(*Cat,$530,&ScnTit$))

  ; ------- Main window gadgets ----------------------------------
Gen_NbLeft$   = Peek$(GetCatalogStr_(*Cat,$600,&Gen_NbLeft$))
Gen_Elapse$   = Peek$(GetCatalogStr_(*Cat,$610,&Gen_Elapse$))
Gen_Stop$     = Peek$(GetCatalogStr_(*Cat,$620,&Gen_Stop$))
Gen_Pause$    = Peek$(GetCatalogStr_(*Cat,$630,&Gen_Pause$))
Gen_Start$    = Peek$(GetCatalogStr_(*Cat,$640,&Gen_Start$))
Set_NbCols$   = Peek$(GetCatalogStr_(*Cat,$700,&Set_NbCols$))
Set_NbLins$   = Peek$(GetCatalogStr_(*Cat,$710,&Set_NbLins$))
Set_NbMins$   = Peek$(GetCatalogStr_(*Cat,$720,&Set_NbMins$))
Set_ShpDrw$   = Peek$(GetCatalogStr_(*Cat,$730,&Set_ShpDrw$))
GadOk$        = Peek$(GetCatalogStr_(*Cat,$740,&GadOk$))
GadAnnule$    = Peek$(GetCatalogStr_(*Cat,$750,&GadAnnule$))
GadSave$      = Peek$(GetCatalogStr_(*Cat,$760,&GadSave$))
Set_SndFx$    = Peek$(GetCatalogStr_(*Cat,$770,&Set_SndFx$))
Set_SavHiS$   = Peek$(GetCatalogStr_(*Cat,$780,&Set_SavHiS$))

  ; ------- General strings --------------------------------------
CompilLe$     = Peek$(GetCatalogStr_(*Cat,$800,&CompilLe$))
YourAmiga$    = Peek$(GetCatalogStr_(*Cat,$810,&YourAmiga$))
KickVer$      = Peek$(GetCatalogStr_(*Cat,$820,&KickVer$))

Return


;Display Easy-Requester
.Requester:
  easy\es_StructSize=SizeOf.EasyStruct
  easy\es_Title=&titrereq$
  easy\es_TextFormat=&reqtext$
  easy\es_GadgetFormat=&gadget$
  *WinAdr._Window = Peek.l(Addr Window(Used Window))
  Gosub Busy_Pointer
  Rsp=EasyRequestArgs_(*WinAdr,easy,0,0)
  Gosub Standard_Pointer
Return

Busy_Pointer:
;This sets the busypointer for the window
  tags\a=#WA_BusyPointer
  tags\b=True
  tags\c=#WA_PointerDelay
  tags\d=True
  tags\e=#TAG_END
  SetWindowPointerA_ Peek.l(Addr Window(#NumWdw0)),tags
Return



Standard_Pointer:
  ClearPointer_(Peek.l(Addr Window(#NumWdw0)))
Return



.Quit:
  Gosub FreeShapes
  Gosub FreeButtonShapes
  If Addr Sound(#SndWin)
    Free Sound(#SndWin)
  EndIf
  If Addr Sound(#SndLoo)
    Free Sound(#SndLoo)
  EndIf
  CloseWindow #NumWdw0
  CloseScreen #NumScn0
  Forbid_
  End
Return

Drw1: IncBin "Drawer1.shp"
Drw2: IncBin "Drawer2.shp"
Logo: IncBin "A_SweeperLogo.iff"

;String format to write to be used with c:Version
; VER: version name (jj.mm.aa) remarks
Dc.b  "$VER: A_Sweeper 1.06beta (17.Jan.01) Jean-Marc GIGANDET",0
Even

