;******************************* ; Free Loopz ; ; By Yann LEBRUN (Thyphoon) ; Mars 2022 ;******************************* #MajorVersion="1" #BuildVersion="2" #GamePlayVersion="2" ;Change when gameplay change #Version=#MajorVersion+"."+#GamePlayVersion+"."+#BuildVersion+"."+#PB_Editor_CompileCount ;-Config #UsePreProdServer=#False #PreProdServerURL="https://loopzdb.thyphoon.net/LoopzServer-pp.php" #UsePackFile=#True ; True load file From Data.pck / False load file directly #DebugCheckLoopVerbose=#True; see CheckLoop() #DebugPackageVerbose=#False ; see Package.pbi #TestServer=#False ;See >TEST SERVEUR CompilerSelect #PB_Compiler_OS CompilerCase #PB_OS_Linux CompilerSelect #PB_Compiler_Processor CompilerCase#PB_Processor_x86 #CompileVersion="Linuxx86" CompilerCase#PB_Processor_x64 #CompileVersion="Linuxx64" CompilerCase#PB_Processor_Arm32 #CompileVersion="LinuxArm32" CompilerCase#PB_Processor_Arm64 #CompileVersion="LinuxArm64" CompilerEndSelect CompilerCase #PB_OS_MacOS CompilerSelect #PB_Compiler_Processor CompilerCase#PB_Processor_x86 #CompileVersion="MacOsx86" CompilerCase#PB_Processor_x64 #CompileVersion="MacOsx64" CompilerCase#PB_Processor_Arm32 #CompileVersion="MacOsArm32" CompilerCase#PB_Processor_Arm64 #CompileVersion="MacOsArm64" CompilerEndSelect CompilerCase #PB_OS_Windows CompilerSelect #PB_Compiler_Processor CompilerCase#PB_Processor_x86 #CompileVersion="Windowsx86" CompilerCase#PB_Processor_x64 #CompileVersion="Windowsx64" CompilerCase#PB_Processor_Arm32 #CompileVersion="WindowsArm32" CompilerCase#PB_Processor_Arm64 #CompileVersion="WindowsArm64" CompilerEndSelect CompilerEndSelect EnableExplicit UsePNGImageDecoder() UsePNGImageEncoder() ; To Take ScreenShoot UseMD5Fingerprint() ;Hide cursor Code from Shardik ;src : https://www.purebasic.fr/english/viewtopic.php?f=15&t=71173&start=4 CompilerIf #PB_Compiler_OS = #PB_OS_Linux #GDK_BLANK_CURSOR = -2 ;ImportC "" ;gtk_widget_get_window(*Widget.GtkWidget) ;EndImport CompilerEndIf Procedure HideCursor(HideCursor.I = #True) Protected Cursor.I CompilerSelect #PB_Compiler_OS CompilerCase #PB_OS_Linux ;If HideCursor ;; Cursor = gdk_cursor_new_(#GDK_BLANK_CURSOR) ;Else ; Cursor = 0 ;EndIf ;gdk_window_set_cursor_(gtk_widget_get_window(WindowID(0)), Cursor) CompilerCase #PB_OS_MacOS If HideCursor ;CocoaMessage(0, 0, "NSCursor hide") Else ;CocoaMessage(0, 0, "NSCursor unhide") EndIf CompilerCase #PB_OS_Windows If HideCursor ShowCursor_(#False) Else ShowCursor_(#True) EndIf CompilerEndSelect EndProcedure Procedure.s GetPDataDirectory(File.s) CompilerSelect #PB_Compiler_OS CompilerCase #PB_OS_Windows ProcedureReturn GetUserDirectory(#PB_Directory_AllUserData)+"LoopzRemix\"+File CompilerCase #PB_OS_MacOS ProcedureReturn GetCurrentDirectory()+File CompilerCase #PB_OS_Linux ProcedureReturn GetCurrentDirectory()+File CompilerEndSelect EndProcedure Procedure.b GetLeftMouseClick() Static Mb.l If MouseButton(#PB_MouseButton_Left) If Mb=#False Debug "MOUSE 1" Mb=#True ProcedureReturn #True EndIf Else Mb=#False EndIf ProcedureReturn #False EndProcedure CompilerIf #PB_Compiler_OS<>#PB_OS_Windows Procedure.s KeyboardInkeyEx() Protected key.s key = KeyboardInkey() If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift) key = UCase(key) EndIf ProcedureReturn key EndProcedure CompilerEndIf ;-Event GUI Enumeration Event #EventGui_Empty #EventGui_PlayJukeBox #EventGui_ChangeVinyl #EventGui_AddJewelBlue #EventGui_AddJewelRed #EventGui_AddJewelGreen #EventGui_EnableHammer #EventGui_EnableRemover #EventGui_EnableEye #EventGui_AddHealth #EventGui_AddX2 #EventGui_Dead #EventGui_EnableFreeze #EventGui_NextHallOfFame #EventGui_NewResolution #EventGui_ChangeMusicVolume #EventGui_ChangeSfxVolume #EventGui_StartCalculBonus EndEnumeration Global NewList myEventGUI.l() Procedure PostEventGUI(Event.l) AddElement(myEventGUI()) myEventGUI()=Event EndProcedure Procedure EventGUI() Protected Event.l If ListSize(myEventGUI())>0 FirstElement(myEventGUI()) Event=myEventGUI() DeleteElement(myEventGUI()) Else Event=0 EndIf ProcedureReturn Event EndProcedure Procedure.s MyFormatNumber(Base.s,Value.l) Protected ValueTxt.s=Str(Value) ProcedureReturn Left(Base,Len(Base)-Len(ValueTxt))+ValueTxt EndProcedure ;- Init Library If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSound()=0 MessageRequester("Erreur", "Can't Init Sprite() Or Keyboard() Or Mouse() Or Sound()", 0) End EndIf Declare InitGameMode(Mode.l) Declare AddmoveToEngine(*Value,ValueType.l,StartTime.l,Duration.l,StartValue.f,EndValue.f,Easing.l,Event.l=-1,*AutoDestroy=0) Declare AddItemToDisplayEngine(*Pointer,Type.l,InsertIndex.l=-1) Declare myDisplaySprite(*Sprite) Declare DisplayText(*Text) Declare DisplayMenu() Declare DisplayTitles() Declare DisplayBench() Declare DisplayCursor() Declare DisplayScore() Declare DisplayMessage() Declare DisplayBonus() Declare DisplayEarthQuakeFall() Declare DisplayTimer() Declare DisplayWarning(Warning.s,BackMode.l=-1) XIncludeFile("Linux_Screen3DMousePatch.pbi") XIncludeFile("Easing.pbi") XIncludeFile("GUI.pbi") XIncludeFile("Package.pb") ;XIncludeFile("Package.pbi") XIncludeFile("GameStructure.pbi") XIncludeFile("Sprite.pbi") XIncludeFile("SpritesObj.pbi") XIncludeFile("BitmapText.pbi") XIncludeFile("MoveEngine.pbi") XIncludeFile("Sound.pbi") XIncludeFile("Screen.pbi") XIncludeFile("EarthQuake.pbi") XIncludeFile("Bonus.pbi") XIncludeFile("Database.pbi") XIncludeFile("Shape.pbi") XIncludeFile("Menu.pbi") XIncludeFile("Game.pbi") ;- TEST SERVEUR CompilerIf #TestServer=#True ;to test server LoadPrefs() If OpenWindow(0, 0, 0, 640, 480, "Loopz "+#Version, #PB_Window_SystemMenu | #PB_Window_ScreenCentered) OpenWindowedScreen(WindowID(0), 0, 0, 640, 480) Game\ScoreData\Pseudo="Thy" Game\ScoreData\Difficulty=1 Game\ScoreData\Score=Random(10000,800) Game\ScoreData\Duration=168059 Game\ScoreData\PiecesPerMinute=27.0539970398 Game\ScoreData\LoopsPerMinute=1.440633893 Game\ScoreData\AveragePiecesPerLoop=16.33 Game\ScoreData\NbLoop=3 Game\ScoreData\BigestLoopSize=32 Game\ScoreData\Bonus_JewelBlue=13 Game\ScoreData\Bonus_JewelRed=1 Game\ScoreData\BenchIsEmpty=0 Game\ScoreData\Fps_Max=61 Game\ScoreData\Fps_Min=60 EndIf ;The function you want to test ;LoadHallOfFameFromServer(1) SaveScoreToServerDB() End CompilerEndIf Procedure Quit() If IsDatabase(#DB) CloseDatabase(#DB) SavePrefs() HideCursor(#False) EndIf End EndProcedure Procedure DisplayWarning(Warning.s,BackMode.l=-1) Debug Warning If BackMode=-1 BackMode=#Mode_Menu EndIf Game\Warning=Warning EndProcedure Procedure Main() ;- Load Sound CompilerIf #UsePackFile=#True CatchSoundFromPackage(#Snd_PutPiece,"mixkit-explainer-video-game-alert-sweep-236.wav") CatchSoundFromPackage(#Snd_CanTPutPiece,"mixkit-video-game-retro-click-237.wav") CatchSoundFromPackage(#Snd_DoALoop,"mixkit-extra-bonus-in-a-video-game-2045.wav") CatchSoundFromPackage(#Snd_GetBonus,"mixkit-bonus-earned-in-video-game-2058.wav") CatchSoundFromPackage(#Snd_GetBonus2,"322897-rhodesmas-connected-01.wav") ; https://freesound.org/people/rhodesmas/sounds/322897/ CatchSoundFromPackage(#Snd_DeletePiece,"mixkit-fast-small-sweep-transition-166.wav") CatchSoundFromPackage(#Snd_GetJewel,"mixkit-fairy-magic-sparkle-871.wav") CatchSoundFromPackage(#Snd_EarthQuake,"mixkit-erupting-volcano-lava-2442.wav") CatchSoundFromPackage(#Snd_DeadBonus,"My-Dead-Snd-Effect.wav") CatchSoundFromPackage(#Snd_MetalHammer,"Metal-hammer.wav") CatchSoundFromPackage(#Snd_Woosh,"Woosh 06.wav") ;old moogy73_woosh-medium-short-01.wav CatchSoundFromPackage(#Snd_Collapse,"434897-thebuilder15-collapse.wav") CatchSoundFromPackage(#Snd_Freeze,"446112-justinvoke-freeze.wav") CatchSoundFromPackage(#Snd_Jukebox,"jukebox.wav") CatchSoundFromPackage(#Snd_WaterDrop,"Goutte 03.wav") CompilerElse LoadSound(#Snd_PutPiece,"Datas\mixkit-explainer-video-game-alert-sweep-236.wav") ; Put piece LoadSound(#Snd_CanTPutPiece,"Datas\mixkit-video-game-retro-click-237.wav") ; Can't put Piece LoadSound(#Snd_DoALoop,"Datas\mixkit-extra-bonus-in-a-video-game-2045.wav") ; I Have a Loop LoadSound(#Snd_GetBonus,"Datas\mixkit-bonus-earned-in-video-game-2058.wav") ; Get Bonus LoadSound(#Snd_GetBonus2,"Datas\322897-rhodesmas-connected-01.wav") LoadSound(#Snd_DeletePiece,"Datas\mixkit-fast-small-sweep-transition-166.wav") LoadSound(#Snd_GetJewel,"Datas\mixkit-fairy-magic-sparkle-871.wav") ; Edited LoadSound(#Snd_EarthQuake,"Datas\mixkit-erupting-volcano-lava-2442.wav") LoadSound(#Snd_DeadBonus,"Datas\My-Dead-Snd-Effect.wav") LoadSound(#Snd_MetalHammer,"Datas\Metal-hammer.wav") LoadSound(#Snd_Woosh,"Datas\Woosh 06.wav") ;425706__moogy73__woosh-medium-short-01.wav LoadSound(#Snd_WaterDrop,"Datas\Goutte 03.wav") LoadSound(#Snd_Collapse,"Datas\434897-thebuilder15-collapse.wav") LoadSound(#Snd_Freeze,"Datas\446112-justinvoke-freeze.wav") LoadSound(#Snd_Jukebox,"Datas\jukebox.wav") ;271401__ylearkisto__levyautomaatti-kolikko-aukkoon-vanha-jukebox-old-coin-into-the-slot-mechanism-starts-To-buzz.wav CompilerEndIf Protected n.l=0 For n=0 To #Snd_DeadBonus If Not IsSound(n) MessageRequester("Sound Error","Can't use sound "+Str(n)) End EndIf Next ;-Load Music Game\CurrentMusic=-1 CompilerIf #UsePackFile=#True CatchMusicFromPackage(#Music_Intro,"Loopz03V2.mod") CatchMusicFromPackage(#Music_GameA,"Loopz01.mod") CatchMusicFromPackage(#Music_GameB,"Loopz02.mod") CatchMusicFromPackage(#Music_Missed,"LoopzGameOver01.mod") CatchMusicFromPackage(#Music_GameOver,"LoopzGameOver03.mod") CatchMusicFromPackage(#Music_HighScore,"LoopzHighScore01V2.mod") CatchMusicFromPackage(#Music_Credits,"Loopz10.mod") CompilerElse LoadMusic(#Music_Intro,"Modules/Loopz03V2.mod") LoadMusic(#Music_GameA,"Modules/Loopz01.mod") LoadMusic(#Music_GameB,"Modules/Loopz02.mod") LoadMusic(#Music_Missed,"Modules/LoopzGameOver01.mod") LoadMusic(#Music_GameOver,"Modules/LoopzGameOver03.mod") LoadMusic(#Music_HighScore,"Modules/LoopzHighScore01V2.mod") LoadMusic(#Music_Credits,"Modules/Loopz10.mod") CompilerEndIf LoadPrefs() ;-Init Volume SFX / MUSIC For n=0 To #Music_End-1 MusicVolume(n,Game\VolumeMusic*10) Next ;SoundVolume(#PB_All,Game\VolumeSfx*10) For n=0 To #Snd_End-1 SoundVolume(n,Game\VolumeSfx*10) Next ;-Load Sprite ; in InitScreen because you must to reload all sprite when you change resolution in game (Option resolution) InitScreen() Protected Event.i InitDatabase() InitGameMode(#Mode_Intro) ;InitGameMode(#Mode_record) HideCursor(#True) MouseLocate(ScreenWidth()/2,(GUI\BenchHeight+GUI\BenchY)/2) Protected MouseOutScreen.b=#False Repeat ;Loop for window Mode If GUI\FullScreen=#False And IsWindow(0) Repeat Event = WindowEvent() Select Event Case #PB_Event_CloseWindow Quit() Case #PB_Event_MoveWindow GUI\WindowX=WindowX(0) GUI\WindowY=WindowY(0) EndSelect Until Event = 0 EndIf ExamineKeyboard() ExamineMouse() ;- Mouse IN/OUT If GUI\FullScreen=#False ;Debug "MouseOutScreen="+Str(MouseOutScreen)+" WindowMouseX(0)="+Str(WindowMouseX(0))+ " ScreenWidth()="+Str(ScreenWidth()) If MouseOutScreen=#True And WindowMouseX(0) > 2 And WindowMouseY(0) > 2 And WindowMouseX(0) < ScreenWidth()-2 And WindowMouseY(0) < ScreenHeight() -2 Debug "Mouse IN" ReleaseMouse(0) MouseLocate(WindowMouseX(0), WindowMouseY(0)) ;MouseLocate(ScreenWidth()/2, ScreenHeight() / 2) HideCursor(#True) MouseOutScreen = #False ElseIf MouseOutScreen=#False And (MouseX() <2 Or MouseY() < 2 Or MouseX() > ScreenWidth() -2 Or MouseY() > ScreenHeight() -2) Debug "Mouse OUT" ReleaseMouse(1) HideCursor(#False) MouseOutScreen = #True EndIf Else MouseOutScreen=#False ReleaseMouse(0) EndIf ;- Switch FullScreen / Window If Game\Mode<>#Mode_Game_Run And KeyboardPushed(#PB_Key_LeftAlt) And KeyboardPushed(#PB_Key_Return) DeInitScreen() GUI\FullScreen=1-GUI\FullScreen InitScreen() InitGameMode(#Mode_Menu) EndIf ;- Quit Game If KeyboardReleased(#PB_Key_Escape) If Game\Mode=#Mode_Menu Quit() Else InitGameMode(#Mode_Menu) EndIf EndIf If KeyboardPushed(#PB_Key_Add) Debug Str(ElapsedMilliseconds())+ " "+Str(ListSize(MoveEngine())) EndIf FlipBuffersAndRetrieveFPS() ClearScreen(RGB(32,32,32)) CheckMusic() GameMode() If MouseOutScreen=#True DisplayClipSprite(#Spr_White,0,0,128,1,ScreenWidth(),ScreenHeight()) Else If Game\DisplayCursor=#True DisplayClipSprite(#Spr_Pointer,MouseX(),MouseY(),255,1) EndIf EndIf If Game\DisplayFps=#True Debug Str(GUI\fpsValue)+" Fps" EndIf Delay(1) ForEver EndProcedure Main() ; IDE Options = PureBasic 6.11 LTS (Windows - x64) ; CursorPosition = 15 ; FirstLine = 15 ; Folding = --- ; EnableXP ; DisableDebugger ; EnableCompileCount = 158 ; EnableBuildCount = 0 ; EnableExeConstant