450 lines
14 KiB
Plaintext
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 |