;
; Ballmaster V1.2
; Copyright (C) 1998-2000  Damir Arh
;
; This program is Free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY OR FITNESS For A PARTICULAR PURPOSE.  See the
; GNU General Public License For more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;
;
; E-mail: damir.arh@telesat.si
;
; S-mail: Damir Arh
;         Titova 89
;         SI-4270 Jesenice
;         Slovenia
;
;
; $VER: BallMaster.bb2 V1.2 (29.12.2000)
;

version$ = "$VER: BallMaster V1.2 (29.12.2000)"

#ecs=0


#_Width=$80000023
#_Height=$80000024
#_Depth=$80000025
#_BitMap=$8000002E
#_Exclusive=$8000003F
#_DisplayID=$80000032


;potrebujemo tile funkciji ;)

  Statement Fade{}
    For i=1 To 100
      FadePalette 1,1,0.98
      Use Palette 1
      VWait
    Next i
  End Statement

  Statement SemiFade{}
    For i=1 To 15
      FadePalette 1,1,0.95
      Use Palette 1
      VWait
    Next i
  End Statement


.zacetek:
  WBStartup

  ;za zacetek nekaj konstant in zacetnih vrednosti
  #sirina=10  ;stevilo polj na zaslonu po sirini
  #visina=7   ;stevilo polj na zaslonu po visini
  #zacx=310   ;x koordinata zacetnega polozaja
  #zacy=6     ;y koordinata zacetnega polozaja
  #hitrost=1  ;#hitrost gibanja kroglic
  #maxzog=20  ;najvecje mozno stevilo kroglic na zaslonu
  #vel=32     ;dimenzije posameznega polja
  #sredina=11 ;odmik koordinate od roba ob sredinskem polozaju
  #premer=9   ;odmik desnega roba kroglice od njenih koordinat
  #zamik=7    ;#zamik oblik glede na tip
  #odmor=10   ;premor med vrtenjem


  ;definicija kroglice
  NEWTYPE .zoga
    x.w:y:barva.b:obstoj:dx:dy:teleport
  End NEWTYPE

  ;definicija igralnega polja
  NEWTYPE .element
    tip.b:a:b:c:d:ok:draw:rot
  End NEWTYPE

  ;pripravimo nekaj tabel
  Dim zoga.zoga(#maxzog)
  Dim element.element(#sirina,#visina)
  Dim order.b(5)
  Dim kriz.b(4)
  Dim teleport(3)

  ;okno za napake ;)

  DosBuffLen 0
  If NOT OpenFile(1,"CON:0/15//150/BallMaster Output") Then End
  FileOutput 1

  NPrint ""
  NPrint "BallMaster V1.2 (29.12.2000)"
  NPrint "(c)1998-2000 Damir Arh"
  NPrint ""


  ;nalozimo grafiko in zvok
  NPrint "Loading level gfx and sound..."
  DecodeShapes 0,?grafika
  DecodePalette 0,?paleta
  DecodeShapes 47,?krizec
  Handle 47,-5,-5

  Dim zvoki$(5)
  zvoki$(0)="sfx/padec.sfx"
  zvoki$(1)="sfx/vrti.sfx"
  zvoki$(2)="sfx/trk.sfx"
  zvoki$(5)="sfx/prazno.sfx"
  zvoki$(3)="sfx/barvanje.sfx"
  zvoki$(4)="sfx/teleport.sfx"

  Dim dolzvok.b(5)
  dolzvok(0)=4
  dolzvok(1)=6
  dolzvok(2)=6
  dolzvok(5)=17
  dolzvok(3)=10
  dolzvok(4)=33

  For i=0 To 5
    If Exists(zvoki$(i))
      LoadSound i,zvoki$(i)
    Else
      Goto sounderr
    EndIf
  Next i

  If Exists("sfx/flouqe.mus")
    LoadMedModule 0,"sfx/flouqe.mus"
  Else
    Goto sounderr
  EndIf

  If Exists("sfx/meanwhile.mus")
    LoadMedModule 1,"sfx/meanwhile.mus"
  Else
    Goto sounderr
  EndIf

  If Exists("sfx/fazahn.mus")
    LoadMedModule 2,"sfx/fazahn.mus"
  Else
    Goto sounderr
  EndIf

  SetInt 5
    PlayMed
    If hold.b>0
      hold.b-1
    EndIf
  End SetInt


  ;preverimo registracijo
  NPrint "Checking registration..."
  Gosub register


  ;preverimo konfiguracijo
  Snd.b=True
  Mus.b=True
  Pro.b=False
  If Exists("BallMaster.cfg")
    If ReadFile(0,"BallMaster.cfg")
      ReadMem 0,&Snd,1
      ReadMem 0,&Mus,1
      ReadMem 0,&Pro,1
      CloseFile 0
    EndIf
  EndIf

  levelset$="default"
  gfxset$="default"


  ;nalozimo stopnje
  NPrint "Loading levels..."
  Gosub load_levels


  ;preverimo obstoj grafik
  NPrint "Loading pictures..."
  Dim slika$(16)
  For i=0 To 9
    slika$(i)="gfx/"+gfxset$+"/back"+Str$(i)+".iff"
  Next i
  slika$(10)="gfx/logo.iff"
  slika$(11)="gfx/title.iff"
  slika$(12)="gfx/menu.iff"
  slika$(13)="gfx/end.iff"
  slika$(14)="gfx/out.iff"
  slika$(15)="gfx/about.iff"
  slika$(16)="gfx/options.iff"

  For i=0 To 16
    If ReadFile(0,slika$(i))

      char.b=0
      j.b=0

      Repeat
        ReadMem 0,&char,1
        j=j+1
      Until Chr$(char)="I"

      FileInput 0
      Check$=Edit$(11)
      If NOT Left$(Check$,7)="LBMCHCK" Then Goto picerr
      Check$=Edit$(8)
      If NOT Left$(Check$,2)="BM" Then Goto picerr
      If NOT Val(Right$(Check$,6))=987654-Exists(slika$(i)) Then Goto picerr

      CloseFile 0

    EndIf

  Next i

  CloseFile 1
                                   

  ;pripravimo zaslon
  Gosub zaslon


.info:
  retry=2           ;zaceli bomo novo igro
  Use BitMap 0
  BitMapOutput 0
  ShowBitMap 0

  Cls

  LoadPalette 1,"gfx/logo.iff"
  Use Palette 1
  LoadIFF "gfx/logo.iff",0
  VWait 100
  Fade{}

  Cls

  LoadPalette 1,"gfx/title.iff"
  Use Palette 1
  LoadIFF "gfx/title.iff",0
  VWait 100
  Fade{}

  StartMedModule 0
  SetMedMask 15


.menu:

  Use BitMap 0
  Cls
  ShowBitMap 0

  LoadPalette 1,"gfx/menu.iff"
  Use Palette 1
  LoadIFF "gfx/menu.iff",0

  FlushEvents
  Repeat
    nwev.l=WaitEvent  ;pocakajmo dogodek
    If nwev=$8        ;klik miske?
      If RectsHit(WMouseX,WMouseY,1,1,64,61,186,18) ;start new game?
        Fade{}
        stopnja=0
        StopMed
        Goto mainloop
      EndIf
      If RectsHit(WMouseX,WMouseY,1,1,30,88,260,18) ;password
        Fade{}
        Gosub password
        Fade{}
        StopMed
        Goto mainloop
      EndIf
      If RectsHit(WMouseX,WMouseY,1,1,103,114,117,18) ;options
        Fade{}
        Gosub options
      EndIf
      If RectsHit(WMouseX,WMouseY,1,1,115,142,92,18) ;about
        Fade{}
        Goto about
      EndIf
      If RectsHit(WMouseX,WMouseY,1,1,80,168,156,18) ;quit
        Fade{}
        StopMed
        Gosub savecfg
        End
      EndIf
    EndIf
  Until False


.playsfx:

  Statement PlaySFX{num.b,ch.b}
    SHARED hold.b, cursnd.b, dolzvok.b(), Mus
    If Mus=True
      If hold=0
        cursnd=num
        Sound num,8
        hold=dolzvok(num)
      Else
        If num>=cursnd
          cursnd=num
          Sound num,8
          hold=dolzvok(num)
        EndIf
      EndIf
    Else
      Sound num,ch
    EndIf
  End Statement


.mainloop:

  ;prikazimo stopnjo
  Gosub stopnja

  ;se nekaj zacetnih vrednosti
  bit.b=1          ;aktualni bitmap
  cev.b=0          ;ali je kaj v cevi
  cas=0            ;cas do naslednje dovoljene operacije
  changen.b=0      ;sprva se ni sprememb na zogici
  changeo.b=2      ;spremembe na semaforju so
  changec.b=2      ;prav tako na krizu
  hold.b=0         ;trenutno ni zv. ucinka
  cursnd.b=0       ;slisimo tudi ucinke najnizje prioritete

  For i=1 To #maxzog
    zoga(i)\obstoj=0 ;unicimo vse zogice
  Next i
  Gosub sledi    ;priklici zogico
  Colour 5,0     ;pisali bomo z modro
  Format "##0"   ;in sicer takole

  If Mus=True
    StartMedModule 2
    SetMedMask 7
  EndIf

  Repeat
    FlushEvents
    done.b=1       ;stopnjo bomo mogoce koncali
    igra.l=igra-1  ;tempus fugit.. ;)
    ritem.b=ritem-1
    If bonus>0
      bonus=bonus-1
    EndIf

    bit=1-bit    ;zamenjamo bitmap
    UnBuffer bit ;spraznimo zaslon
    Use BitMap bit
    BitMapOutput bit

    Gosub miska

    USEPATH zoga(i)      ;povecajmo preglednost

    For i=1 To #maxzog   ;preverimo vse zogice

      If \obstoj=1 AND \teleport=0      ;ce zoga obstoja

        Gosub element    ;preverimo posebnosti elementa

        If \teleport=0
          \x=\x+\dx        ;jo premaknemo
          \y=\y+\dy

          If \y=#zacy      ;ce je se vedno v cevi
            Gosub zoga_cev
          Else             ;ce je v cevi ni vec
            Gosub zoga_tel ;ali sme zoga v teleport
            Gosub zoga_trk ;ali trci s kako drugo zogo
            Gosub zoga_rev ;preverimo, ali pade v revolver
          EndIf

        EndIf

      EndIf

    Next i

    krizc=krizc-1
    Gosub cev              ;kako je s cevjo
    Gosub kriz             ;napolnimo kriz?

    ;ali smo kaj storili
    USEPATH element(x.b,y.b)   ;povecajmo preglednost
    If cas<1               ;ali ze smemo operirati
      Gosub klik_vrti      ;hocemo vrteti?
      Gosub klik_zoga      ;ali smo kliknili na zogico
    EndIf
    cas=cas-1              ;kmalu bomo zopet operirali
    Gosub avto             ;atomatsko vrtenje

    Gosub revolverji       ;preglejmo revolverje
    Gosub pano             ;uredimo pano
    Gosub neosnovni        ;narisimo drugi del sestavljenih elementov

    ShowBitMap bit    ;prikazimo narisano
    VWait                  ;pocakajmo uskladitev


    ;ali je igre konec
    If vcevi=5 OR igra=0
      VWait 50
      StopMed
      If retry>0
        retry=retry-1
        Goto mainloop
      Else
        Goto the_end
      EndIf
    EndIf

    If done=1
      VWait 50
      StopMed
      stopnja=stopnja+1
      If stopnja<entries
        Goto mainloop
      Else
        Goto done
      EndIf
    EndIf

    If RawStatus($19)      ;premor
      CNIF #ecs=1
        InitPalette 1,64
      CELSE
        InitPalette 1,256
      CEND
      FadePalette 0,1,0.5
      Use Palette 1
      SetMedVolume 32
      Repeat
        nwev.l=WaitEvent
      Until nwev=$8        ;klik miske?
      Use Palette 0
      Free Palette 1
      SetMedVolume 64
    EndIf

  Until RawStatus($45)

  VWait 10
  StopMed
  If retry>0
    retry=retry-1
    Goto mainloop
  Else
    Goto the_end
  EndIf


