Files
LoopzRemix/Main.pb
2025-07-17 20:36:20 +02:00

450 lines
14 KiB
Plaintext

;*******************************
; 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