Initial commit

This commit is contained in:
2025-07-17 20:36:20 +02:00
commit 069402c4ec
37 changed files with 7849 additions and 0 deletions

371
Bonus.pbi Normal file
View File

@@ -0,0 +1,371 @@
; Moved to GameStructure
; Enumeration BonusType
; #Bonus_Health ; Add Health
; #Bonus_Time ; Slowest Time
; #Bonus_EarthQuake ; Check Bench and pieces Fall
; #Bonus_Dead ; All points X2
; #Bonus_X2 ; All points X4
; #Bonus_JewelBlue ;
; #Bonus_JewelRed ;
; #Bonus_Eye
; #Bonus_End
; EndEnumeration
Structure DisplayedBonus
Type.l ;see BonusType Enumeration
X.l
Y.l
State.l
Alpha.l
StartTime.l
Duration.l
EndStructure
Structure Bonus
List DisplayedBonus.DisplayedBonus()
Dead_StartTimer.q
EyeEnable.b
HammerEnable.b
BonusScrollDisplayed.b
Hammer_StartTime.q
Random_StartTime.q
Random_Duration.l
RemoveEnable.b
Remove_StartTime.q
X2Enable.b
FreezeEnable.b
FreezeStartTime.q
FreezeTimer.l
FreezeAlpha.l
EndStructure
Global Bonus.Bonus
Procedure NewBonus(BonusType.l,Bx.l=-1,By.l=-1)
Protected TmpX.l,TmpY.l
Protected Authorization.b=#False
Protected Count.l=0
Protected Quit.b=#False
Debug "_____NewBonus()____"
If BonusType<>#Bonus_X2 Or (BonusType=#Bonus_X2 And Bonus\X2Enable<3) ;No Over x8
If Bx=-1
Protected BonusCase.l
Repeat
Count=Count+1
BonusCase.l=RandUniq()
TmpX=BonusCase%(#MaxTableWidth+1)
TmpY=BonusCase/(#MaxTableWidth+1)
Debug "Test New Bonus "+Str(TmpX)+","+Str(TmpY)+" BonusType="+Str(BonusType)
If BonusType=#Bonus_Dead:Debug "Add Dead Bonus":EndIf
If Game\GameTable(TmpX,TmpY)\BonusOnThisCase=#False
If (TmpX=Game\BlockMouseX And TmpY=Game\BlockMouseY)
Debug "Bonus Under Mouse "
Quit=#True
Else
Authorization=#True
Quit=#True
EndIf
EndIf
If Count=4 And Game\GameTable(TmpX,TmpY)\BonusOnThisCase=#True
Quit=#True
EndIf
Until Quit=#True
Else
If Bx=Game\BlockMouseX And By=Game\BlockMouseY
Debug "Bonus Under Mouse Bis"
Else
Authorization=#True
TmpX=Bx
TmpY=By
EndIf
EndIf
If Authorization=#True And Game\GameTable(TmpX,TmpY)\BonusOnThisCase=#False
AddElement(Bonus\DisplayedBonus())
Bonus\DisplayedBonus()\Type=BonusType
Bonus\DisplayedBonus()\X=TmpX
Bonus\DisplayedBonus()\Y=TmpY
Bonus\DisplayedBonus()\StartTime=ElapsedMilliseconds()
Game\GameTable(TmpX,TmpY)\BonusOnThisCase=#True
Select BonusType
Case #Bonus_Health
Bonus\DisplayedBonus()\Duration=4000
Case #Bonus_Time ; Slowest Time
Bonus\DisplayedBonus()\Duration=Random(4000,2500)
Case #Bonus_EarthQuake ; Check Bench and pieces Fall
Bonus\DisplayedBonus()\Duration=4000
Case #Bonus_Dead ; Dead
Bonus\DisplayedBonus()\Duration=Game\Difficulty(Game\ScoreData\Difficulty)\DeadBonusDuration
Bonus\Dead_StartTimer=ElapsedMilliseconds()
Case #Bonus_X2 ; All points X2
Bonus\DisplayedBonus()\Duration=4000
Case #Bonus_Eye
Bonus\DisplayedBonus()\Duration=4000
If Game\ScoreData\Difficulty<2
Bonus\DisplayedBonus()\Type=#Bonus_Time
EndIf
Case #Bonus_JewelBlue,#Bonus_JewelRed ; Jewel
Bonus\DisplayedBonus()\Duration=Random(6000,3000)
Case #Bonus_Gravity
Bonus\DisplayedBonus()\Duration=4000
Bonus\BonusScrollDisplayed=#True
Case #Bonus_Freeze
Bonus\DisplayedBonus()\Duration=4000
Default
Bonus\DisplayedBonus()\Duration=4000
EndSelect
PlaySound(#Snd_Woosh)
Else
Debug "Lost Bonus No empty Case"
EndIf
EndIf
EndProcedure
Procedure NewBonus_old(BonusType.l,Bx.l=-1,By.l=-1)
AddElement(Bonus\DisplayedBonus())
Bonus\DisplayedBonus()\Type=BonusType
;Loop to never put Bonus on Mouse Cursor
If Bx=-1
Repeat
Protected BonusCase.l
BonusCase.l=RandUniq(); RandUniq() function is GameStructure.pbi
Bonus\DisplayedBonus()\X=BonusCase%(#MaxTableWidth+1)
Bonus\DisplayedBonus()\Y=BonusCase/(#MaxTableWidth+1)
Debug "New Bonus "+Str(Bonus\DisplayedBonus()\X)+","+Str(Bonus\DisplayedBonus()\Y)
Until (Bonus\DisplayedBonus()\X>Game\BlockMouseX+1 Or Bonus\DisplayedBonus()\X<Game\BlockMouseX-1) Or (Bonus\DisplayedBonus()\Y>Game\BlockMouseY+1 Or Bonus\DisplayedBonus()\Y<Game\BlockMouseY-1)
Else
Bonus\DisplayedBonus()\X=Bx
Bonus\DisplayedBonus()\Y=By
EndIf
Bonus\DisplayedBonus()\StartTime=ElapsedMilliseconds()
Select BonusType
Case #Bonus_Health
Bonus\DisplayedBonus()\Duration=4000
Case #Bonus_Time ; Slowest Time
Bonus\DisplayedBonus()\Duration=Random(4000,2500)
Case #Bonus_EarthQuake ; Check Bench and pieces Fall
Bonus\DisplayedBonus()\Duration=4000
Case #Bonus_Dead ; Dead
Bonus\DisplayedBonus()\Duration=Game\Difficulty(Game\ScoreData\Difficulty)\DeadBonusDuration
Bonus\Dead_StartTimer=ElapsedMilliseconds()
Case #Bonus_X2 ; All points X2
Bonus\DisplayedBonus()\Duration=4000
Case #Bonus_Eye
Bonus\DisplayedBonus()\Duration=4000
If Game\ScoreData\Difficulty<2
Bonus\DisplayedBonus()\Type=#Bonus_Time
EndIf
Case #Bonus_JewelBlue,#Bonus_JewelRed ; Jewel
Bonus\DisplayedBonus()\Duration=Random(6000,3000)
Case #Bonus_Gravity
Bonus\DisplayedBonus()\Duration=4000
Bonus\BonusScrollDisplayed=#True
Case #Bonus_Freeze
Bonus\DisplayedBonus()\Duration=4000
Default
Bonus\DisplayedBonus()\Duration=4000
EndSelect
PlaySound(#Snd_Woosh)
EndProcedure
Procedure DisplayBonus()
Protected TmpX.l
Protected TmpY.l
Protected During.l
Protected Alpha.l
ForEach Bonus\DisplayedBonus()
TmpX=Bonus\DisplayedBonus()\X * GUI\BlockSize + GUI\BenchX + EarthQuake\DeltaX
TmpY=Bonus\DisplayedBonus()\Y * GUI\BlockSize + GUI\BenchY + EarthQuake\DeltaY
During.l=ElapsedMilliseconds()-Bonus\DisplayedBonus()\StartTime
If During<2000
Bonus\DisplayedBonus()\Alpha=Int(During/4)
EndIf
If During>Bonus\DisplayedBonus()\Duration-500
Bonus\DisplayedBonus()\Alpha=Int((Bonus\DisplayedBonus()\Duration-During)/2)
Else
Bonus\DisplayedBonus()\Alpha=255
EndIf
If During>Bonus\DisplayedBonus()\Duration
If Bonus\DisplayedBonus()\Type=#Bonus_Gravity
Bonus\BonusScrollDisplayed=#False
EndIf
Game\GameTable(Bonus\DisplayedBonus()\X,Bonus\DisplayedBonus()\Y)\BonusOnThisCase=#False
DeleteElement(Bonus\DisplayedBonus())
Else
DisplayClipSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,TmpX,TmpY,Bonus\DisplayedBonus()\Alpha)
;DrawBitmapText(TmpX,TmpY,Str(Bonus\DisplayedBonus()\Alpha)) ; Display Tansparency on Bonus
EndIf
Next
EndProcedure
; Procedure ScrollLeft()
; Protected Bx.l,By.l
; For By=0 To #MaxTableHeight
; Protected EmptyCase.l=-1
; For Bx=0 To #MaxTableWidth
; If Game\GameTable(Bx,By)\Sprite>0
; If EmptyCase>-1
; Game\GameTable(EmptyCase,By)\Sprite=Game\GameTable(Bx,By)\Sprite
; Game\GameTable(EmptyCase,By)\Selected=Game\GameTable(Bx,By)\Selected
; Game\GameTable(Bx,By)\Sprite=0
; Game\GameTable(Bx,By)\Selected=0
; EmptyCase=EmptyCase+1
; EndIf
; ElseIf Game\GameTable(Bx,By)\Sprite=0
; If EmptyCase=-1:EmptyCase=Bx:EndIf
; EndIf
; Next
; Next
; EndProcedure
Procedure ScrollDown()
Protected Bx.l,By.l
For Bx=0 To #MaxTableWidth
Protected EmptyCase.l=#MaxTableHeight+1
For By=#MaxTableHeight To 0 Step -1
If Game\GameTable(Bx,By)\Sprite=0
If EmptyCase=#MaxTableHeight+1:EmptyCase=By:EndIf
Else
If EmptyCase<#MaxTableHeight+1
Game\GameTable(Bx,EmptyCase)\Sprite=Game\GameTable(Bx,By)\Sprite
Game\GameTable(By,EmptyCase)\Selected=Game\GameTable(Bx,By)\Selected
Game\GameTable(Bx,By)\Sprite=0
Game\GameTable(Bx,By)\Selected=0
EmptyCase=EmptyCase-1
EndIf
EndIf
Next
Next
EndProcedure
Procedure TakeBonus(Bx.l,By.l)
;-Mouse Take Bonus
If ListSize(Bonus\DisplayedBonus())>0
ForEach Bonus\DisplayedBonus()
If Bx=Bonus\DisplayedBonus()\X And By=Bonus\DisplayedBonus()\Y And Bonus\DisplayedBonus()\Alpha>90
Debug "Bonus "+Str(Bx)+","+Str(By)+" Type="+Str(Bonus\DisplayedBonus()\Type)
Game\GameTable(BX,BY)\BonusOnThisCase=#False
Protected *Obj_Sprite.SpriteData
;Param\game\Stats\NbBonus(Bonus\DisplayedBonus()\Type)=Param\game\Stats\NbBonus(Bonus\DisplayedBonus()\Type)+1
Select Bonus\DisplayedBonus()\Type
Case #Bonus_Health ; Add Health
;Game\Life=Game\Life+1 ;Moved to Event in Game.pbi Gamemode()
PlaySound(#Snd_GetBonus)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,19,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,0,#Easing_BackEaseIn,#EventGui_AddHealth,@*Obj_Sprite\AutoDestroy)
Case #Bonus_Time ; Slowest Time
PlaySound(#Snd_GetBonus)
Game\Timer=Game\Timer+400
Game\NextTime=ElapsedMilliseconds()+Game\Timer
Case #Bonus_EarthQuake ; Check Bench and pieces Fall
StartEarthQuake() ; Do Earth Quake
Case #Bonus_Dead ; All points X2
PlaySound(#Snd_DeadBonus)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx+0.5,By+0.5,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,100,#Easing_Linear,#EventGui_Dead,@*Obj_Sprite\AutoDestroy)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,Bx+1.5,GUI\ScreenWidth/2,#Easing_Linear)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,By+1.5,GUI\ScreenHeight/2,#Easing_Linear)
NewMessage("DEAD",0)
Debug "DEAD"+Str(ListSize(Bonus\DisplayedBonus()))
Game\WaitTimer=ElapsedMilliseconds()+1000
Case #Bonus_X2 ; All points X4
If Bonus\X2Enable<3 ;No Over x8
PlaySound(#Snd_GetBonus2)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
Debug "X2"
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,5,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,0,#Easing_BackEaseIn,#EventGui_AddX2,@*Obj_Sprite\AutoDestroy)
Debug "___"
EndIf
Case #Bonus_JewelBlue
;Game\Bonus_JewelBlue=Game\Bonus_JewelBlue+1 ;Moved to Event in Game.pbi Gamemode()
PlaySound(#Snd_GetJewel)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,8,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,0,#Easing_BackEaseIn,#EventGui_AddJewelBlue,@*Obj_Sprite\AutoDestroy)
Case #Bonus_JewelRed ; Jewel
;Game\Bonus_JewelRed=Game\Bonus_JewelRed+1 ;Moved to Event in Game.pbi Gamemode()
PlaySound(#Snd_GetJewel)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,11,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,0,#Easing_BackEaseIn,#EventGui_AddJewelRed,@*Obj_Sprite\AutoDestroy)
Case #Bonus_JewelGreen
;Game\Bonus_JewelBlue=Game\Bonus_JewelBlue+1 ;Moved to Event in Game.pbi Gamemode()
PlaySound(#Snd_GetJewel)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,14,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,0,#Easing_BackEaseIn,#EventGui_AddJewelGreen,@*Obj_Sprite\AutoDestroy)
Case #Bonus_Eye
PlaySound(#Snd_GetBonus2)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,14.5,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,8,#Easing_BackEaseIn,#EventGui_EnableEye,@*Obj_Sprite\AutoDestroy)
Case #Bonus_Gravity
ScrollDown()
;ScrollLeft()
PlaySound(#Snd_Collapse)
Case #Bonus_Hammer
PlaySound(#Snd_GetBonus2)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,3,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,0,#Easing_BackEaseIn,#EventGui_EnableHammer,@*Obj_Sprite\AutoDestroy)
Game\WaitTimer=ElapsedMilliseconds()+1000
Case #Bonus_Remove
PlaySound(#Snd_GetBonus2)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,3,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,0,#Easing_BackEaseIn,#EventGui_EnableRemover,@*Obj_Sprite\AutoDestroy)
Game\WaitTimer=ElapsedMilliseconds()+1000
Case #Bonus_Freeze
PlaySound(#Snd_GetBonus2)
*Obj_Sprite=NewSprite(#Spr_Health+Bonus\DisplayedBonus()\Type,Bx,By,1,1,255,1,#Spr_Depth_Front,9)
AddItemToDisplayEngine(*Obj_Sprite,#Type_Sprite)
AddmoveToEngine(@*Obj_Sprite\X,#PB_Float,0,1000,BX+1,10,#Easing_BackEaseIn)
AddmoveToEngine(@*Obj_Sprite\Y,#PB_Float,0,1000,BY+1,9,#Easing_BackEaseIn,#EventGui_EnableFreeze,@*Obj_Sprite\AutoDestroy)
Game\WaitTimer=ElapsedMilliseconds()+1000
EndSelect
DeleteElement(Bonus\DisplayedBonus())
EndIf
Next
EndIf
EndProcedure
; IDE Options = PureBasic 6.11 LTS (Windows - x64)
; CursorPosition = 129
; FirstLine = 57
; Folding = -
; EnableXP
; DPIAware