--- a/hedgewars/GSHandlers.inc Thu Jan 18 20:29:28 2007 +0000
+++ b/hedgewars/GSHandlers.inc Sun Jan 21 19:51:02 2007 +0000
@@ -20,93 +20,94 @@
function CheckGearDrowning(Gear: PGear): boolean;
begin
-Result:= Gear.Y + Gear.Radius >= cWaterLine;
-if Result then
+if cWaterLine < Gear^.Y + Gear^.Radius then
begin
- Gear.State:= gstDrowning;
- Gear.doStep:= doStepDrowningGear;
- PlaySound(sndSplash)
- end
+ CheckGearDrowning:= true;
+ Gear^.State:= gstDrowning;
+ Gear^.doStep:= @doStepDrowningGear;
+ PlaySound(sndSplash, false)
+ end else
+ CheckGearDrowning:= false
end;
procedure CheckCollision(Gear: PGear);
begin
-if TestCollisionXwithGear(Gear, hwSign(Gear.X)) or TestCollisionYwithGear(Gear, hwSign(Gear.Y))
- then Gear.State:= Gear.State or gstCollision
- else Gear.State:= Gear.State and not gstCollision
+if TestCollisionXwithGear(Gear, hwSign(Gear^.X)) or TestCollisionYwithGear(Gear, hwSign(Gear^.Y))
+ then Gear^.State:= Gear^.State or gstCollision
+ else Gear^.State:= Gear^.State and not gstCollision
end;
procedure CheckHHDamage(Gear: PGear);
begin
-if Gear.dY > 0.40 then Gear.Damage:= Gear.Damage + 1 + round(70 * (abs(Gear.dY) - 0.40));
+if _0_4 < Gear^.dY then Gear^.Damage:= Gear^.Damage + 1 + hwRound(70 * (hwAbs(Gear^.dY) - _0_4));
end;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
procedure CalcRotationDirAngle(Gear: PGear);
-var dAngle: Double;
+var dAngle: hwFloat;
begin
-dAngle:= (abs(Gear.dX) + abs(Gear.dY))*0.1;
-if Gear.dX >= 0 then Gear.DirAngle:= Gear.DirAngle + dAngle
- else Gear.DirAngle:= Gear.DirAngle - dAngle;
-if Gear.DirAngle < 0 then Gear.DirAngle:= Gear.DirAngle + 16
-else if Gear.DirAngle >= 16 then Gear.DirAngle:= Gear.DirAngle - 16
+dAngle:= (hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) * _0_1;
+if not Gear^.dX.isNegative then Gear^.DirAngle:= Gear^.DirAngle + dAngle
+ else Gear^.DirAngle:= Gear^.DirAngle - dAngle;
+if Gear^.DirAngle < 0 then Gear^.DirAngle:= Gear^.DirAngle + 16
+else if 16 < Gear^.DirAngle then Gear^.DirAngle:= Gear^.DirAngle - 16
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepDrowningGear(Gear: PGear);
begin
AllInactive:= false;
-Gear.Y:= Gear.Y + cDrownSpeed;
-if round(Gear.Y) > Gear.Radius + cWaterLine + cVisibleWater then DeleteGear(Gear)
+Gear^.Y:= Gear^.Y + cDrownSpeed;
+if hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater then DeleteGear(Gear)
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepFallingGear(Gear: PGear);
var b: boolean;
begin
-if TestCollisionYwithGear(Gear, hwSign(Gear.dY)) then
+if TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) then
begin
- Gear.dX:= Gear.dX * Gear.Friction;
- Gear.dY:= - Gear.dY * Gear.Elasticity;
+ Gear^.dX:= Gear^.dX * Gear^.Friction;
+ Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
b:= false
end else b:= true;
-if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then
+if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
begin
- Gear.dX:= - Gear.dX * Gear.Elasticity;
-// Gear.dY:= Gear.dY;
+ Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
+// Gear^.dY:= Gear^.dY;
b:= false
end;
if b then
begin
- Gear.dY:= Gear.dY + cGravity;
- Gear.State:= Gear.State and not gstCollision
+ Gear^.dY:= Gear^.dY + cGravity;
+ Gear^.State:= Gear^.State and not gstCollision
end else
begin
- if sqr(Gear.dX) + sqr(Gear.dY) < 0.00001 then
- if (Gear.Timer = 0) then Gear.Active:= false
+ if hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _1div100000 then
+ if (Gear^.Timer = 0) then Gear^.Active:= false
else begin
- Gear.dX:= 0;
- Gear.dY:= 0
+ Gear^.dX:= 0;
+ Gear^.dY:= 0
end;
- Gear.State:= Gear.State or gstCollision
+ Gear^.State:= Gear^.State or gstCollision
end;
-Gear.X:= Gear.X + Gear.dX;
-Gear.Y:= Gear.Y + Gear.dY;
+Gear^.X:= Gear^.X + Gear^.dX;
+Gear^.Y:= Gear^.Y + Gear^.dY;
CheckGearDrowning(Gear);
-if (sqr(Gear.dX) + sqr(Gear.dY) < 0.003) then Gear.State:= Gear.State and not gstMoving
- else Gear.State:= Gear.State or gstMoving
+if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_003) then Gear^.State:= Gear^.State and not gstMoving
+ else Gear^.State:= Gear^.State or gstMoving
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepCloud(Gear: PGear);
begin
-Gear.X:= Gear.X + cWindSpeed * 200 + Gear.dX;
-if Gear.Y > -160 then Gear.dY:= Gear.dY - 0.00002
- else Gear.dY:= Gear.dY + 0.00002;
-Gear.Y:= Gear.Y + Gear.dY;
-if Gear.X < -cScreenWidth - 256 then Gear.X:= cScreenWidth + 2048 else
-if Gear.X > cScreenWidth + 2048 then Gear.X:= -cScreenWidth - 256
+Gear^.X:= Gear^.X + cWindSpeed * 200 + Gear^.dX;
+if Gear^.Y > -160 then Gear^.dY:= Gear^.dY - _1div50000
+ else Gear^.dY:= Gear^.dY + _1div50000;
+Gear^.Y:= Gear^.Y + Gear^.dY;
+if Gear^.X < -cScreenWidth - 256 then Gear^.X:= cScreenWidth + 2048 else
+if Gear^.X > cScreenWidth + 2048 then Gear^.X:= -cScreenWidth - 256
end;
////////////////////////////////////////////////////////////////////////////////
@@ -115,63 +116,63 @@
begin
AllInactive:= false;
doStepFallingGear(Gear);
-dec(Gear.Timer);
-if Gear.Timer = 0 then
+dec(Gear^.Timer);
+if Gear^.Timer = 0 then
begin
- case Gear.Kind of
- gtAmmo_Bomb: doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
+ case Gear^.Kind of
+ gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
gtClusterBomb: begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound);
for i:= 0 to 4 do
- AddGear(round(Gear.X), round(Gear.Y), gtCluster, 0, (getrandom - 0.5)*0.2, (getrandom - 3) * 0.08);
+ AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, (getrandom - _0_5) * _0_2, (getrandom - 3) * _0_08, 0);
end
end;
DeleteGear(Gear);
exit
end;
CalcRotationDirAngle(Gear);
-if (Gear.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact)
+if (Gear^.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact, false)
end;
procedure doStepCluster(Gear: PGear);
begin
AllInactive:= false;
doStepFallingGear(Gear);
-if (Gear.State and gstCollision) <> 0 then
+if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 20, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
if (GameTicks and $1F) = 0 then
- AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0)
+ AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, 0, 0, 0)
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepGrenade(Gear: PGear);
begin
AllInactive:= false;
-Gear.dX:= Gear.dX + cWindSpeed;
+Gear^.dX:= Gear^.dX + cWindSpeed;
doStepFallingGear(Gear);
-if (Gear.State and gstCollision) <> 0 then
+if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
if (GameTicks and $3F) = 0 then
- AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0)
+ AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, 0, 0, 0)
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepHealthTagWork(Gear: PGear);
begin
AllInactive:= false;
-dec(Gear.Timer);
-Gear.Y:= Gear.Y - 0.07;
-if Gear.Timer = 0 then
+dec(Gear^.Timer);
+Gear^.Y:= Gear^.Y - _0_08;
+if Gear^.Timer = 0 then
begin
- PHedgehog(Gear.Hedgehog).Gear.Active:= true; // to let current hh die
+ PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die
DeleteGear(Gear)
end
end;
@@ -179,8 +180,8 @@
procedure doStepHealthTagWorkUnderWater(Gear: PGear);
begin
AllInactive:= false;
-Gear.Y:= Gear.Y - 0.07;
-if Gear.Y <= cWaterLine + 10 then
+Gear^.Y:= Gear^.Y - _0_08;
+if Gear^.Y < cWaterLine + 10 then
DeleteGear(Gear)
end;
@@ -188,52 +189,52 @@
var s: shortstring;
begin
AllInactive:= false;
-str(Gear.State, s);
-Gear.Surf:= RenderString(s, PHedgehog(Gear.Hedgehog).Team.Color, fnt16);
-if Gear.Y < cWaterLine then Gear.doStep:= doStepHealthTagWork
- else Gear.doStep:= doStepHealthTagWorkUnderWater
+str(Gear^.State, s);
+Gear^.Surf:= RenderString(s, PHedgehog(Gear^.Hedgehog)^.Team^.Color, fnt16);
+if Gear^.Y < cWaterLine then Gear^.doStep:= @doStepHealthTagWork
+ else Gear^.doStep:= @doStepHealthTagWorkUnderWater
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepGrave(Gear: PGear);
begin
AllInactive:= false;
-if Gear.dY < 0 then
- if TestCollisionY(Gear, -1) then Gear.dY:= 0;
+if Gear^.dY < 0 then
+ if TestCollisionY(Gear, -1) then Gear^.dY:= 0;
-if Gear.dY >=0 then
+if not Gear^.dY.isNegative then
if TestCollisionY(Gear, 1) then
begin
- Gear.dY:= - Gear.dY * Gear.Elasticity;
- if Gear.dY > - 0.001 then
+ Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
+ if Gear^.dY > - _1div1024 then
begin
- Gear.Active:= false;
+ Gear^.Active:= false;
exit
- end else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact)
+ end else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false)
end;
-Gear.Y:= Gear.Y + Gear.dY;
+Gear^.Y:= Gear^.Y + Gear^.dY;
CheckGearDrowning(Gear);
-Gear.dY:= Gear.dY + cGravity
+Gear^.dY:= Gear^.dY + cGravity
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepUFOWork(Gear: PGear);
-var t: Double;
+var t: hwFloat;
begin
AllInactive:= false;
-t:= sqrt(sqr(Gear.dX) + sqr(Gear.dY));
-Gear.dX:= Gear.Elasticity * (Gear.dX + 0.000004 * (TargetPoint.X - trunc(Gear.X)));
-Gear.dY:= Gear.Elasticity * (Gear.dY + 0.000004 * (TargetPoint.Y - trunc(Gear.Y)));
-t:= t / (sqrt(sqr(Gear.dX) + sqr(Gear.dY)));
-Gear.dX:= Gear.dX * t;
-Gear.dY:= Gear.dY * t;
-Gear.X:= Gear.X + Gear.dX;
-Gear.Y:= Gear.Y + Gear.dY;
+t:= Distance(Gear^.dX, Gear^.dY);
+Gear^.dX:= Gear^.Elasticity * (Gear^.dX + _0_000004 * (TargetPoint.X - hwRound(Gear^.X)));
+Gear^.dY:= Gear^.Elasticity * (Gear^.dY + _0_000004 * (TargetPoint.Y - hwRound(Gear^.Y)));
+t:= t / Distance(Gear^.dX, Gear^.dY);
+Gear^.dX:= Gear^.dX * t;
+Gear^.dY:= Gear^.dY * t;
+Gear^.X:= Gear^.X + Gear^.dX;
+Gear^.Y:= Gear^.Y + Gear^.dY;
CheckCollision(Gear);
-dec(Gear.Timer);
-if ((Gear.State and gstCollision) <> 0) or (Gear.Timer = 0) then
+dec(Gear^.Timer);
+if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then
begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
DeleteGear(Gear);
end;
end;
@@ -241,21 +242,21 @@
procedure doStepUFO(Gear: PGear);
begin
AllInactive:= false;
-Gear.X:= Gear.X + Gear.dX;
-Gear.Y:= Gear.Y + Gear.dY;
-Gear.dY:= Gear.dY + cGravity;
+Gear^.X:= Gear^.X + Gear^.dX;
+Gear^.Y:= Gear^.Y + Gear^.dY;
+Gear^.dY:= Gear^.dY + cGravity;
CheckCollision(Gear);
-if (Gear.State and gstCollision) <> 0 then
+if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
-dec(Gear.Timer);
-if Gear.Timer = 0 then
+dec(Gear^.Timer);
+if Gear^.Timer = 0 then
begin
- Gear.Timer:= 5000;
- Gear.doStep:= doStepUFOWork
+ Gear^.Timer:= 5000;
+ Gear^.doStep:= @doStepUFOWork
end;
end;
@@ -264,28 +265,28 @@
var i: LongWord;
begin
AllInactive:= false;
-if Gear.Timer > 0 then
+if Gear^.Timer > 0 then
begin
- dec(Gear.Timer);
- if Gear.Timer = 0 then PlaySound(sndShotgunFire);
+ dec(Gear^.Timer);
+ if Gear^.Timer = 0 then PlaySound(sndShotgunFire, false);
exit
end;
i:= 200;
repeat
-Gear.X:= Gear.X + Gear.dX;
-Gear.Y:= Gear.Y + Gear.dY;
+Gear^.X:= Gear^.X + Gear^.dX;
+Gear^.Y:= Gear^.Y + Gear^.dY;
CheckCollision(Gear);
-if (Gear.State and gstCollision) <> 0 then
+if (Gear^.State and gstCollision) <> 0 then
begin
AmmoShove(Gear, 25, 25);
- doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH);
DeleteGear(Gear);
AfterAttack;
exit
end;
dec(i)
until i = 0;
-if (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then
+if (Gear^.X < 0) or (Gear^.Y < 0) or (Gear^.X > 2048) or (Gear^.Y > 1024) then
begin
DeleteGear(Gear);
AfterAttack
@@ -295,53 +296,53 @@
////////////////////////////////////////////////////////////////////////////////
procedure doStepDEagleShot(Gear: PGear);
var i, x, y: LongWord;
- oX, oY: Double;
+ oX, oY: hwFloat;
begin
AllInactive:= false;
i:= 80;
-oX:= Gear.X;
-oY:= Gear.Y;
+oX:= Gear^.X;
+oY:= Gear^.Y;
repeat
- Gear.X:= Gear.X + Gear.dX;
- Gear.Y:= Gear.Y + Gear.dY;
- x:= round(Gear.X);
- y:= round(Gear.Y);
+ Gear^.X:= Gear^.X + Gear^.dX;
+ Gear^.Y:= Gear^.Y + Gear^.dY;
+ x:= hwRound(Gear^.X);
+ y:= hwRound(Gear^.Y);
if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0)
- and (Land[y, x] <> 0) then inc(Gear.Damage);
+ and (Land[y, x] <> 0) then inc(Gear^.Damage);
AmmoShove(Gear, 7, 20);
dec(i)
-until (i = 0) or (Gear.Damage > Gear.Health);
-if Gear.Damage > 0 then
+until (i = 0) or (Gear^.Damage > Gear^.Health);
+if Gear^.Damage > 0 then
begin
- DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1);
- dec(Gear.Health, Gear.Damage);
- Gear.Damage:= 0
+ DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 82 - i, 1);
+ dec(Gear^.Health, Gear^.Damage);
+ Gear^.Damage:= 0
end;
-if (Gear.Health <= 0) or (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then
+if (Gear^.Health <= 0) or (Gear^.X < 0) or (Gear^.Y < 0) or (Gear^.X > 2048) or (Gear^.Y > 1024) then
DeleteGear(Gear)
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepActionTimer(Gear: PGear);
begin
-dec(Gear.Timer);
-case Gear.Kind of
+dec(Gear^.Timer);
+case Gear^.Kind of
gtATStartGame: begin
AllInactive:= false;
- if Gear.Timer = 0 then
+ if Gear^.Timer = 0 then
AddCaption(trmsg[sidStartFight], $FFFFFF, capgrpGameState);
end;
gtATSmoothWindCh: begin
- if Gear.Timer = 0 then
+ if Gear^.Timer = 0 then
begin
- if WindBarWidth < Gear.Tag then inc(WindBarWidth)
- else if WindBarWidth > Gear.Tag then dec(WindBarWidth);
- if WindBarWidth <> Gear.Tag then Gear.Timer:= 10;
+ if WindBarWidth < Gear^.Tag then inc(WindBarWidth)
+ else if WindBarWidth > Gear^.Tag then dec(WindBarWidth);
+ if WindBarWidth <> Gear^.Tag then Gear^.Timer:= 10;
end
end;
gtATFinishGame: begin
AllInactive:= false;
- if Gear.Timer = 0 then
+ if Gear^.Timer = 0 then
begin
SendIPC('N');
SendIPC('q');
@@ -349,7 +350,7 @@
end
end;
end;
-if Gear.Timer = 0 then DeleteGear(Gear)
+if Gear^.Timer = 0 then DeleteGear(Gear)
end;
////////////////////////////////////////////////////////////////////////////////
@@ -358,50 +359,50 @@
HHGear: PGear;
begin
AllInactive:= false;
-HHGear:= PHedgehog(Gear.Hedgehog).Gear;
-dec(Gear.Timer);
-if (Gear.Timer = 0)or((Gear.Message and gm_Destroy) <> 0)or((HHGear.State and gstHHDriven) = 0) then
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
+dec(Gear^.Timer);
+if (Gear^.Timer = 0)or((Gear^.Message and gm_Destroy) <> 0)or((HHGear^.State and gstHHDriven) = 0) then
begin
StopSound(sndPickhammer);
DeleteGear(Gear);
AfterAttack;
exit
end;
-if (Gear.Timer and $3F) = 0 then
+if (Gear^.Timer and $3F) = 0 then
begin
- i:= round(Gear.X) - Gear.Radius - GetRandom(2);
- ei:= round(Gear.X) + Gear.Radius + GetRandom(2);
+ i:= hwRound(Gear^.X) - Gear^.Radius - GetRandom(2);
+ ei:= hwRound(Gear^.X) + Gear^.Radius + GetRandom(2);
while i <= ei do
begin
- doMakeExplosion(i, round(Gear.Y) + 3, 3, 0);
+ doMakeExplosion(i, hwRound(Gear^.Y) + 3, 3, 0);
inc(i, 1)
end;
- Gear.X:= Gear.X + Gear.dX;
- Gear.Y:= Gear.Y + 1.9;
+ Gear^.X:= Gear^.X + Gear^.dX;
+ Gear^.Y:= Gear^.Y + _1_9;
SetAllHHToActive;
end;
if TestCollisionYwithGear(Gear, 1) then
begin
- Gear.dY:= 0;
- SetLittle(HHGear.dX);
- HHGear.dY:= 0;
+ Gear^.dY:= 0;
+ SetLittle(HHGear^.dX);
+ HHGear^.dY:= 0;
end else
begin
- Gear.dY:= Gear.dY + cGravity;
- Gear.Y:= Gear.Y + Gear.dY;
- if Gear.Y > 1024 then Gear.Timer:= 1
+ Gear^.dY:= Gear^.dY + cGravity;
+ Gear^.Y:= Gear^.Y + Gear^.dY;
+ if Gear^.Y > 1024 then Gear^.Timer:= 1
end;
-Gear.X:= Gear.X + HHGear.dX;
-HHGear.X:= Gear.X;
-HHGear.Y:= Gear.Y - cHHRadius;
+Gear^.X:= Gear^.X + HHGear^.dX;
+HHGear^.X:= Gear^.X;
+HHGear^.Y:= Gear^.Y - cHHRadius;
-if (Gear.Message and gm_Attack) <> 0 then
- if (Gear.State and gsttmpFlag) <> 0 then Gear.Timer:= 1 else else
- if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag;
-if ((Gear.Message and gm_Left) <> 0) then Gear.dX:= -0.3 else
- if ((Gear.Message and gm_Right) <> 0) then Gear.dX:= 0.3
- else Gear.dX:= 0;
+if (Gear^.Message and gm_Attack) <> 0 then
+ if (Gear^.State and gsttmpFlag) <> 0 then Gear^.Timer:= 1 else else
+ if (Gear^.State and gsttmpFlag) = 0 then Gear^.State:= Gear^.State or gsttmpFlag;
+if ((Gear^.Message and gm_Left) <> 0) then Gear^.dX:= - _0_3 else
+ if ((Gear^.Message and gm_Right) <> 0) then Gear^.dX:= _0_3
+ else Gear^.dX:= 0;
end;
procedure doStepPickHammer(Gear: PGear);
@@ -409,19 +410,19 @@
ar: TRangeArray;
begin
i:= 0;
-y:= round(Gear.Y) - cHHRadius*2;
-while y < round(Gear.Y) do
+y:= hwRound(Gear^.Y) - cHHRadius*2;
+while y < hwRound(Gear^.Y) do
begin
- ar[i].Left := round(Gear.X) - Gear.Radius - GetRandom(2);
- ar[i].Right:= round(Gear.X) + Gear.Radius + GetRandom(2);
+ ar[i].Left := hwRound(Gear^.X) - Gear^.Radius - GetRandom(2);
+ ar[i].Right:= hwRound(Gear^.X) + Gear^.Radius + GetRandom(2);
inc(y, 2);
inc(i)
end;
-DrawHLinesExplosions(@ar, 3, round(Gear.Y) - cHHRadius*2, 2, Pred(i));
-Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY;
+DrawHLinesExplosions(@ar, 3, hwRound(Gear^.Y) - cHHRadius*2, 2, Pred(i));
+Gear^.dY:= PHedgehog(Gear^.Hedgehog)^.Gear^.dY;
PlaySound(sndPickhammer, true);
doStepPickHammerWork(Gear);
-Gear.doStep:= doStepPickHammerWork
+Gear^.doStep:= @doStepPickHammerWork
end;
////////////////////////////////////////////////////////////////////////////////
@@ -432,50 +433,50 @@
b: boolean;
begin
AllInactive:= false;
-dec(Gear.Timer);
-HHGear:= PHedgehog(Gear.Hedgehog).Gear;
+dec(Gear^.Timer);
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
HedgehogChAngle(HHGear);
b:= false;
-if (HHGear.Angle <> BTPrevAngle) then
+if (HHGear^.Angle <> BTPrevAngle) then
begin
- Gear.dX:= hwSign(HHGear.dX) * Sin(HHGear.Angle * pi / cMaxAngle) * 0.5;
- Gear.dY:= Cos(HHGear.Angle * pi / cMaxAngle) * (-0.5);
- BTPrevAngle:= HHGear.Angle;
+ Gear^.dX:= hwSign(HHGear^.dX) * _0_5;//hwSign(HHGear^.dX) * Sin(HHGear^.Angle * pi / cMaxAngle) * _0_5;
+ Gear^.dY:= 0;//Cos(HHGear^.Angle * pi / cMaxAngle) * (-0.5);
+ BTPrevAngle:= HHGear^.Angle;
b:= true
end;
-if Gear.Timer mod cHHStepTicks = 0 then
+if Gear^.Timer mod cHHStepTicks = 0 then
begin
b:= true;
- if Gear.dX < 0 then HHGear.Message:= (HHGear.Message or gm_Left) and not gm_Right
- else HHGear.Message:= (HHGear.Message or gm_Right) and not gm_Left;
+ if Gear^.dX < 0 then HHGear^.Message:= (HHGear^.Message or gm_Left) and not gm_Right
+ else HHGear^.Message:= (HHGear^.Message or gm_Right) and not gm_Left;
HedgehogStep(HHGear);
inc(BTSteps);
if BTSteps = 11 then
begin
BTSteps:= 0;
- Gear.X:= HHGear.X + Gear.dX * cHHRadius * 2;
- Gear.Y:= HHGear.Y + Gear.dY * cHHRadius * 2;
- HHGear.State:= HHGear.State or gstNoDamage;
+ Gear^.X:= HHGear^.X + Gear^.dX * cHHRadius * 2;
+ Gear^.Y:= HHGear^.Y + Gear^.dY * cHHRadius * 2;
+ HHGear^.State:= HHGear^.State or gstNoDamage;
AmmoShove(Gear, 3, 14);
- HHGear.State:= HHGear.State and not gstNoDamage
+ HHGear^.State:= HHGear^.State and not gstNoDamage
end;
- if (HHGear.State and gstFalling) <> 0 then Gear.Timer:= 0
+ if (HHGear^.State and gstFalling) <> 0 then Gear^.Timer:= 0
end;
if b then
- DrawTunnel(HHGear.X - Gear.dX * cHHRadius, HHGear.Y - 4 - Gear.dY * cHHRadius + abs(Gear.dY) * 7,
- Gear.dX, Gear.dY,
+ DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - 4 - Gear^.dY * cHHRadius + hwAbs(Gear^.dY) * 7,
+ Gear^.dX, Gear^.dY,
cHHRadius * 5, cHHRadius * 2 + 6);
-if (Gear.Timer = 0) or ((HHGear.Message and gm_Attack) <> 0) then
+if (Gear^.Timer = 0) or ((HHGear^.Message and gm_Attack) <> 0) then
begin
- HHGear.Message:= 0;
+ HHGear^.Message:= 0;
DeleteGear(Gear);
AfterAttack
end
@@ -486,10 +487,10 @@
begin
BTPrevAngle:= High(Longword);
BTSteps:= 0;
-HHGear:= PHedgehog(Gear.Hedgehog).Gear;
-HHGear.State:= HHGear.State and not gstAttacking;
-HHGear.Message:= 0;
-Gear.doStep:= doStepBlowTorchWork
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
+HHGear^.State:= HHGear^.State and not gstAttacking;
+HHGear^.Message:= 0;
+Gear^.doStep:= @doStepBlowTorchWork
end;
////////////////////////////////////////////////////////////////////////////////
@@ -497,7 +498,7 @@
procedure doStepRopeWork(Gear: PGear);
const flCheck: boolean = false;
var HHGear: PGear;
- len, cs, cc, tx, ty: Double;
+ len, cs, cc, tx, ty: hwFloat;
lx, ly: LongInt;
procedure DeleteMe;
@@ -508,58 +509,58 @@
State:= State or gstFalling;
end;
DeleteGear(Gear);
- OnUsedAmmo(PHedgehog(HHGear.Hedgehog)^.Ammo);
- ApplyAmmoChanges(PHedgehog(HHGear.Hedgehog)^)
+ OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^.Ammo);
+ ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^)
end;
begin
-HHGear:= PHedgehog(Gear.Hedgehog).Gear;
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
-if ((HHGear.State and gstHHDriven) = 0)
+if ((HHGear^.State and gstHHDriven) = 0)
or (CheckGearDrowning(HHGear)) then
begin
DeleteMe;
exit
end;
-Gear.dX:= HHGear.X - Gear.X;
-Gear.dY:= HHGear.Y - Gear.Y;
+Gear^.dX:= HHGear^.X - Gear^.X;
+Gear^.dY:= HHGear^.Y - Gear^.Y;
-if (Gear.Message and gm_Left <> 0) then HHGear.dX:= HHGear.dX - 0.0002 else
-if (Gear.Message and gm_Right <> 0) then HHGear.dX:= HHGear.dX + 0.0002;
+if (Gear^.Message and gm_Left <> 0) then HHGear^.dX:= HHGear^.dX - _0_0002 else
+if (Gear^.Message and gm_Right <> 0) then HHGear^.dX:= HHGear^.dX + _0_0002;
-if not TestCollisionYwithGear(HHGear, 1) then HHGear.dY:= HHGear.dY + cGravity;
+if not TestCollisionYwithGear(HHGear, 1) then HHGear^.dY:= HHGear^.dY + cGravity;
-cs:= Gear.dY + HHGear.dY;
-cc:= Gear.dX + HHGear.dX;
-len:= 1 / sqrt(sqr(cc)+sqr(cs));
+cs:= Gear^.dY + HHGear^.dY;
+cc:= Gear^.dX + HHGear^.dX;
+len:= 1 / Distance(cc, cs);
cc:= cc * len;
cs:= cs * len;
flCheck:= not flCheck;
if flCheck then // check whether rope needs dividing
begin
- len:= Gear.Elasticity - 20;
+ len:= Gear^.Elasticity - 20;
while len > 5 do
begin
tx:= cc*len;
ty:= cs*len;
- lx:= round(Gear.X + tx) + hwSign(HHGear.dX);
- ly:= round(Gear.Y + ty) + hwSign(HHGear.dY);
+ lx:= hwRound(Gear^.X + tx) + hwSign(HHGear^.dX);
+ ly:= hwRound(Gear^.Y + ty) + hwSign(HHGear^.dY);
if ((ly and $FFFFFC00) = 0) and ((lx and $FFFFF800) = 0)and (Land[ly, lx] <> 0) then
begin
with RopePoints.ar[RopePoints.Count] do
begin
- X:= Gear.X;
- Y:= Gear.Y;
- if RopePoints.Count = 0 then RopePoints.HookAngle:= DxDy2Angle32(Gear.dY, Gear.dX);
- b:= (cc * HHGear.dY) > (cs * HHGear.dX);
+ X:= Gear^.X;
+ Y:= Gear^.Y;
+ if RopePoints.Count = 0 then RopePoints.HookAngle:= 0;//DxDy2Angle32(Gear^.dY, Gear^.dX);
+ b:= (cc * HHGear^.dY) > (cs * HHGear^.dX);
dLen:= len
end;
- Gear.X:= Gear.X + tx;
- Gear.Y:= Gear.Y + ty;
+ Gear^.X:= Gear^.X + tx;
+ Gear^.Y:= Gear^.Y + ty;
inc(RopePoints.Count);
- Gear.Elasticity:= Gear.Elasticity - len;
- Gear.Friction:= Gear.Friction - len;
+ Gear^.Elasticity:= Gear^.Elasticity - len;
+ Gear^.Friction:= Gear^.Friction - len;
break
end;
len:= len - 3
@@ -569,113 +570,107 @@
begin
tx:= RopePoints.ar[Pred(RopePoints.Count)].X;
ty:= RopePoints.ar[Pred(RopePoints.Count)].Y;
- if GameTicks = 189245 then
- begin
- AddFileLog('tx = ' + floattostr(tx) + ' ty = ' + floattostr(ty));
- AddFileLog('Gear.X = ' + floattostr(Gear.X) + ' Gear.Y = ' + floattostr(Gear.Y));
- AddFileLog('HHGear.X = ' + floattostr(HHGear.X) + ' HHGear.Y = ' + floattostr(HHGear.Y));
- end;
- if RopePoints.ar[Pred(RopePoints.Count)].b xor ((tx - Gear.X) * (ty - HHGear.Y) > (tx - HHGear.X) * (ty - Gear.Y)) then
+ if RopePoints.ar[Pred(RopePoints.Count)].b xor ((tx - Gear^.X) * (ty - HHGear^.Y) > (tx - HHGear^.X) * (ty - Gear^.Y)) then
begin
dec(RopePoints.Count);
- Gear.X:=RopePoints.ar[RopePoints.Count].X;
- Gear.Y:=RopePoints.ar[RopePoints.Count].Y;
- Gear.Elasticity:= Gear.Elasticity + RopePoints.ar[RopePoints.Count].dLen;
- Gear.Friction:= Gear.Friction + RopePoints.ar[RopePoints.Count].dLen
+ Gear^.X:=RopePoints.ar[RopePoints.Count].X;
+ Gear^.Y:=RopePoints.ar[RopePoints.Count].Y;
+ Gear^.Elasticity:= Gear^.Elasticity + RopePoints.ar[RopePoints.Count].dLen;
+ Gear^.Friction:= Gear^.Friction + RopePoints.ar[RopePoints.Count].dLen
end
end;
-Gear.dX:= HHGear.X - Gear.X;
-Gear.dY:= HHGear.Y - Gear.Y;
+Gear^.dX:= HHGear^.X - Gear^.X;
+Gear^.dY:= HHGear^.Y - Gear^.Y;
-cs:= Gear.dY + HHGear.dY;
-cc:= Gear.dX + HHGear.dX;
-len:= 1 / sqrt(sqr(cc)+sqr(cs));
+cs:= Gear^.dY + HHGear^.dY;
+cc:= Gear^.dX + HHGear^.dX;
+len:= 1 / Distance(cc, cs);
cc:= cc * len;
cs:= cs * len;
-HHGear.dX:= HHGear.X;
-HHGear.dY:= HHGear.Y;
+HHGear^.dX:= HHGear^.X;
+HHGear^.dY:= HHGear^.Y;
-if ((Gear.Message and gm_Down) <> 0) and (Gear.Elasticity < Gear.Friction) then
- if not (TestCollisionXwithGear(HHGear, hwSign(Gear.dX))
- or TestCollisionYwithGear(HHGear, hwSign(Gear.dY))) then Gear.Elasticity:= Gear.Elasticity + 0.3;
+if ((Gear^.Message and gm_Down) <> 0) and (Gear^.Elasticity < Gear^.Friction) then
+ if not (TestCollisionXwithGear(HHGear, hwSign(Gear^.dX))
+ or TestCollisionYwithGear(HHGear, hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity + _0_3;
-if ((Gear.Message and gm_Up) <> 0) and (Gear.Elasticity > 30) then
- if not (TestCollisionXwithGear(HHGear, -hwSign(Gear.dX))
- or TestCollisionYwithGear(HHGear, -hwSign(Gear.dY))) then Gear.Elasticity:= Gear.Elasticity - 0.3;
+if ((Gear^.Message and gm_Up) <> 0) and (Gear^.Elasticity > 30) then
+ if not (TestCollisionXwithGear(HHGear, -hwSign(Gear^.dX))
+ or TestCollisionYwithGear(HHGear, -hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity - _0_3;
-HHGear.X:= Gear.X + cc*Gear.Elasticity;
-HHGear.Y:= Gear.Y + cs*Gear.Elasticity;
+HHGear^.X:= Gear^.X + cc*Gear^.Elasticity;
+HHGear^.Y:= Gear^.Y + cs*Gear^.Elasticity;
-HHGear.dX:= HHGear.X - HHGear.dX;
-HHGear.dY:= HHGear.Y - HHGear.dY;
+HHGear^.dX:= HHGear^.X - HHGear^.dX;
+HHGear^.dY:= HHGear^.Y - HHGear^.dY;
-if TestCollisionXwithGear(HHGear, hwSign(HHGear.dX)) then
- HHGear.dX:= -0.6 * HHGear.dX;
-if TestCollisionYwithGear(HHGear, hwSign(HHGear.dY)) then
- HHGear.dY:= -0.6 * HHGear.dY;
+if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
+ HHGear^.dX:= -_0_6 * HHGear^.dX;
+if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) then
+ HHGear^.dY:= -_0_6 * HHGear^.dY;
-if (Gear.Message and gm_Attack) <> 0 then
- if (Gear.State and gsttmpFlag) <> 0 then DeleteMe else
-else if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag;
+if (Gear^.Message and gm_Attack) <> 0 then
+ if (Gear^.State and gsttmpFlag) <> 0 then DeleteMe else
+else if (Gear^.State and gsttmpFlag) = 0 then Gear^.State:= Gear^.State or gsttmpFlag;
end;
procedure doStepRopeAttach(Gear: PGear);
var HHGear: PGear;
- tx, ty, tt: Double;
+ tx, ty, tt: hwFloat;
begin
-Gear.X:= Gear.X - Gear.dX;
-Gear.Y:= Gear.Y - Gear.dY;
-Gear.Elasticity:= Gear.Elasticity + 1.0;
-HHGear:= PHedgehog(Gear.Hedgehog)^.Gear;
-if (HHGear.State and gstFalling) <> 0 then
+Gear^.X:= Gear^.X - Gear^.dX;
+Gear^.Y:= Gear^.Y - Gear^.dY;
+Gear^.Elasticity:= Gear^.Elasticity + 1;
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
+if (HHGear^.State and gstFalling) <> 0 then
if TestCollisionYwithGear(HHGear, 1) then
begin
- HHGear.dY:= 0;
+ HHGear^.dY:= 0;
CheckHHDamage(HHGear);
- HHGear.State:= HHGear.State and not (gstFalling or gstHHJumping);
+ HHGear^.State:= HHGear^.State and not (gstFalling or gstHHJumping);
end else
begin
- if TestCollisionXwithGear(HHGear, hwSign(HHGear.dX)) then HHGear.dX:= 0.0000001 * hwSign(HHGear.dX);
- HHGear.X:= HHGear.X + HHGear.dX;
- HHGear.Y:= HHGear.Y + HHGear.dY;
- Gear.X:= Gear.X + HHGear.dX;
- Gear.Y:= Gear.Y + HHGear.dY;
- HHGear.dY:= HHGear.dY + cGravity;
- tt:= Gear.Elasticity;
+ if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX);
+ HHGear^.X:= HHGear^.X + HHGear^.dX;
+ HHGear^.Y:= HHGear^.Y + HHGear^.dY;
+ Gear^.X:= Gear^.X + HHGear^.dX;
+ Gear^.Y:= Gear^.Y + HHGear^.dY;
+ HHGear^.dY:= HHGear^.dY + cGravity;
+ tt:= Gear^.Elasticity;
tx:= 0;
ty:= 0;
while tt > 20 do
begin
- if TestCollisionXwithXYShift(Gear, round(tx), round(ty), hwSign(Gear.dX))
- or TestCollisionYwithXYShift(Gear, round(tx), round(ty), hwSign(Gear.dY)) then
+ if TestCollisionXwithXYShift(Gear, hwRound(tx), hwRound(ty), hwSign(Gear^.dX))
+ or TestCollisionYwithXYShift(Gear, hwRound(tx), hwRound(ty), hwSign(Gear^.dY)) then
begin
- Gear.X:= Gear.X + tx;
- Gear.Y:= Gear.Y + ty;
- Gear.Elasticity:= tt;
- Gear.doStep:= doStepRopeWork;
+ Gear^.X:= Gear^.X + tx;
+ Gear^.Y:= Gear^.Y + ty;
+ Gear^.Elasticity:= tt;
+ Gear^.doStep:= @doStepRopeWork;
with HHGear^ do State:= State and not gstAttacking;
tt:= 0
end;
- tx:= tx + Gear.dX - Gear.dX;
- ty:= ty + Gear.dY - Gear.dY;
- tt:= tt - 2.0;
+ tx:= tx + Gear^.dX - Gear^.dX;
+ ty:= ty + Gear^.dY - Gear^.dY;
+ tt:= tt - 2;
end;
end;
CheckCollision(Gear);
-if (Gear.State and gstCollision) <> 0 then
+if (Gear^.State and gstCollision) <> 0 then
begin
- Gear.doStep:= doStepRopeWork;
+ Gear^.doStep:= @doStepRopeWork;
with HHGear^ do State:= State and not gstAttacking;
- if Gear.Elasticity < 10 then
- Gear.Elasticity:= 10000;
+ if Gear^.Elasticity < 10 then
+ Gear^.Elasticity:= 10000;
end;
-if (Gear.Elasticity >= Gear.Friction) or ((Gear.Message and gm_Attack) = 0) then
+if (Gear^.Elasticity > Gear^.Friction) or ((Gear^.Message and gm_Attack) = 0) then
begin
- with PHedgehog(Gear.Hedgehog).Gear^ do
+ with PHedgehog(Gear^.Hedgehog)^.Gear^ do
begin
State:= State and not gstAttacking;
Message:= Message and not gm_Attack
@@ -686,71 +681,71 @@
procedure doStepRope(Gear: PGear);
begin
-Gear.dX:= - Gear.dX;
-Gear.dY:= - Gear.dY;
-Gear.doStep:= doStepRopeAttach
+Gear^.dX:= - Gear^.dX;
+Gear^.dY:= - Gear^.dY;
+Gear^.doStep:= @doStepRopeAttach
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepSmokeTrace(Gear: PGear);
begin
-inc(Gear.Timer);
-if Gear.Timer > 64 then
+inc(Gear^.Timer);
+if Gear^.Timer > 64 then
begin
- Gear.Timer:= 0;
- dec(Gear.State)
+ Gear^.Timer:= 0;
+ dec(Gear^.State)
end;
-Gear.dX:= Gear.dX + cWindSpeed;
-Gear.X:= Gear.X + Gear.dX;
-if Gear.State = 0 then DeleteGear(Gear)
+Gear^.dX:= Gear^.dX + cWindSpeed;
+Gear^.X:= Gear^.X + Gear^.dX;
+if Gear^.State = 0 then DeleteGear(Gear)
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepExplosion(Gear: PGear);
begin
-inc(Gear.Timer);
-if Gear.Timer > 75 then
+inc(Gear^.Timer);
+if Gear^.Timer > 75 then
begin
- inc(Gear.State);
- Gear.Timer:= 0;
- if Gear.State > 5 then DeleteGear(Gear)
+ inc(Gear^.State);
+ Gear^.Timer:= 0;
+ if Gear^.State > 5 then DeleteGear(Gear)
end;
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepMine(Gear: PGear);
begin
-if (Gear.dX <> 0) or (Gear.dY <> 0) then
+if (Gear^.dX.QWordValue <> 0) or (Gear^.dY.QWordValue <> 0) then
begin
- if Gear.CollIndex < High(Longword) then DeleteCI(Gear);
+ if Gear^.CollIndex < High(Longword) then DeleteCI(Gear);
doStepFallingGear(Gear);
- if Gear.Active = false then
+ if Gear^.Active = false then
begin
- if Gear.CollIndex = High(Longword) then AddGearCI(Gear);
- Gear.dX:= 0;
- Gear.dY:= 0
+ if Gear^.CollIndex = High(Longword) then AddGearCI(Gear);
+ Gear^.dX:= 0;
+ Gear^.dY:= 0
end;
CalcRotationDirAngle(Gear);
AllInactive:= false
end;
-
-if ((Gear.State and gsttmpFlag) <> 0) then
- if ((Gear.State and gstAttacking) = 0) then
+
+if ((Gear^.State and gsttmpFlag) <> 0) then
+ if ((Gear^.State and gstAttacking) = 0) then
begin
if ((GameTicks and $F) = 0) then
- if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear.State:= Gear.State or gstAttacking
+ if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State:= Gear^.State or gstAttacking
end else // gstAttacking <> 0
begin
AllInactive:= false;
- if (Gear.Timer and $FF) = 0 then PlaySound(sndMineTick);
- if Gear.Timer = 0 then
+ if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick, false);
+ if Gear^.Timer = 0 then
begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
DeleteGear(Gear)
end;
- dec(Gear.Timer);
+ dec(Gear^.Timer);
end else // gsttmpFlag = 0
- if TurnTimeLeft = 0 then Gear.State:= Gear.State or gsttmpFlag;
+ if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag;
end;
////////////////////////////////////////////////////////////////////////////////
@@ -758,54 +753,54 @@
begin
doStepFallingGear(Gear);
AllInactive:= false;
-if Gear.Timer mod 166 = 0 then inc(Gear.Tag);
-if Gear.Timer = 0 then
+if Gear^.Timer mod 166 = 0 then inc(Gear^.Tag);
+if Gear^.Timer = 0 then
begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 75, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
-dec(Gear.Timer);
+dec(Gear^.Timer);
end;
-////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
procedure doStepCase(Gear: PGear);
var i, x, y: integer;
begin
-if (Gear.Message and gm_Destroy) > 0 then
+if (Gear^.Message and gm_Destroy) > 0 then
begin
DeleteGear(Gear);
exit
end;
-if Gear.Damage > 0 then
+if Gear^.Damage > 0 then
begin
- x:= round(Gear.X);
- y:= round(Gear.Y);
+ x:= hwRound(Gear^.X);
+ y:= hwRound(Gear^.Y);
DeleteGear(Gear);
doMakeExplosion(x, y, 25, EXPLAutoSound);
for i:= 0 to 63 do
- AddGear(x, y, gtFlame, 0);
+ AddGear(x, y, gtFlame, 0, 0, 0, 0);
exit
end;
-if (Gear.dY <> 0) or (not TestCollisionYwithGear(Gear, 1)) then
+if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then
begin
AllInactive:= false;
- Gear.dY:= Gear.dY + cGravity;
- Gear.Y:= Gear.Y + Gear.dY;
- if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0 else
- if (Gear.dY >= 0) and TestCollisionYwithGear(Gear, 1) then
+ Gear^.dY:= Gear^.dY + cGravity;
+ Gear^.Y:= Gear^.Y + Gear^.dY;
+ if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= 0 else
+ if (Gear^.dY.QWordValue <> 0) and TestCollisionYwithGear(Gear, 1) then
begin
- Gear.dY:= - Gear.dY * Gear.Elasticity;
- if Gear.dY > - 0.001 then Gear.dY:= 0
- else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact);
+ Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
+ if Gear^.dY > - _0_001 then Gear^.dY:= 0
+ else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false);
end;
CheckGearDrowning(Gear);
end;
-if (Gear.CollIndex = High(Longword)) and (Gear.dY = 0) then AddGearCI(Gear)
- else if (Gear.CollIndex < High(Longword)) and (Gear.dY <> 0) then DeleteCI(Gear);
+if (Gear^.CollIndex = High(Longword)) and (Gear^.dY.QWordValue = 0) then AddGearCI(Gear)
+ else if (Gear^.CollIndex < High(Longword)) and (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear);
end;
////////////////////////////////////////////////////////////////////////////////
@@ -820,14 +815,14 @@
var i: integer;
begin
AllInactive:= false;
-dec(Gear.Timer);
-if (Gear.Timer and 15) = 0 then
+dec(Gear^.Timer);
+if (Gear^.Timer and 15) = 0 then
for i:= 0 to Pred(thexchcnt) do
with thexchar[i] do
{$WARNINGS OFF}
- team.DrawHealthY:= ny + (oy - ny) * Gear.Timer div 640;
+ team^.DrawHealthY:= ny + (oy - ny) * Gear^.Timer div 640;
{$WARNINGS ON}
-if (Gear.Timer = 0) or (currsorter <> Gear) then
+if (Gear^.Timer = 0) or (currsorter <> Gear) then
begin
if currsorter = Gear then currsorter:= nil;
DeleteGear(Gear)
@@ -843,15 +838,15 @@
i:= 0;
while team <> nil do
begin
- thexchar[i].oy:= team.DrawHealthY;
+ thexchar[i].oy:= team^.DrawHealthY;
thexchar[i].team:= team;
inc(i);
- team:= team.Next
+ team:= team^.Next
end;
thexchcnt:= i;
for i:= 1 to thexchcnt do
for t:= 0 to thexchcnt - 2 do
- if thexchar[t].team.TeamHealthBarWidth > thexchar[Succ(t)].team.TeamHealthBarWidth then
+ if thexchar[t].team^.TeamHealthBarWidth > thexchar[Succ(t)].team^.TeamHealthBarWidth then
begin
thexchar[5]:= thexchar[t];
thexchar[t]:= thexchar[Succ(t)];
@@ -861,11 +856,11 @@
for i:= 0 to Pred(thexchcnt) do
with thexchar[i] do
begin
- dec(t, team.HealthRect.h + 2);
+ dec(t, team^.HealthRect.h + 2);
ny:= t
end;
-Gear.Timer:= 640;
-Gear.doStep:= doStepTeamHealthSorterWork;
+Gear^.Timer:= 640;
+Gear^.doStep:= @doStepTeamHealthSorterWork;
currsorter:= Gear
end;
@@ -873,10 +868,10 @@
procedure doStepShover(Gear: PGear);
var HHGear: PGear;
begin
-HHGear:= PHedgehog(Gear.Hedgehog)^.Gear;
-HHGear.State:= HHGear.State or gstNoDamage;
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
+HHGear^.State:= HHGear^.State or gstNoDamage;
AmmoShove(Gear, 30, 115);
-HHGear.State:= HHGear.State and not gstNoDamage;
+HHGear^.State:= HHGear^.State and not gstNoDamage;
DeleteGear(Gear)
end;
@@ -886,30 +881,30 @@
AllInactive:= false;
if not TestCollisionYwithGear(Gear, 1) then
begin
- Gear.dX:= Gear.dX + cWindSpeed;
- Gear.dY:= Gear.dY + cGravity;
- if abs(Gear.dX) > 0.12 then Gear.dX:= Gear.dX * 0.5;
- if Gear.dY > 0.12 then Gear.dY:= Gear.dY * 0.995;
- Gear.X:= Gear.X + Gear.dX;
- Gear.Y:= Gear.Y + Gear.dY;
- if Gear.Y > 1023 then
+ Gear^.dX:= Gear^.dX + cWindSpeed;
+ Gear^.dY:= Gear^.dY + cGravity;
+ if hwAbs(Gear^.dX) > _0_1 then Gear^.dX:= Gear^.dX * _0_5;
+ if Gear^.dY > _0_1 then Gear^.dY:= Gear^.dY * _0_995;
+ Gear^.X:= Gear^.X + Gear^.dX;
+ Gear^.Y:= Gear^.Y + Gear^.dY;
+ if Gear^.Y > 1023 then
begin
DeleteGear(Gear);
exit
end
end else begin
- if Gear.Timer > 0 then dec(Gear.Timer)
+ if Gear^.Timer > 0 then dec(Gear^.Timer)
else begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 2, 0);
- dec(Gear.Health);
- Gear.Timer:= 1250 - Gear.Angle * 12
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 2, 0);
+ dec(Gear^.Health);
+ Gear^.Timer:= 1250 - Gear^.Angle * 12
end
end;
-if (((GameTicks div 8) mod 64) = Gear.Angle) then
+if (((GameTicks div 8) mod 64) = Gear^.Angle) then
AmmoFlameWork(Gear);
-if Gear.Health = 0 then
+if Gear^.Health = 0 then
DeleteGear(Gear)
end;
@@ -918,49 +913,49 @@
var HHGear: PGear;
begin
AllInactive:= false;
-if ((Gear.Message and gm_Destroy) <> 0) then
+if ((Gear^.Message and gm_Destroy) <> 0) then
begin
DeleteGear(Gear);
AfterAttack;
exit
end;
-HHGear:= PHedgehog(Gear.Hedgehog).Gear;
-if round(HHGear.Y) <= Gear.Tag - 2 then
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
+if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then
begin
- Gear.Tag:= round(HHGear.Y);
- DrawTunnel(HHGear.X - cHHRadius, HHGear.Y - 1, 0.5, 0.0, cHHRadius * 4, 2);
- HHGear.State:= HHGear.State or gstNoDamage;
- Gear.Y:= HHGear.Y;
+ Gear^.Tag:= hwRound(HHGear^.Y);
+ DrawTunnel(HHGear^.X - cHHRadius, HHGear^.Y - 1, _0_5, 0, cHHRadius * 4, 2);
+ HHGear^.State:= HHGear^.State or gstNoDamage;
+ Gear^.Y:= HHGear^.Y;
AmmoShove(Gear, 30, 40);
- HHGear.State:= HHGear.State and not gstNoDamage
+ HHGear^.State:= HHGear^.State and not gstNoDamage
end;
-
-HHGear.dY:= HHGear.dY + cGravity;
-if HHGear.dY >= 0 then
+
+HHGear^.dY:= HHGear^.dY + cGravity;
+if not (HHGear^.dY.isNegative) then
begin
- HHGear.State:= HHGear.State or gstFalling;
+ HHGear^.State:= HHGear^.State or gstFalling;
DeleteGear(Gear);
AfterAttack;
exit
end;
-HHGear.Y:= HHGear.Y + HHGear.dY
+HHGear^.Y:= HHGear^.Y + HHGear^.dY
end;
procedure doStepFirePunch(Gear: PGear);
var HHGear: PGear;
begin
AllInactive:= false;
-HHGear:= PHedgehog(Gear.Hedgehog).Gear;
-HHGear.X:= round(HHGear.X) - 0.5;
-HHGear.dX:= 0.0000001 * hwSign(HHGear.dX);
-HHGear.dY:= -0.30;
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
+HHGear^.X:= hwRound(HHGear^.X) - _0_5;
+SetLittle(HHGear^.dX);
+HHGear^.dY:= - _0_3;
-Gear.X:= HHGear.X;
-Gear.dX:= hwSign(HHGear.dX)* 0.45;
-Gear.dY:= -0.9;
-Gear.doStep:= doStepFirePunchWork;
-DrawTunnel(HHGear.X - cHHRadius, HHGear.Y + 1, 0.5, 0.0, cHHRadius * 4, 5);
+Gear^.X:= HHGear^.X;
+Gear^.dX:= hwSign(HHGear^.dX) * _0_45;
+Gear^.dY:= - _0_9;
+Gear^.doStep:= @doStepFirePunchWork;
+DrawTunnel(HHGear^.X - cHHRadius, HHGear^.Y + 1, _0_5, 0, cHHRadius * 4, 5);
end;
////////////////////////////////////////////////////////////////////////////////
@@ -968,69 +963,69 @@
procedure doStepParachute(Gear: PGear);
var HHGear: PGear;
begin
-HHGear:= PHedgehog(Gear.Hedgehog).Gear;
-HHGear.State:= HHGear.State and not gstAttacking;
+HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
+HHGear^.State:= HHGear^.State and not gstAttacking;
if TestCollisionYwithGear(HHGear, 1)
- or ((HHGear.State and gstHHDriven) = 0)
+ or ((HHGear^.State and gstHHDriven) = 0)
or CheckGearDrowning(HHGear) then
begin
with HHGear^ do
begin
Message:= 0;
- dx:= 0.0000001 * hwSign(dX);
+ SetLittle(dx);
dY:= 0;
State:= State and not (gstAttacking or gstAttacked);
State:= State or gstFalling;
end;
DeleteGear(Gear);
- OnUsedAmmo(PHedgehog(HHGear.Hedgehog)^.Ammo);
- ApplyAmmoChanges(PHedgehog(HHGear.Hedgehog)^);
+ OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^.Ammo);
+ ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
exit
end;
-if not TestCollisionXwithGear(HHGear, hwSign(HHGear.dX)) then
- HHGear.X:= HHGear.X + cWindSpeed * 200;
+if not TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
+ HHGear^.X:= HHGear^.X + cWindSpeed * 200;
-if (Gear.Message and gm_Left) <> 0 then HHGear.X:= HHGear.X - cMaxWindSpeed * 40
-else if (Gear.Message and gm_Right) <> 0 then HHGear.X:= HHGear.X + cMaxWindSpeed * 40;
-if (Gear.Message and gm_Up) <> 0 then HHGear.Y:= HHGear.Y - cGravity * 40
-else if (Gear.Message and gm_Down) <> 0 then HHGear.Y:= HHGear.Y + cGravity * 40;
+if (Gear^.Message and gm_Left) <> 0 then HHGear^.X:= HHGear^.X - cMaxWindSpeed * 40
+else if (Gear^.Message and gm_Right) <> 0 then HHGear^.X:= HHGear^.X + cMaxWindSpeed * 40;
+if (Gear^.Message and gm_Up) <> 0 then HHGear^.Y:= HHGear^.Y - cGravity * 40
+else if (Gear^.Message and gm_Down) <> 0 then HHGear^.Y:= HHGear^.Y + cGravity * 40;
-HHGear.Y:= HHGear.Y + cGravity * 100;
+HHGear^.Y:= HHGear^.Y + cGravity * 100;
end;
////////////////////////////////////////////////////////////////////////////////
-const cAirPlaneSpeed = 1.4;
- cBombsDistance = 30;
- cBombsSpeed = 0.1;
+const cAirPlaneSpeed: hwFloat = (isNegative: false; QWordValue: 6012954214); // 1.4
+ cBombsDistance: hwFloat = (isNegative: false; QWordValue: 128849018880); // 30
+ cBombsSpeed : hwFloat = (isNegative: false; QWordValue: 429496729);
procedure doStepAirAttackWork(Gear: PGear);
begin
AllInactive:= false;
-Gear.X:= Gear.X + cAirPlaneSpeed;
-if (Gear.Health > 0)and(Gear.X >= Gear.dX)and(Gear.X < Gear.dX + cAirPlaneSpeed) then
+Gear^.X:= Gear^.X + cAirPlaneSpeed;
+if (Gear^.Health > 0)and( not (Gear^.X < Gear^.dX))and(Gear^.X < Gear^.dX + cAirPlaneSpeed) then
begin
- dec(Gear.Health);
- case Gear.State of
- 0: AddGear(round(Gear.X), round(Gear.Y), gtAirBomb, 0, cBombsSpeed, 0.0);
- 1: AddGear(round(Gear.X), round(Gear.Y), gtMine, 0, cBombsSpeed, 0.0);
+ dec(Gear^.Health);
+ case Gear^.State of
+ 0: AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed, 0, 0);
+ 1: AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMine, 0, cBombsSpeed, 0, 0);
end;
- Gear.dX:= Gear.dX + cBombsDistance
+ Gear^.dX:= Gear^.dX + cBombsDistance
end;
-if Gear.X > 3072 then DeleteGear(Gear)
+if Gear^.X > 3072 then DeleteGear(Gear)
end;
procedure doStepAirAttack(Gear: PGear);
begin
AllInactive:= false;
-Gear.X:= -1024;
-Gear.Y:= -128;
-Gear.dX:= TargetPoint.X -
- cBombsDistance * 5 / 2 -
- cBombsSpeed * sqrt(2 * (TargetPoint.Y - Gear.Y) / cGravity);
-Gear.Health:= 6;
-Gear.doStep:= doStepAirAttackWork
+Gear^.X:= -1024;
+Gear^.Y:= -128;
+Gear^.dX:= TargetPoint.X -
+ cBombsDistance * 5 / 2;{ -
+ cBombsSpeed * sqrt(2 * (TargetPoint.Y - Gear^.Y) / cGravity);}
+Gear^.Health:= 6;
+Gear^.doStep:= @doStepAirAttackWork
end;
////////////////////////////////////////////////////////////////////////////////
@@ -1039,14 +1034,12 @@
begin
AllInactive:= false;
doStepFallingGear(Gear);
-if (Gear.State and gstCollision) <> 0 then
+if (Gear^.State and gstCollision) <> 0 then
begin
- doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound);
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound);
DeleteGear(Gear);
exit
end;
if (GameTicks and $3F) = 0 then
- AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0)
+ AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, 0, 0, 0)
end;
-
-