3314 |
3314 |
3315 const cAngleSpeed = 3; |
3315 const cAngleSpeed = 3; |
3316 var |
3316 var |
3317 HHGear: PGear; |
3317 HHGear: PGear; |
3318 i: LongInt; |
3318 i: LongInt; |
3319 dX, dY, X, Y : hwFloat; |
3319 dX, dY : hwFloat; |
3320 fChanged: boolean; |
3320 fChanged: boolean; |
3321 trueAngle: Longword; |
3321 trueAngle: Longword; |
3322 t: PGear; |
3322 t: PGear; |
3323 begin |
3323 begin |
3324 if WorldWrap(Gear) and (WorldEdge <> weWrap) then |
3324 if WorldWrap(Gear) then |
3325 begin |
3325 begin |
3326 Y.isNegative:= false; |
3326 if (WorldEdge = weBounce) then // mirror |
3327 Y.QWordValue:= 4294967296 * 112; |
3327 Gear^.Angle:= 4096 - Gear^.Angle |
3328 X.isNegative:= false; |
3328 else if (WorldEdge = weSea) then // rotate 90 degree |
3329 X.QWordValue:= 4294967296 * 35; |
3329 begin |
3330 dX.isNegative:= false; |
3330 // sea-wrapped gears move upwards, so let's mirror angle if needed |
3331 dX.QWordValue:= 4294967296 * 1152; |
3331 if Gear^.Angle < 2048 then |
3332 |
3332 Gear^.Angle:= 4096 - Gear^.Angle; |
3333 dY:=hwAbs(Gear^.dX*4); |
3333 Gear^.Angle:= (Gear^.Angle + 1024) mod 4096; |
3334 dY:= dY + hwPow(dY,3)/_6 + _3 * hwPow(dY,5) / _40 + _5 * hwPow(dY,7) / Y + X * hwPow(dY,9) / dX; |
3334 end; |
3335 Gear^.Angle:= hwRound(dY*_2048 / _PI); |
|
3336 if not Gear^.dY.isNegative then Gear^.Angle:= 2048-Gear^.Angle; |
|
3337 if Gear^.dX.isNegative then Gear^.Angle:= 4096-Gear^.Angle; |
|
3338 end; |
3335 end; |
3339 AllInactive := false; |
3336 AllInactive := false; |
3340 |
3337 |
3341 HHGear := Gear^.Hedgehog^.Gear; |
3338 HHGear := Gear^.Hedgehog^.Gear; |
3342 FollowGear := Gear; |
3339 FollowGear := Gear; |