;*****************************************************************************
;**                                                                         **
;**            Boxy a Sokoban Clone written by Epyx 06/2005                 **
;** No Ressources are included, all grafix and Sounds are runtime generated **
;**                                                                         **
;**         
epyx@FlashArts.de            Http://www.FlashArts.de            **
;**  No idea who have written the Procedure to create Sounds at runtime     **
;**  but i found it here ...                                                **
;**  
http://www.purebasic-lounge.de/viewtopi ... ght=sounds    ** 
;**                                                                         **
;*****************************************************************************
Declare Create_Sprites()
Declare Draw_Map(Mode.l)
Declare Init()
Declare GenSFX(nr,Frequency, Duration,Mode)
Declare CloseSFX(nr)
      If InitSprite()=0   : MessageRequester("Boxy - DirectX Error","You need at least DirectX 7 to run this game",#MB_ICONERROR) : End : EndIf
      If InitSprite3D()=0 : MessageRequester("Boxy - 3D Error","You need at least a Direct3D Card to run this game",#MB_ICONERROR) : End : EndIf
      If InitSound()=0    : MessageRequester("Boxy - Sound Error","Cant activating your SoundCard",#MB_ICONERROR) : End : EndIf
      X= InitKeyboard()
      Title_Window$ = "Boxy" : #pi = 3.1415
      Fullscreen=1 : Screen_X=640 : Screen_Y=480
      Dim Map.l(20,14) : Dim SMap(20,14)
      
      Global FigurX,FigurY,Finish_Points,PoCol,Crate_on_finish
    
    Init() : GenSFX(1,22610,50,0) : GenSFX(2,44610,100,1) : GenSFX(3,810,300,2)  : GenSFX(4,810,300,2)
    SoundVolume(1, 30) : SoundVolume(2, 100)
    If Fullscreen=0
      hWnd=OpenWindow(0,0,0,Screen_X,Screen_Y,#PB_Window_ScreenCentered ,Title_Window$)
      X=OpenWindowedScreen(hWnd,0,0,Screen_X,Screen_Y,0,0,0)
    Else
      X= OpenScreen(Screen_X, Screen_Y, 32, Title_Window$) 
    EndIf
    
    
    Create_Sprites()
    
    Structure Info_ST
      image.l
          x.l
          y.l
       SinX.f
       SinY.f
      SinXS.l
      SinYS.l
      SinXA.f
      SinYA.f
      SinSA.f
       Size.l
      SizeS.f
        Rot.f
    EndStructure
    NewList Partikel.Info_ST()
    
    
    
  Menu:   
    ClearList(Partikel()) 
    For t = 0 To 19
    AddElement(Partikel())
    Partikel()\image = 50 + Random(2)
    Partikel()\x = 0 : Partikel()\y = 0
    Partikel()\SinX = 0 + (t*2)
    Partikel()\SinY = 0 + (t*2)
    Partikel()\SizeS= Random(360)
    Partikel()\SinXA= Random(1000000) / 1000000.0 
    Partikel()\SinYA= Random(1000000) / 1000000.0 
    Partikel()\SinSA= Random(1000000) / 1000000.0
    Partikel()\SinXS = 320 : Partikel()\SinYS = 240
    Next t 
    Restore Intro
    For Y = 1 To 14 : For X = 1 To 20
    ShAd=0 : Read ima : If ima=2 : Finish_Points+1 : EndIf
    Map(X,Y) = ima : SM=ima : If ima>2 : SM=1 : EndIf
    SMap(X,Y) = SM : Next X : Next Y
    FigurX=-200 : FigurY=-200 : Taste=0
   
   
  ;  #########################################
  ;  ###             Menu Loop             ###
  ;  #########################################
   Repeat 
   
  ClearScreen(0,0,0)
 
     If Fullscreen=0
     Event = WindowEvent()
     Select Event
       Case #PB_Event_CloseWindow      
       End                                     
     EndSelect
     Delay(10)
   EndIf
   
   Draw_Map(0)
   
   StartDrawing(ScreenOutput()) 
    DrawingMode(1) : FrontColor(255, 200, 200)
    Locate(230, 310) : DrawText("a Game written by Epyx 2005")   
    Locate(440, 377) : DrawText("Press Enter to Start the Game")
    Locate(440, 409) : DrawText("Escape to exit this Game")
    FrontColor(255, 0, 0)
    Locate(0, 377) : DrawText("Cursor keys to move the cone head")
    Locate(0, 393) : DrawText("Cursor keys and space to push the crates")
    Locate(0, 409) : DrawText("F1 to reset the scene and try again")
    Locate(0, 425) : DrawText("Escape jumps to the menu")
   StopDrawing()
   
   ExamineKeyboard() 
   If KeyboardReleased(#PB_Key_Escape)   
     CloseSFX(1) : CloseSFX(2) : End
   EndIf   
   
   Taste= KeyboardPushed(#PB_Key_Return) 
   FlipBuffers() 
  Until (Taste<>0) 
   
   
   Map_number=0 : Taste=0   
   Start:
   Seconds_to_Run=125 : Turns_needed=0
   
   Reset:
   Finish_Points=0
   
   
   If Map_number=0 : Restore Level0 : EndIf
   If Map_number=1 : Restore Level1 : EndIf
   If Map_number=2 : Restore Level2 : EndIf
   If Map_number=3 : Restore Level3 : EndIf
   If Map_number=4 : Restore Level4 : EndIf
   If Map_number=5 : Restore Level5 : EndIf
   If Map_number=6 : Restore Level6 : EndIf
   If Map_number=7 : Restore Level7 : EndIf
   If Map_number=8 : Restore Level8 : EndIf
   If Map_number=9 : Goto Menu : EndIf
    For Y = 1 To 14
      For X = 1 To 20
       ShAd=0
       Read ima 
          If ima=2 Or ima=5 : Finish_Points+1 : EndIf
          Map(X,Y) = ima : SM=ima
          If ima>2 : SM=1 : EndIf
          SMap(X,Y) = SM            
          If ima=5 : Map(X,Y) =4 : SMap(X,Y) =2 : EndIf  
       Next X
    Next Y
    Read FigurX : Read FigurY : Read Epyx
   
 
  ;  #########################################
  ;  ###             Main Loop             ###
  ;  #########################################
   Repeat 
   
  ClearScreen(0,0,0)
   
  JTime = timeGetTime_()
  If (JTime-LTime) > 999 
    LTime    = timeGetTime_() 
    If Seconds_to_Run<11 : SoundFrequency(3, 30000) : PlaySound(3,0) : SoundFrequency(4, 15000):  PlaySound(4,0): EndIf
    Seconds_to_Run -1
  Else 
    SFPS + 1 
  EndIf 
  
  
     If Fullscreen=0
     Event = WindowEvent()
     Select Event
       Case #PB_Event_CloseWindow      
       End                                     
     EndSelect
     Delay(10)
   EndIf
   
  ExamineKeyboard() : Taste = KeyboardReleased(#PB_Key_Escape)  
  
  If RCol=0 : PoCol +2 : If PoCol> 100 : RCol=1 : EndIf : EndIf
  If RCol=1 : PoCol -2 : If PoCol< 10  : RCol=0 : EndIf : EndIf
  Crate_on_finish=0 
  
    Start3D()
     Sprite3DBlendingMode(5,7) 
     ResetList(Partikel())  
      While NextElement(Partikel())
      
        Sprite3DQuality(1)
        Partikel()\x = ((Screen_X/2)-16)+(Sin(Partikel()\SinX * #pi/180) * Partikel()\SinXS)
        Partikel()\y = ((Screen_Y/2)-16)+(Sin(Partikel()\SinY * #pi/180) * Partikel()\SinYS)
        
        Partikel()\Size = (Sin(Partikel()\SizeS * #pi/180) * 255)
        ZoomSprite3D(Partikel()\image, Partikel()\Size, Partikel()\Size)
        RotateSprite3D(Partikel()\image, Partikel()\Rot, 0)
        DisplaySprite3D(Partikel()\image, Partikel()\x, Partikel()\y, 155)
         
        Partikel()\SinX+Partikel()\SinXA : Partikel()\SinY+Partikel()\SinYA : Partikel()\SizeS+Partikel()\SinSA : Partikel()\Rot+ 0.5
      Wend 
    Stop3D()
 
  Draw_Map(1)
  
  If KeyboardPushed(#PB_Key_F1) : Goto Reset : EndIf 
  If KeyboardPushed(#PB_Key_Space) : Space_me=1 : Else : Space_me=0 : EndIf 
 
  If KeyboardPushed(#PB_Key_left) And Taschte=0 : FigurX-1 : Taschte=1 : Turns_needed+1 : PlaySound(1,0)
   If (Map(FigurX,FigurY)=4) And (Map(FigurX-1,FigurY)<3) And (Space_me=1)
      Map(FigurX-1,FigurY)=4 : Map(FigurX,FigurY)=SMap(FigurX,FigurY): PlaySound(2,0)  : EndIf
   If Map(FigurX,FigurY)>2 : FigurX+1 : Turns_needed-1 : EndIf : EndIf
  If KeyboardPushed(#PB_Key_Right) And Taschte=0 : FigurX+1  : Taschte=1 : Turns_needed+1 : PlaySound(1,0)
   If (Map(FigurX,FigurY)=4) And (Map(FigurX+1,FigurY)<3) And (Space_me=1)
      Map(FigurX+1,FigurY)=4 : Map(FigurX,FigurY)=SMap(FigurX,FigurY): PlaySound(2,0) : EndIf
  If Map(FigurX,FigurY)>2 : FigurX-1 : Turns_needed-1 : EndIf : EndIf
  If KeyboardPushed(#PB_Key_Up) And Taschte=0 : FigurY-1  : Taschte=1 : Turns_needed+1 : PlaySound(1,0)
   If (Map(FigurX,FigurY)=4) And (Map(FigurX,FigurY-1)<3) And (Space_me=1)
      Map(FigurX,FigurY-1)=4 : Map(FigurX,FigurY)=SMap(FigurX,FigurY) : PlaySound(2,0) : EndIf
  If Map(FigurX,FigurY)>2 : FigurY+1 : Turns_needed-1 : EndIf : EndIf
  If KeyboardPushed(#PB_Key_Down) And Taschte=0 : FigurY+1 : Taschte=1 : Turns_needed+1 : PlaySound(1,0)
   If (Map(FigurX,FigurY)=4) And (Map(FigurX,FigurY+1)<3) And (Space_me=1)
      Map(FigurX,FigurY+1)=4 : Map(FigurX,FigurY)=SMap(FigurX,FigurY): PlaySound(2,0) : EndIf
  If Map(FigurX,FigurY)>2 : FigurY-1 : Turns_needed-1 : EndIf : EndIf
  
  
  If KeyboardPushed(#PB_Key_Down)=0 And KeyboardPushed(#PB_Key_Up)=0 And KeyboardPushed(#PB_Key_Right)=0 And KeyboardPushed(#PB_Key_Left)=0 : Taschte=0 : EndIf
 
   StartDrawing(ScreenOutput()) 
       DrawingMode(1) : FrontColor(255, 255, 255)
       Locate(90,00)  : DrawText("Time: "+Str(Seconds_to_Run))
       Locate(178,00) : DrawText("Level: "+Str(Map_number+1))
       Locate(260,00) : DrawText("Turns: "+Str(Turns_needed))
       Locate(520,00) : DrawText("Epyx Turns: "+Str(Epyx))
   StopDrawing()
  
   FlipBuffers() 
       
   If Crate_on_finish=Finish_Points 
      SoundFrequency(3, 22000) : PlaySound(3,0) : Delay(100)
      SoundFrequency(4, 16000) : PlaySound(4,0) : Delay(100)
      SoundFrequency(3, 11000) : PlaySound(3,0) : Delay(100)
      SoundFrequency(4, 20000) : PlaySound(4,0) : Delay(300)
      SoundFrequency(3, 15000) : PlaySound(3,0) : Delay(100)
      SoundFrequency(4, 15000) : PlaySound(4,0) : Delay(200)
      Delay(2000) : Map_number+1 : Goto Start : EndIf
   If Seconds_to_Run<0 : Taste=1 : EndIf
           
   Until (Taste<>0)  
   
   Goto Menu
DataSection
  Intro:
  Data.l 3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 3,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 3,1,3,3,1,1,1,3,3,1,1,3,1,3,3,1,3,1,1,3
  Data.l 3,1,1,3,3,1,3,1,3,3,1,3,1,3,3,1,3,1,1,3
  Data.l 3,1,1,3,3,1,3,1,3,3,1,1,3,3,1,1,3,3,3,3
  Data.l 3,1,1,3,3,1,3,1,3,3,1,3,1,3,3,1,1,3,3,1
  Data.l 3,3,3,3,1,1,1,3,3,1,1,3,1,3,3,1,1,3,3,1
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  
  Level0:
  Data.l 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0
  Data.l 0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0
  Data.l 0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0
  Data.l 0,3,1,1,3,3,3,3,1,2,1,3,3,3,3,1,1,3,0,0
  Data.l 0,3,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1,3,0,0
  Data.l 0,3,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1,3,0,0
  Data.l 0,3,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,3,0,0
  Data.l 0,3,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,3,0,0
  Data.l 0,3,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1,3,0,0
  Data.l 0,3,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1,3,0,0
  Data.l 0,3,1,1,3,3,3,3,1,2,1,3,3,3,3,1,1,3,0,0
  Data.l 0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0
  Data.l 0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0
  Data.l 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0
  Data.l 10,7,20
  Level1:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,3,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,2,1,4,1,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,4,1,4,1,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,2,1,4,1,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,3,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 10,7,18
  Level2:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,1,4,2,1,4,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,1,2,4,1,4,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,1,4,2,1,4,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,1,2,4,1,4,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 7,8,45
  
  Level3:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,1,1,1,1,1,1,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,1,4,2,2,1,1,3,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,3,3,2,2,3,1,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,3,3,4,4,4,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,3,1,1,1,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 7,6,91
  
  Level4:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,3,3,1,1,1,3,3,3,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,3,1,1,3,1,1,1,3,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,3,1,3,1,1,3,1,3,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,3,1,4,1,4,3,1,3,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,3,2,3,1,1,1,1,3,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,3,2,1,1,3,3,3,3,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 7,6,74
    
  Level5:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,1,1,3,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,3,3,3,1,1,3,3,3,3,3,0,3,3,3,3,0,0
  Data.l 0,0,0,3,1,1,2,2,4,1,1,1,3,0,3,1,1,3,0,0
  Data.l 0,0,0,3,1,4,2,2,1,4,1,1,3,0,3,1,1,3,0,0
  Data.l 0,0,0,3,3,3,1,4,3,3,3,3,3,0,3,3,3,3,0,0
  Data.l 0,0,0,0,0,3,1,1,3,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 7,6,52
  
  Level6:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,3,2,1,2,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,3,2,1,4,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,3,1,4,3,3,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,4,1,1,4,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,3,4,3,3,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,1,1,1,1,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,3,3,3,3,3,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 11,10,61
  Level7:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,3,1,1,1,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,3,4,4,4,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,1,4,2,2,1,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,4,2,2,2,3,3,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,3,3,1,1,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 8,7,40
  Level8:
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,1,2,1,1,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,4,1,4,1,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,2,1,5,1,2,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,1,4,1,4,1,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,3,3,1,2,1,3,3,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  Data.l 12,7,200
  EndDataSection
    EndDataSection
  
Procedure Create_Sprites()
  ;  #########################################
  ;  ###     Create all needed Grafix      ###
  ;  #########################################
   ;###### Bodenplatten
   CreateSprite(1,32, 32,0) 
   StartDrawing(SpriteOutput(1)): Box(0, 0, 32, 32 , RGB(70,0,0))
   For t=0 To 20 : Y1= Random(31) : Y2= Random(6)+1 : C1= Random(40)
   Box(0, Y1, 32, Y2 , RGB(50+C1,0,0)) : Next t : Base=0
   For i=0 To 1
     For t=0 To 2
      iX=(t*16) : lX=(i*16)
      LineXY(Base+0+iX, 0+lX, Base+13+iX, 0+lX , RGB(150,60,60)) : LineXY(Base+0+iX, 0+lX, Base+0+iX, 13+LX , RGB(150,60,60))
      LineXY(Base+0+iX, 13+lX, Base+13+iX, 13+lX , RGB(8,0,0)) : LineXY(Base+13+iX, 13+lX, Base+13+iX, 0+lX , RGB(8,0,0)) 
     Next t : Base-6 : Next i : StopDrawing()
 
    
   ;###### Wände
   CreateSprite(3,32, 64,0) 
   StartDrawing(SpriteOutput(3)): Box(0, 32, 32, 40 , RGB(70,70,70)) : Box(0, 16, 32, 16 , RGB(170,170,170)) 
   For t=0 To 20 : Y1= 32+ Random(31) : Y2= Random(6)+1 : C1= Random(40)
   Box(0, Y1, 32, Y2 , RGB(50+C1,50+C1,50+C1)) : Next t : Base=0
   For i=0 To 4 : For t=0 To 3
      iX=(t*16) : lX=(i*7)
      LineXY(Base+0+iX, 32+lX, Base+13+iX, 32+lX , RGB(130,130,130)) : LineXY(Base+0+iX, 32+lX, Base+0+iX, 37+LX , RGB(130,130,130))
      LineXY(Base+0+iX, 37+lX, Base+13+iX, 37+lX , RGB(8,0,0)) : LineXY(Base+13+iX, 37+lX, Base+13+iX, 32+lX , RGB(8,8,8)) 
   Next t : Base-6 : Next i 
   FrontColor(200, 200, 200) : LineXY(0, 16, 16, 22) : LineXY(16, 22, 32, 16) : LineXY(0, 16, 32, 16) :FillArea(16, 17,RGB(200, 200, 200))
   FrontColor(140, 140, 140) : LineXY(0, 32, 16, 23) : LineXY(16, 23, 32, 32) : LineXY(0, 32, 32, 32) :FillArea(16, 25,RGB(140, 140, 140))
   FrontColor(120, 120, 120) : LineXY(17,22, 32, 16) : LineXY(17, 23, 32, 32) : LineXY(32, 16, 32, 32):FillArea(25, 22,RGB(120, 120, 120))
   StopDrawing()
    
   CreateSprite(2,64,64,#PB_Sprite_Texture) : StartDrawing(SpriteOutput(2)): Circle(16, 16, 16 , RGB(255,255,255)) : StopDrawing()
   CreateSprite(4,32, 64,0) : StartDrawing(SpriteOutput(4)) : Box(0, 32, 32, 40 , RGB(170,140,0)) : Box(0, 14, 32, 18 , RGB(200,170,0)) 
   LineXY(0, 32, 32, 32,RGB(250, 200, 0)) : LineXY(0, 63, 16, 63,RGB(100, 50, 0)) : LineXY(32, 32, 32,64,RGB(100, 50, 0))
   For t= 0 To 4 : iX=(t*8) : LineXY(0+iX, 32, 0+iX, 64,RGB(250, 200, 0)) : LineXY((-1)+iX, 32, (-1)+iX, 64,RGB(100, 50, 0)) : Next t
   For t= 0 To 8 : LineXY(0+t, 57, 23+t, 38,RGB(170,140,0)) : Next t : LineXY(0, 57, 23, 38,RGB(250, 200, 0))  : LineXY(8, 57, 32, 38,RGB(100, 50, 0)) : LineXY(8, 58, 32, 39,RGB(100, 50, 0) )
   Base=0 : For o = 0 To 1 : For t= 0 To 5 : LineXY(1, 36+t+Base, 31, 36+t+Base,RGB(170,140,0)) : Next t
   LineXY(1, 36+Base, 31, 36+Base,RGB(250,200,0)) : LineXY(1, 41+Base, 31, 41+Base,RGB(100,50,0)) : LineXY(1, 42+Base, 31, 42+Base,RGB(120,70,0))
   Base+19 : Next o   
   ito=2 : For t= 0 To 3 
   iX=(t*ito) : LineXY(1, 16+iX, 31, 16+iX,RGB(150, 100, 0)) : LineXY (1,16+iX+1, 31, 16+iX+1 ,RGB(255, 225,100)) : ito+1 :Next t
   LineXY(0, 14, 0, 32,RGB(255, 225,100)) : LineXY(31, 14, 31, 32,RGB(150, 100, 0))
   Base=0 : For o=0 To 10 : For t = 0 To 6 : LineXY(4+t+Base, 15, 4+t+Base, 31,RGB(200,170,0)) : Next t
   LineXY(4+Base , 14, 4+Base, 31,RGB(255, 225,100)) : LineXY(9+Base, 14, 9+Base, 31,RGB(150, 100, 0)) : LineXY(10+Base, 14, 10+Base, 31,RGB(150, 100, 0))
   Base+18 : Next o : StopDrawing()
   
   CreateSprite(10,64,64,#PB_Sprite_Texture) : UseBuffer(10) : ClearScreen(8,8,8) : UseBuffer(-1)
   CreateSprite3D(10, 10) : CreateSprite3D(2, 2)
   
   ;###### Spielfigur
   CreateSprite(8,32, 64,0) 
   StartDrawing(SpriteOutput(8)): FrontColor(0, 0, 255)
   Ellipse(16, 52, 16,9) : LineXY(16, 0, 0, 50) : LineXY(17, 0, 32, 50) : FillArea(16, 5,RGB(0, 0, 255))
   For t= 0 To 14 : tr=t*7
    LineXY(16, 1, 16-t,58-(t*0.3) , RGB(100-tr,100-tr,255)) : LineXY(16, 1, 16+t,58-(t*0.3) , RGB(100-tr,100-tr,255))
   Next t    
   StopDrawing()
   
   CreateSprite(50,256, 256,#PB_Sprite_Texture) : StartDrawing(SpriteOutput(50)) : For t = 0 To 128 : Circle(128, 128, 128-t, RGB(0,0,(t))) : Next t
   StopDrawing() : CreateSprite3D(50,50) 
   CreateSprite(51,256, 256,#PB_Sprite_Texture) : StartDrawing(SpriteOutput(51)) : For t = 0 To 128 : Circle(128, 128, 128-t, RGB(t,0,0)) : Next t
   StopDrawing() : CreateSprite3D(51,51) 
   CreateSprite(52,256, 256,#PB_Sprite_Texture) : StartDrawing(SpriteOutput(52)) : For t = 0 To 128 : Circle(128, 128, 128-t, RGB(0,(t),0)) : Next t
   StopDrawing() : CreateSprite3D(52,52)
   
EndProcedure
Procedure Draw_Map(Mode.l)
  For Y = 1 To 14
    For X = 1 To 20
      SPR = Map(X,Y)
      
          If SPR=3 : siz=4 : Kolo.l = RGB(200,200,200)
      ElseIf SPR=1 : siz=4 : Kolo.l = RGB(60,0,0) 
      ElseIf SPR=4 : siz=4 : Kolo.l = RGB(250,250,0)  
      ElseIf SPR=0 : siz=2 : Kolo.l = RGB(0,0,0)  
      ElseIf SPR=2 : siz=4 : Kolo.l = RGB(PoCol,PoCol,PoCol) : EndIf
      If (X=FigurX) And (Y=FigurY) : siz=4 : Kolo.l = RGB(0,0,250) : EndIf
     
      If SPR=4 And SMap(X,Y)=2 : Crate_on_finish+1 : EndIf
 
      If Mode=1
       StartDrawing(ScreenOutput()) 
        Box((X*4), (Y*4), siz, siz, Kolo.l)
       StopDrawing()
      EndIf
      
      ShD=0 : If SPR=1 Or SPR=2
        SH_Y = Y-1 : If SH_Y>0 : If Map(X,SH_Y)>2 : ShD=1 : EndIf 
       EndIf : EndIf
      
      
      If SPR>2 : Panning=32 : Else : Panning=0 : EndIf
      If SPR=1 Or SPR>2: DisplayTransparentSprite(SPR ,(X-1)*32,(Y*32)-Panning) : EndIf
      If SPR = 2 : DisplayTransparentSprite(1,(X-1)*32,(Y*32)) : EndIf
      
      If ShD= 1 
        Start3D() 
         DisplaySprite3D(10, (X-1)*32,(Y*32), 100) 
        Stop3D() 
      EndIf
      
      If SPR = 2  
        Start3D() 
         DisplaySprite3D(2, (X-1)*32,(Y*32), PoCol) 
        Stop3D() 
      EndIf
      
      If (X=FigurX) And (Y=FigurY)
        DisplayTransparentSprite(8,(FigurX-1)*32,(FigurY*32)-32)  
      EndIf
    Next X
  Next Y
EndProcedure
Procedure Init()
  Structure WAVE
   wFormatTag.w
   nChannels.w
   nSamplesPerSec.l
   nAvgBytesPerSec.l
   nBlockAlign.w
   wBitsPerSample.w
   cbSize.w
  EndStructure
 
EndProcedure
Procedure GenSFX(nr,Frequency, Duration,Mode)
  SoundValue.b
  w.f
 
  #Mono = $0001
  #SampleRate = 11025
  #RiffId$ = "RIFF"
  #WaveId$ = "WAVE"
  #FmtId$ =  "fmt "
  #DataId$ = "data"
  WaveFormatEx.WAVE
  WaveFormatEx\wFormatTag = #WAVE_FORMAT_PCM
  WaveFormatEx\nChannels = #Mono
  WaveFormatEx\nSamplesPerSec = #SampleRate
  WaveFormatEx\wBitsPerSample = $0008
  WaveFormatEx\nBlockAlign = (WaveFormatEx\nChannels * WaveFormatEx\wBitsPerSample) / 8
  WaveFormatEx\nAvgBytesPerSec = WaveFormatEx\nSamplesPerSec * WaveFormatEx\nBlockAlign
  WaveFormatEx\cbSize = 0
 
  DataCount = (Duration * #SampleRate)/1000
  RiffCount = 4 + 4 + 4 + SizeOf(WAVE) + 4 + 4 + DataCount
 
  start=AllocateMemory(RiffCount+100)
  MS=start
 
  PokeS(MS,#RiffId$):MS+4
  PokeL(MS,RiffCount):MS+4
  PokeS(MS,#WaveId$):MS+4
  PokeS(MS,#FmtId$):MS+4
  TempInt = SizeOf(WAVE)
  PokeL(MS,TempInt):MS+4
 
  PokeW(MS,WaveFormatEx\wFormatTag):MS+2
  PokeW(MS,WaveFormatEx\nChannels):MS+2
  PokeL(MS,WaveFormatEx\nSamplesPerSec):MS+4
  PokeL(MS,WaveFormatEx\nAvgBytesPerSec):MS+4
  PokeW(MS,WaveFormatEx\nBlockAlign):MS+2
  PokeW(MS,WaveFormatEx\wBitsPerSample):MS+2
  PokeW(MS,WaveFormatEx\cbSize):MS+2
 
  PokeS(MS,#DataId$):MS+4
  PokeL(MS,DataCount):MS+4
 
  w = 2 * #pi * Frequency
  For i = 0 To DataCount - 1
    Select Mode
      Case 0
        SoundValue = 127 + 32 * Sin(i * w / #SampleRate)*1.55*35
      Case 1
        SoundValue =  #SampleRate+Random(100)
      Case 2
        SoundValue =  127 + 127 * Sin(i * w / #SampleRate)
      EndSelect
   
   PokeB(MS,SoundValue):MS+1;
  Next
 
  CatchSound(nr,start)
EndProcedure
Procedure CloseSFX(nr)
  StopSound(nr)
  FreeSound(nr)
  FreeMemory(nr)
EndProcedure