.load_levels:

  If ReadFile(0,"lvl/"+levelset$+".dat")  ;nalozimo podatke o stopnjah
    FileInput 0
    entries=Edit(5)          ;koliko stopenj je v datoteki
    Dim lvldat(entries-1,5),lvlnm$(entries-1)
    For i=0 To entries-1
      lvlnm$(i)=Edit$(40)
      For j=0 To 5
        lvldat(i,j)=Edit(5)  ;podatki
      Next j
      chcksm=Edit(5)         ;kontrolna vsota
      If NOT chcksm=i+lvldat(i,0)+2*lvldat(i,1)+3*lvldat(i,2)+4*lvldat(i,3)+5*lvldat(i,4)+6*lvldat(i,5)+7*Len(lvlnm$(i))
        Goto levelerr                  ;preverimo kontrolno vsoto
      EndIf
      If (lvldat(i,0)<50) OR (lvldat(i,0)>999)
        Goto levelerr                  ;obseg casa
      EndIf
      If (lvldat(i,1)<1) OR (lvldat(i,1)>10)
        Goto levelerr                  ;obseg sprehodov zoge
      EndIf
      If (lvldat(i,2)<0) OR (lvldat(i,2)>5)
        Goto levelerr                  ;obseg stevila predpisanih barv
      EndIf
      If (lvldat(i,3)<0) OR (lvldat(i,3)>120)
        Goto levelerr                  ;obseg intervala med krizi
      EndIf
      If (lvldat(i,4)<0) OR (lvldat(i,4)>120)
        Goto levelerr                  ;obseg bonus casa
      EndIf
      If (lvldat(i,5)<0) OR (lvldat(i,5)>5)
        Goto levelerr                  ;obseg joker zogic
      EndIf
    Next i
    CloseFile 0
  Else
    Goto levelerr
  EndIf

  Dim lvlmap.b(9,6,entries-1) ;nalozimo izgled stopenj

  If ReadFile(0,"lvl/"+levelset$+".map")
    ReadMem 0,&lvlmap(0,0,0),entries*70
    CloseFile 0
  Else
    Goto levelerr
  EndIf

  Return


.zaslon:

CNIF #ecs=1
  BitMap 0,320,256,6 : Buffer 0,16384
  BitMap 1,320,256,6 : Buffer 1,16384
  ScreenTags 0,"BallMaster",#_Width,320,#_Height,256,#_Depth,6,#_BitMap,Addr BitMap(0),#_Exclusive,True,#_DisplayID,$80
CELSE
  BitMap 0,320,256,8 : Buffer 0,16384
  BitMap 1,320,256,8 : Buffer 1,16384
  ScreenTags 0,"BallMaster",#_Width,320,#_Height,256,#_Depth,8,#_BitMap,Addr BitMap(0),#_Exclusive,True
CEND
  Window 0,0,0,320,256,$1800,"",4,4
  WPointer 47
  Use Palette 0
  Menus Off

  Return


