51 procedure init_uVisualGears; |
53 procedure init_uVisualGears; |
52 procedure free_uVisualGears; |
54 procedure free_uVisualGears; |
53 |
55 |
54 function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; |
56 function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; |
55 procedure ProcessVisualGears(Steps: Longword); |
57 procedure ProcessVisualGears(Steps: Longword); |
|
58 procedure KickFlakes(dmgRadius, X, Y: LongInt); |
56 procedure DrawVisualGears(Layer: LongWord); |
59 procedure DrawVisualGears(Layer: LongWord); |
57 procedure DeleteVisualGear(Gear: PVisualGear); |
60 procedure DeleteVisualGear(Gear: PVisualGear); |
58 procedure AddClouds; |
61 procedure AddClouds; |
59 procedure AddDamageTag(X, Y, Damage, Color: LongWord); |
62 procedure AddDamageTag(X, Y, Damage, Color: LongWord); |
60 |
63 |
92 if FrameTicks > vobFrameTicks then |
95 if FrameTicks > vobFrameTicks then |
93 begin |
96 begin |
94 dec(FrameTicks, vobFrameTicks); |
97 dec(FrameTicks, vobFrameTicks); |
95 inc(Frame); |
98 inc(Frame); |
96 if Frame = vobFramesCount then Frame:= 0 |
99 if Frame = vobFramesCount then Frame:= 0 |
97 end |
100 end; |
|
101 X:= X + (cWindSpeed * 200 + dX + tdX) * Steps; |
|
102 Y:= Y + (dY + tdY + cGravity * vobFallSpeed) * Steps; |
|
103 Angle:= Angle + dAngle * Steps; |
|
104 |
|
105 if hwRound(X) < -cScreenWidth - 64 then X:= int2hwFloat(cScreenWidth + LAND_WIDTH) else |
|
106 if hwRound(X) > cScreenWidth + LAND_WIDTH then X:= int2hwFloat(-cScreenWidth - 64); |
|
107 // if hwRound(Y) < (LAND_HEIGHT - 1024 - 75) then Y:= Y + int2hwFloat(25); // For if flag is set for flakes rising upwards? |
|
108 if hwRound(Y) > (LAND_HEIGHT + 75) then Y:= Y - int2hwFloat(1024 + 150); // TODO - configure in theme (jellies for example could use limited range) |
|
109 if (Timer > 0) and (Timer-Steps > 0) then dec(Timer, Steps) |
|
110 else |
|
111 begin |
|
112 Timer:= 0; |
|
113 tdX:= _0; |
|
114 tdY:= _0 |
|
115 end; |
98 end; |
116 end; |
99 |
117 |
100 Gear^.X:= Gear^.X + (cWindSpeed * 200 + Gear^.dX) * Steps; |
|
101 Gear^.Y:= Gear^.Y + (Gear^.dY + cGravity * vobFallSpeed) * Steps; |
|
102 Gear^.Angle:= Gear^.Angle + Gear^.dAngle * Steps; |
|
103 |
|
104 if hwRound(Gear^.X) < -cScreenWidth - 64 then Gear^.X:= int2hwFloat(cScreenWidth + LAND_WIDTH) else |
|
105 if hwRound(Gear^.X) > cScreenWidth + LAND_WIDTH then Gear^.X:= int2hwFloat(-cScreenWidth - 64); |
|
106 // if hwRound(Gear^.Y) < (LAND_HEIGHT - 1024 - 75) then Gear^.Y:= Gear^.Y + int2hwFloat(25); // For if flag is set for flakes rising upwards? |
|
107 if hwRound(Gear^.Y) > (LAND_HEIGHT + 75) then Gear^.Y:= Gear^.Y - int2hwFloat(1024 + 150) // TODO - configure in theme (jellies for example could use limited range) |
|
108 end; |
118 end; |
109 |
119 |
110 procedure doStepCloud(Gear: PVisualGear; Steps: Longword); |
120 procedure doStepCloud(Gear: PVisualGear; Steps: Longword); |
111 var i: Longword; |
121 var i: Longword; |
112 begin |
122 begin |
456 gear^.doStep:= doStepHandlers[Kind]; |
466 gear^.doStep:= doStepHandlers[Kind]; |
457 |
467 |
458 with gear^ do |
468 with gear^ do |
459 case Kind of |
469 case Kind of |
460 vgtFlake: begin |
470 vgtFlake: begin |
|
471 Timer:= 0; |
|
472 tdX:= _0; |
|
473 tdY:= _0; |
461 FrameTicks:= random(vobFrameTicks); |
474 FrameTicks:= random(vobFrameTicks); |
462 Frame:= random(vobFramesCount); |
475 Frame:= random(vobFramesCount); |
463 Angle:= random * 360; |
476 Angle:= random * 360; |
464 dx.isNegative:= random(2) = 0; |
477 dx.isNegative:= random(2) = 0; |
465 dx.QWordValue:= random(100000000); |
478 dx.QWordValue:= random(100000000); |
591 while t <> nil do |
604 while t <> nil do |
592 begin |
605 begin |
593 Gear:= t; |
606 Gear:= t; |
594 t:= Gear^.NextGear; |
607 t:= Gear^.NextGear; |
595 Gear^.doStep(Gear, Steps) |
608 Gear^.doStep(Gear, Steps) |
|
609 end |
|
610 end; |
|
611 |
|
612 procedure KickFlakes(dmgRadius, X, Y: LongInt); |
|
613 var Gear, t: PVisualGear; |
|
614 dmg: LongInt; |
|
615 begin |
|
616 if dmgRadius = 0 then exit; |
|
617 |
|
618 t:= VisualGearsList; |
|
619 while t <> nil do |
|
620 begin |
|
621 Gear:= t; |
|
622 if Gear^.Kind = vgtFlake then |
|
623 begin |
|
624 // Damage calc from doMakeExplosion |
|
625 dmg:= dmgRadius + cHHRadius div 2 - hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y))); |
|
626 if dmg > 1 then |
|
627 begin |
|
628 Gear^.tdX:= Gear^.dX + SignAs(_0_01 * dmg + cHHKick, Gear^.X - int2hwFloat(X)); |
|
629 Gear^.tdY:= Gear^.dY + SignAs(_0_01 * dmg + cHHKick, Gear^.Y - int2hwFloat(Y)); |
|
630 Gear^.Timer:= 100 |
|
631 end |
|
632 end; |
|
633 t:= Gear^.NextGear |
596 end |
634 end |
597 end; |
635 end; |
598 |
636 |
599 procedure DrawVisualGears(Layer: LongWord); |
637 procedure DrawVisualGears(Layer: LongWord); |
600 var Gear: PVisualGear; |
638 var Gear: PVisualGear; |