38 doStep: TVGearStepProcedure; |
38 doStep: TVGearStepProcedure; |
39 end; |
39 end; |
40 |
40 |
41 function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; |
41 function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; |
42 procedure ProcessVisualGears(Steps: Longword); |
42 procedure ProcessVisualGears(Steps: Longword); |
43 procedure DrawVisualGears(); |
43 procedure DrawVisualGears(Layer: LongWord); |
44 procedure DeleteVisualGear(Gear: PVisualGear); |
44 procedure DeleteVisualGear(Gear: PVisualGear); |
45 procedure AddClouds; |
45 procedure AddClouds; |
46 |
46 |
47 var VisualGearsList: PVisualGear = nil; |
47 var VisualGearsList: PVisualGear = nil; |
48 vobFrameTicks, vobFramesCount: Longword; |
48 vobFrameTicks, vobFramesCount: Longword; |
49 vobVelocity, vobFallSpeed: LongInt; |
49 vobVelocity, vobFallSpeed: LongInt; |
50 |
50 |
51 implementation |
51 implementation |
52 uses uWorld, uMisc, uStore; |
52 uses uWorld, uMisc, uStore; |
|
53 const cExplFrameTicks = 80; |
53 |
54 |
54 // ================================================================== |
55 // ================================================================== |
55 procedure doStepFlake(Gear: PVisualGear; Steps: Longword); |
56 procedure doStepFlake(Gear: PVisualGear; Steps: Longword); |
56 begin |
57 begin |
57 with Gear^ do |
58 with Gear^ do |
91 Gear^.X:= Gear^.X + Gear^.dX; |
92 Gear^.X:= Gear^.X + Gear^.dX; |
92 |
93 |
93 Gear^.Y:= Gear^.Y + Gear^.dY; |
94 Gear^.Y:= Gear^.Y + Gear^.dY; |
94 Gear^.dY:= Gear^.dY + cGravity; |
95 Gear^.dY:= Gear^.dY + cGravity; |
95 |
96 |
96 dec(Gear^.FrameTicks); |
97 if Gear^.FrameTicks <= Steps then |
97 if Gear^.FrameTicks = 0 then DeleteVisualGear(Gear) |
98 if Gear^.Frame = 0 then DeleteVisualGear(Gear) |
|
99 else |
|
100 begin |
|
101 dec(Gear^.Frame); |
|
102 Gear^.FrameTicks:= cExplFrameTicks |
|
103 end |
|
104 else dec(Gear^.FrameTicks, Steps) |
98 end; |
105 end; |
99 |
106 |
100 // ================================================================== |
107 // ================================================================== |
101 const doStepHandlers: array[TVisualGearType] of TVGearStepProcedure = |
108 const doStepHandlers: array[TVisualGearType] of TVGearStepProcedure = |
102 ( |
109 ( |
105 @doStepExpl |
112 @doStepExpl |
106 ); |
113 ); |
107 |
114 |
108 function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; |
115 function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; |
109 var Result: PVisualGear; |
116 var Result: PVisualGear; |
|
117 t: Longword; |
|
118 sp: hwFloat; |
110 begin |
119 begin |
111 New(Result); |
120 New(Result); |
112 FillChar(Result^, sizeof(TVisualGear), 0); |
121 FillChar(Result^, sizeof(TVisualGear), 0); |
113 Result^.X:= int2hwFloat(X); |
122 Result^.X:= int2hwFloat(X); |
114 Result^.Y:= int2hwFloat(Y); |
123 Result^.Y:= int2hwFloat(Y); |
136 dy.QWordValue:= 21474836 + random(64424509); |
145 dy.QWordValue:= 21474836 + random(64424509); |
137 mdY:= dy.QWordValue |
146 mdY:= dy.QWordValue |
138 end; |
147 end; |
139 vgtExplPart: with Result^ do |
148 vgtExplPart: with Result^ do |
140 begin |
149 begin |
|
150 t:= random(1024); |
|
151 sp:= _0_001 * (random(700) + 150); |
|
152 dx:= AngleSin(t) * sp; |
141 dx.isNegative:= random(2) = 0; |
153 dx.isNegative:= random(2) = 0; |
142 dx.QWordValue:= random(300000) + 1000000; |
154 dy:= AngleCos(t) * sp; |
143 dy.isNegative:= random(2) = 0; |
155 dy.isNegative:= random(2) = 0; |
144 dy.QWordValue:= random(300000) + 1000000; |
156 Frame:= 7 - random(3); |
145 FrameTicks:= 700 |
157 FrameTicks:= cExplFrameTicks |
146 end; |
158 end; |
147 end; |
159 end; |
148 |
160 |
149 if VisualGearsList <> nil then |
161 if VisualGearsList <> nil then |
150 begin |
162 begin |
177 t:= Gear^.NextGear; |
189 t:= Gear^.NextGear; |
178 Gear^.doStep(Gear, Steps) |
190 Gear^.doStep(Gear, Steps) |
179 end |
191 end |
180 end; |
192 end; |
181 |
193 |
182 procedure DrawVisualGears(); |
194 procedure DrawVisualGears(Layer: LongWord); |
183 var Gear: PVisualGear; |
195 var Gear: PVisualGear; |
184 begin |
196 begin |
185 Gear:= VisualGearsList; |
197 Gear:= VisualGearsList; |
186 while Gear <> nil do |
198 case Layer of |
187 begin |
199 0: while Gear <> nil do |
188 case Gear^.Kind of |
200 begin |
189 vgtFlake: if vobVelocity = 0 then |
201 case Gear^.Kind of |
190 DrawSprite(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame) |
202 vgtFlake: if vobVelocity = 0 then |
191 else |
203 DrawSprite(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame) |
192 DrawRotatedF(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle); |
204 else |
193 |
205 DrawRotatedF(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle); |
194 vgtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame); |
206 vgtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame); |
195 end; |
207 end; |
196 Gear:= Gear^.NextGear |
208 Gear:= Gear^.NextGear |
197 end; |
209 end; |
|
210 1: while Gear <> nil do |
|
211 begin |
|
212 case Gear^.Kind of |
|
213 vgtExplPart: DrawSprite(sprExplPart, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 7 - Gear^.Frame); |
|
214 end; |
|
215 Gear:= Gear^.NextGear |
|
216 end |
|
217 end |
198 end; |
218 end; |
199 |
219 |
200 procedure AddClouds; |
220 procedure AddClouds; |
201 var i: LongInt; |
221 var i: LongInt; |
202 begin |
222 begin |