.stopnja:

  FlushBuffer 0
  FlushBuffer 1
  Use BitMap 1
  BitMapOutput 1

  teleport(0)=0
  teleport(3)=0
  whleft=0      ;prestej revolverje
  changewl=2    ;to napisi na pano
  Cls
  For i=2 To #sirina-1
    Block 6,(i-1)*32,0 ;narisimo cev (srednji del)
  Next i
  Block 48,0,0         ;narisimo cev (zacetni del)
  Block 49,288,0       ;narisimo cev (koncni del)
  For j=1 To #visina
    For i=1 To #sirina
      element(i,j)\tip=lvlmap(i-1,j-1,stopnja) ;preberimo element
      Select element(i,j)\tip+1 ;dolocimo lastnosti (1-zaprto,0-odprto)
        Case 1
          element(i,j)\a=1,1,1,1,0,0,0
        Case 2
          element(i,j)\a=1,0,1,0,0,0,0
        Case 3
          element(i,j)\a=0,1,0,1,0,0,0
        Case 4
          element(i,j)\a=0,0,0,0,0,0,0
          whleft=whleft+1
        Case 5
          element(i,j)\a=0,0,0,0,0,0,0
          whleft=whleft+1
        Case 6
          element(i,j)\a=0,0,0,0,0,0,0
        Case 7
          element(i,j)\a=0,0,1,1,0,0,0
        Case 8
          element(i,j)\a=1,0,0,1,0,0,0
        Case 9
          element(i,j)\a=1,1,0,0,0,0,0
        Case 10
          element(i,j)\a=0,1,1,0,0,0,0
        Case 11
          element(i,j)\a=1,0,1,0,0,0,0
        Case 12
          element(i,j)\a=0,1,0,1,0,0,0
        Case 13
          element(i,j)\a=1,0,1,0,0,0,0
        Case 14
          element(i,j)\a=0,1,0,1,0,0,0
        Case 15
          element(i,j)\a=1,0,1,0,0,0,0
        Case 16
          element(i,j)\a=0,1,0,1,0,0,0
        Case 17
          element(i,j)\a=1,0,1,0,0,0,0
        Case 18
          element(i,j)\a=0,1,0,1,0,0,0
        Case 19
          element(i,j)\a=1,0,1,0,0,0,0
        Case 20
          element(i,j)\a=0,1,0,1,0,0,0
        Case 21
          element(i,j)\a=1,0,1,0,0,0,0
        Case 22
          element(i,j)\a=0,1,0,1,0,0,0
        Case 23
          element(i,j)\a=1,0,1,0,0,0,0
        Case 24
          element(i,j)\a=0,1,0,1,0,0,0
        Case 25
          element(i,j)\a=1,0,1,0,0,0,0
        Case 26
          element(i,j)\a=0,1,0,1,0,0,0
        Case 27
          element(i,j)\a=1,0,1,0,0,0,0
        Case 28
          element(i,j)\a=0,1,0,1,0,0,0
        Case 29
          element(i,j)\a=1,0,1,0,0,0,0
        Case 30
          element(i,j)\a=0,1,0,1,0,0,0
        Case 31
          element(i,j)\a=0,0,0,0,0,0,0
        Case 32
          element(i,j)\a=0,0,0,0,0,0,0
          whleft=whleft+1
        Case 33
          element(i,j)\a=0,0,0,0,0,0,0
          whleft=whleft+1
      End Select
      If element(i,j)\tip<10 OR element(i,j)\tip>29 ;ce je element osnoven
        If element (i,j)\tip<4
          Block element(i,j)\tip+#zamik,(i-1)*#vel,(j*#vel)-16
        Else
          If element(i,j)\tip=30
            Block 50,(i-1)*#vel,(j*#vel)-16
            If teleport(0)=0
              teleport(0)=i+(j-1)*10
              teleport(1)=i
              teleport(2)=j
            Else
              teleport(1)=i-teleport(1)
              teleport(2)=j-teleport(2)
            EndIf
          EndIf
          If element(i,j)\tip>30
            Block 10,(i-1)*#vel,(j*#vel)-16
          EndIf
          If element(i,j)\tip<10
            Block element(i,j)\tip+#zamik-1,(i-1)*#vel,(j*#vel)-16 ;narisimo
          EndIf
        EndIf
      Else                                    ;sicer
        If element(i,j)\tip MOD 2 = 0             ;ce je sod
          Block 1+#zamik,(i-1)*#vel,(j*#vel)-16 ;narisemo vod. cev
        Else                                  ;sicer
          Block 2+#zamik,(i-1)*#vel,(j*#vel)-16 ;narisemo nav. cev
        EndIf
        If element(i,j)\tip<14
          Blit element(i,j)\tip+25,i*32-22,j*32-6
        Else
          Blit (element(i,j)\tip)/2+32,i*32-22,j*32-6
        EndIf
      EndIf
    Next i
  Next j
  Block 17,0,240      ;narisimo se pano

  igra=lvldat(stopnja,0)*50+2      ;uredimo cas
  konst=lvldat(stopnja,1)          ;preberimo stevilo obhodov zoge
  sem=lvldat(stopnja,2)            ;stevilo predpisanih barv
  For i=1 To sem
    order(i)=Rnd(4)+1 ;napolnimo semafor
  Next i
  krizcas=lvldat(stopnja,3)        ;preberimo cas kriza
  krizc=1
  If krizcas>0
    For i=1 To 4
      kriz(i)=Rnd(4)+1  ;napolnimo kriz (ce je treba)
    Next i
  EndIf
  bonus=lvldat(stopnja,4)*50       ;preberimo bonus
  bonusmax.w=bonus
  If bonus=0
    Box 201,253,236,254,1
  Else
    Box 201,253,236,254,5
  EndIf
  joker=lvldat(stopnja,5)          ;kaj pa verjetnost jokerja
  ime$=lvlnm$(stopnja)             ;in ime stopnje
  ritem=50                         ;postavimo cas za vrtenje revolverjev

  Gosub level_info
  CopyBitMap 1,0

  Return


