371 lines
15 KiB
Plaintext
371 lines
15 KiB
Plaintext
; 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 |