; 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()\XGame\BlockMouseY+1 Or Bonus\DisplayedBonus()\YBonus\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