60 exit |
60 exit |
61 end; |
61 end; |
62 |
62 |
63 HedgehogChAngle(HHGear); |
63 HedgehogChAngle(HHGear); |
64 |
64 |
65 if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then |
65 if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) <> 0 then |
66 SetLittle(HHGear^.dX); |
66 SetLittle(HHGear^.dX); |
67 |
67 |
68 if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then |
68 if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then |
69 HHGear^.dY := _0; |
69 HHGear^.dY := _0; |
70 HHGear^.X := HHGear^.X + HHGear^.dX; |
70 HHGear^.X := HHGear^.X + HHGear^.dX; |
125 |
125 |
126 HHGear := Gear^.Hedgehog^.Gear; |
126 HHGear := Gear^.Hedgehog^.Gear; |
127 |
127 |
128 tX:= HHGear^.X; |
128 tX:= HHGear^.X; |
129 if WorldWrap(HHGear) and (WorldEdge = weWrap) and |
129 if WorldWrap(HHGear) and (WorldEdge = weWrap) and |
130 (TestCollisionXwithGear(HHGear, 1) or TestCollisionXwithGear(HHGear, -1)) then |
130 ((TestCollisionXwithGear(HHGear, 1) <> 0) or (TestCollisionXwithGear(HHGear, -1) <> 0)) then |
131 begin |
131 begin |
132 PlaySound(sndRopeRelease); |
132 PlaySound(sndRopeRelease); |
133 RopeDeleteMe(Gear, HHGear); |
133 RopeDeleteMe(Gear, HHGear); |
134 HHGear^.X:= tX; |
134 HHGear^.X:= tX; |
135 HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2); |
135 HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2); |
145 exit |
145 exit |
146 end; |
146 end; |
147 |
147 |
148 HHGear^.dX.QWordValue:= HHGear^.dX.QWordValue shl 2; |
148 HHGear^.dX.QWordValue:= HHGear^.dX.QWordValue shl 2; |
149 HHGear^.dY.QWordValue:= HHGear^.dY.QWordValue shl 2; |
149 HHGear^.dY.QWordValue:= HHGear^.dY.QWordValue shl 2; |
150 if (Gear^.Message and gmLeft <> 0) and (not TestCollisionXwithGear(HHGear, -1)) then |
150 if (Gear^.Message and gmLeft <> 0) and (TestCollisionXwithGear(HHGear, -1) = 0) then |
151 HHGear^.dX := HHGear^.dX - _0_0032; |
151 HHGear^.dX := HHGear^.dX - _0_0032; |
152 |
152 |
153 if (Gear^.Message and gmRight <> 0) and (not TestCollisionXwithGear(HHGear, 1)) then |
153 if (Gear^.Message and gmRight <> 0) and (TestCollisionXwithGear(HHGear, 1) = 0) then |
154 HHGear^.dX := HHGear^.dX + _0_0032; |
154 HHGear^.dX := HHGear^.dX + _0_0032; |
155 |
155 |
156 // vector between hedgehog and rope attaching point |
156 // vector between hedgehog and rope attaching point |
157 ropeDx := HHGear^.X - Gear^.X; |
157 ropeDx := HHGear^.X - Gear^.X; |
158 ropeDy := HHGear^.Y - Gear^.Y; |
158 ropeDy := HHGear^.Y - Gear^.Y; |
159 |
159 |
160 if not TestCollisionYwithXYShift(HHGear, 0, 1, 1) then |
160 if TestCollisionYwithXYShift(HHGear, 0, 1, 1) = 0 then |
161 begin |
161 begin |
162 |
162 |
163 // depending on the rope vector we know which X-side to check for collision |
163 // depending on the rope vector we know which X-side to check for collision |
164 // in order to find out if the hog can still be moved by gravity |
164 // in order to find out if the hog can still be moved by gravity |
165 if ropeDx.isNegative = RopeDy.IsNegative then |
165 if ropeDx.isNegative = RopeDy.IsNegative then |
166 cd:= -1 |
166 cd:= -1 |
167 else |
167 else |
168 cd:= 1; |
168 cd:= 1; |
169 |
169 |
170 // apply gravity if there is no obstacle |
170 // apply gravity if there is no obstacle |
171 if not (TestCollisionXwithXYShift(HHGear, _2*cd, 0, cd, true)) then |
171 if TestCollisionXwithXYShift(HHGear, _2*cd, 0, cd, true) = 0 then |
172 HHGear^.dY := HHGear^.dY + cGravity * 16; |
172 HHGear^.dY := HHGear^.dY + cGravity * 16; |
173 |
173 |
174 if (GameFlags and gfMoreWind) <> 0 then |
174 if (GameFlags and gfMoreWind) <> 0 then |
175 // apply wind if there's no obstacle |
175 // apply wind if there's no obstacle |
176 if not TestCollisionXwithGear(HHGear, hwSign(cWindSpeed)) then |
176 if TestCollisionXwithGear(HHGear, hwSign(cWindSpeed)) = 0 then |
177 HHGear^.dX := HHGear^.dX + cWindSpeed * 16 / HHGear^.Density; |
177 HHGear^.dX := HHGear^.dX + cWindSpeed * 16 / HHGear^.Density; |
178 end; |
178 end; |
179 |
179 |
180 mdX := ropeDx + HHGear^.dX; |
180 mdX := ropeDx + HHGear^.dX; |
181 mdY := ropeDy + HHGear^.dY; |
181 mdY := ropeDy + HHGear^.dY; |
191 ///// |
191 ///// |
192 tx := HHGear^.X; |
192 tx := HHGear^.X; |
193 ty := HHGear^.Y; |
193 ty := HHGear^.Y; |
194 |
194 |
195 if ((Gear^.Message and gmDown) <> 0) and (Gear^.Elasticity < Gear^.Friction) then |
195 if ((Gear^.Message and gmDown) <> 0) and (Gear^.Elasticity < Gear^.Friction) then |
196 if not (TestCollisionXwithXYShift(HHGear, _2*hwSign(ropeDx), 0, hwSign(ropeDx), true) |
196 if not ((TestCollisionXwithXYShift(HHGear, _2*hwSign(ropeDx), 0, hwSign(ropeDx), true) <> 0) |
197 or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(ropeDy), hwSign(ropeDy)))) then |
197 or ((ropeDy.QWordValue <> 0) and (TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(ropeDy), hwSign(ropeDy)) <> 0))) then |
198 Gear^.Elasticity := Gear^.Elasticity + _1_2; |
198 Gear^.Elasticity := Gear^.Elasticity + _1_2; |
199 |
199 |
200 if ((Gear^.Message and gmUp) <> 0) and (Gear^.Elasticity > _30) then |
200 if ((Gear^.Message and gmUp) <> 0) and (Gear^.Elasticity > _30) then |
201 if not (TestCollisionXwithXYShift(HHGear, -_2*hwSign(ropeDx), 0, -hwSign(ropeDx), true) |
201 if not ((TestCollisionXwithXYShift(HHGear, -_2*hwSign(ropeDx), 0, -hwSign(ropeDx), true) <> 0) |
202 or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1*-hwSign(ropeDy), -hwSign(ropeDy)))) then |
202 or ((ropeDy.QWordValue <> 0) and (TestCollisionYwithXYShift(HHGear, 0, 1*-hwSign(ropeDy), -hwSign(ropeDy)) <> 0))) then |
203 Gear^.Elasticity := Gear^.Elasticity - _1_2; |
203 Gear^.Elasticity := Gear^.Elasticity - _1_2; |
204 |
204 |
205 HHGear^.X := Gear^.X + mdX * Gear^.Elasticity; |
205 HHGear^.X := Gear^.X + mdX * Gear^.Elasticity; |
206 HHGear^.Y := Gear^.Y + mdY * Gear^.Elasticity; |
206 HHGear^.Y := Gear^.Y + mdY * Gear^.Elasticity; |
207 |
207 |
313 end; |
313 end; |
314 end |
314 end |
315 end; |
315 end; |
316 |
316 |
317 haveCollision := false; |
317 haveCollision := false; |
318 if TestCollisionXwithXYShift(HHGear, _2*hwSign(HHGear^.dX), 0, hwSign(HHGear^.dX), true) then |
318 if TestCollisionXwithXYShift(HHGear, _2*hwSign(HHGear^.dX), 0, hwSign(HHGear^.dX), true) <> 0 then |
319 begin |
319 begin |
320 HHGear^.dX := -_0_6 * HHGear^.dX; |
320 HHGear^.dX := -_0_6 * HHGear^.dX; |
321 haveCollision := true |
321 haveCollision := true |
322 end; |
322 end; |
323 if TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(HHGear^.dY), hwSign(HHGear^.dY)) then |
323 if TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(HHGear^.dY), hwSign(HHGear^.dY)) <> 0 then |
324 begin |
324 begin |
325 HHGear^.dY := -_0_6 * HHGear^.dY; |
325 HHGear^.dY := -_0_6 * HHGear^.dY; |
326 haveCollision := true |
326 haveCollision := true |
327 end; |
327 end; |
328 |
328 |
416 HHGear := Gear^.Hedgehog^.Gear; |
416 HHGear := Gear^.Hedgehog^.Gear; |
417 DeleteCI(HHGear); |
417 DeleteCI(HHGear); |
418 |
418 |
419 if (HHGear^.State and gstMoving) <> 0 then |
419 if (HHGear^.State and gstMoving) <> 0 then |
420 begin |
420 begin |
421 if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then |
421 if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) <> 0 then |
422 SetLittle(HHGear^.dX); |
422 SetLittle(HHGear^.dX); |
423 if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then |
423 if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then |
424 HHGear^.dY := _0; |
424 HHGear^.dY := _0; |
425 |
425 |
426 HHGear^.X := HHGear^.X + HHGear^.dX; |
426 HHGear^.X := HHGear^.X + HHGear^.dX; |