Files
LoopzRemix/Game.pbi
2025-07-17 20:36:20 +02:00

1824 lines
72 KiB
Plaintext

Procedure ResetGame()
MouseLocate(ScreenWidth()/2,(GUI\BenchHeight+GUI\BenchY)/2)
Game\Life=Game\Difficulty(Game\ScoreData\Difficulty)\NbLife
Game\ScoreData\Score=0
Game\ScoreData\NbLoop=0
Game\ScoreData\BenchIsEmpty=0
Game\Combo=0
Game\UnfinishedLoopCount=0
Game\Timer=Game\Difficulty(Game\ScoreData\Difficulty)\Timer
Game\WaitTimer=0
EarthQuake\StartTime=0
Game\LittlePieceCounter=0 ;If Game\NbPiecesOnBench>70 count little piece and when Game\LittlePieceCounter>Game\Difficulty(#Level_Hard)\NbLittlePiece a bigger piece see: Shape.Pbi RandomShape()
Game\NbPiecesOnBench=0
EarthQuake\WaitStartTime=ElapsedMilliseconds()
Game\NextTime=ElapsedMilliseconds()+Game\Timer
Game\ScoreData\BigestLoopSize=0
ClearList(LoopPath())
;ClearList(Game\Bonus\DisplayedBonus())
Protected.l Bx,By,n
For By=0 To #MaxTableHeight
For Bx=0 To #MaxTableWidth
Game\GameTable(Bx,By)\Sprite=0
Game\GameTable(Bx,By)\Selected=#False
Game\GameTable(Bx,By)\BonusOnThisCase=#False
Next
Next
Game\ScoreData\Bonus_JewelRed=0
Game\ScoreData\Bonus_JewelBlue=0
Game\ScoreData\Bonus_JewelGreen=0
;reset State
For n=0 To 5
Stats\NbItemByGroup(n)=0
Next
For n=0 To #Bonus_End
Stats\NbBonus(n)=0
Next
ClearList(Stats\PieceTime())
ClearList(Stats\LoopTime())
ClearList(Stats\NbPieces())
ClearList(Bonus\DisplayedBonus())
Stats\StartGameTimer=ElapsedMilliseconds()
Stats\StartLoopTimer=ElapsedMilliseconds()
Stats\BigestLoopSize=0
Stats\NbLoop=0
Stats\Bonus_JewelBlue=0
Stats\Bonus_JewelRed=0
Stats\Bonus_JewelGreen=0
Stats\BenchIsEmpty=0
Bonus\Dead_StartTimer=ElapsedMilliseconds()
Bonus\Random_StartTime=ElapsedMilliseconds()
Bonus\Random_Duration=5000
Bonus\HammerEnable=#False
Bonus\RemoveEnable=#False
Bonus\X2Enable=#False
Bonus\FreezeEnable=#False
Select Game\ScoreData\Difficulty
Case #Level_Novice
Bonus\EyeEnable=#True
Case #Level_Normal
Bonus\EyeEnable=#True
Case #Level_Hard
Bonus\EyeEnable=#False
Case #Level_Madness
Bonus\EyeEnable=#False
EndSelect
Game\ScoreData\Fps_Max=0
Game\ScoreData\Fps_Min=99999
EndProcedure
Procedure InitGameMode(Mode.l)
Game\ComeFromMode=Game\Mode
Game\Mode=Mode
Game\ToggleMode=0
Protected *Obj_Sprite.SpriteData
Protected *Obj_Text.TextData
Protected Text.s
;Protected *Step
Protected n.l
Debug "InitGameMode="+Str(Mode)
Select Mode
Case #Mode_record
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
If IsMusic(Game\CurrentMusic):StopMusic(Game\CurrentMusic):EndIf
Game\CurrentMusic=-1
Game\DisplayCursor=#False
;-Init Mode Intro
Case #Mode_Intro
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
StartMusic(#Music_Intro,#True)
*Obj_Sprite=NewSprite(#Spr_Thy,10,(GUI\ScreenHeight/2),-1,-1,0,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,500,2000,0,255,0)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,2000,1000,255,255,0)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,3000,1000,255,0,0)
;*Obj_Sprite=NewSprite(#Spr_Presente,10,(GUI\ScreenHeight/2),-1,-1,0,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
*Obj_Text=NewText(0,"Presents",ScreenWidth()/2,ScreenHeight()/2,0,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,3000,2000,0,255,0)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,5000,1000,255,255,0)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,6000,2000,255,0,0)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,12000,2000,0,2,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,12000,2000,0,2,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_Logo,10,(GUI\ScreenHeight/2),-1,-1,0,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,7000,4000,0,255,0)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,11000,1000,255,255,0)
AddmoveToEngine(@*Obj_Sprite\y,#PB_Float,12000,2000,(GUI\ScreenHeight/2),1,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_Remix,10,(GUI\ScreenHeight/2),-1,-1,0,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,9500,1000,0,255,0)
AddmoveToEngine(@*Obj_Sprite\y,#PB_Float,12100,2000,(GUI\ScreenHeight/2),1,#Easing_ElasticEaseOut,1000+#Mode_Menu)
Game\DisplayCursor=#False
;-Init Mode Menu
Case #Mode_Menu
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
StartMusic(#Music_Intro)
;TO DO TEST Server connection
;If Game\ConnectToServer=#True
; DisplayWarning("No Web Connection")
;EndIf
Protected *MenuOption.MenuOption
NewMenu("Game Menu")
*MenuOption=AddMenuOption("Start Game",#Mode_Game_Init)
*MenuOption=AddMenuOption("Difficulty",-1,-1,"Novice|Normal|Hard|Madness",@Game\ScoreData\Difficulty)
*MenuOption=AddMenuOption("Options",#Mode_Options)
*MenuOption=AddMenuOption("JukeBox",#Mode_JukeBox)
If Game\ConnectToServer=#False
*MenuOption=AddMenuOption("Hall Of Fame",#Mode_HallOfFame)
Else
*MenuOption=AddMenuOption("World Hall Of Fame",#Mode_HallOfFame)
EndIf
*MenuOption=AddMenuOption("Credits",#Mode_Credits)
FinalizeMenu()
AddItemToDisplayEngine(0,#Type_DisplayMenu)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
Game\DisplayCursor=#True
;-Init Mode Options
Case #Mode_Options
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
NewMenu("Options")
*MenuOption=AddMenuOption("Score On Internet",-1,-1,"No|Yes",@Game\ConnectToServer)
*MenuOption=AddMenuOption("Fluid Cursor",-1,-1,"No|Yes",@Game\FluidCursor)
*MenuOption=AddMenuOption("Graphics",#Mode_Graphics)
*MenuOption=AddMenuOption("Audios",#Mode_Audios)
*MenuOption=AddMenuOption("Return",#Mode_Menu)
FinalizeMenu()
AddItemToDisplayEngine(0,#Type_DisplayMenu)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
;-Init Mode Graphics
Case #Mode_Graphics
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
Protected txt.s=""
NewMenu("Graphics")
*MenuOption=AddMenuOption("FullScreen",-1,-1,"No|Yes",@GUI\FullScreen)
ForEach GUI\ScreenResolution()
Txt+GUI\ScreenResolution()+"|"
Next
Txt=Left(Txt,Len(Txt)-1) ; Delete Last "|"
*MenuOption=AddMenuOption("Screen Resolution",-1,-1,Txt,@GUI\ScreenResolutionIndex)
txt=""
ForEach GUI\WindowResolution()
Txt+GUI\WindowResolution()+"|"
Next
Txt=Left(Txt,Len(Txt)-1) ; Delete Last "|"
*MenuOption=AddMenuOption("Window Resolution",-1,-1,Txt,@GUI\WindowResolutionIndex)
*MenuOption=AddMenuOption("Save",-1,#EventGui_NewResolution)
FinalizeMenu()
AddItemToDisplayEngine(0,#Type_DisplayMenu)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
;-Init Mode Audios
Case #Mode_Audios
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
NewMenu("Audio")
*MenuOption=AddMenuOption("Music",-1,#EventGui_ChangeMusicVolume,"0%|10%|20%|30%|40%|50%|60%|70%|80%|90%|100%",@Game\VolumeMusic)
*MenuOption=AddMenuOption("Sfx",-1,#EventGui_ChangeSfxVolume,"0%|10%|20%|30%|40%|50%|60%|70%|80%|90%|100%",@Game\VolumeSfx)
*MenuOption=AddMenuOption("Return",#Mode_Options)
FinalizeMenu()
AddItemToDisplayEngine(0,#Type_DisplayMenu)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
;-Init JukeBox
Case #Mode_JukeBox
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
NewMenu("JukeBox")
*MenuOption=AddMenuOption("Select Music",-1,#EventGui_ChangeVinyl,"Intro|Game Novice/Normal|Game Hard/Madness|GameMissed|GameOver|HighScore|Credits",@Game\JukeBoxIndex)
*MenuOption=AddMenuOption("Return",#Mode_Menu)
FinalizeMenu()
StopMusic(game\CurrentMusic)
Game\CurrentMusic =-1 ; To force To play if play same music played before
PlaySound(#Snd_Jukebox)
Game\ObjetVinyl=NewSprite(#Spr_Vinyl,22,GUI\ScreenHeight/2,-1,-1,255,2,#Spr_Depth_Front,#Align_Hor_Right|#Align_Ver_Middle)
AddItemToDisplayEngine(Game\ObjetVinyl,#Type_Sprite)
AddmoveToEngine(@Game\ObjetVinyl\X,#PB_Float,0,2000,24,20,0,#EventGui_PlayJukeBox)
AddItemToDisplayEngine(0,#Type_DisplayMenu)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
;-Init Mode Credits
Case #Mode_Credits
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
StartMusic(#Music_Credits,#True)
AddTitle("Credits",1)
TitlesCenter(#True)
AddTitle("Original Concept By Ian Upton",0)
AddTitle("Graphics by Yann Lebrun",0)
AddTitle("Code by Yann Lebrun",0)
AddTitle("Music by Alex Menchi",0)
AddTitle("SFX by mixkit.co - freesound.org",0)
AddTitle("",0)
AddTitle("Mindphazer MacOs Test",0)
AddTitle("",0)
AddTitle("Musical Themes inspired by",1)
AddTitle("David Wittaker",0)
AddTitle("Alexandre Ekian",0)
AddTitle("Stephane Picq",0)
AddTitle("",0)
AddTitle("Thanks",1)
AddTitle("Delphine Le Philippe",0)
AddTitle("",0)
AddTitle("Other Thanks",1)
Addtitle("Frederic Laboureur",0)
Addtitle("Alain (Poum) Massoumipour",0)
Addtitle("Jay Miner",0)
AddTitle("",0)
AddTitle("Big Up!",1)
AddTitle("Purebasic community",0)
AddTitle("Amiga and Amstrad community",0)
AddTitle("Roller Skating Family",0)
AddTitle("St Joseph Team",0)
AddTitle("Frederic (scr33tch) Boisdron",0)
AddTitle("Walid (Hybrid) Moghrabi",0)
AddTitle("Eric (Titan) Cubizolle",0)
AddTitle("Pascal (Deckard) Visa",0)
AddTitle("Jesahel (Djes) Benoist",0)
AddTitle("",0)
AddTitle("",0)
AddTitle("",0)
AddTitle("",0)
AddTitle("",0)
AddTitle("",0)
AddTitle("",0)
AddTitle("",0)
AddTitle("Don't Forget, there is a worm in Apple !")
Titles\LineSpacing=0
Titles\Alpha=255
Titles\Speed=10000
Titles\ScrollY=0
AddItemToDisplayEngine(0,#Type_DisplayTitle)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
;-Init Mode Game Init
Case #Mode_Game_Init
RandomSeed(ElapsedMilliseconds())
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
If Game\ScoreData\Difficulty<2
StartMusic(#Music_GameA,#True)
Else
StartMusic(#Music_GameB,#True)
EndIf
ResetGame()
*Obj_Sprite=NewSprite(#Spr_Sc,1,8,3,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,2000,-3,1,#Easing_ElasticEaseIn)
*Obj_Sprite=NewSprite(#Spr_Sc,GUI\ScreenWidth-4,8,3,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,2000,GUI\ScreenWidth,GUI\ScreenWidth-4,#Easing_ElasticEaseIn)
Protected.l Bx,By
Protected.f SX,SY,EX,EY
Protected.l Angle
For By=0 To #MaxTableHeight
For Bx=0 To #MaxTableWidth
SX=GUI\ScreenWidth/2+#MaxTableWidth*Cos(Angle)
SY=GUI\ScreenHeight/2+#MaxTableWidth*Sin(Angle)
Angle=Angle+2
If (Bx+(By*#MaxTableWidth))%2
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
Else
*Obj_Sprite=NewSprite(#Spr_BenchB,0,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
EndIf
Protected time.l=Random(3000,2000)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,1000,time,SX,BX+1,#Easing_ElasticEaseOut)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,1000,time,SY,BY+1,#Easing_ElasticEaseOut)
Next
Next
AddmoveToEngine(0,0,0,3000,0,0,0,1000+#Mode_Game_Run)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,0,2000,2,0,#Easing_ElasticEaseIn)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,0,2000,2,0,#Easing_ElasticEaseIn)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,0,2000,255,0,0)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,1,-2,#Easing_ElasticEaseIn)
;-Init Mode Game Run
Case #Mode_Game_Run
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayBench)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayCursor)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayTimer)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayScore)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayMessage)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayBonus)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayEarthQuakeFall)
Game\ObjetBlueJewel=NewSprite(#Spr_JewelBlue,8,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetBlueJewel,#Type_Sprite)
AddmoveToEngine(@Game\ObjetBlueJewel\Opacity,#PB_Float,0,2000,0,255,0)
Game\ObjetBlueJewelValue=NewText(0,"x"+Str(Game\ScoreData\Bonus_JewelBlue),(8+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetBlueJewelValue,#Type_BitmapText)
AddmoveToEngine(@Game\ObjetBlueJewelValue\Opacity,#PB_Long,0,2000,0,255,0)
Game\ObjetRedJewel=NewSprite(#Spr_JewelRed,11,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetRedJewel,#Type_Sprite)
AddmoveToEngine(@Game\ObjetRedJewel\Opacity,#PB_Float,0,2000,0,255,0)
Game\ObjetRedJewelValue=NewText(0,"x"+Str(Game\ScoreData\Bonus_JewelRed),(11+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetRedJewelValue,#Type_BitmapText)
AddmoveToEngine(@Game\ObjetRedJewelValue\Opacity,#PB_Long,0,2000,0,255,0)
Game\ObjetGreenJewel=NewSprite(#Spr_JewelGreen,14,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetGreenJewel,#Type_Sprite)
AddmoveToEngine(@Game\ObjetGreenJewel\Opacity,#PB_Float,0,2000,0,255,0)
Game\ObjetGreenJewelValue=NewText(0,"x"+Str(Game\ScoreData\Bonus_JewelGreen),(14+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetGreenJewelValue,#Type_BitmapText)
AddmoveToEngine(@Game\ObjetGreenJewelValue\Opacity,#PB_Long,0,2000,0,255,0)
ResetGame()
RunEarthQuake()
NewMessage("Let's Go !!!")
;-Init Mode GameOver
Case #Mode_GameOver
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
StartMusic(#Music_GameOver,#True)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayBench)
;AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayCursor)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayScore)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayMessage)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayBonus)
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayEarthQuakeFall)
;AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayTimer)
Game\ObjetBlueJewel=NewSprite(#Spr_JewelBlue,8,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetBlueJewel,#Type_Sprite)
Game\ObjetBlueJewelValue=NewText(0,"x"+Str(Game\ScoreData\Bonus_JewelBlue),(8+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetBlueJewelValue,#Type_BitmapText)
Game\ObjetRedJewel=NewSprite(#Spr_JewelRed,11,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetRedJewel,#Type_Sprite)
Game\ObjetRedJewelValue=NewText(0,"x"+Str(Game\ScoreData\Bonus_JewelRed),(11+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetRedJewelValue,#Type_BitmapText)
Game\ObjetGreenJewel=NewSprite(#Spr_JewelGreen,14,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetGreenJewel,#Type_Sprite)
Game\ObjetGreenJewelValue=NewText(0,"x"+Str(Game\ScoreData\Bonus_JewelGreen),(14+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetGreenJewelValue,#Type_BitmapText)
*Obj_Text=NewText(1,"GAME OVER",ScreenWidth()/2,GUI\BenchHeight/2+GUI\BlockSize,0,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,0,2000,0,255,0)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,5000,2000,255,0,0,-1,@*Obj_Text\Autodestroy)
Game\ScoreData\Duration=ElapsedMilliseconds()-Stats\StartGameTimer ; End Game i record party duration
;-Init Mode GameOver End
Case #Mode_GameOver_End
Debug ("Init Mode GameOver End")
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
StartMusic(#Music_GameOver,#True)
Game\StartCalculBonus=#False ; Wait End Animation Before Start Calcul
Protected TmpX.l
;Blue Jewel
Game\ObjetBlueJewel=NewSprite(#Spr_JewelBlue,8,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetBlueJewel,#Type_Sprite)
Game\ObjetBlueJewelValue=NewText(0,Str(Stats\Bonus_JewelBlue)+"x10",(9+1) * GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetBlueJewelValue,#Type_BitmapText)
TmpX=20/5
AddmoveToEngine(@Game\ObjetBlueJewel\X,#PB_Float,0,2000,8,TmpX,0)
AddmoveToEngine(@Game\ObjetBlueJewel\Y,#PB_Float,0,2000,0,3,0)
AddmoveToEngine(@Game\ObjetBlueJewelValue\X,#PB_Long,0,2000,(8+1) * GUI\BlockSize,(TmpX+1)* GUI\BlockSize,0)
AddmoveToEngine(@Game\ObjetBlueJewelValue\Y,#PB_Long,0,2000,0,3 * GUI\BlockSize,0)
;Red Jewel
Game\ObjetRedJewel=NewSprite(#Spr_JewelRed,11.5,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetRedJewel,#Type_Sprite)
Game\ObjetRedJewelValue=NewText(0,Str(Stats\Bonus_JewelRed)+"x20",(11+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetRedJewelValue,#Type_BitmapText)
AddmoveToEngine(@Game\ObjetRedJewelValue\Opacity,#PB_Long,0,2000,0,255,0)
TmpX=20/5*2
AddmoveToEngine(@Game\ObjetRedJewel\X,#PB_Float,0,2000,11,TmpX,0)
AddmoveToEngine(@Game\ObjetRedJewel\Y,#PB_Float,0,2000,0,3,0)
AddmoveToEngine(@Game\ObjetRedJewelValue\X,#PB_Long,0,2000,(11+1) * GUI\BlockSize,(TmpX+1)* GUI\BlockSize,0)
AddmoveToEngine(@Game\ObjetRedJewelValue\Y,#PB_Long,0,2000,0,3 * GUI\BlockSize,0)
;Green Jewel
Game\ObjetGreenJewel=NewSprite(#Spr_JewelGreen,14,0,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetGreenJewel,#Type_Sprite)
Game\ObjetGreenJewelValue=NewText(0,Str(Stats\Bonus_JewelGreen)+"x40",(14+1)*GUI\BlockSize,0,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetGreenJewelValue,#Type_BitmapText)
TmpX=20/5*3
AddmoveToEngine(@Game\ObjetGreenJewel\X,#PB_Float,0,2000,14,TmpX,0)
AddmoveToEngine(@Game\ObjetGreenJewel\Y,#PB_Float,0,2000,0,3,0)
AddmoveToEngine(@Game\ObjetGreenJewelValue\X,#PB_Long,0,2000,(14+1) * GUI\BlockSize,(TmpX+1)* GUI\BlockSize,0)
AddmoveToEngine(@Game\ObjetGreenJewelValue\Y,#PB_Long,0,2000,0,3 * GUI\BlockSize,0)
;Jewel Score
TmpX=20/5*4
Game\ObjetText[0]=NewText(0,"= 00000",TmpX * GUI\BlockSize,3 * GUI\BlockSize,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetText[0],#Type_BitmapText)
AddmoveToEngine(@Game\ObjetText[0]\X,#PB_Long,0,2000,ScreenWidth(),TmpX* GUI\BlockSize,#Easing_ElasticEaseOut)
;Biggest Loop
Game\ObjetText[1]=NewText(0,"Biggest Loop "+MyFormatNumber("00",Stats\BigestLoopSize)+" x 5",(TmpX-1)* GUI\BlockSize,4*GUI\BlockSize,255,#Spr_Depth_Front,#Align_Hor_Right|#Align_Ver_Top)
AddItemToDisplayEngine(Game\ObjetText[1],#Type_BitmapText)
;AddmoveToEngine(@*Obj_Text\X,#PB_Long,1000,4000,-*Obj_Text\Width,6*GUI\BlockSize,0)
Game\ObjetText[2]=NewText(0,"= 00000",TmpX * GUI\BlockSize,4 * GUI\BlockSize,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetText[2],#Type_BitmapText)
AddmoveToEngine(@Game\ObjetText[2]\X,#PB_Long,0,2000,ScreenWidth(),TmpX* GUI\BlockSize,#Easing_ElasticEaseOut)
;Number of Loops
Game\ObjetText[3]=NewText(0,"Number of Loops "+MyFormatNumber("00",Stats\NbLoop)+" x 10",(TmpX-1)* GUI\BlockSize,5 * GUI\BlockSize,255,#Spr_Depth_Front,#Align_Hor_Right|#Align_Ver_Top)
AddItemToDisplayEngine(Game\ObjetText[3],#Type_BitmapText)
Game\ObjetText[4]=NewText(0,"= 00000",TmpX * GUI\BlockSize,5 * GUI\BlockSize,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetText[4],#Type_BitmapText)
AddmoveToEngine(@Game\ObjetText[4]\X,#PB_Long,0,2000,ScreenWidth(),TmpX* GUI\BlockSize,#Easing_ElasticEaseOut)
;Cleaned Bench
Game\ObjetText[5]=NewText(0,Str(Stats\BenchIsEmpty)+" Cleaned Bench x 500",(TmpX-1)* GUI\BlockSize,6 * GUI\BlockSize,255,#Spr_Depth_Front,#Align_Hor_Right|#Align_Ver_Top)
AddItemToDisplayEngine(Game\ObjetText[5],#Type_BitmapText)
Game\ObjetText[6]=NewText(0,"= 00000",TmpX * GUI\BlockSize,6 * GUI\BlockSize,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetText[6],#Type_BitmapText)
AddmoveToEngine(@Game\ObjetText[6]\X,#PB_Long,0,2000,ScreenWidth(),TmpX* GUI\BlockSize,#Easing_ElasticEaseOut)
;Bonus Score
*Obj_Text=NewText(1,"Bonus",(TmpX-1)* GUI\BlockSize,7 * GUI\BlockSize,255,#Spr_Depth_Front,#Align_Hor_Right|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
Game\ObjetText[7]=NewText(1,"= 00000",TmpX * GUI\BlockSize,7 * GUI\BlockSize,255,#Spr_Depth_Front)
AddItemToDisplayEngine(Game\ObjetText[7],#Type_BitmapText)
AddmoveToEngine(@Game\ObjetText[7]\X,#PB_Long,0,2000,ScreenWidth(),TmpX* GUI\BlockSize,#Easing_ElasticEaseOut)
Game\ObjetText[8]=NewText(0,"",ScreenWidth()/2,8 * GUI\BlockSize,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(Game\ObjetText[8],#Type_BitmapText)
; Bench
For By=0 To #MaxTableHeight
For Bx=0 To #MaxTableWidth
SX=GUI\ScreenWidth/2+#MaxTableWidth*Cos(Angle)
SY=GUI\ScreenHeight/2+#MaxTableWidth*Sin(Angle)
Angle=Angle+2
If (Bx+(By*#MaxTableWidth))%2
*Obj_Sprite=NewSprite(#Spr_BenchA,BX+1,BY+1,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
Else
*Obj_Sprite=NewSprite(#Spr_BenchB,BX+1,BY+1,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
EndIf
time.l=Random(2000,1000)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,time,BX+1,SX,#Easing_ElasticEaseIn,-1,@*Obj_Sprite\AutoDestroy)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,time,BY+1,SY,#Easing_ElasticEaseIn,-1,@*Obj_Sprite\AutoDestroy)
Next
Next
AddmoveToEngine(0,0,0,2000,0,0,0,#EventGui_StartCalculBonus)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,0,2000,0,2,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,0,2000,0,2,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,0,2000,0,255,0)
*Obj_Sprite=NewSprite(#Spr_Remix,10,-2,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,-2,1,#Easing_ElasticEaseOut)
Case -1
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
StartMusic(#Music_GameOver,#True)
Game\StartCalculBonus=#False ; Wait End Animation Before Start Calcul
*Obj_Text=NewText(1,"Bonus",(ScreenWidth()- TextBitmapWidth("Bonus")) / 2,GUI\BlockSize*2,255,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
Protected.f Y=3*GUI\BlockSize:
Protected.l X=13*GUI\BlockSize
;CalculBonus\BonusA=NewText(0,"Biggest "+MyFormatNumber("00",Stats\BigestLoopSize)+" x 1",6*GUI\BlockSize,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusA,#Type_BitmapText)
;AddmoveToEngine(@*Obj_Text\X,#PB_Long,1000,4000,-*Obj_Text\Width,6*GUI\BlockSize,0)
;CalculBonus\BonusAResult=NewText(0,"= "+Str(Stats\BigestLoopSize*10),X,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusAResult,#Type_BitmapText)
Y=Y+GUI\BlockSize
;CalculBonus\BonusB=NewText(0,MyFormatNumber("000",Stats\NbLoop)+" Loops x 10",6*GUI\BlockSize,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusB,#Type_BitmapText)
; CalculBonus\BonusBResult=NewText(0,"= "+Str(Stats\NbLoop*10),X,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusBResult,#Type_BitmapText)
Y=Y+GUI\BlockSize
;CalculBonus\BonusC=NewText(0,MyFormatNumber("00",Stats\Bonus_JewelBlue)+" x 20",9*GUI\BlockSize,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusC,#Type_BitmapText)
*Obj_Sprite=NewSprite(#Spr_JewelBlue,8,Y/GUI\BlockSize,-1,-1,255,1)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,1000,1500,GUI\JewelBlue_X / GUI\BlockSize,8,0)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,1000,1500,0,Y/GUI\BlockSize,0)
; CalculBonus\BonusCResult=NewText(0,"= "+Str(Stats\Bonus_JewelBlue*20),X,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusCResult,#Type_BitmapText)
Y=Y+GUI\BlockSize
;CalculBonus\BonusD=NewText(0,MyFormatNumber("00",Stats\Bonus_JewelRed)+" x 20",9*GUI\BlockSize,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusD,#Type_BitmapText)
*Obj_Sprite=NewSprite(#Spr_JewelRed,8,Y/GUI\BlockSize,-1,-1,255,1)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,1000,1500,GUI\JewelRed_X / GUI\BlockSize,8,0)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,1000,1500,0,Y/GUI\BlockSize,0)
;CalculBonus\BonusDResult=NewText(0,"= "+Str(Stats\Bonus_JewelRed*20),X,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusDResult,#Type_BitmapText)
Y=Y+GUI\BlockSize
;CalculBonus\BonusE=NewText(0,Str(Stats\BenchIsEmpty)+" Cleaned Bench x 500",3*GUI\BlockSize,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusE,#Type_BitmapText)
;CalculBonus\BonusEResult=NewText(0,"= "+Str(Stats\BenchIsEmpty*500),X,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusEResult,#Type_BitmapText)
Y=Y+GUI\BlockSize*1
;CalculBonus\BonusF=NewText(1,"Score",9*GUI\BlockSize,Y,255,#Spr_Depth_Front)
; AddItemToDisplayEngine(CalculBonus\BonusF,#Type_BitmapText)
;CalculBonus\BonusFResult=NewText(1,"= "+MyFormatNumber("00000",Game\ScoreData\Score),X,Y,255,#Spr_Depth_Front)
;AddItemToDisplayEngine(CalculBonus\BonusFResult,#Type_BitmapText)
*Obj_Sprite=NewSprite(#Spr_Sc,1,8,3,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,2000,1,-3,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_Sc,GUI\ScreenWidth-4,8,3,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,2000,GUI\ScreenWidth-4,GUI\ScreenWidth,#Easing_ElasticEaseOut)
For By=0 To #MaxTableHeight
For Bx=0 To #MaxTableWidth
SX=GUI\ScreenWidth/2+#MaxTableWidth*Cos(Angle)
SY=GUI\ScreenHeight/2+#MaxTableWidth*Sin(Angle)
Angle=Angle+2
If (Bx+(By*#MaxTableWidth))%2
*Obj_Sprite=NewSprite(#Spr_BenchA,BX+1,BY+1,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
Else
*Obj_Sprite=NewSprite(#Spr_BenchB,BX+1,BY+1,-1,-1,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
EndIf
time.l=Random(2000,1000)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,time,BX+1,SX,#Easing_ElasticEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,time,BY+1,SY,#Easing_ElasticEaseIn)
Next
Next
AddmoveToEngine(0,0,0,2000,0,0,0,#EventGui_StartCalculBonus)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,0,2000,0,2,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,0,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Height,#PB_Float,0,2000,0,2,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Opacity,#PB_Float,0,2000,0,255,0)
*Obj_Sprite=NewSprite(#Spr_Remix,10,-2,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,-2,1,#Easing_ElasticEaseOut)
*Obj_Text=NewText(0,"Press Space to SpeedUp",ScreenWidth()/2,ScreenHeight()-GUI\BlockSize,0,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,2000,2000,0,255,0)
;-Init Mode Enter Your Name
Case #Mode_EnterYourName
Debug ("Init Mode Enter Your Name")
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
ClearMoveEngine()
*Obj_Text=NewText(1,"Score "+MyFormatNumber("00000",Game\ScoreData\Score),ScreenWidth()/2,GUI\DoubleBlockSize,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Y,#PB_Long,0,1000,ScreenHeight(),GUI\DoubleBlockSize,#Easing_ElasticEaseOut)
*Obj_Text=NewText(0,"Enter your name",ScreenWidth()/4,GUI\BlockSize*3.5,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,0,1000,0,255,0)
Game\ObjetText[0]=NewText(1,Game\ScoreData\Pseudo,ScreenWidth()/4,GUI\BlockSize*5,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(Game\ObjetText[0],#Type_BitmapText)
AddmoveToEngine(@Game\ObjetText[0]\X,#PB_Long,0,1000,-Game\ObjetText[0]\X,ScreenWidth()/4,#Easing_ElasticEaseOut)
Game\ObjetText[8]=NewText(0,"Return to Continue",ScreenWidth()/2,8 * GUI\BlockSize,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(Game\ObjetText[8],#Type_BitmapText)
;Calcul Rythme
n=0
Protected PieceTime.f,LoopTime.f
If ListSize(Stats\PieceTime())>0 ;If No Piece = Infiny
ForEach Stats\PieceTime()
n=n+Stats\PieceTime()
Next
PieceTime=n/ListSize(Stats\PieceTime())
Game\ScoreData\PiecesPerMinute=60/(PieceTime/1000)
Else
Game\ScoreData\PiecesPerMinute=-1
EndIf
n=0;
ForEach Stats\LoopTime()
n=n+Stats\LoopTime()
Next
If ListSize(Stats\LoopTime())>0 ; If No Loop = Infiny
LoopTime=n/ListSize(Stats\LoopTime())
Game\ScoreData\LoopsPerMinute=60/(LoopTime/1000)
Else
Game\ScoreData\LoopsPerMinute=-1
EndIf
n=0;
ForEach Stats\NbPieces()
n=n+Stats\NbPieces()
Next
If ListSize(Stats\NbPieces())>0
Game\ScoreData\AveragePiecesPerLoop=n/ListSize(Stats\NbPieces())
EndIf
*Obj_Text=NewText(0,"Your Rythme",ScreenWidth()*3/4,GUI\BlockSize*3.5,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Opacity,#PB_Long,0,1000,0,255,0)
*Obj_Text=NewText(0,StrF(Game\ScoreData\PiecesPerMinute,2)+" Pieces/Min",ScreenWidth()*3/4,GUI\BlockSize*5,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Y,#PB_Long,0,1800,ScreenHeight(),GUI\BlockSize*5,#Easing_ElasticEaseOut)
*Obj_Text=NewText(0,StrF(Game\ScoreData\LoopsPerMinute,2)+" Loops/Min",ScreenWidth()*3/4,GUI\BlockSize*6,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Y,#PB_Long,0,1900,ScreenHeight(),GUI\BlockSize*6,#Easing_ElasticEaseOut)
*Obj_Text=NewText(0,StrF(Game\ScoreData\AveragePiecesPerLoop,2)+" Pieces/Loop",ScreenWidth()*3/4,GUI\BlockSize*7,255,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
AddmoveToEngine(@*Obj_Text\Y,#PB_Long,0,2000,ScreenHeight(),GUI\BlockSize*7,#Easing_ElasticEaseOut)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
;-Init Mode HallOfFame
Case #Mode_HallOfFame
Debug ("Init Mode HallOfFame")
ClearAllSprite()
ClearTitles()
ClearAllText()
ClearDisplayEngine()
StartMusic(#Music_HighScore)
DrawingBitmapFont(0)
BitmapFont()\Tab(0)=1.5* GUI\BlockSize ;Pseudo
BitmapFont()\Tab(1)=6* GUI\BlockSize ;Score
BitmapFont()\Tab(2)=9* GUI\BlockSize ;piece time
BitmapFont()\Tab(3)=13.5* GUI\BlockSize; Lop/min
BitmapFont()\Tab(4)=18 * GUI\BlockSize ; Duration
TitlesCenter(#False)
If Game\ComeFromMode=#Mode_HallOfFame Or Game\ComeFromMode=#Mode_Menu
If Game\ConnectToServer=#True
LoadHallOfFameFromServer(Game\HallOfFameDifficultyMode)
HallofFamelistToTitle(Game\LastInsertIdServer)
Else
LoadHallOfFame(Game\HallOfFameDifficultyMode)
EndIf
TitlesEvent(#EventGui_NextHallOfFame)
Else
If Game\ConnectToServer=#True
LoadHallOfFameFromServer(Game\ScoreData\Difficulty)
HallofFamelistToTitle(Game\LastInsertIdServer)
Else
LoadHallOfFame(Game\ScoreData\Difficulty) ;<- Database.pbi
EndIf
EndIf
Titles\LineSpacing=0.5
Titles\Alpha=255
AddItemToDisplayEngine(*Obj_Sprite,#Type_DisplayTitle)
*Obj_Sprite=NewSprite(#Spr_BckgrndFadeUp,0,2,GUI\ScreenWidth,3,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BckgrndFadeDown,0,GUI\ScreenHeight-2,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
text="Hall Of Fame"
DrawingBitmapFont(1) ;Used by TextBitmapWidth() next line
*Obj_Text=NewText(1,text,(ScreenWidth()- TextBitmapWidth(text)) / 2,GUI\DoubleBlockSize,255)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
Protected D.l
If Game\ComeFromMode=#Mode_HallOfFame Or Game\ComeFromMode=#Mode_Menu
D=Game\HallOfFameDifficultyMode
Else
D=Game\ScoreData\Difficulty
EndIf
Select D
Case 0 ;Novice
Text="Novice"
Case 1 ;Normal
Text="Normal"
Case 2 ;Hard
Text="Hard"
Case 3 ;Madness
Text="Madness"
EndSelect
If Game\ConnectToServer=#True
text="World "+Text
EndIf
DrawingBitmapFont(0) ;Used by TextBitmapWidth() next line
*Obj_Text=NewText(0,text,(ScreenWidth()- TextBitmapWidth(text)) / 2,GUI\DoubleBlockSize+GUI\BlockSize,255)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
*Obj_Sprite=NewSprite(#Spr_BenchA,0,0,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_BenchC,0,GUI\ScreenHeight,GUI\ScreenWidth,2,255,1,#Spr_Depth_Front,#Align_Hor_Left|#Align_Ver_Bottom)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Logo,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
*Obj_Sprite=NewSprite(#Spr_Remix,10,1,-1,-1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Top)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
EndSelect
EndProcedure
Procedure ScreenShoot()
Protected File.s
Protected n.l=-1
If KeyboardReleased(#PB_Key_F10)
Debug "Screenshoot"
GrabSprite(100,0,0,ScreenWidth(),ScreenHeight())
Repeat
n=n+1
File=Str(n)
File=Left("1000",4-Len(File))+File
File=GetUserDirectory(#PB_Directory_Desktop)+"Loopz-"+File+".png"
Until FileSize(File)=-1
SaveSprite(100,File,#PB_ImagePlugin_PNG )
FreeSprite(100)
EndIf
EndProcedure
Procedure DisplayBench()
Protected Bx.l
Protected By.l
Protected Tmpx.l
Protected Tmpy.l
Protected Spr.l
Protected Selected.l
DisplayClipSprite(#Spr_SelectedBackground,GUI\BenchX+ EarthQuake\DeltaX,GUI\BenchY+ EarthQuake\DeltaY,255,1,GUI\BenchWidth,GUI\BenchHeight)
Game\NbPiecesOnBench=0
For By=0 To #MaxTableHeight
For Bx=0 To #MaxTableWidth
TmpX=Bx * GUI\BlockSize + GUI\BenchX+ EarthQuake\DeltaX
TmpY=By * GUI\BlockSize + GUI\BenchY+ EarthQuake\DeltaY
Spr=Game\GameTable(Bx,By)\Sprite
Selected=Game\GameTable(Bx,By)\Selected
If Spr>0
Game\NbPiecesOnBench=Game\NbPiecesOnBench+1
If Selected=#False
DisplayClipSprite(#Spr_Black,TmpX,TmpY,255)
EndIf
;If Game\GameTable(Bx,By)\BonusOnThisCase=#True
; Spr=#Spr_Black
;EndIf
DisplayClipSprite(Spr,TmpX,TmpY,255)
Else
If (Bx+(By*#MaxTableWidth))%2
Spr=#Spr_BenchA
Else
Spr=#Spr_BenchB
EndIf
DisplayClipSprite(Spr,TmpX,TmpY,255)
EndIf
Next
Next
EndProcedure
Procedure DisplayTimer()
;-Timer
If Bonus\FreezeEnable=#True
If (ElapsedMilliseconds()-Bonus\FreezeStartTime)/1000>10
Bonus\FreezeAlpha=Bonus\FreezeAlpha-1
Bonus\FreezeTimer=Bonus\FreezeTimer-1
If Bonus\FreezeAlpha=0
Bonus\FreezeEnable=#False
EndIf
Else
Bonus\FreezeAlpha=255
EndIf
Game\NextTime=ElapsedMilliseconds()+Bonus\FreezeTimer-1
EndIf
If Game\WaitTimer=0 And Game\Timer>0
Protected Width.l= GUI\TimerWidth * (Game\NextTime-ElapsedMilliseconds()) / Game\Timer
DisplayClipSprite(#Spr_Black,GUI\TimerX,GUI\TimerY,255,1,GUI\TimerWidth,GUI\BlockSize)
DisplayClipSprite(#Spr_White,GUI\TimerX,GUI\TimerY,255,1,Width,GUI\BlockSize)
Protected TimerTxt.s
TimerTxt=StrF(Game\Timer/1000,1)+" Sec"
DrawBitmapText((ScreenWidth()-TextBitmapWidth(TimerTxt))/2,GUI\TimerY,TimerTxt)
If Bonus\FreezeEnable=#True
DisplayClipSprite(#Spr_Frozen,GUI\TimerX,GUI\TimerY,Bonus\FreezeAlpha)
EndIf
If ElapsedMilliseconds()>Game\NextTime
RandomShape()
Game\Life=Game\Life-1
If Game\Life>0
StartMusic(#Music_Missed,#True)
NewMessage("Missed",0)
NewBonus(#Bonus_Time)
Game\WaitTimer=ElapsedMilliseconds()+Game\Difficulty(Game\ScoreData\Difficulty)\WaitMissed
Else
Debug "Game Over : End Timer"
Game\Mode=#Mode_GameOver
InitGameMode(#Mode_GameOver)
EndIf
EndIf
EndIf
EndProcedure
Procedure DisplayScore()
Protected Score.s=Str(Game\ScoreData\Score)
Score=Left("0000",4-Len(Score))+Score
Protected Width.l=TextBitmapWidth(Score)
DisplayClipSprite(#Spr_Sc,GUI\BlockSize,GUI\BenchY+GUI\BenchHeight,255,1)
DrawingBitmapFont(0)
DrawBitmapText(GUI\BenchX+((GUI\BlockSize*3)-Width)/2,GUI\BenchY+GUI\BenchHeight+GUI\HalfBlockSize, Score);
Protected.l Minutes,Seconds,Duration
Duration=ElapsedMilliseconds()-Stats\StartGameTimer
Minutes=(Duration/1000)/60
Seconds=(Duration/1000)%60
DisplayClipSprite(#Spr_Sc,ScreenWidth()-GUI\BlockSize*4,GUI\BenchY+GUI\BenchHeight,255,1)
DrawBitmapText(ScreenWidth()-GUI\BlockSize*3.5,GUI\BenchY+GUI\BenchHeight+GUI\HalfBlockSize, MyFormatNumber("00",Minutes)+":"+MyFormatNumber("00",Seconds));
;-Display DIfficulty
Protected Text.s
Select Game\ScoreData\Difficulty
Case 0 ;Novice
Text="Novice"
Case 1 ;Normal
Text="Normal"
Case 2 ;Hard
Text="Hard"
Case 3 ;Madness
Text="Madness"
EndSelect
DrawBitmapText(0,0,Text)
If Bonus\EyeEnable=#True
DrawShape(GUI\TimerX+GUI\TimerWidth+GUI\BlockSize-GUI\QuarterBlockSize,GUI\TimerY-GUI\QuarterBlockSize,Game\NextShape,128,0.5)
EndIf
;-Display Life
Protected n.l
Protected lifeSpace.l
If Game\Life<4
lifeSpace=GUI\BlockSize
Else
lifeSpace=4*GUI\BlockSize/Game\Life
EndIf
For n=1 To Game\Life
DisplayClipSprite(#Spr_Health,ScreenWidth()-lifeSpace*n,0,255,1,GUI\BlockSize,GUI\BlockSize)
Next
;Display Jewel
Game\ObjetBlueJewelValue\String="x"+Str(Game\ScoreData\Bonus_JewelBlue);
Game\ObjetRedJewelValue\String="x"+Str(Game\ScoreData\Bonus_JewelRed);
Game\ObjetGreenJewelValue\String="x"+Str(Game\ScoreData\Bonus_JewelGreen);
If Bonus\RemoveEnable=#True
DisplayClipSprite(#Spr_Remove,GUI\BlockSize*3,0)
;Duration=(ElapsedMilliseconds()-Bonus\Remove_StartTime)
;If Duration>Game\Difficulty(Game\ScoreData\Difficulty)\BonusRemoveDuration
; Bonus\RemoveEnable=#False
; Bonus\Remove_StartTime=0
;Else
; DrawBitmapText(GUI\BlockSize*4,0,MyFormatNumber("00",(Game\Difficulty(Game\ScoreData\Difficulty)\BonusRemoveDuration-Duration)/1000));
;EndIf
EndIf
If Bonus\HammerEnable=#True
DisplayClipSprite(#Spr_Hammer,GUI\BlockSize*3,0)
Duration=(ElapsedMilliseconds()-Bonus\Hammer_StartTime)
If Duration>Game\Difficulty(Game\ScoreData\Difficulty)\BonusHammerDuration
Bonus\HammerEnable=#False
Bonus\Hammer_StartTime=0
Else
DrawBitmapText(GUI\BlockSize*4,0,MyFormatNumber("00",(Game\Difficulty(Game\ScoreData\Difficulty)\BonusHammerDuration-Duration)/1000));
EndIf
EndIf
; Bonus X2
If Bonus\X2Enable>3
Bonus\X2Enable=3
EndIf
Select Bonus\X2Enable
Case 1
DisplayClipSprite(#Spr_X2,GUI\BlockSize*5,0)
Case 2
DisplayClipSprite(#Spr_X4,GUI\BlockSize*5,0)
Case 3
DisplayClipSprite(#Spr_X8,GUI\BlockSize*5,0)
EndSelect
EndProcedure
Procedure DisplayCursor()
Protected MX.l
Protected MY.l
Protected Bx.l
Protected By.l
Protected TmpX.l
Protected TmpY.l
Static MouseBL.l
Static MouseBR.l
MX=MouseX()-GUI\BlockSize
MY=MouseY()-GUI\BlockSize
Bx=Int(MX / GUI\BlockSize)
By=Int(MY / GUI\BlockSize)
If Bx<0:Bx=0:EndIf
If By<0:Bx=0:EndIf
If Bx>#MaxTableWidth
Bx=#MaxTableWidth
EndIf
If By>#MaxTableHeight
By=#MaxTableHeight
EndIf
Game\BlockMouseX=Bx
Game\BlockMouseY=By
TmpX=Bx * GUI\BlockSize + GUI\BenchX
TmpY=By * GUI\BlockSize + GUI\BenchY
If Game\WaitTimer>0
;DisplayClipSprite(#Spr_Cursor,TmpX,TmpY,255)
If ElapsedMilliseconds()>Game\WaitTimer
Game\NextTime=ElapsedMilliseconds()+Game\Timer
Game\WaitTimer=0
EraseSelectedPieceOnBench()
EndIf
Else
EndIf
;Display Cursor
If Game\FluidCursor=#True
If Not Game\WaitTimer>0 And Bonus\RemoveEnable=#False
DrawShape(MX+GUI\HalfBlockSize,MY+GUI\HalfBlockSize,Game\SelectedShape,200)
EndIf
DisplayClipSprite(#Spr_Cursor,MX+GUI\HalfBlockSize,MY+GUI\HalfBlockSize,255)
Else
If Not Game\WaitTimer>0 And Bonus\RemoveEnable=#False
DrawShape(TmpX,TmpY,Game\SelectedShape,200)
EndIf
DisplayClipSprite(#Spr_Cursor,TmpX,TmpY,255)
EndIf
If ListSize(Bonus\DisplayedBonus())>0
TakeBonus(Bx.l,By.l)
EndIf
If Game\WaitTimer=0 And MouseButton(#PB_MouseButton_Left)
If MouseBL=0
MouseBL=#PB_MouseButton_Left
If Bonus\RemoveEnable=#True
CheckLoop(Bx,By,#False)
PlaySound(#Snd_DoALoop)
ClearList(LoopPath()) ; Don't Add Jewel when no Loop
Bonus\RemoveEnable=#False
Game\WaitTimer=ElapsedMilliseconds()+1000 ; <-Wait before next piece
If Game\NbPiecesOnBench=0:Bonus\RemoveEnable=#False:EndIf
ElseIf TestShapeToBench(Bx,By,Game\SelectedShape) Or Bonus\HammerEnable=#True
Game\Timer=Game\Timer-Game\Difficulty(Game\ScoreData\Difficulty)\TimerDownValue
;Add Stats To time to put a piece
AddElement(Stats\PieceTime())
Stats\PieceTime()=Game\Timer-(Game\NextTime-ElapsedMilliseconds())
Debug "PieceTime="+StrF(Stats\PieceTime()/1000)+"sec"
If Bonus\HammerEnable=#True
PlaySound(#Snd_MetalHammer)
Else
PlaySound(#Snd_PutPiece)
EndIf
InsertShapeToBench(Bx,By,Game\SelectedShape)
RandomShape()
Protected LoopSize=CheckLoop(Bx,By)
;-Do a Loop
If LoopSize>1
PlaySound(#Snd_DoALoop)
Bonus\Dead_StartTimer=ElapsedMilliseconds() ; reset Dead Bonus Time
;Add Stats To time to put a piece
EarthQuake\WaitStartTime=ElapsedMilliseconds() ; Reset EarthQuake Timer
AddElement(Stats\NbPieces())
Stats\NbPieces()=LoopSize
AddElement(Stats\LoopTime())
Stats\LoopTime()=ElapsedMilliseconds()-Stats\StartLoopTimer
Stats\StartLoopTimer=ElapsedMilliseconds()
Debug "LoopTime="+Str(Stats\LoopTime()/1000)+"Sec"
If LoopSize>Game\ScoreData\BigestLoopSize
Game\ScoreData\BigestLoopSize=LoopSize
If Game\ScoreData\NbLoop>1
NewMessage("Biggest Loop",0)
EndIf
EndIf
Game\WaitTimer=ElapsedMilliseconds()+1000 ; <-Wait before next piece
Game\ScoreData\NbLoop=Game\ScoreData\NbLoop+1
NewMessage("Loops "+Str(Game\ScoreData\NbLoop)+" With "+Str(LoopSize)+" pieces",0 )
Protected n.l
;Add Jewel
If Bonus\X2Enable>0
Debug "A Bonus\X2Enable="+Str(Bonus\X2Enable)
LoopSize=LoopSize*Pow(2,Bonus\X2Enable)
NewMessage("Loop Score X"+Str(Pow(2,Bonus\X2Enable)),0 )
Protected *Obj_Sprite.SpriteData
Protected Sprite.l
Select Bonus\X2Enable
Case 1
Sprite=#Spr_X2
Case 2
Sprite=#Spr_X4
Case 3
Sprite=#Spr_X8
EndSelect
*Obj_Sprite=NewSprite(Sprite,5,0,1,1,255,1,#Spr_Depth_Front,#Align_Hor_Middle|#Align_Ver_Middle)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\Size,#PB_Float,0,1000,1,75,#Easing_Linear,-1,@*Obj_Sprite\AutoDestroy)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,5,GUI\ScreenWidth/2,#Easing_QuintEaseOut)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,0,GUI\ScreenHeight/2,#Easing_QuintEaseOut)
Bonus\X2Enable=#False
Debug "B Bonus\X2Enable="+Str(Bonus\X2Enable)
EndIf
If Game\NbCross>0
NewMessage("Cross X "+Str(Game\NbCross)+" Bonus",0)
EndIf
If LoopSize>=18
For n=0 To LoopSize/8
NewBonus(#Bonus_JewelRed)
Next
For n=0 To LoopSize/15
NewBonus(#Bonus_JewelGreen)
Next
EndIf
If LoopSize>=40
NewBonus(#Bonus_Eye)
EndIf
Game\Timer=Game\Timer-100
If Game\Timer<2500:Game\Timer=2500:EndIf
If Game\Timer<=3900
NewBonus(#Bonus_Time)
EndIf
If LoopSize>=40
NewBonus(#Bonus_Health)
EndIf
Game\Combo=Game\Combo+1
If (Game\Combo>1)
NewMessage("Combo X"+Str(Game\Combo),0 )
EndIf
Game\ScoreData\Score=Game\ScoreData\Score+LoopSize*10*Game\Combo
If CheckBenchIsEmpty()=#True
Game\ScoreData\BenchIsEmpty=Game\ScoreData\BenchIsEmpty+1
NewMessage("Empty Bench ",0 )
Else
Debug "CheckBenchIsEmpty()=#False"
EndIf
Else
Game\Combo=0
EndIf
;reset Timer
Game\NextTime=ElapsedMilliseconds()+Game\Timer
Else
PlaySound(#Snd_CanTPutPiece)
Debug "NON"
EndIf
EndIf
Else
MouseBL=0
EndIf
; Turn Piece
If Game\WaitTimer=0 And (MouseButton(#PB_MouseButton_Right) Or KeyboardPushed(#PB_Key_LeftControl) )
If MouseBR=0
MouseBR=#PB_MouseButton_Left
Game\SelectedShape=SP(Game\SelectedShape)\NextId
EndIf
Else
MouseBR=0
EndIf
EndProcedure
Procedure KeyboardOrMouseClick()
Static Mb.l
If KeyboardReleased(#PB_Key_Space) Or GetLeftMouseClick()
Mb=#True
ProcedureReturn #True
Else
Mb=#False
ProcedureReturn #False
EndIf
EndProcedure
Procedure GameMode()
Protected Event.i
Protected n.l
Protected MB.l
;-EVentGUI
Repeat
Event=EventGUI()
If Event>0
;Enumeration Event in Main.Pbi
Select Event
Case #EventGui_ChangeVinyl
ClearMoveEngine()
StopMusic(Game\CurrentMusic)
Game\CurrentMusic =-1 ; To force To play if play same music played before
PlaySound(#Snd_Jukebox)
AddmoveToEngine(@Game\ObjetVinyl\X,#PB_Float,0,1000,Game\ObjetVinyl\X,24,0)
AddmoveToEngine(@Game\ObjetVinyl\X,#PB_Float,1000,1000,24,20,0,#EventGui_PlayJukeBox)
Case #EventGui_PlayJukeBox
StartMusic(Game\JukeBoxIndex,#True)
Case #EventGui_AddHealth
Game\Life=Game\Life+1
Case #EventGui_AddJewelBlue
Game\ScoreData\Bonus_JewelBlue=Game\ScoreData\Bonus_JewelBlue+1
Case #EventGui_AddJewelRed
Game\ScoreData\Bonus_JewelRed=Game\ScoreData\Bonus_JewelRed+1
Case #EventGui_AddJewelGreen
Game\ScoreData\Bonus_JewelGreen=Game\ScoreData\Bonus_JewelGreen+1
Case #EventGui_AddX2
Bonus\X2Enable=Bonus\X2Enable+1
Case #EventGui_Dead
Game\Life=Game\Life-1
If Game\Life>0
NewMessage("DEAD",0)
Game\WaitTimer=ElapsedMilliseconds()+Game\Difficulty(Game\ScoreData\Difficulty)\WaitMissed
Else
Debug "Game Over : Get Dead Penalty"
InitGameMode(#Mode_GameOver)
EndIf
Case #EventGui_EnableHammer
Bonus\Hammer_StartTime=ElapsedMilliseconds()
Bonus\HammerEnable=#True
Bonus\RemoveEnable=#False
Case #EventGui_EnableRemover
Bonus\Remove_StartTime=ElapsedMilliseconds()
Bonus\RemoveEnable=#True
Bonus\HammerEnable=#False
Case #EventGui_EnableEye
Bonus\EyeEnable=#True
Case #EventGui_EnableFreeze
Bonus\FreezeEnable=#True
Bonus\FreezeStartTime=ElapsedMilliseconds()
Bonus\FreezeTimer=Game\NextTime-ElapsedMilliseconds()
PlaySound(#Snd_Freeze)
Case #EventGui_NextHallOfFame
Game\HallOfFameDifficultyMode=Game\HallOfFameDifficultyMode+1
If Game\HallOfFameDifficultyMode>=3:Game\HallOfFameDifficultyMode=0:EndIf
InitGameMode(#Mode_HallOfFame)
Case #EventGui_NewResolution
DeInitScreen()
InitNewResolution()
InitScreen()
InitGameMode(#Mode_Menu)
Case #EventGui_ChangeMusicVolume
For n=0 To #Music_End-1
MusicVolume(n,Game\VolumeMusic*10)
Next
Case #EventGui_ChangeSfxVolume
;SoundVolume(#PB_All,Game\VolumeSfx*10)
For n=0 To #Snd_End-1
SoundVolume(n,Game\VolumeSfx*10)
Next
PlaySound(#Snd_GetBonus)
Case #EventGui_StartCalculBonus
Game\StartCalculBonus=#True
StartMusic(#Music_HighScore,#True)
EndSelect
If Event>999
InitGameMode(Event-1000)
EndIf
EndIf
Until Event=0
;DrawTitles()
Select Game\Mode
Case #Mode_record
If KeyboardOrMouseClick()
InitGameMode(#Mode_Intro)
EndIf
;-Mode Intro
Case #Mode_Intro
If KeyboardOrMouseClick()
InitGameMode(#Mode_Menu)
EndIf
; DisplaySprites()
;-Mode Menu
Case #Mode_Menu,#Mode_Options,#Mode_Graphics,#Mode_Audios
If KeyboardReleased(#PB_Key_F9)
InitGameMode(#Mode_record)
EndIf
;-Init JukeBox
Case #Mode_JukeBox
;-Mode Credits
Case #Mode_Credits
If KeyboardOrMouseClick()
InitGameMode(#Mode_Menu)
EndIf
;-Mode Game Init
Case #Mode_Game_Init
Stats\StartGameTimer=ElapsedMilliseconds() ; Always 00:00 when Game Init
;-Mode Game Run
Case #Mode_Game_Run
If KeyboardReleased(#PB_Key_Grave)
;NewBonus(#Bonus_Time)
EndIf
If KeyboardReleased(#PB_Key_Tab)
;game\SelectedShape=8
EndIf
If KeyboardReleased(#PB_Key_F1)
Game\FluidCursor=1-Game\FluidCursor
EndIf
;Juste to test !
CompilerIf #UsePreProdServer=#True
If KeyboardReleased(#PB_Key_1)
;game\SelectedShape=1
EndIf
If KeyboardReleased(#PB_Key_2)
;game\SelectedShape=1
EndIf
If KeyboardReleased(#PB_Key_Grave)
;PlaySound(#Snd_GetBonus)
;NewBonus(#Bonus_Gravity)
;game\SelectedShape=25
;DrawBitmapText(GUI\BlockSize*4,0,Str(Game\NbPiecesOnBench))
;Debug "C Bonus\X2Enable="+Str(Bonus\X2Enable)
EndIf
If KeyboardReleased(#PB_Key_4)
Bonus\Remove_StartTime=ElapsedMilliseconds()
Bonus\RemoveEnable=#True
Bonus\HammerEnable=#False
EndIf
CompilerEndIf
RunEarthQuake()
;Random Bonus
If ElapsedMilliseconds()-Bonus\Random_StartTime>Bonus\Random_Duration
Protected TmpBonus.l
Protected BonusValid.b=#True
Repeat
TmpBonus=Random(#Bonus_End-1,0)
Select TmpBonus
Case #Bonus_X2
If Bonus\X2Enable>=3
BonusValid=#False
EndIf
Case #Bonus_Eye
If Bonus\EyeEnable=#True
TmpBonus=#Bonus_Time
EndIf
Default
BonusValid=#True
EndSelect
Until BonusValid=#True
NewBonus(TmpBonus)
Bonus\Random_StartTime=ElapsedMilliseconds()
Bonus\Random_Duration=Random(20000,10000)
EndIf
;Add bonnus after Loop
Static DeadCounter
Static NexTimeToPutJewel.q
If LastElement(LoopPath()) And NexTimeToPutJewel<ElapsedMilliseconds()
DeadCounter=DeadCounter+1
Select Game\ScoreData\Difficulty
Case 0 ;Novice
If DeadCounter=Game\Difficulty(Game\ScoreData\Difficulty)\DeadCounter
DeadCounter=0
NewBonus(#Bonus_Dead,LoopPath()\BX,LoopPath()\BY)
Else
Select Game\NbCross
Case 0
NewBonus(#Bonus_JewelBlue,LoopPath()\BX,LoopPath()\BY)
Case 1
NewBonus(#Bonus_JewelRed,LoopPath()\BX,LoopPath()\BY)
Case 2
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
Case 3
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelRed)
Case 4
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelGreen)
EndSelect
EndIf
Case 1 ;Normal
If DeadCounter=15
DeadCounter=0
NewBonus(#Bonus_Dead,LoopPath()\BX,LoopPath()\BY)
Else
Select Game\NbCross
Case 0
NewBonus(#Bonus_JewelBlue,LoopPath()\BX,LoopPath()\BY)
Case 1
NewBonus(#Bonus_JewelRed,LoopPath()\BX,LoopPath()\BY)
Case 2
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
Case 3
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelRed)
Case 4
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelGreen)
EndSelect
EndIf
Case 2 ;Hard
If ListSize(LoopPath())%20=1
NewBonus(#Bonus_Dead,LoopPath()\BX,LoopPath()\BY)
Else
Select Game\NbCross
Case 0
NewBonus(#Bonus_JewelBlue,LoopPath()\BX,LoopPath()\BY)
Case 1
NewBonus(#Bonus_JewelRed,LoopPath()\BX,LoopPath()\BY)
Case 2
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
Case 3
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelRed)
Case 4
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelGreen)
EndSelect
EndIf
Case 3 ;madnesse
If ListSize(LoopPath())%10=1
NewBonus(#Bonus_Dead,LoopPath()\BX,LoopPath()\BY)
Else
Select Game\NbCross
Case 0
NewBonus(#Bonus_JewelBlue,LoopPath()\BX,LoopPath()\BY)
Case 1
NewBonus(#Bonus_JewelRed,LoopPath()\BX,LoopPath()\BY)
Case 2
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
Case 3
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelRed)
Case 4
NewBonus(#Bonus_JewelGreen,LoopPath()\BX,LoopPath()\BY)
NewBonus(#Bonus_JewelGreen)
EndSelect
EndIf
EndSelect
DeleteElement(LoopPath())
NexTimeToPutJewel=ElapsedMilliseconds()+50
EndIf
;Dead Bonus
If ElapsedMilliseconds()-Bonus\Dead_StartTimer>Game\Difficulty(Game\ScoreData\Difficulty)\DeadBonusWaitTimer
Debug "New DEAD"
NewBonus(#Bonus_Dead)
EndIf
;Scroll Bonus
If Game\NbPiecesOnBench>70 And Bonus\BonusScrollDisplayed=#False
NewBonus(#Bonus_Gravity)
EndIf
;-Mode GameOver
Case #Mode_GameOver
;Remove the remaining pieces from the bench
If ElapsedMilliseconds()>Game\WaitTimer
Game\WaitTimer=ElapsedMilliseconds()+500
Game\ToggleMode=1-Game\ToggleMode
If Game\ToggleMode=1
Protected Length.l
Length=SelectNextElementOnBench()
Debug "Remove Length="+Str(Length)
If Length>0
Game\ScoreData\Score=Game\ScoreData\Score-10
Game\UnfinishedLoopCount=Game\UnfinishedLoopCount+1
NewMessage(Str(Game\UnfinishedLoopCount)+" Unfinished x -10 ="+Str(Game\UnfinishedLoopCount*-10),0,1000,0)
ElseIf ListSize(MoveEngine())=0 ; IF GameOver FadeIn / FadeOut ended !
Debug "MODE SCORE"
Game\UnfinishedLoopCount=0
InitGameMode(#Mode_GameOver_End) ;TODO before its #Mode_CalculBonus
EndIf
Else
EraseSelectedPieceOnBench()
EndIf
EndIf
;-Mode GameOver End
Case #Mode_GameOver_End
Protected TmpOpacity.l=Int(ElapsedMilliseconds()/500)%255
Game\ObjetText[8]\Opacity=TmpOpacity
If Game\StartCalculBonus=#True And (ElapsedMilliseconds()>Game\NextTime Or KeyboardPushed(#PB_Key_Space) Or MouseButton(#PB_MouseButton_Left) )
Game\NextTime=ElapsedMilliseconds()+200
ChangeText(Game\ObjetText[8],"Left Click or Espace to Speed Up")
If Stats\Bonus_JewelBlue<Game\ScoreData\Bonus_JewelBlue
Game\ScoreData\Score=Game\ScoreData\Score+20
Stats\Bonus_JewelBlue=Stats\Bonus_JewelBlue+1
PlaySound(#Snd_GetJewel)
Game\ObjetBlueJewelValue\String=Str(Stats\Bonus_JewelBlue)+"x10"
Game\ObjetText[0]\String="= "+MyFormatNumber("00000",(Stats\Bonus_JewelBlue*10 + Stats\Bonus_JewelRed*20 +Stats\Bonus_JewelGreen*40))
ElseIf Stats\Bonus_JewelRed<Game\ScoreData\Bonus_JewelRed
Game\ScoreData\Score=Game\ScoreData\Score+40
Stats\Bonus_JewelRed=Stats\Bonus_JewelRed+1
PlaySound(#Snd_GetJewel)
Game\ObjetRedJewelValue\String=Str(Stats\Bonus_JewelRed)+"x20"
Game\ObjetText[0]\String="= "+MyFormatNumber("00000",Stats\Bonus_JewelBlue*10 + Stats\Bonus_JewelRed*20 +Stats\Bonus_JewelGreen*40)
ElseIf Stats\Bonus_JewelGreen<Game\ScoreData\Bonus_JewelGreen
Game\ScoreData\Score=Game\ScoreData\Score+40
Stats\Bonus_JewelGreen=Stats\Bonus_JewelGreen+1
PlaySound(#Snd_GetJewel)
Game\ObjetGreenJewelValue\String=Str(Stats\Bonus_JewelGreen)+"x40"
Game\ObjetText[0]\String="= "+MyFormatNumber("00000",Stats\Bonus_JewelBlue*10 + Stats\Bonus_JewelRed*20 +Stats\Bonus_JewelGreen*40)
ElseIf Stats\BigestLoopSize<Game\ScoreData\BigestLoopSize
Game\ScoreData\Score=Game\ScoreData\Score+5
Stats\BigestLoopSize=Stats\BigestLoopSize+1
Game\ObjetText[1]\String="Biggest Loop "+MyFormatNumber("00",Stats\BigestLoopSize)+" x 5"
Game\ObjetText[2]\String="= "+MyFormatNumber("00000",Stats\BigestLoopSize*5)
ElseIf Stats\NbLoop<Game\ScoreData\NbLoop
Game\ScoreData\Score=Game\ScoreData\Score+10
Stats\NbLoop=Stats\NbLoop+1
Game\ObjetText[3]\String="Number of Loops "+MyFormatNumber("00",Stats\NbLoop)+" x 10"
Game\ObjetText[4]\String="= "+MyFormatNumber("00000",Stats\NbLoop*10)
ElseIf Stats\BenchIsEmpty<Game\ScoreData\BenchIsEmpty
Game\ScoreData\Score=Game\ScoreData\Score+500
Stats\BenchIsEmpty=Stats\BenchIsEmpty+1
Game\ObjetText[5]\String=Str(Stats\BenchIsEmpty)+" Cleaned Bench x 500"
Game\ObjetText[6]\String="= "+MyFormatNumber("00000",Stats\BenchIsEmpty*500)
Else
ChangeText(Game\ObjetText[8],"Left Click or Espace to Continue")
Game\ObjetText[7]\String="= "+MyFormatNumber("00000",Game\ScoreData\Score)
If KeyboardOrMouseClick()
Stats\BigestLoopSize=Game\ScoreData\BigestLoopSize
Stats\NbLoop=Game\ScoreData\NbLoop
Stats\Bonus_JewelBlue=Game\ScoreData\Bonus_JewelBlue
Stats\Bonus_JewelRed=Game\ScoreData\Bonus_JewelRed
Stats\BenchIsEmpty=Game\ScoreData\BenchIsEmpty
If Game\ScoreData\Score>0
InitGameMode(#Mode_EnterYourName)
Else
InitGameMode(#Mode_HallOfFame)
EndIf
EndIf
EndIf
EndIf
;-Mode Enter Your Name
Case #Mode_EnterYourName
If KeyboardReleased(#PB_Key_Back)
Game\ScoreData\Pseudo= Left(Game\ScoreData\Pseudo, Len(Game\ScoreData\Pseudo)-1)
ChangeText(Game\ObjetText[0],Game\ScoreData\Pseudo)
Else
If Len(Game\ScoreData\Pseudo)<8
Protected text.s
CompilerIf #PB_Compiler_OS=#PB_OS_Windows
text=KeyboardInkey()
CompilerElse
text=KeyboardInkeyEx() ;Function define in Main.pb
CompilerEndIf
If FindString("1234567890'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", text) ; Ajouter vos propres caractères valides ici
Game\ScoreData\Pseudo + text
ChangeText(Game\ObjetText[0],Game\ScoreData\Pseudo)
EndIf ; Ajouter le nouveau texte à l'actuel (le cas échéant)
EndIf
EndIf
If ElapsedMilliseconds()>Game\NextTime
Game\NextTime=ElapsedMilliseconds()+500
Game\ObjetText[0]\String=Game\ScoreData\Pseudo+"_"
Else
Game\ObjetText[0]\String=Game\ScoreData\Pseudo
EndIf
If KeyboardReleased(#PB_Key_Return)
If Game\ScoreData\Pseudo<>""
SaveScoreToLocalDB()
If Game\ConnectToServer=#True
SaveScoreToServerDB()
EndIf
EndIf
InitGameMode(#Mode_HallOfFame)
EndIf
;-Mode HallOfFame
Case #Mode_HallOfFame
If KeyboardOrMouseClick()
InitGameMode(#Mode_Menu)
EndIf
EndSelect
If Game\ScoreData\Score<0:Game\ScoreData\Score=0:EndIf
;-WARNING SCREEN
If Game\Warning<>""
Debug "WARNIIIIIIIIIIIINNNNNNNNNG!!!"
Protected *Obj_Sprite
Protected *Obj_Text
*Obj_Sprite=NewSprite(#Spr_BenchB,0,0,GUI\ScreenWidth,GUI\ScreenHeight,220,1,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
DrawingBitmapFont(1)
*Obj_Text=NewText(1,"Warning !",(ScreenWidth()- TextBitmapWidth("Warning")) / 2,GUI\BlockSize*2,255,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
DrawingBitmapFont(0)
For n=1 To CountString(Game\Warning,Chr(13))+1
text=StringField(Game\Warning,n,Chr(13))
*Obj_Text=NewText(0,text,(ScreenWidth()- TextBitmapWidth(text)) / 2,GUI\BlockSize*3+n*GUI\BlockSize,255,#Spr_Depth_Front)
AddItemToDisplayEngine(*Obj_Text,#Type_BitmapText)
Next
Game\Warning=""
EndIf
RunMoveEngine()
RenderingDisplayEngine()
ScreenShoot()
EndProcedure
; IDE Options = PureBasic 6.00 LTS (Windows - x64)
; CursorPosition = 319
; FirstLine = 302
; Folding = --
; EnableXP
; DPIAware