.miska:

  misx.w=SMouseX            ;spravimo miskine koordinate
  misy.w=SMouseY
  If misx>319 Then misx=319  ;poskrbimo, da koordinate niso
  If misx<0 Then misx=0      ;zunaj zaslona
  If misy>235 Then misy=235
  If misy<0 Then misy=0
  x.b=Int(misx/#vel)+1      ;prevedimo to v polje
  y.b=Int((misy-16)/#vel)+1

  Return


.element:

  USEPATH zoga(i)
  elx.b=Int(\x/#vel)+1
  ely.b=Int((\y-16)/#vel)+1
  If \x MOD 32=11 AND (\y-16) MOD 32=11
    Select element(elx,ely)\tip
      Case 6
        If \dx=-#hitrost
          \dx=0
          \dy=-#hitrost
        Else
          If \dy=#hitrost
            \dy=0
            \dx=#hitrost
          EndIf
        EndIf
      Case 7
        If \dx=-#hitrost
          \dx=0
          \dy=#hitrost
        Else
          If \dy=-#hitrost
            \dy=0
            \dx=#hitrost
          EndIf
        EndIf
      Case 8
        If \dx=#hitrost
          \dx=0
          \dy=#hitrost
        Else
          If \dy=-#hitrost
            \dy=0
            \dx=-#hitrost
          EndIf
        EndIf
      Case 9
        If \dx=#hitrost
          \dx=0
          \dy=-#hitrost
        Else
          If \dy=#hitrost
            \dy=0
            \dx=-#hitrost
          EndIf
        EndIf
      Case 10
        If \dx=-#hitrost
          \dx=#hitrost
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 11
        If \dy=-#hitrost
          \dy=#hitrost
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 12
        If \dx=#hitrost
          \dx=-#hitrost
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 13
        If \dy=#hitrost
          \dy=-#hitrost
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 14
        If NOT (\barva=1 OR \barva=5)
          \dx=-\dx
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 15
        If NOT (\barva=1 OR \barva=5)
          \dy=-\dy
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 16
        If NOT (\barva=2 OR \barva=5)
          \dx=-\dx
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 17
        If NOT (\barva=2 OR \barva=5)
          \dy=-\dy
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 18
        If NOT (\barva=3 OR \barva=5)
          \dx=-\dx
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 19
        If NOT (\barva=3 OR \barva=5)
          \dy=-\dy
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 20
        If NOT (\barva=4 OR \barva=5)
          \dx=-\dx
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 21
        If NOT (\barva=4 OR \barva=5)
          \dy=-\dy
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Case 22
        If \barva<5
          \barva=1
        EndIf
        If Snd=True Then PlaySFX{3,8}
      Case 23
        If \barva<5
          \barva=1
        EndIf
        If Snd=True Then PlaySFX{3,8}
      Case 24
        If \barva<5
          \barva=2
        EndIf
        If Snd=True Then PlaySFX{3,8}
      Case 25
        If \barva<5
          \barva=2
        EndIf
        If Snd=True Then PlaySFX{3,8}
      Case 26
        If \barva<5
          \barva=3
        EndIf
        If Snd=True Then PlaySFX{3,8}
      Case 27
        If \barva<5
          \barva=3
        EndIf
        If Snd=True Then PlaySFX{3,8}
      Case 28
        If \barva<5
          \barva=4
        EndIf
        If Snd=True Then PlaySFX{3,8}
      Case 29
        If \barva<5
          \barva=4
        EndIf
        If Snd=True Then PlaySFX{3,8}
    End Select
  EndIf
  If element(elx,ely)\tip>9 AND element(elx,ely)\tip<30
    element(elx,ely)\draw=1
  EndIf
  If element(elx,ely)\tip=30
    If \x MOD 32=1 OR \x MOD 32=21 OR (\y-16) MOD 32=1 OR (\y-16) MOD 32=21
       If teleport(3)=0
         \teleport=1
         teleport(3)=1
         If Snd=True Then PlaySFX{4,8}
       Else
         teleport(3)=0
       EndIf
    EndIf
  EndIf

  Return


.zoga_cev:

  USEPATH zoga(i)
  ;preverimo, ce se je zaletela
  If \x<0 OR \x>319-#premer
    \dx=-\dx    ;spremenimo smer
    \x=\x+2*\dx ;in popravimo polozaj
  EndIf

  ;ali bo padla v revolver
  If \x MOD #vel=#sredina AND element(\x/#vel+1,1)\a=0 AND element(\x/#vel+1,1)\rot=0
    element(\x/#vel+1,1)\a=\barva ;revolver se napolni
    element(\x/#vel+1,1)\draw=2
    \obstoj=0 ;zogice ni vec
    cev=0 ;cev je prazna
    If Snd=True Then PlaySFX{0,1}
  EndIf

  Return


.zoga_trk:

  USEPATH zoga(i)
  For j=i+1 To #maxzog
    If zoga(j)\obstoj=1 AND (i>j OR j>i)
      If \dx=-zoga(j)\dx OR \dy=-zoga(j)\dy       ;trk na ravnem
        If RectsHit(\x,\y,10,10,zoga(j)\x,zoga(j)\y,10,10)=-1
          \dx=-\dx : \dy=-\dy       ;spremeni smer
          \x=\x+\dx : \y=\y+\dy ;popravi pozicijo
          zoga(j)\dx=-zoga(j)\dx    ;tudi drugi zogi se smer spremeni
          zoga(j)\dy=-zoga(j)\dy
          zoga(j)\y=zoga(j)\y+zoga(j)\dy
          zoga(j)\x=zoga(j)\x+zoga(j)\dx
          If Snd=True Then PlaySFX{2,4}
        EndIf
      Else                                        ;trk v ovinku
        If RectsHit(\x+2,\y+2,6,6,zoga(j)\x+2,zoga(j)\y+2,6,6)=-1
          \dx=-\dx : \dy=-\dy       ;spremeni smer
          \x=\x+\dx : \y=\y+\dy ;popravi pozicijo
          zoga(j)\dx=-zoga(j)\dx    ;tudi drugi zogi se smer spremeni
          zoga(j)\dy=-zoga(j)\dy
          zoga(j)\y=zoga(j)\y+zoga(j)\dy
          zoga(j)\x=zoga(j)\x+zoga(j)\dx
          If Snd=True Then PlaySFX{2,4}
        EndIf
      EndIf
    EndIf
  Next j

  Return


.zoga_tel

  USEPATH zoga(i)

  If \dy=-#hitrost AND element(\x/32+1,(\y-16)/32+1)\tip=30
    If teleport(3)=1
      \dy=-dy
      \y=\y+2*\dy
      If Snd=True Then PlaySFX{2,4}
    EndIf
  EndIf

  If \dx=#hitrost AND element((\x+9)/32+1,\y/32+1)\tip=30
    If teleport(3)=1
      \dx=-\dx
      \x=\x+2*\dx
      If Snd=True Then PlaySFX{2,4}
    EndIf
  EndIf

  If \dy=#hitrost AND element(\x/32+1,(\y-7)/32+1)\tip=30
    If teleport(3)=1
      \dy=-\dy
      \y=\y-2*\dy
      If Snd=True Then PlaySFX{2,4}
    EndIf
  EndIf

  If \dx=-#hitrost AND element(\x/32+1,\y/32+1)\tip=30
    If teleport(3)=1
      \dx=-\dx
      \x=\x+2*\dx
      If Snd=True Then PlaySFX{2,4}
    EndIf
  EndIf

  Return


.zoga_rev:

  USEPATH zoga (i)
  ;ce gre gor
  If \dy=-#hitrost
    If element(\x/32+1,(\y-16)/32+1)\tip=3 OR element(\x/32+1,(\y-16)/32+1)\tip=4 OR element(\x/32+1,(\y-16)/32+1)\tip>30

      ;v revolverju je prostor in se ne vrti
      If element(\x/32+1,(\y-16)/32+1)\c=0 AND element(\x/32+1,(\y-16)/32+1)\rot=0
        element(\x/32+1,(\y-16)/32+1)\c=\barva ;zoga ga zasede
        element(\x/32+1,(\y-16)/32+1)\draw=2
        cas=#odmor                              ;ne smemo operirati
        \obstoj=0                              ;sama pa izgine
        If Snd=True Then PlaySFX{0,1}
      Else                                     ;ali pa ga ni
        \dy=-\dy                               ;zogica se odbije
        \y=\y+2*\dy                            ;in spremeni polozaj
        If Snd=True Then PlaySFX{2,4}
      EndIf

    EndIf

  EndIf

  ;ce gre desno
  If \dx=#hitrost
    If element((\x+9)/32+1,\y/32+1)\tip=3 OR element((\x+9)/32+1,\y/32+1)\tip=4 OR element((\x+9)/32+1,\y/32+1)\tip>30

      ;v revolverju je prostor
      If element((\x+9)/32+1,\y/32+1)\d=0 AND element((\x+9)/32+1,\y/32+1)\rot=0
        element((\x+9)/32+1,\y/32+1)\d=\barva  ;zoga ga zasede
        element((\x+9)/32+1,\y/32+1)\draw=2
        cas=#odmor                              ;ne smemo operirati
        \obstoj=0                              ;sama pa izgine
        If Snd=True Then PlaySFX{0,1}
      Else                                     ;ali pa ga ni
        \dx=-\dx                               ;zogica se odbije
        \x=\x+2*\dx                            ;in spremeni polozaj
        If Snd=True Then PlaySFX{2,4}
      EndIf

    EndIf

  EndIf

  ;ce gre dol
  If \dy=#hitrost
    If element(\x/32+1,(\y-7)/32+1)\tip=3 OR element(\x/32+1,(\y-7)/32+1)\tip=4 OR element(\x/32+1,(\y-7)/32+1)\tip>30

      ;v revolverju je prostor
      If element(\x/32+1,(\y-7)/32+1)\a=0 AND element(\x/32+1,(\y-7)/32+1)\rot=0
        element(\x/32+1,(\y-7)/32+1)\a=\barva  ;zoga ga zasede
        element(\x/32+1,(\y-7)/32+1)\draw=2
        cas=#odmor                              ;ne smemo operirati
        \obstoj=0                              ;sama pa izgine
        If Snd=True Then PlaySFX{0,1}
      Else                                     ;ali pa ga ni
        \dy=-\dy                               ;zogica se odbije
        \y=\y+2*\dy                            ;in spremeni polozaj
        If Snd=True Then PlaySFX{2,4}
      EndIf

    EndIf

  EndIf

  ;ce gre levo
  If \dx=-#hitrost
    If element(\x/32+1,\y/32+1)\tip=3 OR element(\x/32+1,\y/32+1)\tip=4 OR element(\x/32+1,\y/32+1)\tip>30

      ;v revolverju je prostor
      If element(\x/32+1,\y/32+1)\b=0 AND element(\x/32+1,\y/32+1)\rot=0
        element(\x/32+1,\y/32+1)\b=\barva      ;zoga ga zasede
        element(\x/32+1,\y/32+1)\draw=2
        cas=#odmor                              ;ne smemo operirati
        \obstoj=0                              ;sama pa izgine
        If Snd=True Then PlaySFX{0,1}
      Else                                     ;ali pa ga ni
        \dx=-\dx                               ;zogica se odbije
        \x=\x+2*\dx                            ;in spremeni polozaj
        If Snd=True Then PlaySFX{2,4}
      EndIf

    EndIf

  EndIf

  Return


.cev:

  USEPATH zoga(i)
  If cev=0 ;ce ni nic v cevi
    i=0
    ;poiscimo nezasedeno zogico
    Repeat
      i=i+1
    Until \obstoj=0
    ;naredimo novo zogico
    \x=#zacx,#zacy,sledi,1,-#hitrost,0,0
    Gosub sledi     ;napovemo naslednjo
    changen=2       ;pano se je spremenil
    vcevi=314      ;zogica je sel prisla
    const=konst    ;kako hitro bo tekel cas zogice
    Box 5,2,314,3,1 : Use BitMap 1-bit
    Box 5,2,314,3,1 : Use BitMap bit
    cev=1 ;cev je zdaj polna
  EndIf

  Return


.kriz:

  If krizc=1
    For i=1 To 4
      kriz(i)=Rnd(4)+1
    Next i
    bonus=bonusmax
    If bonus=0
      t=1
    Else
      t=5
    EndIf
    Box 201,253,236,254,t : Use BitMap 1-bit
    Box 201,253,236,254,t : Use BitMap bit
    changec=2
  EndIf

  Return


.klik_vrti:

  USEPATH element(x,y)
  If Joyb(0)=2 AND \tip=3
    t=\a:\a=\d:\d=\c:\c=\b:\b=t ;zavrtimo
    \rot=3
    cas=#odmor                  ;nastavimo premor
    If Snd=True Then PlaySFX{1,2}    ;pa se zvok
  EndIf
  If Joyb(0)=2 AND \tip=4
    t=\a:\a=\b:\b=\c:\c=\d:\d=t
    \rot=3
    cas=#odmor
    If Snd=True Then PlaySFX{1,2}
  EndIf

  Return


.klik_zoga:

  USEPATH element(x,y)
  If Joyb(0)=1 AND (\tip=3 OR \tip=4 OR \tip>30)

    ;zogica je zgoraj
    If \a>0 AND RectsHit(x*32-21,y*32-15,10,10,misx,misy,1,1)=-1
      If y>1 AND element(x,y-1)\c=0  ;ce ima prostor
        ok=1                         ;kontrolna spremenljivka
        If element(x,y-1)\tip=3 OR element(x,y-1)\tip=4 OR element(x,y-1)\tip>30      ;ce je zraven revolver
          element(x,y-1)\c=\a        ;ga napolnimo
          element(x,y-1)\draw=2
        Else                         ;kot kaze je nekaksna cev
          i=0
          Repeat                     ;poiscimo prazno zogico
            i=i+1
          Until zoga(i)\obstoj=0
          For j=1 To #maxzog
            If zoga(j)\obstoj=1 AND (i>j OR j>i) ;ali trci z drugo zogo
              ok=ok+RectsHit(zoga(j)\x,zoga(j)\y,10,10,x*32-21,y*32-28,10,10)
            EndIf
          Next j
          If ok=1                    ;ce trka ni bilo
            zoga(i)\x=x*32-21,y*32-26,\a,1,0,-#hitrost ;naredimo novo
          EndIf
        EndIf
        If ok=1
          \a=0:cas=#odmor               ;na koncu se je znebimo
          \draw=2
          If Snd=True Then PlaySFX{0,1}
        EndIf
      EndIf
    EndIf

    ;zogica je desno
    If \b>0 AND RectsHit(x*32-11,y*32-5,10,10,misx,misy,1,1)=-1
      If x<10 AND element(x+1,y)\d=0 ;ce ima prostor
        ok=1                         ;kontrolna spremenljivka
        If element(x+1,y)\tip=3 OR element(x+1,y)\tip=4 OR element(x+1,y)\tip>30    ;ce je zraven revolver
          element(x+1,y)\d=\b        ;ga napolnimo
          element(x+1,y)\draw=2
        Else                         ;kot kaze je nekaksna cev
          i=0
          Repeat                     ;poiscimo prazno zogico
            i=i+1
          Until zoga(i)\obstoj=0
          For j=1 To #maxzog
            If zoga(j)\obstoj=1 AND (i>j OR j>i) ;ali trci z drugo zogo
              ok=ok+RectsHit(zoga(j)\x,zoga(j)\y,10,10,x*32+2,y*32-5,10,10)
            EndIf
          Next j
          If ok=1                  ;ce trka ni bilo
            zoga(i)\x=x*32,y*32-5,\b,1,#hitrost,0     ;naredimo novo
          EndIf
        EndIf
        If ok=1
          \b=0:cas=#odmor               ;na koncu se je znebimo
          \draw=2
          If Snd=True Then PlaySFX{0,1}
        EndIf
      EndIf
    EndIf

    ;zogica je spodaj
    If \c>0 AND RectsHit(x*32-21,y*32+5,10,10,misx,misy,1,1)=-1
      If y<7 AND element (x,y+1)\a=0 ;ce ima prostor
        ok=1                         ;kontrolna spremenljivka
        If element(x,y+1)\tip=3 OR element(x,y+1)\tip=4 OR element(x,y+1)\tip>30    ;ce je zraven revolver
          element(x,y+1)\a=\c        ;ga napolnimo
          element(x,y+1)\draw=2
        Else                         ;kot kaze je nekaksna cev
          i=0
          Repeat                     ;poiscimo prazno zogico
            i=i+1
          Until zoga(i)\obstoj=0
          For j=1 To #maxzog
            If zoga(j)\obstoj=1 AND (i>j OR j>i) ;ali trci z drugo zogo
              ok=ok+RectsHit(zoga(j)\x,zoga(j)\y,10,10,x*32-21,y*32+18,10,10)
            EndIf
          Next j
          If ok=1                  ;ce trka ni bilo
            zoga(i)\x=x*32-21,y*32+16,\c,1,0,#hitrost ;naredimo novo
          EndIf
        EndIf
        If ok=1
          \c=0:cas=#odmor               ;na koncu se je znebimo
          \draw=2
          If Snd=True Then PlaySFX{0,1}
        EndIf
      EndIf
    EndIf

    ;zogica je levo
    If \d>0 AND RectsHit(x*32-31,y*32-5,10,10,misx,misy,1,1)=-1
      If x>1 AND element (x-1,y)\b=0 ;ce ima prostor
        ok=1                         ;kontrolna spremenljivka
        If element(x-1,y)\tip=3 OR element(x-1,y)\tip=4 OR element(x-1,y)\tip>30    ;ce je zraven revolver
          element(x-1,y)\b=\d        ;ga napolnimo
          element(x-1,y)\draw=2
        Else                         ;kot kaze je nekaksna cev
          i=0
          Repeat                     ;poiscimo prazno zogico
            i=i+1
          Until zoga(i)\obstoj=0
          For j=1 To #maxzog
            If zoga(j)\obstoj=1 AND (i>j OR j>i) ;ali trci z drugo zogo
              ok=ok+RectsHit(zoga(j)\x,zoga(j)\y,10,10,x*32-44,y*32-5,10,10)
            EndIf
          Next j
          If ok=1                  ;ce trka ni bilo
            zoga(i)\x=x*32-42,y*32-5,\d,1,-#hitrost,0 ;naredimo novo
          EndIf
        EndIf
        If ok=1
          \d=0:cas=#odmor               ;na koncu se je znebimo
          \draw=2
          If Snd=True Then PlaySFX{0,1}
        EndIf
      EndIf
    EndIf

  EndIf

  Return


.avto:

  USEPATH element(i,j)
  If ritem<1                    ;avto revolverji
    ritem=50
    For i=1 To 10
      For j=1 To 7
        If \tip=31
          t=\a:\a=\d:\d=\c:\c=\b:\b=t
          \rot=3
          If Snd=True Then PlaySFX{1,2}
        EndIf
        If \tip=32
          t=\a:\a=\b:\b=\c:\c=\d:\d=t
          \rot=3
          If Snd=True Then PlaySFX{1,2}
        EndIf
      Next j
    Next i
  EndIf

  Return


.revolverji:

  USEPATH element(x,y)
  For x=1 To #sirina
    For y=1 To #visina
      If \tip=3 OR \tip=4 OR \tip=31 OR \tip=32
        If \rot=0          ;ce se revolver ne vrti vec
          If Pro=False OR \ok=0
            If kriz(1)=0 ;ce ni predpisane kombinacije
              If \a>0 AND \b>0 AND \c>0 AND \d>0 ;ce so vse luknje polne
                If \a<5        ;poiscimo barvo
                  a=\a
                Else
                  If \b<5
                    a=\b
                  Else
                    If \c<5
                      a=\c
                    Else
                      a=\d
                    EndIf
                  EndIf
                EndIf
                If (\a=a OR \a=5) AND (\b=a OR \b=5) AND (\c=a OR \c=5) AND (\d=a OR \d=5)
                  If order(1)=0
                    If \ok=0
                      whleft=whleft-1 ;en manj do konca
                      changewl=2
                    EndIf
                    \a=0,0,0,0,1,2 ;ce ni semaforja jih enostavno zbrisemo
                    If Snd=True Then PlaySFX{5,15}
                  Else
                    If order(1)=a OR a=5
                      If \ok=0
                        whleft=whleft-1 ;en manj do konca
                        changewl=2
                      EndIf
                      \a=0,0,0,0,1,2 ;ce se s semaforjem ujema, jih zbrisemo
                      For i=1 To 4
                        order(i)=order(i+1) ;semafor premaknemo
                      Next i
                      order(5)=0; zadnjega spraznimo
                      changeo=2
                      If Snd=True Then PlaySFX{5,15}
                    EndIf
                  EndIf
                EndIf
              EndIf
            Else ; ce pa kombinacija je
              If (\a=kriz(1) OR \a=5) AND (\b=kriz(2) OR \b=5) AND (\c=kriz(3) OR \c=5) AND (\d=kriz(4) OR \d=5) ;ce se s kombin
                If \ok=0
                  whleft=whleft-1  ;en manj do konca
                  changewl=2
                EndIf
                \a=0,0,0,0,1,2        ;zbrisemo revolver
                If Snd=True Then PlaySFX{5,15}
                For i=1 To 4
                  kriz(i)=0           ;spraznimo kriz
                Next i
                krizc=krizcas*50
                igra=igra+bonus       ;dodamo bonus cas
                bonus=2
                changec=2             ;ukazemo spremembo
                Box 201,253,236,254,1 : Use BitMap 1-bit ; pocistimo
                Box 201,253,236,254,1 : Use BitMap bit   ; merilec
              EndIf
            EndIf
          EndIf
        EndIf
        If \draw>0
          \draw=\draw-1
          Blit 10,(x-1)*32,y*32-16
          If \a>0
            Blit \a,x*32-21,y*32-15 ;nato narisemo zogice v njih
          EndIf
          If \b>0
            Blit \b,x*32-11,y*32-5
          EndIf
          If \c>0
            Blit \c,x*32-21,y*32+5
          EndIf
          If \d>0
            Blit \d,x*32-31,y*32-5
          EndIf
          If \ok=1
            Blit 16,x*32-18,y*32-2                  ;prizgemo zeleno lucko
          EndIf
        EndIf
        If \ok=0 Then done=0
      EndIf
    Next y
  Next x

  For x=1 To 10
    For y=1 To 7
      If \rot=1
        \draw=2
        \rot=0
        If \tip=3 OR \tip=31
          Blit 69,(x-1)*32,(y-1)*32+16
          If \a>0
            Blit \a,x*32-25,y*32-14
          EndIf
          If \b>0
            Blit \b,x*32-12,y*32-9
          EndIf
          If \c>0
            Blit \c,x*32-17,y*32+4
          EndIf
          If \d>0
            Blit \d,x*32-30,y*32-1
          EndIf
        EndIf
        If \tip=4 OR \tip=32
          Blit 67,(x-1)*32,(y-1)*32+16
          If \d>0
            Blit \d,x*32-30,y*32-9
          EndIf
          If \a>0
            Blit \a,x*32-17,y*32-14
          EndIf
          If \b>0
            Blit \b,x*32-12,y*32-1
          EndIf
          If \c>0
            Blit \c,x*32-25,y*32+4
          EndIf
        EndIf
        If \ok=1
          Blit 16,x*32-18,y*32-2
        EndIf
      EndIf
      If \rot=2
        \rot=1
        Blit 68,(x-1)*32,(y-1)*32+16
        If \tip=3 OR \tip=31
          If \b>0
            Blit \b,x*32-14,y*32-12
          EndIf
          If \c>0
            Blit \c,x*32-14,y*32+2
          EndIf
          If \d>0
            Blit \d,x*32-28,y*32+2
          EndIf
          If \a>0
            Blit \a,x*32-28,y*32-12
          EndIf
        EndIf
        If \tip=4 OR \tip=32
          If \a>0
            Blit \a,x*32-14,y*32-12
          EndIf
          If \b>0
            Blit \b,x*32-14,y*32+2
          EndIf
          If \c>0
            Blit \c,x*32-28,y*32+2
          EndIf
          If \d>0
            Blit \d,x*32-28,y*32-12
          EndIf
        EndIf
        If \ok=1
          Blit 16,x*32-18,y*32-2
        EndIf
      EndIf
      If \rot=3
        \rot=2
        If \tip=3 OR \tip=31
          Blit 67,(x-1)*32,(y-1)*32+16
          If \a>0
            Blit \a,x*32-30,y*32-9
          EndIf
          If \b>0
            Blit \b,x*32-17,y*32-14
          EndIf
          If \c>0
            Blit \c,x*32-12,y*32-1
          EndIf
          If \d>0
            Blit \d,x*32-25,y*32+4
          EndIf
        EndIf
        If \tip=4 OR \tip=32
          Blit 69,(x-1)*32,(y-1)*32+16
          If \d>0
            Blit \d,x*32-25,y*32-14
          EndIf
          If \a>0
            Blit \a,x*32-12,y*32-9
          EndIf
          If \b>0
            Blit \b,x*32-17,y*32+4
          EndIf
          If \c>0
            Blit \c,x*32-30,y*32-1
          EndIf
        EndIf
        If \ok=1
          Blit 16,x*32-18,y*32-2
        EndIf
      EndIf
    Next y
  Next x


  Return


.neosnovni:

  USEPATH element(x,y)
  For x=1 To #sirina
    For y=1 To #visina
      If \draw=1 AND \tip>9 AND \tip<30
        If \tip<14
          Blit \tip+25,x*32-22,y*32-6
        Else
          Blit (element(x,y)\tip)/2+32,x*32-22,y*32-6
        EndIf
        \draw=0
      EndIf
    Next y
  Next x

  Return


.pano:

  If igra MOD 50=0 OR igra MOD 50=1
    Format "##0"
    Locate 4,30.5
    Print Int(igra/50)      ;cas
  EndIf
  If changewl>0             ;preostali revolverji
    changewl=changewl-1
    Format "#0"
    Locate 11,30.5
    Print whleft
  EndIf
  If changen>0
    changen=changen-1
    Blit Int(sledi),306,243 ;naslednja zoga
  EndIf
  If changeo>0
    changeo=changeo-1
    For i=1 To 5
      Blit order(i),133+i*11,243 ;semafor
    Next i
  EndIf
  If changec>0
    changec=changec-1
    If kriz(1)=0
      Blit 18,239,241
    Else
      Blit kriz(1)+18,242,242
      Blit kriz(2)+22,248,244
      Blit kriz(3)+26,242,249
      Blit kriz(4)+30,240,244
    EndIf
  EndIf
  const=const-1
  If const=0            ;ce se cas premakne
    const=konst         ;popravimo premor
    vcevi=vcevi-1       ;crtica se podaljsa
  EndIf
  Box vcevi,2,Min(313,vcevi+2),3,5   ;narisimo crtico
  If bonus>0
    Box 235-Int((bonusmax-bonus)/bonusmax*35),253,Min(236,237-Int((bonusmax-bonus)/bonusmax*35)),254,1 ;narisimo bonus
  EndIf

  ;poskrbimo le se za risanje zogic
  For i=1 To #maxzog
    If zoga(i)\obstoj=1
      If zoga(i)\teleport=0
        BBlit bit,zoga(i)\barva,zoga(i)\x,zoga(i)\y
      Else
        xkoor=(teleport(0)-1) MOD 10
        ykoor=Int((teleport(0)-1) / 10)
        BBlit bit,51,xkoor*32+14,ykoor*32+30
        BBlit bit,51,(xkoor+teleport(1))*32+14,(ykoor+teleport(2))*32+30
        Select zoga(i)\teleport
          Case 1
            BBlit bit,51+zoga(i)\barva,zoga(i)\x,zoga(i)\y
          Case 2
            BBlit bit,56+zoga(i)\barva,zoga(i)\x,zoga(i)\y
          Case 3
            BBlit bit,61+zoga(i)\barva,zoga(i)\x,zoga(i)\y
          Case 4
            elx.b=Int(zoga(i)\x/#vel)+1
            ely.b=Int((zoga(i)\y-16)/#vel)+1
            If elx + (ely-1)*10=teleport(0)
              zoga(i)\x=zoga(i)\x+teleport(1)*32+zoga(i)\dx*20
              zoga(i)\y=zoga(i)\y+teleport(2)*32+zoga(i)\dy*20
            Else
              zoga(i)\x=zoga(i)\x-teleport(1)*32+zoga(i)\dx*20
              zoga(i)\y=zoga(i)\y-teleport(2)*32+zoga(i)\dy*20
            EndIf
          Case 5
            BBlit bit,61+zoga(i)\barva,zoga(i)\x,zoga(i)\y
          Case 6
            BBlit bit,56+zoga(i)\barva,zoga(i)\x,zoga(i)\y
          Case 7
            BBlit bit,51+zoga(i)\barva,zoga(i)\x,zoga(i)\y
          Case 8
            BBlit bit,zoga(i)\barva,zoga(i)\x,zoga(i)\y
        End Select
        zoga(i)\teleport=(zoga(i)\teleport+1) MOD 9
      EndIf
    EndIf
  Next i

  Return


.sledi:

  If Rnd(50)<joker
    sledi=5
  Else
    sledi=Int(Rnd(4))+1
  EndIf

  Return


.funkcije:

  Function Num{a$}     ; vrne stevilko iz crke passworda
    a=Asc("z")-Asc(a$)
    Function Return a
  End Function

  Function$ Ltr{a}     ; vrne crko za password iz stevilke
    a$=Chr$(Asc("z")-a)
    Function Return a$
  End Function

  Function$ pswd{lev}  ; izracunajmo password
    SHARED lvlnm$(), lvldat(),lvlmap() ;poberemo potr. sprem.
    fime=Len(lvlnm$(lev))         ; izracunamo vrednosti
    fcas=lvldat(lev,0)
    fsum=0
    For fi=0 To 9
      For fj=0 To 6
        fsum=fsum+lvlmap(fi,fj,lev)
      Next fj
    Next fi
    fkon=lvldat(lev,1)    ;sledi se dolocitev passworda
    a$=Ltr{fime/2}+Ltr{Int(lev/10)}+Ltr{fcas/100}+Ltr{fsum/100}+Ltr{lev MOD 10}
    a$=a$+Ltr{(fsum/5) MOD 20}+Ltr{fkon}+Ltr{(fcas/5) MOD 20}+Ltr{fsum MOD 5}
    Function Return a$
  End Function

  Function.l Encode{s$}
    l=Len(s$)
    For i=1 To l
      code.l=code.l+Asc(Mid$(s$,l+1-i,1))*i
    Next i
    Function Return code
  End Function

  Function.l Control{a.l,b.l}
    code.l=Abs(a-b)*10+a+b
    Function Return code
  End Function

  Function$ ChangeName{name$}
    newname$=""
    For i.b=1 To Len(name$)
      newname$=newname$+Chr$(Asc(Mid$(name$,i,1))-100+i)
    Next i
    Function Return newname$
  End Function


.level_info:

  Use BitMap 0
  BitMapOutput 0
  ShowBitMap 0

  Cls

  StartMedModule 1
  SetMedMask 15

  slikanum=Int(stopnja/10)

  LoadPalette 1,slika$(slikanum)
  Use Palette 1
  LoadIFF slika$(slikanum),0
  VWait 25
  SemiFade{}

CNIF #ecs=0
  AGARGB 255,255,255,0
  AGAPalRGB 1,255,255,255,0
CELSE
  RGB 31,15,15,0
  PalRGB 1,31,15,15,0
CEND
  FNSOutput 0,True
CNIF #ecs=0
  FNSPrefs $1,255
CELSE
  FNSPrefs $1,31
CEND

  FNSPrint 0,160,8,"Next Level"
  Format "00"
  FNSPrint 0,160,48,"Level "+Str$(stopnja)
  FNSPrint 0,160,72,ime$

  FNSPrefs $8
  FNSPrint 0,160,104,"Time available:"
  FNSPrint 0,160,136,"Retries left:"
  If stopnja MOD 5=0
    FNSPrint 0,160,168,"Password:"
  EndIf

  FNSPrefs $0
  Format "##0"
  FNSPrint 0,170,104,Str$(Int(igra/50))
  Format "0"
  FNSPrint 0,170,136,Str$(retry)
  If stopnja MOD 5=0
    FNSPrint 0,170,168,pswd{stopnja}
  EndIf

  FNSPrefs $1
  FNSPrint 0,160,216,"Click mousebutton to start"
  FNSPrefs $8
  FNSPrint 0,312,248,"(ESC to quit)"

  FlushEvents                 ;pobrisimo dosedanje dogodke
  Repeat
    nwev.l=WaitEvent
    If nwev=$8                ;klik miske?
      Fade{}
      Cls
      Use Palette 0
      StopMed
      Return
    EndIf
  Until nwev=$400 AND Inkey$=Chr$(27)   ;ESC?
  Fade{}
  StopMed
  Goto the_end


.the_end:

  Use BitMap 1
  BitMapOutput 1
  ShowBitMap 1

  Cls

  LoadPalette 1,"gfx/end.iff"
  Use Palette 1
  LoadIFF "gfx/end.iff",1

CNIF #ecs=0
  AGARGB 255,255,255,0
  AGAPalRGB 1,255,255,255,0
CELSE
  RGB 31,15,15,0
  PalRGB 1,31,15,15,0
CEND
  FNSOutput 1,True
CNIF #ecs=0
  FNSPrefs $1,255
CELSE
  FNSPrefs $1,31
CEND

  FNSPrint 0,160,220,"You LOSE!"

  FlushEvents
  Repeat
    nwev.l=WaitEvent
    If nwev=$8
      Fade{}
      StartMedModule 0
      SetMedMask 15
      Goto menu
    EndIf
  Until False


.done:

  Use BitMap 1
  BitMapOutput 1
  ShowBitMap 1

  Cls

  LoadPalette 1,"gfx/out.iff"
  Use Palette 1
  LoadIFF "gfx/out.iff",1

CNIF #ecs=0
  AGARGB 255,255,255,0
  AGAPalRGB 1,255,255,255,0
CELSE
  RGB 31,15,15,0
  PalRGB 1,31,15,15,0
CEND
  FNSOutput 1,True
CNIF #ecs=0
  FNSPrefs $1,255
CELSE
  FNSPrefs $1,31
CEND

  FNSPrint 0,160,220,"You WON!"

  FlushEvents
  Repeat
    nwev.l=WaitEvent
    If nwev=$8
      Fade{}
      StartMedModule 0
      SetMedMask 15
      Goto menu
    EndIf
  Until False



.about:

  Use BitMap 0
  BitMapOutput 0
  ShowBitMap 0

  Cls

  LoadPalette 1,"gfx/about.iff"
  Use Palette 1
  LoadIFF "gfx/about.iff",0

  VWait 100
  SemiFade{}

CNIF #ecs=0
  AGARGB 255,255,255,0
  AGAPalRGB 1,255,255,255,0
CELSE
  RGB 31,15,15,0
  PalRGB 1,31,15,15,0
CEND
  FNSOutput 0,True
CNIF #ecs=0
  FNSPrefs $1,255
CELSE
  FNSPrefs $1,31
CEND

  FNSPrint 0,160,68,"BallMaster V1.2 (29.12.2000)"
  FNSPrint 0,160,84,"(c)1998-2000 Damir Arh"

  FNSPrint 0,160,142,"This version of the game"
  FNSPrint 0,160,158,"is released under the GPL licence."
  FNSPrint 0,160,182,"This program is free software under the"
  FNSPrint 0,160,198,"terms of the GNU General Public Licence."

  FlushEvents
  Repeat
    nwev.l=WaitEvent
    If nwev=$8
      Fade{}
      Goto menu
    EndIf
  Until False
                                                                                                                              

.options:

  Use BitMap 0
  BitMapOutput 0
  ShowBitMap 0

  Cls

  LoadPalette 1,"gfx/options.iff"
  Use Palette 1
  LoadIFF "gfx/options.iff",0
  VWait 25
  SemiFade{}


options_ch:

  LoadIFF "gfx/options.iff",0

CNIF #ecs=0
  AGARGB 255,255,255,0
  AGAPalRGB 1,255,255,255,0
CELSE
  RGB 31,15,15,0
  PalRGB 1,31,15,15,0
CEND
  FNSOutput 0,True
CNIF #ecs=0
  FNSPrefs $8,255
  WColour 255,0
CELSE
  FNSPrefs $8,31
  WColour 31,0
CEND


  FNSPrint 0,160,72,"SoundFX:"
  FNSPrint 0,160,96,"Music:"
  FNSPrint 0,160,120,"Profi mode:"
  FNSPrefs $1
  FNSPrint 0,160,200,"Quit options"

  Use BitMap 0
  Use Window 0
  WJam 0
  WLocate 176,72
  If Snd=True
    Print " On"
  Else
    Print "Off"
  EndIf
  WLocate 176,96
  If Mus=True
    Print " On"
  Else
    Print "Off"
  EndIf
  WLocate 176,120
  If Pro=True
    Print " On"
  Else
    Print "Off"
  EndIf

  FlushEvents
  Repeat
    nwev.l=WaitEvent
    If nwev=$8
      If RectsHit(WMouseX,WMouseY,1,1,104,72,96,8)
        If Snd=True
          Snd=False
        Else
          Snd=True
        EndIf
        Repeat
          nwev=WaitEvent
          If nwev=$8 Then Goto options_ch
        Until False
      EndIf
      If RectsHit(WMouseX,WMouseY,1,1,122,96,78,8)
        If Mus=True
          Mus=False
        Else
          Mus=True
        EndIf
        Repeat
          nwev=WaitEvent
          If nwev=$8 Then Goto options_ch
        Until False
      EndIf
      If RectsHit(WMouseX,WMouseY,1,1,88,120,112,8)
        If Pro=True
          Pro=False
        Else
          Pro=True
        EndIf
        Repeat
          nwev=WaitEvent
          If nwev=$8 Then Goto options_ch
        Until False
      EndIf
      If RectsHit(WMouseX,WMouseY,1,1,120,200,80,8)
        Fade{}
        Goto menu
      EndIf
    EndIf
  Until False



.password:

  Use BitMap 0
  BitMapOutput 0
  ShowBitMap 0

  Cls

  LoadPalette 1,"gfx/title.iff"
  Use Palette 1
  LoadIFF "gfx/title.iff",0

  VWait 25
  SemiFade{}

CNIF #ecs=0
  AGARGB 255,255,255,0
  AGAPalRGB 1,255,255,255,0
CELSE
  RGB 31,15,15,0
  PalRGB 1,31,15,15,0
CEND
  FNSOutput 0,True
CNIF #ecs=0
  FNSPrefs $1,255
CELSE
  FNSPrefs $1,31
CEND


  FNSPrint 0,160,116,"Enter password:"

  Use Window 0
  CNIF #ecs=0
    WColour 255,0
  CELSE
    WColour 31,0
  CEND
  WJam 1
  WLocate 120,132
  Print "          "
  WLocate 120,132                   ; preberemo password
  pswdent$=Edit$(10)

  If Len(pswdent$)=9  ; preverimo dolzino
    pswdlev=Num{Mid$(pswdent$,5,1)}+Num{Mid$(pswdent$,2,1)}*10
    If (pswdlev<0) OR (pswdlev>entries-1) OR (pswdlev MOD 5)>0; ali je v obsegu
      pswdlev=0
    EndIf
    If pswd{pswdlev}=pswdent$  ;ali ustreza
      stopnja=pswdlev
    Else
      stopnja=0
    EndIf
  Else
    stopnja=0
  EndIf


  Return


.register:

  UserName$="GPL version"

  Return


.levelerr:

  NPrint "Level files corrupt..."
  NPrint "Game loading aborted!"
  VWait 10
  CloseFile 1
  End


.picerr:

  CloseFile 0
  NPrint "Can't find all the necessary pictures..."
  NPrint "Game loading aborted!"
  VWait 10
  CloseFile 1
  End


.sounderr:

  NPrint "Can't load sound effects..."
  NPrint "Game loading aborted!"
  VWait 10
  CloseFile 1
  End


.savecfg:

  If WriteFile(0,"BallMaster.cfg")
    WriteMem 0,&Snd,1
    WriteMem 0,&Mus,1
    WriteMem 0,&Pro,1
    CloseFile 0
  EndIf

  Return


paleta:
CNIF #ecs=1
  IncBin "ballmaster_ecs.col"
CELSE
  IncBin "ballmaster_aga.col"
CEND

grafika:
CNIF #ecs=1
  IncBin "ballmaster_ecs.gfx"
CELSE
  IncBin "ballmaster_aga.gfx"
CEND

krizec:
  IncBin "pointer.gfx"


