134 lines
3.6 KiB
Plaintext
134 lines
3.6 KiB
Plaintext
|
|
|
|
Procedure CheckLoop(StartX.l,StartY.l,OnlyLoop.b=#True,Onepiece.b=#False)
|
|
Protected OutDirection.l=-1
|
|
Protected.l CountPass=0
|
|
Protected.l Bx,By
|
|
NewList Path.Path()
|
|
Bx=StartX
|
|
By=StartY
|
|
Protected.l ChangeDirection=-1
|
|
Protected.b FindLoop=#False
|
|
Protected.b EndSearch=#False
|
|
|
|
Repeat
|
|
CurrentSprite=Game\GameTable(Bx,By)\Sprite
|
|
If CurrentSprite=0
|
|
ProcedureReturn #False
|
|
EndIf
|
|
|
|
;Chose first Direction
|
|
If OutDirection=-1
|
|
Select CurrentSprite
|
|
Case #Spr_UD
|
|
OutDirection=#Shape_Up
|
|
ChangeDirection=#Shape_Down
|
|
Case #Spr_LR
|
|
OutDirection=#Shape_Right
|
|
ChangeDirection=#Shape_Left
|
|
Case #Spr_RD
|
|
OutDirection=#Shape_Left
|
|
ChangeDirection=#Shape_Up
|
|
Case #Spr_DL
|
|
OutDirection=#Shape_Up
|
|
ChangeDirection=#Shape_Right
|
|
Case #Spr_LU
|
|
OutDirection=#Shape_Down
|
|
ChangeDirection=#Shape_Right
|
|
Case #Spr_UR
|
|
OutDirection=#Shape_Down
|
|
ChangeDirection=#Shape_Left
|
|
Case #Spr_Cross
|
|
OutDirection=#Shape_Up
|
|
ChangeDirection=#Shape_Down
|
|
Case #Spr_Locked
|
|
ProcedureReturn #False
|
|
EndSelect
|
|
|
|
EndIf
|
|
|
|
OutDirection=ShapeDirection(CurrentSprite,OutDirection)
|
|
|
|
|
|
|
|
Select ShapeDirection
|
|
Case #Shape_Right
|
|
Bx=Bx+1
|
|
Case #Shape_Left
|
|
Bx=Bx-1
|
|
Case #Shape_Up
|
|
By=By-1
|
|
Case #Shape_Down
|
|
By=By+1
|
|
EndSelect
|
|
|
|
If ShapeDirection=#Shape_None ;If no Way
|
|
If CountPass=0 ; If first pass I start at the beginning in reverse direction
|
|
Bx=StartX
|
|
By=StartY
|
|
OutDirection=ChangeDirection
|
|
CountPass=CountPass+1
|
|
Else
|
|
ProcedureReturn #False
|
|
EndIf
|
|
Else
|
|
|
|
|
|
If Bx<0 Or By<0 Or Bx>#MaxTableWidth Or By>#MaxTableHeight
|
|
CompilerIf #DebugCheckLoopVerbose=#True:Debug"Out of GamePath "+Str(CountPiece):CompilerEndIf
|
|
OutBench=#True
|
|
EndSearch=#True
|
|
Else
|
|
NextSprite=Game\GameTable(Bx,By)\Sprite
|
|
|
|
|
|
If NextSprite=0
|
|
CompilerIf #DebugCheckLoopVerbose=#True:Debug"Empty Case"+Str(CountPiece):CompilerEndIf
|
|
|
|
EndSearch=#True
|
|
ElseIf CheckShapeCompatible(CurrentSprite,ShapeDirection,NextSprite)=#True
|
|
|
|
;If Back to first Piece it's a Loop
|
|
If BX=StartX And BY=StartY
|
|
If NextSprite<>#Spr_Cross Or (NextSprite=#Spr_Cross And CrossCounter(BX,BY)=2)
|
|
EndSearch=#True
|
|
FindLoop=#True
|
|
EndIf
|
|
EndIf
|
|
|
|
EndIf
|
|
EndIf
|
|
EndIf
|
|
Until EndSearch=#True
|
|
|
|
|
|
Debug "OnlyLoop="+Str(OnlyLoop)
|
|
If OnlyLoop=#True
|
|
If FindLoop=#False
|
|
|
|
CompilerIf #DebugCheckLoopVerbose=#True:Debug"Loop Stoped by bad piece"+GetShapeName(NewSprite)+" "+Str(CountPiece):CompilerEndIf
|
|
FreeList(Path())
|
|
Debug "CheckLoop() Return #False"
|
|
ProcedureReturn #False
|
|
|
|
EndIf
|
|
EndIf
|
|
CompilerIf #DebugCheckLoopVerbose=#True:Debug "YEeeeeeeeeeeeeeeah":CompilerEndIf
|
|
|
|
ForEach Path()
|
|
Game\GameTable(Path()\BX,Path()\BY)\Selected=#True
|
|
Next
|
|
|
|
CopyList(Path(),LoopPath())
|
|
Protected LoopSize.l=ListSize(Path())
|
|
FreeList(Path())
|
|
CompilerIf #DebugCheckLoopVerbose=#True:Debug "Result:"+Str(LoopSize)+"/"+Str(CountPiece):CompilerEndIf
|
|
Debug "CheckLoop() Return "+Str(LoopSize)
|
|
Debug "#######"
|
|
ProcedureReturn LoopSize
|
|
|
|
EndProcedure
|
|
; IDE Options = PureBasic 6.00 LTS (Windows - x64)
|
|
; Folding = --
|
|
; EnableXP
|
|
; DPIAware |