; German forum: http://www.purebasic.fr/german/viewtopic.php?t=3591&start=10 ; Author: FGK (updated for PB 4.00 by Andre) ; Date: 07. June 2005 ; OS: Windows, Linux ; Demo: Yes ; GridLock Clone V0.8 ; Use the mouse (press and hold the left mouse button) to move the stones. ; Hier mein bescheidener Beitrag zum MiniGameContest: ; Ziel von "Gridlock" ist es den Masterstein aus dem Durchbruch ; in der Mauer zu schieben. Horizontale Steine können nur quer ; bewegt werden. Vertikale nur in der Senkrechten. Inspiriert hat ; mich dieses Spiel auf meinem SE P900. Die Punktebewertung ; habe ich Zug- und Levelabhänig gestaltet - das mißfiel mir beim ; "Orginal". Mangels der Contest-Einschränkungen gibts keine ; speicherbare Hiscoreliste oder Weiterspielen am aktuellen Level. ; ; Gesteuert wird mit der Maus. ; ; ; ------------------------------------------------------------ ; GridLock Clone V0.8 ; PB Version von F. Kastl für MiniGameContest '05 ; Credits an Riku Salkia dem Autor der P900 Version ; ; ------------------------------------------------------------ ; #BlockSize=24 #BlockHalf = #BlockSize/2 #StatusX = 220 #StatusY = 10 #Master = 0 #Horizontal = 1 #Vertikal= 2 #Width=320 #Height=200 #MoveCost = 2 #BlockBonus = 10 #LevelValue= 5 #MaxLevel = 40 Structure Block Typ.b Size.b XPos.l YPos.l dx.l dy.l XLen.l YLen.l XMap.b YMap.b MovePlus.b MoveMinus.b Col.l SpriteID.l EndStructure Global HSprite1,HSprite2 Global VSprite1,VSprite2 Global MSprite,MapSprite Global x,y,oldX,oldY Global I,btn Global Bonus.l,Score.l Global Level.l,Moves.l Global Done,Quit Global Dim Map.b(7,7) Global NewList Blocks.Block() Procedure DrawShadowText(px.l,py.l,Text$,FrontCol.l,ShadowCol.l) FrontColor(FrontCol) DrawingMode(1) DrawText(px,py,Text$) FrontColor(ShadowCol) DrawText(px+1,py-1,Text$) EndProcedure Procedure DrawBox(px,py,w,h,Text$) StartDrawing(ScreenOutput()) DrawingMode(0) Box(px,py,w,h,RGB($C0,$3F,$66)) Line(px,py,w,0,RGB($EA,$A8,$B9)) Line(px+w,py,0,h,RGB($EA,$A8,$B9)) DrawShadowText(w-TextWidth(Text$)-15,h/2+10,Text$,RGB(0,0,0),RGB($EA,$A8,$B9)) StopDrawing() EndProcedure Procedure DrawLevel() DisplaySprite(MapSprite,0,0) ForEach Blocks() DisplayTransparentSprite(Blocks()\SpriteID,#BlockSize+Blocks()\XPos,#BlockSize+Blocks()\YPos) Next EndProcedure Procedure DrawStatus() If Moves*#MoveCostBlocks()\XPos+#BlockSize And x<(Blocks()\XPos+Blocks()\XLen+#BlockSize) If y>Blocks()\YPos+#BlockSize And y<(Blocks()\YPos+Blocks()\YLen+#BlockSize) R =ListIndex(Blocks()) Break EndIf EndIf Next ProcedureReturn R EndProcedure Procedure CheckMove() Blocks()\MoveMinus=0 Blocks()\MovePlus=0 Select Blocks()\Typ Case #Vertikal If Map(Blocks()\XMap+1,Blocks()\YMap)=1 Blocks()\MoveMinus=1 EndIf If Map(Blocks()\XMap+1,Blocks()\YMap+Blocks()\Size+1)=1 Blocks()\MovePlus=1 EndIf Case #Horizontal If Map(Blocks()\XMap,Blocks()\YMap+1)=1 Blocks()\MoveMinus=1 EndIf If Map(Blocks()\XMap+Blocks()\Size+1,Blocks()\YMap+1)=1 Blocks()\MovePlus=1 EndIf Case #Master If Map(Blocks()\XMap,Blocks()\YMap+1)=1 Blocks()\MoveMinus=1 EndIf If Map(Blocks()\XMap+Blocks()\Size+1,Blocks()\YMap+1)=1 Blocks()\MovePlus=1 EndIf EndSelect EndProcedure Procedure SetBlocksToMap(Mode.b) Select Blocks()\Typ Case #Horizontal For l=1 To Blocks()\Size Map(Blocks()\XMap+l,Blocks()\YMap+1)=Mode Next l Case #Vertikal For l=1 To Blocks()\Size Map(Blocks()\XMap+1,Blocks()\YMap+l)=Mode Next l Case #Master For l=1 To Blocks()\Size Map(Blocks()\XMap+l,Blocks()\YMap+1)=Mode Next l EndSelect EndProcedure Procedure AlignBlocks() If I>-1 SelectElement(Blocks(),I) If Abs(Blocks()\dy) < #BlockSize/4 Blocks()\dy=0 EndIf If Abs(Blocks()\dx) < #BlockSize/4 Blocks()\dx=0 EndIf Blocks()\YPos =Blocks()\YMap * #BlockSize Blocks()\XPos =Blocks()\XMap * #BlockSize EndIf EndProcedure Procedure MoveBlocks() I= GetBlock() If I>-1 SelectElement(Blocks(),I) CheckMove() DeltaX = oldX-x DeltaY = oldY-y dy=0:dx=0 Select Blocks()\Typ Case #Vertikal If DeltaY>0 ;Minus Richtung If Blocks()\MoveMinus=1 ProcedureReturn EndIf Else ;Plus Richtung If Blocks()\MovePlus=1 ProcedureReturn EndIf EndIf DeltaX=0 Case #Horizontal If DeltaX>0 ;Minus Richtung If Blocks()\MoveMinus=1 ProcedureReturn EndIf Else ;Plus Richtung If Blocks()\MovePlus=1 ProcedureReturn EndIf EndIf DeltaY=0 Case #Master If DeltaX>0 ;Minus Richtung If Blocks()\MoveMinus=1 ProcedureReturn EndIf Else ;Plus Richtung If Blocks()\MovePlus=1 ProcedureReturn EndIf EndIf DeltaY=0 EndSelect Blocks()\YPos-DeltaY Blocks()\XPos-DeltaX Blocks()\dx - DeltaX Blocks()\dy - DeltaY SetBlocksToMap(0) If Blocks()\dy > #BlockSize/4 Blocks()\YMap+1 Blocks()\dy=0 Blocks()\YPos =Blocks()\YMap * #BlockSize Moves+1 EndIf If Blocks()\dy < -#BlockSize/4 Blocks()\YMap-1 Blocks()\dy=0 Blocks()\YPos =Blocks()\YMap * #BlockSize Moves+1 EndIf If Blocks()\dx > #BlockSize/4 Blocks()\XMap+1 Blocks()\dx=0 Blocks()\XPos =Blocks()\XMap * #BlockSize Moves+1 EndIf If Blocks()\dx < -#BlockSize/4 Blocks()\XMap-1 Blocks()\dx=0 Blocks()\XPos =Blocks()\XMap * #BlockSize Moves+1 EndIf SetBlocksToMap(1) If Blocks()\Typ=#Master And Blocks()\XMap=5 Done=1 EndIf If GetBlock()=-1 btn=0 EndIf EndIf EndProcedure Procedure GetLevel(LVL) If LVL<=#MaxLevel ClearList(Blocks()) Restore Map For ty= 0 To 7 For tx= 0 To 7 Read Map.b(tx,ty) Next tx Next ty Restore BlockCount For l=1 To Level-1 Read o.b Offset.l+(o*4) ;Bytelänge berechnen Next l Read Count.b ;Blockanzahl einlesen Bonus.l=Count*#BlockBonus ;Bonus von Blockanzahl abhängig berechnen Restore LevelTab For l= 1 To Offset Read o.b ;Skip LevelBytes Next l For l=1 To Count AddElement(Blocks()) Read Blocks()\Typ Read Blocks()\XMap Read Blocks()\YMap Read Blocks()\Size Select Blocks()\Typ Case #Horizontal Blocks()\XLen=#BlockSize*Blocks()\Size Blocks()\YLen=#BlockSize If Blocks()\Size=3 Blocks()\SpriteID = HSprite1 Else Blocks()\SpriteID = HSprite2 EndIf Case #Vertikal Blocks()\XLen=#BlockSize Blocks()\YLen=#BlockSize*Blocks()\Size If Blocks()\Size=3 Blocks()\SpriteID = VSprite1 Else Blocks()\SpriteID = VSprite2 EndIf Case #Master Blocks()\XLen=#BlockSize*Blocks()\Size Blocks()\YLen=#BlockSize Blocks()\SpriteID = MSprite EndSelect SetBlocksToMap(1) Blocks()\XPos=Blocks()\XMap*#BlockSize;+#BlockSize Blocks()\YPos=Blocks()\YMap*#BlockSize;+#BlockSize Next l Else LVL=#MaxLevel Quit=1 EndIf Moves=0 Done=0 EndProcedure Procedure NextLevel(Text$) DrawBox(#BlockSize,#BlockSize,6*#BlockSize,6*#BlockSize,Text$) FlipBuffers() Delay(2000) If Moves*#MoveCost