diff -r 803b277e4894 -r 3f21a9dc93d0 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sat Mar 06 10:54:24 2010 +0000 +++ b/hedgewars/GSHandlers.inc Sat Mar 06 10:59:20 2010 +0000 @@ -20,26 +20,26 @@ var gi: PGear; d: LongInt; begin - gi:= GearsList; - while gi <> nil do - begin - d:= r - hwRound(Distance(gi^.X - x, gi^.Y - y)); - if (d > 1) and (gi^.Kind = gtHedgehog) and not gi^.Invulnerable and (GetRandom(2) = 0) then - begin - if (CurrentHedgehog^.Gear = gi) then - PlaySound(sndOops, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) - else - begin - if (gi^.State and gstMoving) = 0 then - gi^.State:= gi^.State or gstLoser; - if d > r div 2 then - PlaySound(sndNooo, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) - else - PlaySound(sndUhOh, PHedgehog(gi^.Hedgehog)^.Team^.voicepack); - end; - end; - gi:= gi^.NextGear - end; + gi:= GearsList; + while gi <> nil do + begin + d:= r - hwRound(Distance(gi^.X - x, gi^.Y - y)); + if (d > 1) and (gi^.Kind = gtHedgehog) and not gi^.Invulnerable and (GetRandom(2) = 0) then + begin + if (CurrentHedgehog^.Gear = gi) then + PlaySound(sndOops, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) + else + begin + if (gi^.State and gstMoving) = 0 then + gi^.State:= gi^.State or gstLoser; + if d > r div 2 then + PlaySound(sndNooo, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) + else + PlaySound(sndUhOh, PHedgehog(gi^.Hedgehog)^.Team^.voicepack); + end; + end; + gi:= gi^.NextGear + end; end; //////////////////////////////////////////////////////////////////////////////// procedure doStepDrowningGear(Gear: PGear); forward; @@ -68,50 +68,50 @@ Gear^.State:= gstDrowning; Gear^.RenderTimer:= false; Gear^.doStep:= @doStepDrowningGear; - if Gear^.Kind = gtHedgehog then - begin - Gear^.State:= Gear^.State and (not gstHHDriven); - AddCaption(Format(GetEventString(eidDrowned), PHedgehog(Gear^.Hedgehog)^.Name), cWhiteColor, capgrpMessage); - end + if Gear^.Kind = gtHedgehog then + begin + Gear^.State:= Gear^.State and (not gstHHDriven); + AddCaption(Format(GetEventString(eidDrowned), PHedgehog(Gear^.Hedgehog)^.Name), cWhiteColor, capgrpMessage); + end end; PlaySound(sndSplash) end else - CheckGearDrowning:= false + 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 + then Gear^.State:= Gear^.State or gstCollision + else Gear^.State:= Gear^.State and not gstCollision end; procedure CheckHHDamage(Gear: PGear); var - dmg: Longword; - i: LongInt; - particle: PVisualGear; + dmg: Longword; + i: LongInt; + particle: PVisualGear; begin if _0_4 < Gear^.dY then - begin - dmg:= ModifyDamage(1 + hwRound((hwAbs(Gear^.dY) - _0_4) * 70), Gear); + begin + dmg:= ModifyDamage(1 + hwRound((hwAbs(Gear^.dY) - _0_4) * 70), Gear); if dmg < 1 then exit; - for i:= min(12, (3 + dmg div 10)) downto 0 do begin - particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); + for i:= min(12, (3 + dmg div 10)) downto 0 do begin + particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX / 5); - end; + end; if(Gear^.Invulnerable) then exit; - if _0_6 < Gear^.dY then - PlaySound(sndOw4, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack) - else - PlaySound(sndOw1, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack); + if _0_6 < Gear^.dY then + PlaySound(sndOw4, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack) + else + PlaySound(sndOw1, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack); ApplyDamage(Gear, dmg); - end + end end; //////////////////////////////////////////////////////////////////////////////// @@ -121,9 +121,9 @@ begin dAngle:= (hwAbs(Gear^.dX) + hwAbs(Gear^.dY)).QWordValue / $80000000; if not Gear^.dX.isNegative then - Gear^.DirAngle:= Gear^.DirAngle + dAngle + Gear^.DirAngle:= Gear^.DirAngle + dAngle else - Gear^.DirAngle:= Gear^.DirAngle - dAngle; + Gear^.DirAngle:= Gear^.DirAngle - dAngle; if Gear^.DirAngle < 0 then Gear^.DirAngle:= Gear^.DirAngle + 360 else if 360 < Gear^.DirAngle then Gear^.DirAngle:= Gear^.DirAngle - 360 @@ -151,29 +151,29 @@ Gear^.State:= Gear^.State and not gstCollision; if Gear^.dY.isNegative then - begin - isFalling:= true; - if TestCollisionYwithGear(Gear, -1) then - begin - Gear^.dX:= Gear^.dX * Gear^.Friction; - Gear^.dY:= - Gear^.dY * Gear^.Elasticity; - Gear^.State:= Gear^.State or gstCollision - end - end else - if TestCollisionYwithGear(Gear, 1) then - begin - isFalling:= false; - Gear^.dX:= Gear^.dX * Gear^.Friction; - Gear^.dY:= - Gear^.dY * Gear^.Elasticity; - Gear^.State:= Gear^.State or gstCollision - end else isFalling:= true; + begin + isFalling:= true; + if TestCollisionYwithGear(Gear, -1) then + begin + Gear^.dX:= Gear^.dX * Gear^.Friction; + Gear^.dY:= - Gear^.dY * Gear^.Elasticity; + Gear^.State:= Gear^.State or gstCollision + end + end else + if TestCollisionYwithGear(Gear, 1) then + begin + isFalling:= false; + Gear^.dX:= Gear^.dX * Gear^.Friction; + Gear^.dY:= - Gear^.dY * Gear^.Elasticity; + Gear^.State:= Gear^.State or gstCollision + end else isFalling:= true; if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then - begin - Gear^.dX:= - Gear^.dX * Gear^.Elasticity; - Gear^.dY:= Gear^.dY * Gear^.Elasticity; - Gear^.State:= Gear^.State or gstCollision - end; + begin + Gear^.dX:= - Gear^.dX * Gear^.Elasticity; + Gear^.dY:= Gear^.dY * Gear^.Elasticity; + Gear^.State:= Gear^.State or gstCollision + end; if isFalling then Gear^.dY:= Gear^.dY + cGravity; @@ -181,10 +181,10 @@ Gear^.Y:= Gear^.Y + Gear^.dY; CheckGearDrowning(Gear); if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and - (not isFalling) then - Gear^.State:= Gear^.State and not gstMoving + (not isFalling) then + Gear^.State:= Gear^.State and not gstMoving else - Gear^.State:= Gear^.State or gstMoving + Gear^.State:= Gear^.State or gstMoving end; //////////////////////////////////////////////////////////////////////////////// @@ -199,97 +199,97 @@ dec(Gear^.Timer); if Gear^.Timer = 1000 then // might need adjustments - case Gear^.Kind of - gtAmmo_Bomb: makeHogsWorry(Gear^.X, Gear^.Y, 50); - gtClusterBomb: makeHogsWorry(Gear^.X, Gear^.Y, 20); - gtWatermelon: makeHogsWorry(Gear^.X, Gear^.Y, 75); - gtHellishBomb: makeHogsWorry(Gear^.X, Gear^.Y, 90); - end; + case Gear^.Kind of + gtAmmo_Bomb: makeHogsWorry(Gear^.X, Gear^.Y, 50); + gtClusterBomb: makeHogsWorry(Gear^.X, Gear^.Y, 20); + gtWatermelon: makeHogsWorry(Gear^.X, Gear^.Y, 75); + gtHellishBomb: makeHogsWorry(Gear^.X, Gear^.Y, 90); + end; if Gear^.Timer = 0 then - begin - case Gear^.Kind of - gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); - gtBall: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 40, EXPLAutoSound); - gtClusterBomb: begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound); - for i:= 0 to 4 do - begin - dX:= rndSign(GetRandom * _0_1); - dY:= (GetRandom - _3) * _0_08; - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 25); - end - end; - gtWatermelon: begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound); - for i:= 0 to 5 do - begin - dX:= rndSign(GetRandom * _0_1); - dY:= (GetRandom - _1_5) * _0_3; - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMelonPiece, 0, dX, dY, 75)^.DirAngle:= i * 60; - end - end; - gtHellishBomb: begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 90, EXPLAutoSound); - for i:= 0 to 127 do - begin - dX:= AngleCos(i * 16) * _0_5 * (GetRandom + _1); - dY:= AngleSin(i * 16) * _0_5 * (GetRandom + _1); + begin + case Gear^.Kind of + gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); + gtBall: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 40, EXPLAutoSound); + gtClusterBomb: begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound); + for i:= 0 to 4 do + begin + dX:= rndSign(GetRandom * _0_1); + dY:= (GetRandom - _3) * _0_08; + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 25); + end + end; + gtWatermelon: begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound); + for i:= 0 to 5 do + begin + dX:= rndSign(GetRandom * _0_1); + dY:= (GetRandom - _1_5) * _0_3; + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMelonPiece, 0, dX, dY, 75)^.DirAngle:= i * 60; + end + end; + gtHellishBomb: begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 90, EXPLAutoSound); + for i:= 0 to 127 do + begin + dX:= AngleCos(i * 16) * _0_5 * (GetRandom + _1); + dY:= AngleSin(i * 16) * _0_5 * (GetRandom + _1); Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); if i mod 2 = 0 then Fire^.State:= Fire^.State or gsttmpFlag; Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); if i mod 2 <> 0 then Fire^.State:= Fire^.State or gsttmpFlag; - end - end; - end; - DeleteGear(Gear); - exit - end; + end + end; + end; + DeleteGear(Gear); + exit + end; CalcRotationDirAngle(Gear); if Gear^.Kind = gtHellishBomb then - begin - if Gear^.Timer = 3000 then PlaySound(sndHellish); + begin + if Gear^.Timer = 3000 then PlaySound(sndHellish); - if (GameTicks and $3F) = 0 then - if (Gear^.State and gstCollision) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtEvilTrace, 0, _0, _0, 0); - end; + if (GameTicks and $3F) = 0 then + if (Gear^.State and gstCollision) = 0 then + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtEvilTrace, 0, _0, _0, 0); + end; if (Gear^.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then - if (hwAbs(Gear^.dX) > _0_1) or - (hwAbs(Gear^.dY) > _0_1) then - PlaySound(sndGrenadeImpact) + if (hwAbs(Gear^.dX) > _0_1) or + (hwAbs(Gear^.dY) > _0_1) then + PlaySound(sndGrenadeImpact) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepMolotov(Gear: PGear); var i: LongInt; dX, dY: hwFloat; - Fire: PGear; + Fire: PGear; begin - AllInactive:= false; - - doStepFallingGear(Gear); - CalcRotationDirAngle(Gear); + AllInactive:= false; + + doStepFallingGear(Gear); + CalcRotationDirAngle(Gear); - if (Gear^.State and gstCollision) <> 0 then begin - PlaySound(sndMolotov); - //doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, EXPLAutoSound); - for i:= 0 to 20 do begin - dX:= AngleCos(i * 2) * ((_0_1*(i div 5))) * (GetRandom + _1); - dY:= AngleSin(i * 8) * _0_5 * (GetRandom + _1); - Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); - Fire^.State:= Fire^.State or gsttmpFlag; - Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); - Fire^.State:= Fire^.State or gsttmpFlag; - Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, dY, 0); - Fire^.State:= Fire^.State or gsttmpFlag; - Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, -dY, 0); - Fire^.State:= Fire^.State or gsttmpFlag; - end; - DeleteGear(Gear); - exit - end; + if (Gear^.State and gstCollision) <> 0 then begin + PlaySound(sndMolotov); + //doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, EXPLAutoSound); + for i:= 0 to 20 do begin + dX:= AngleCos(i * 2) * ((_0_1*(i div 5))) * (GetRandom + _1); + dY:= AngleSin(i * 8) * _0_5 * (GetRandom + _1); + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, -dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; + end; + DeleteGear(Gear); + exit + end; end; procedure doStepWatermelon(Gear: PGear); @@ -303,17 +303,17 @@ AllInactive:= false; doStepFallingGear(Gear); if (Gear^.State and gstCollision) <> 0 then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Timer, EXPLAutoSound); - DeleteGear(Gear); - exit - end; + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Timer, EXPLAutoSound); + DeleteGear(Gear); + exit + end; if Gear^.Kind = gtMelonPiece then - CalcRotationDirAngle(Gear) + CalcRotationDirAngle(Gear) else - if (GameTicks and $1F) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) + if (GameTicks and $1F) = 0 then + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) end; //////////////////////////////////////////////////////////////////////////////// @@ -323,30 +323,30 @@ Gear^.dX:= Gear^.dX + cWindSpeed; doStepFallingGear(Gear); if (Gear^.State and gstCollision) <> 0 then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); - DeleteGear(Gear); - exit - end; + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); + DeleteGear(Gear); + exit + end; if (GameTicks and $3F) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepHealthTagWork(Gear: PGear); begin if Gear^.Kind = gtHealthTag then - AllInactive:= false; + AllInactive:= false; dec(Gear^.Timer); Gear^.Y:= Gear^.Y + Gear^.dY; if Gear^.Timer = 0 then - begin - if (Gear^.Kind = gtHealthTag) and (PHedgehog(Gear^.Hedgehog)^.Gear <> nil) then - PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die - DeleteGear(Gear) - end + begin + if (Gear^.Kind = gtHealthTag) and (PHedgehog(Gear^.Hedgehog)^.Gear <> nil) then + PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die + DeleteGear(Gear) + end end; procedure doStepHealthTagWorkUnderWater(Gear: PGear); @@ -356,7 +356,7 @@ Gear^.Y:= Gear^.Y - _0_08; if hwRound(Gear^.Y) < cWaterLine + 10 then - DeleteGear(Gear) + DeleteGear(Gear) end; procedure doStepHealthTag(Gear: PGear); @@ -369,9 +369,9 @@ Gear^.Tex:= RenderStringTex(s, PHedgehog(Gear^.Hedgehog)^.Team^.Clan^.Color, fnt16); if hwRound(Gear^.Y) < cWaterLine then - Gear^.doStep:= @doStepHealthTagWork + Gear^.doStep:= @doStepHealthTagWork else - Gear^.doStep:= @doStepHealthTagWorkUnderWater; + Gear^.doStep:= @doStepHealthTagWorkUnderWater; Gear^.Y:= Gear^.Y - int2hwFloat(Gear^.Tex^.h) end; @@ -459,10 +459,10 @@ AllInactive:= false; inc(Gear^.Timer); if Gear^.Timer > 75 then - begin - DeleteGear(Gear); - AfterAttack - end + begin + DeleteGear(Gear); + AfterAttack + end end; procedure doStepShotgunShot(Gear: PGear); @@ -472,23 +472,23 @@ AllInactive:= false; if ((Gear^.State and gstAnimation) = 0) then - begin - dec(Gear^.Timer); - if Gear^.Timer = 0 then - begin - PlaySound(sndShotgunFire); - shell:= AddVisualGear(hwRound(Gear^.x), hwRound(Gear^.y), vgtShell); + begin + dec(Gear^.Timer); + if Gear^.Timer = 0 then + begin + PlaySound(sndShotgunFire); + shell:= AddVisualGear(hwRound(Gear^.x), hwRound(Gear^.y), vgtShell); if shell <> nil then begin shell^.dX:= gear^.dX / -4; shell^.dY:= gear^.dY / -4; shell^.Frame:= 0 end; - Gear^.State:= Gear^.State or gstAnimation - end; - exit - end - else inc(Gear^.Timer); + Gear^.State:= Gear^.State or gstAnimation + end; + exit + end + else inc(Gear^.Timer); i:= 200; repeat @@ -496,17 +496,17 @@ Gear^.Y:= Gear^.Y + Gear^.dY; CheckCollision(Gear); if (Gear^.State and gstCollision) <> 0 then - begin - Gear^.X:= Gear^.X + Gear^.dX * 8; - Gear^.Y:= Gear^.Y + Gear^.dY * 8; - ShotgunShot(Gear); - Gear^.doStep:= @doStepShotIdle; - exit - end; + begin + Gear^.X:= Gear^.X + Gear^.dX * 8; + Gear^.Y:= Gear^.Y + Gear^.dY * 8; + ShotgunShot(Gear); + Gear^.doStep:= @doStepShotIdle; + exit + end; dec(i) until i = 0; if (hwRound(Gear^.X) and LAND_WIDTH_MASK <> 0) or (hwRound(Gear^.Y) and LAND_HEIGHT_MASK <> 0) then - Gear^.doStep:= @doStepShotIdle + Gear^.doStep:= @doStepShotIdle end; //////////////////////////////////////////////////////////////////////////////// @@ -541,13 +541,13 @@ end; if (Gear^.Health <= 0) - or (hwRound(Gear^.X) and LAND_WIDTH_MASK <> 0) - or (hwRound(Gear^.Y) and LAND_HEIGHT_MASK <> 0) then + or (hwRound(Gear^.X) and LAND_WIDTH_MASK <> 0) + or (hwRound(Gear^.Y) and LAND_HEIGHT_MASK <> 0) then begin if (Gear^.Kind = gtSniperRifleShot) and ((GameFlags and gfLaserSight) = 0) then cLaserSighting:= false; if (Gear^.Ammo^.NumPerTurn <= CurrentHedgehog^.MultiShootAttacks) and ((GameFlags and gfArtillery) = 0) then cArtillery:= false; - Gear^.doStep:= @doStepShotIdle + Gear^.doStep:= @doStepShotIdle end; end; @@ -600,8 +600,8 @@ dec(TurnTimeLeft) else begin - DeleteGear(Gear); - AfterAttack + DeleteGear(Gear); + AfterAttack end; end; @@ -645,48 +645,48 @@ 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(Gear^.SoundChannel); - DeleteGear(Gear); - AfterAttack; - exit - end; + begin + StopSound(Gear^.SoundChannel); + DeleteGear(Gear); + AfterAttack; + exit + end; if (Gear^.Timer mod 33) = 0 then - begin - HHGear^.State:= HHGear^.State or gstNoDamage; - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y) + 7, 6, EXPLDontDraw); - HHGear^.State:= HHGear^.State and not gstNoDamage - end; + begin + HHGear^.State:= HHGear^.State or gstNoDamage; + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y) + 7, 6, EXPLDontDraw); + HHGear^.State:= HHGear^.State and not gstNoDamage + end; if (Gear^.Timer mod 47) = 0 then - begin - i:= hwRound(Gear^.X) - Gear^.Radius - LongInt(GetRandom(2)); - ei:= hwRound(Gear^.X) + Gear^.Radius + LongInt(GetRandom(2)); - while i <= ei do - begin - DrawExplosion(i, hwRound(Gear^.Y) + 3, 3); - inc(i, 1) - end; + begin + i:= hwRound(Gear^.X) - Gear^.Radius - LongInt(GetRandom(2)); + ei:= hwRound(Gear^.X) + Gear^.Radius + LongInt(GetRandom(2)); + while i <= ei do + begin + DrawExplosion(i, hwRound(Gear^.Y) + 3, 3); + inc(i, 1) + end; if CheckLandValue(hwRound(Gear^.X + Gear^.dX + SignAs(_6,Gear^.dX)), hwRound(Gear^.Y + _1_9), COLOR_INDESTRUCTIBLE) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.Y:= Gear^.Y + _1_9; end; - SetAllHHToActive; - end; + SetAllHHToActive; + end; if TestCollisionYwithGear(Gear, 1) then - begin - Gear^.dY:= _0; - SetLittle(HHGear^.dX); - HHGear^.dY:= _0; - end else - begin - Gear^.dY:= Gear^.dY + cGravity; - Gear^.Y:= Gear^.Y + Gear^.dY; - if hwRound(Gear^.Y) > cWaterLine then Gear^.Timer:= 1 - end; + begin + Gear^.dY:= _0; + SetLittle(HHGear^.dX); + HHGear^.dY:= _0; + end else + begin + Gear^.dY:= Gear^.dY + cGravity; + Gear^.Y:= Gear^.Y + Gear^.dY; + if hwRound(Gear^.Y) > cWaterLine then Gear^.Timer:= 1 + end; Gear^.X:= Gear^.X + HHGear^.dX; HHGear^.X:= Gear^.X; @@ -731,8 +731,8 @@ procedure doStepBlowTorchWork(Gear: PGear); var HHGear: PGear; - b: boolean; - prevX: LongInt; + b: boolean; + prevX: LongInt; begin AllInactive:= false; dec(Gear^.Timer); @@ -743,31 +743,31 @@ b:= false; if abs(LongInt(HHGear^.Angle) - BTPrevAngle) > 7 then - begin - Gear^.dX:= SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX); - Gear^.dY:= AngleCos(HHGear^.Angle) * ( - _0_5); - BTPrevAngle:= HHGear^.Angle; - b:= true - end; + begin + Gear^.dX:= SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX); + Gear^.dY:= AngleCos(HHGear^.Angle) * ( - _0_5); + BTPrevAngle:= HHGear^.Angle; + b:= true + end; if ((HHGear^.State and gstMoving) <> 0) then - begin - doStepHedgehogMoving(HHGear); - if (HHGear^.State and gstHHDriven) = 0 then Gear^.Timer:= 0 - end; + begin + doStepHedgehogMoving(HHGear); + if (HHGear^.State and gstHHDriven) = 0 then Gear^.Timer:= 0 + end; if Gear^.Timer mod cHHStepTicks = 0 then - begin - b:= true; - if Gear^.dX.isNegative then - HHGear^.Message:= (HHGear^.Message and (gm_Attack or gm_Up or gm_Down)) or gm_Left - else - HHGear^.Message:= (HHGear^.Message and (gm_Attack or gm_Up or gm_Down)) or gm_Right; + begin + b:= true; + if Gear^.dX.isNegative then + HHGear^.Message:= (HHGear^.Message and (gm_Attack or gm_Up or gm_Down)) or gm_Left + else + HHGear^.Message:= (HHGear^.Message and (gm_Attack or gm_Up or gm_Down)) or gm_Right; - if ((HHGear^.State and gstMoving) = 0) then - begin - HHGear^.State:= HHGear^.State and not gstAttacking; - prevX:= hwRound(HHGear^.X); + if ((HHGear^.State and gstMoving) = 0) then + begin + HHGear^.State:= HHGear^.State and not gstAttacking; + prevX:= hwRound(HHGear^.X); // why the call to HedgehogStep then a further increment of X? if (prevX = hwRound(HHGear^.X)) and @@ -775,23 +775,23 @@ if (prevX = hwRound(HHGear^.X)) and CheckLandValue(hwRound(HHGear^.X + SignAs(_6, HHGear^.dX)), hwRound(HHGear^.Y), COLOR_INDESTRUCTIBLE) then HHGear^.X:= HHGear^.X + SignAs(_1, HHGear^.dX); - HHGear^.State:= HHGear^.State or gstAttacking - end; + HHGear^.State:= HHGear^.State or gstAttacking + end; - inc(BTSteps); - if BTSteps = 7 then - begin - BTSteps:= 0; + inc(BTSteps); + if BTSteps = 7 then + begin + BTSteps:= 0; if CheckLandValue(hwRound(HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC) + SignAs(_6,Gear^.dX)), hwRound(HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC)), COLOR_INDESTRUCTIBLE) then begin - Gear^.X:= HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC); - Gear^.Y:= HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC); + Gear^.X:= HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC); + Gear^.Y:= HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC); end; - HHGear^.State:= HHGear^.State or gstNoDamage; - AmmoShove(Gear, 2, 15); - HHGear^.State:= HHGear^.State and not gstNoDamage - end; - end; + HHGear^.State:= HHGear^.State or gstNoDamage; + AmmoShove(Gear, 2, 15); + HHGear^.State:= HHGear^.State and not gstNoDamage + end; + end; if b then DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs(Gear^.dY) * 7, @@ -799,12 +799,12 @@ cHHRadius * 5, cHHRadius * 2 + 7); if (Gear^.Timer = 0) or ((HHGear^.Message and gm_Attack) <> 0) then - begin - HHGear^.Message:= 0; - HHGear^.State:= HHGear^.State and (not gstNotKickable); - DeleteGear(Gear); - AfterAttack - end + begin + HHGear^.Message:= 0; + HHGear^.State:= HHGear^.State and (not gstNotKickable); + DeleteGear(Gear); + AfterAttack + end end; procedure doStepBlowTorch(Gear: PGear); @@ -827,13 +827,13 @@ begin HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; if ((HHGear^.State and gstHHDriven) = 0) - or (CheckGearDrowning(HHGear)) - or TestCollisionYwithGear(HHGear, 1) then - begin - DeleteGear(Gear); - isCursorVisible:= false; - exit - end; + or (CheckGearDrowning(HHGear)) + or TestCollisionYwithGear(HHGear, 1) then + begin + DeleteGear(Gear); + isCursorVisible:= false; + exit + end; HedgehogChAngle(HHGear); @@ -845,59 +845,59 @@ HHGear^.dY:= HHGear^.dY + cGravity; if (Gear^.Message and gm_Attack) <> 0 then - begin - Gear^.X:= HHGear^.X; - Gear^.Y:= HHGear^.Y; + begin + Gear^.X:= HHGear^.X; + Gear^.Y:= HHGear^.Y; - ApplyAngleBounds(PHedgehog(Gear^.Hedgehog)^, amRope); + ApplyAngleBounds(PHedgehog(Gear^.Hedgehog)^, amRope); - Gear^.dX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX); - Gear^.dY:= -AngleCos(HHGear^.Angle); - Gear^.Friction:= _450; - Gear^.Elasticity:= _0; - Gear^.State:= Gear^.State and not gsttmpflag; - Gear^.doStep:= @doStepRope - end + Gear^.dX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX); + Gear^.dY:= -AngleCos(HHGear^.Angle); + Gear^.Friction:= _450; + Gear^.Elasticity:= _0; + Gear^.State:= Gear^.State and not gsttmpflag; + Gear^.doStep:= @doStepRope + end end; procedure doStepRopeWork(Gear: PGear); var HHGear: PGear; - len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat; - lx, ly: LongInt; - haveCollision, - haveDivided: boolean; + len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat; + lx, ly: LongInt; + haveCollision, + haveDivided: boolean; - procedure DeleteMe; - begin - with HHGear^ do - begin - Message:= Message and not gm_Attack; - State:= (State or gstMoving) and not gstWinner; - end; - DeleteGear(Gear) - end; + procedure DeleteMe; + begin + with HHGear^ do + begin + Message:= Message and not gm_Attack; + State:= (State or gstMoving) and not gstWinner; + end; + DeleteGear(Gear) + end; - procedure WaitCollision; - begin - with HHGear^ do - begin - Message:= Message and not gm_Attack; - State:= State or gstMoving; - end; - RopePoints.Count:= 0; - Gear^.Elasticity:= _0; - Gear^.doStep:= @doStepRopeAfterAttack - end; + procedure WaitCollision; + begin + with HHGear^ do + begin + Message:= Message and not gm_Attack; + State:= State or gstMoving; + end; + RopePoints.Count:= 0; + Gear^.Elasticity:= _0; + Gear^.doStep:= @doStepRopeAfterAttack + end; begin HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; if ((HHGear^.State and gstHHDriven) = 0) - or (CheckGearDrowning(HHGear)) then - begin - DeleteMe; - exit - end; + or (CheckGearDrowning(HHGear)) then + begin + DeleteMe; + exit + end; 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; @@ -917,135 +917,135 @@ Gear^.dY:= mdY; ///// - tx:= HHGear^.X; - ty:= HHGear^.Y; + tx:= HHGear^.X; + ty:= HHGear^.Y; - if ((Gear^.Message and gm_Down) <> 0) and (Gear^.Elasticity < Gear^.Friction) then - if not (TestCollisionXwithGear(HHGear, hwSign(ropeDx)) - or TestCollisionYwithGear(HHGear, hwSign(ropeDy))) 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(ropeDx)) + or TestCollisionYwithGear(HHGear, hwSign(ropeDy))) then + Gear^.Elasticity:= Gear^.Elasticity + _0_3; - if ((Gear^.Message and gm_Up) <> 0) and (Gear^.Elasticity > _30) then - if not (TestCollisionXwithGear(HHGear, -hwSign(ropeDx)) - or TestCollisionYwithGear(HHGear, -hwSign(ropeDy))) then - Gear^.Elasticity:= Gear^.Elasticity - _0_3; + if ((Gear^.Message and gm_Up) <> 0) and (Gear^.Elasticity > _30) then + if not (TestCollisionXwithGear(HHGear, -hwSign(ropeDx)) + or TestCollisionYwithGear(HHGear, -hwSign(ropeDy))) then + Gear^.Elasticity:= Gear^.Elasticity - _0_3; - HHGear^.X:= Gear^.X + mdX * Gear^.Elasticity; - HHGear^.Y:= Gear^.Y + mdY * Gear^.Elasticity; + HHGear^.X:= Gear^.X + mdX * Gear^.Elasticity; + HHGear^.Y:= Gear^.Y + mdY * Gear^.Elasticity; - HHGear^.dX:= HHGear^.X - tx; - HHGear^.dY:= HHGear^.Y - ty; + HHGear^.dX:= HHGear^.X - tx; + HHGear^.dY:= HHGear^.Y - ty; //// - haveDivided:= false; - // check whether rope needs dividing - len:= _1 / Distance(ropeDx, ropeDy); // old rope pos - nx:= ropeDx * len; - ny:= ropeDy * len; + haveDivided:= false; + // check whether rope needs dividing + len:= _1 / Distance(ropeDx, ropeDy); // old rope pos + nx:= ropeDx * len; + ny:= ropeDy * len; - len:= Gear^.Elasticity - _0_3x70; - while len > _3 do - begin - lx:= hwRound(Gear^.X + mdX * len); - ly:= hwRound(Gear^.Y + mdY * len); - if ((ly and LAND_HEIGHT_MASK) = 0) and ((lx and LAND_WIDTH_MASK) = 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:= DxDy2Angle(Gear^.dY, Gear^.dX); - b:= (nx * HHGear^.dY) > (ny * HHGear^.dX); - dLen:= len - end; - with RopePoints.rounded[RopePoints.Count] do - begin - X:= hwRound(Gear^.X); - Y:= hwRound(Gear^.Y); - end; + len:= Gear^.Elasticity - _0_3x70; + while len > _3 do + begin + lx:= hwRound(Gear^.X + mdX * len); + ly:= hwRound(Gear^.Y + mdY * len); + if ((ly and LAND_HEIGHT_MASK) = 0) and ((lx and LAND_WIDTH_MASK) = 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:= DxDy2Angle(Gear^.dY, Gear^.dX); + b:= (nx * HHGear^.dY) > (ny * HHGear^.dX); + dLen:= len + end; + with RopePoints.rounded[RopePoints.Count] do + begin + X:= hwRound(Gear^.X); + Y:= hwRound(Gear^.Y); + end; - Gear^.X:= Gear^.X + nx * len; - Gear^.Y:= Gear^.Y + ny * len; - inc(RopePoints.Count); - TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true); - Gear^.Elasticity:= Gear^.Elasticity - len; - Gear^.Friction:= Gear^.Friction - len; - haveDivided:= true; - break - end; - len:= len - _0_3 // should be the same as increase step - end; + Gear^.X:= Gear^.X + nx * len; + Gear^.Y:= Gear^.Y + ny * len; + inc(RopePoints.Count); + TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true); + Gear^.Elasticity:= Gear^.Elasticity - len; + Gear^.Friction:= Gear^.Friction - len; + haveDivided:= true; + break + end; + len:= len - _0_3 // should be the same as increase step + end; if not haveDivided then - if RopePoints.Count > 0 then // check whether the last dividing point could be removed - begin - tx:= RopePoints.ar[Pred(RopePoints.Count)].X; - ty:= RopePoints.ar[Pred(RopePoints.Count)].Y; - 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 - end - end; + if RopePoints.Count > 0 then // check whether the last dividing point could be removed + begin + tx:= RopePoints.ar[Pred(RopePoints.Count)].X; + ty:= RopePoints.ar[Pred(RopePoints.Count)].Y; + 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 + end + end; haveCollision:= false; if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then - begin - HHGear^.dX:= -_0_6 * HHGear^.dX; - haveCollision:= true - end; + begin + HHGear^.dX:= -_0_6 * HHGear^.dX; + haveCollision:= true + end; if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) then - begin - HHGear^.dY:= -_0_6 * HHGear^.dY; - haveCollision:= true - end; + begin + HHGear^.dY:= -_0_6 * HHGear^.dY; + haveCollision:= true + end; if haveCollision - and (Gear^.Message and (gm_Left or gm_Right) <> 0) - and (Gear^.Message and (gm_Up or gm_Down) <> 0) then - begin - HHGear^.dX:= SignAs(hwAbs(HHGear^.dX) + _0_2, HHGear^.dX); - HHGear^.dY:= SignAs(hwAbs(HHGear^.dY) + _0_2, HHGear^.dY) - end; + and (Gear^.Message and (gm_Left or gm_Right) <> 0) + and (Gear^.Message and (gm_Up or gm_Down) <> 0) then + begin + HHGear^.dX:= SignAs(hwAbs(HHGear^.dX) + _0_2, HHGear^.dX); + HHGear^.dY:= SignAs(hwAbs(HHGear^.dY) + _0_2, HHGear^.dY) + end; len:= Distance(HHGear^.dX, HHGear^.dY); if len > _0_8 then - begin - len:= _0_8 / len; - HHGear^.dX:= HHGear^.dX * len; - HHGear^.dY:= HHGear^.dY * len; - end; + begin + len:= _0_8 / len; + HHGear^.dX:= HHGear^.dX * len; + HHGear^.dY:= HHGear^.dY * len; + end; if (Gear^.Message and gm_Attack) <> 0 then - if (Gear^.State and gsttmpFlag) <> 0 then - with PHedgehog(Gear^.Hedgehog)^ do - if Ammo^[CurSlot, CurAmmo].AmmoType <> amParachute then - WaitCollision - else - DeleteMe - else + if (Gear^.State and gsttmpFlag) <> 0 then + with PHedgehog(Gear^.Hedgehog)^ do + if Ammo^[CurSlot, CurAmmo].AmmoType <> amParachute then + WaitCollision + else + DeleteMe + else else - if (Gear^.State and gsttmpFlag) = 0 then - Gear^.State:= Gear^.State or gsttmpFlag; + if (Gear^.State and gsttmpFlag) = 0 then + Gear^.State:= Gear^.State or gsttmpFlag; end; procedure doStepRopeAttach(Gear: PGear); var HHGear: PGear; - tx, ty, tt: hwFloat; + tx, ty, tt: hwFloat; - procedure RemoveFromAmmo; - begin - if (Gear^.State and gstAttacked) = 0 then - begin - OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); - Gear^.State:= Gear^.State or gstAttacked - end; - ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^) - end; + procedure RemoveFromAmmo; + begin + if (Gear^.State and gstAttacked) = 0 then + begin + OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); + Gear^.State:= Gear^.State or gstAttacked + end; + ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^) + end; begin Gear^.X:= Gear^.X - Gear^.dX; @@ -1056,77 +1056,77 @@ DeleteCI(HHGear); if (HHGear^.State and gstMoving) <> 0 then - begin - if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX); - if HHGear^.dY.isNegative and TestCollisionYwithGear(HHGear, -1) then HHGear^.dY:= _0; + begin + if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX); + if HHGear^.dY.isNegative and TestCollisionYwithGear(HHGear, -1) then HHGear^.dY:= _0; - HHGear^.X:= HHGear^.X + HHGear^.dX; - Gear^.X:= Gear^.X + HHGear^.dX; + HHGear^.X:= HHGear^.X + HHGear^.dX; + Gear^.X:= Gear^.X + HHGear^.dX; - if TestCollisionYwithGear(HHGear, 1) then - begin - CheckHHDamage(HHGear); - HHGear^.dY:= _0; - //HHGear^.State:= HHGear^.State and not (gstHHJumping or gstHHHJump); - end else - begin - HHGear^.Y:= HHGear^.Y + HHGear^.dY; - Gear^.Y:= Gear^.Y + HHGear^.dY; - HHGear^.dY:= HHGear^.dY + cGravity; - end; - - tt:= Gear^.Elasticity; - tx:= _0; - ty:= _0; - while tt > _20 do - begin - if TestCollisionXwithXYShift(Gear, 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; - with HHGear^ do State:= State and not (gstAttacking or gstHHJumping or gstHHHJump); + if TestCollisionYwithGear(HHGear, 1) then + begin + CheckHHDamage(HHGear); + HHGear^.dY:= _0; + //HHGear^.State:= HHGear^.State and not (gstHHJumping or gstHHHJump); + end else + begin + HHGear^.Y:= HHGear^.Y + HHGear^.dY; + Gear^.Y:= Gear^.Y + HHGear^.dY; + HHGear^.dY:= HHGear^.dY + cGravity; + end; + + tt:= Gear^.Elasticity; + tx:= _0; + ty:= _0; + while tt > _20 do + begin + if TestCollisionXwithXYShift(Gear, 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; + with HHGear^ do State:= State and not (gstAttacking or gstHHJumping or gstHHHJump); - RemoveFromAmmo; + RemoveFromAmmo; - tt:= _0; - exit - end; - tx:= tx + Gear^.dX + Gear^.dX; - ty:= ty + Gear^.dY + Gear^.dY; - tt:= tt - _2; - end; - end; + tt:= _0; + exit + end; + 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^.Elasticity < _10 then - Gear^.Elasticity:= _10000 - else - begin - Gear^.doStep:= @doStepRopeWork; - with HHGear^ do State:= State and not (gstAttacking or gstHHJumping or gstHHHJump); + if Gear^.Elasticity < _10 then + Gear^.Elasticity:= _10000 + else + begin + Gear^.doStep:= @doStepRopeWork; + with HHGear^ do State:= State and not (gstAttacking or gstHHJumping or gstHHHJump); - RemoveFromAmmo; + RemoveFromAmmo; - exit - end; + exit + end; if (Gear^.Elasticity > Gear^.Friction) or ((Gear^.Message and gm_Attack) = 0) or ((HHGear^.State and gstHHDriven) = 0) or (HHGear^.Damage > 0) then - begin - with PHedgehog(Gear^.Hedgehog)^.Gear^ do - begin - State:= State and not gstAttacking; - Message:= Message and not gm_Attack - end; - DeleteGear(Gear) - end + begin + with PHedgehog(Gear^.Hedgehog)^.Gear^ do + begin + State:= State and not gstAttacking; + Message:= Message and not gm_Attack + end; + DeleteGear(Gear) + end end; procedure doStepRope(Gear: PGear); @@ -1141,10 +1141,10 @@ begin inc(Gear^.Timer); if Gear^.Timer > 64 then - begin - Gear^.Timer:= 0; - dec(Gear^.State) - end; + begin + 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) @@ -1155,11 +1155,11 @@ begin inc(Gear^.Timer); if Gear^.Timer > 75 then - begin - inc(Gear^.State); - Gear^.Timer:= 0; - if Gear^.State > 5 then DeleteGear(Gear) - end; + begin + inc(Gear^.State); + Gear^.Timer:= 0; + if Gear^.State > 5 then DeleteGear(Gear) + end; end; procedure doStepExplosion(Gear: PGear); @@ -1175,50 +1175,50 @@ procedure doStepMine(Gear: PGear); begin if (Gear^.State and gstMoving) <> 0 then - begin - DeleteCI(Gear); - doStepFallingGear(Gear); - if (Gear^.State and gstMoving) = 0 then - begin - AddGearCI(Gear); - Gear^.dX:= _0; - Gear^.dY:= _0 - end; - CalcRotationDirAngle(Gear); - AllInactive:= false - end else - if ((GameTicks and $3F) = 25) then - doStepFallingGear(Gear); + begin + DeleteCI(Gear); + doStepFallingGear(Gear); + if (Gear^.State and gstMoving) = 0 then + begin + AddGearCI(Gear); + Gear^.dX:= _0; + Gear^.dY:= _0 + end; + CalcRotationDirAngle(Gear); + AllInactive:= false + end else + if ((GameTicks and $3F) = 25) then + doStepFallingGear(Gear); if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then - if ((Gear^.State and gstAttacking) = 0) then - begin - if ((GameTicks and $1F) = 0) then - 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 - begin + if ((Gear^.State and gstAttacking) = 0) then + begin + if ((GameTicks and $1F) = 0) then + 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 + begin if ((Gear^.State and gstWait) <> 0) or (cMineDudPercent = 0) or - (getRandom(100) > cMineDudPercent) then + (getRandom(100) > cMineDudPercent) then begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); - DeleteGear(Gear) + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); + DeleteGear(Gear) end else begin - AddVisualGear(hwRound(Gear^.X) - 4 + Random(8), hwRound(Gear^.Y) - 4 - Random(4), vgtSmoke); - PlaySound(sndVaporize); + AddVisualGear(hwRound(Gear^.X) - 4 + Random(8), hwRound(Gear^.Y) - 4 - Random(4), vgtSmoke); + PlaySound(sndVaporize); Gear^.Health:= 0; end; - exit - end; - dec(Gear^.Timer); - end else // gsttmpFlag = 0 - if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag; + exit + end; + dec(Gear^.Timer); + end else // gsttmpFlag = 0 + if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag; end; //////////////////////////////////////////////////////////////////////////////// @@ -1228,13 +1228,13 @@ AllInactive:= false; if Gear^.Timer mod 166 = 0 then inc(Gear^.Tag); if Gear^.Timer = 1000 then // might need better timing - makeHogsWorry(Gear^.X, Gear^.Y, 75); + makeHogsWorry(Gear^.X, Gear^.Y, 75); if Gear^.Timer = 0 then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound); - DeleteGear(Gear); - exit - end; + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound); + DeleteGear(Gear); + exit + end; dec(Gear^.Timer); end; @@ -1247,7 +1247,7 @@ *) procedure doStepRollingBarrel(Gear: PGear); var i: LongInt; - particle: PVisualGear; + particle: PVisualGear; begin Gear^.State:= Gear^.State or gstAnimation; if ((Gear^.dX.QWordValue <> 0) or (Gear^.dY.QWordValue <> 0)) then @@ -1257,9 +1257,9 @@ if not Gear^.dY.isNegative and (Gear^.dY > _0_03) and TestCollisionYwithGear(Gear, 1) then begin inc(Gear^.Damage, hwRound(Gear^.dY * _30)); - for i:= min(12, hwRound(Gear^.dY*_10)) downto 0 do + for i:= min(12, hwRound(Gear^.dY*_10)) downto 0 do begin - particle:= AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); + particle:= AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX / 5) end end @@ -1272,7 +1272,7 @@ if Gear^.Damage <> 0 then PlaySound(sndGraveImpact); doStepFallingGear(Gear); CalcRotationDirAngle(Gear); - CheckGearDrowning(Gear) + CheckGearDrowning(Gear) end else AddGearCI(Gear); (* @@ -1281,7 +1281,7 @@ x:= hwRound(Gear^.X); y:= hwRound(Gear^.Y); if (((y+1) and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) then - if (Land[y+1, x] = 0) then + if (Land[y+1, x] = 0) then begin if (((y+1) and LAND_HEIGHT_MASK) = 0) and (((x+Gear^.Radius-2) and LAND_WIDTH_MASK) = 0) and (Land[y+1, x+Gear^.Radius-2] = 0) then Gear^.dX:= -_0_08 @@ -1307,25 +1307,25 @@ procedure doStepCase(Gear: PGear); var i, x, y: LongInt; - k: TGearType; - exBoom: boolean; - dX, dY: HWFloat; + k: TGearType; + exBoom: boolean; + dX, dY: HWFloat; begin k:= Gear^.Kind; exBoom:= false; if (Gear^.Message and gm_Destroy) > 0 then - begin - DeleteGear(Gear); - FreeActionsList; - SetAllToActive; // something (hh, mine, etc...) could be on top of the case - with CurrentHedgehog^ do - if Gear <> nil then Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); - exit - end; + begin + DeleteGear(Gear); + FreeActionsList; + SetAllToActive; // something (hh, mine, etc...) could be on top of the case + with CurrentHedgehog^ do + if Gear <> nil then Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); + exit + end; if k = gtExplosives then - begin + begin //if V > _0_03 then Gear^.State:= Gear^.State or gstAnimation; if hwAbs(Gear^.dX) > _0_15 then Gear^.doStep:= @doStepRollingBarrel; @@ -1334,60 +1334,60 @@ AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmoke) else AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmokeWhite); - dec(Gear^.Health, Gear^.Damage); - Gear^.Damage:= 0; - if Gear^.Health <= 0 then - exBoom:= true; - end; + dec(Gear^.Health, Gear^.Damage); + Gear^.Damage:= 0; + if Gear^.Health <= 0 then + exBoom:= true; + end; if (Gear^.Damage > 0) or exBoom then - begin - x:= hwRound(Gear^.X); - y:= hwRound(Gear^.Y); - DeleteGear(Gear); // <-- delete gear! + begin + x:= hwRound(Gear^.X); + y:= hwRound(Gear^.Y); + DeleteGear(Gear); // <-- delete gear! - if k = gtCase then - begin - doMakeExplosion(x, y, 25, EXPLAutoSound); - for i:= 0 to 63 do - AddGear(x, y, gtFlame, 0, _0, _0, 0); - end - else if k = gtExplosives then - begin - doMakeExplosion(x, y, 75, EXPLAutoSound); - for i:= 0 to 31 do - begin - dX:= AngleCos(i * 64) * _0_5 * (getrandom + _1); - dY:= AngleSin(i * 64) * _0_5 * (getrandom + _1); - AddGear(x, y, gtFlame, 0, dX, dY, 0); - AddGear(x, y, gtFlame, 0, -dX, -dY, 0)^.State:= gsttmpFlag; - end - end; - exit - end; + if k = gtCase then + begin + doMakeExplosion(x, y, 25, EXPLAutoSound); + for i:= 0 to 63 do + AddGear(x, y, gtFlame, 0, _0, _0, 0); + end + else if k = gtExplosives then + begin + doMakeExplosion(x, y, 75, EXPLAutoSound); + for i:= 0 to 31 do + begin + dX:= AngleCos(i * 64) * _0_5 * (getrandom + _1); + dY:= AngleSin(i * 64) * _0_5 * (getrandom + _1); + AddGear(x, y, gtFlame, 0, dX, dY, 0); + AddGear(x, y, gtFlame, 0, -dX, -dY, 0)^.State:= gsttmpFlag; + end + end; + exit + end; if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then - begin - AllInactive:= false; + begin + AllInactive:= false; Gear^.dY:= Gear^.dY + cGravity; Gear^.Y:= Gear^.Y + Gear^.dY; if (not Gear^.dY.isNegative) and (Gear^.dY > _0_001) then SetAllHHToActive; - if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0; - if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then - begin + if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0; + if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then + begin if (Gear^.dY > _0_02) and (k = gtExplosives) then inc(Gear^.Damage, hwRound(Gear^.dY * _30)); - if Gear^.dY > _0_2 then - for i:= min(12, hwRound(Gear^.dY*_10)) downto 0 do - AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); - Gear^.dY:= - Gear^.dY * Gear^.Elasticity; - if Gear^.dY > - _0_001 then Gear^.dY:= _0 - else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact) - end; - //if Gear^.dY > - _0_001 then Gear^.dY:= _0 - CheckGearDrowning(Gear); - end; + if Gear^.dY > _0_2 then + for i:= min(12, hwRound(Gear^.dY*_10)) downto 0 do + AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust); + Gear^.dY:= - Gear^.dY * Gear^.Elasticity; + if Gear^.dY > - _0_001 then Gear^.dY:= _0 + else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact) + end; + //if Gear^.dY > - _0_001 then Gear^.dY:= _0 + CheckGearDrowning(Gear); + end; if (Gear^.dY.QWordValue = 0) then AddGearCI(Gear) else if (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear) @@ -1398,36 +1398,36 @@ procedure doStepTarget(Gear: PGear); begin if (Gear^.Timer = 0) and (Gear^.Tag = 0) then - PlaySound(sndWarp); + PlaySound(sndWarp); if (Gear^.Tag = 0) and (Gear^.Timer < 1000) then - inc(Gear^.Timer) + inc(Gear^.Timer) else if Gear^.Tag = 1 then - begin - Gear^.Tag:= 2; - if (TrainingFlags and tfTimeTrial) <> 0 then - begin - inc(TurnTimeLeft, TrainingTimeInc); - - if TrainingTimeInc > TrainingTimeInM then - dec(TrainingTimeInc, TrainingTimeInD); - if TurnTimeLeft > TrainingTimeMax then - TurnTimeLeft:= TrainingTimeMax; - end; - end + begin + Gear^.Tag:= 2; + if (TrainingFlags and tfTimeTrial) <> 0 then + begin + inc(TurnTimeLeft, TrainingTimeInc); + + if TrainingTimeInc > TrainingTimeInM then + dec(TrainingTimeInc, TrainingTimeInD); + if TurnTimeLeft > TrainingTimeMax then + TurnTimeLeft:= TrainingTimeMax; + end; + end else if Gear^.Tag = 2 then - if Gear^.Timer > 0 then - dec(Gear^.Timer) - else - begin - if (TrainingFlags and tfTargetRespawn) <> 0 then - begin - TrainingTargetGear:= AddGear(0, 0, gtTarget, 0, _0, _0, 0); - FindPlace(TrainingTargetGear, false, 0, LAND_WIDTH); - end; - DeleteGear(Gear); - exit; - end; + if Gear^.Timer > 0 then + dec(Gear^.Timer) + else + begin + if (TrainingFlags and tfTargetRespawn) <> 0 then + begin + TrainingTargetGear:= AddGear(0, 0, gtTarget, 0, _0, _0, 0); + FindPlace(TrainingTargetGear, false, 0, LAND_WIDTH); + end; + DeleteGear(Gear); + exit; + end; doStepCase(Gear) end; @@ -1438,10 +1438,10 @@ AllInactive:= false; dec(Gear^.Timer); if Gear^.Timer = 0 then - begin - DeleteGear(Gear); - AfterAttack - end + begin + DeleteGear(Gear); + AfterAttack + end end; procedure doStepShover(Gear: PGear); @@ -1468,10 +1468,10 @@ DeleteCI(HHGear); for i:= 0 to 3 do - begin - AmmoShove(Gear, 30, 25); - Gear^.X:= Gear^.X + Gear^.dX * 5 - end; + begin + AmmoShove(Gear, 30, 25); + Gear^.X:= Gear^.X + Gear^.dX * 5 + end; HHGear^.State:= HHGear^.State and not gstNoDamage; Gear^.Timer:= 250; @@ -1485,26 +1485,26 @@ if (Gear^.State and gsttmpFlag) = 0 then AllInactive:= false; if not TestCollisionYwithGear(Gear, 1) then - begin + begin AllInactive:= false; - if hwAbs(Gear^.dX) > _0_01 then - Gear^.dX:= Gear^.dX * _0_995; - if (Gear^.State and gsttmpFlag) <> 0 then Gear^.dY:= Gear^.dY + _2*cGravity else - Gear^.dY:= Gear^.dY + cGravity; - if hwAbs(Gear^.dY) > _0_2 then Gear^.dY:= Gear^.dY * _0_995; + if hwAbs(Gear^.dX) > _0_01 then + Gear^.dX:= Gear^.dX * _0_995; + if (Gear^.State and gsttmpFlag) <> 0 then Gear^.dY:= Gear^.dY + _2*cGravity else + Gear^.dY:= Gear^.dY + cGravity; + if hwAbs(Gear^.dY) > _0_2 then Gear^.dY:= Gear^.dY * _0_995; - if (Gear^.State and gsttmpFlag) <> 0 then Gear^.X:= Gear^.X + Gear^.dX else - Gear^.X:= Gear^.X + Gear^.dX + cWindSpeed * 640; - Gear^.Y:= Gear^.Y + Gear^.dY; + if (Gear^.State and gsttmpFlag) <> 0 then Gear^.X:= Gear^.X + Gear^.dX else + Gear^.X:= Gear^.X + Gear^.dX + cWindSpeed * 640; + Gear^.Y:= Gear^.Y + Gear^.dY; - if (hwRound(Gear^.Y) > cWaterLine) then - begin - for i:= 0 to 3 do - AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 16 + Random(16), vgtSteam); - PlaySound(sndVaporize); - DeleteGear(Gear); - exit - end + if (hwRound(Gear^.Y) > cWaterLine) then + begin + for i:= 0 to 3 do + AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 16 + Random(16), vgtSteam); + PlaySound(sndVaporize); + DeleteGear(Gear); + exit + end end else begin if (Gear^.State and gsttmpFlag) <> 0 then begin @@ -1512,7 +1512,7 @@ AmmoShove(Gear, 2, 30); Gear^.Radius:= 1 end; - if Gear^.Timer > 0 then + if Gear^.Timer > 0 then begin dec(Gear^.Timer); inc(Gear^.Damage) @@ -1540,7 +1540,7 @@ AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), hwRound(Gear^.Y) - 2, vgtSmoke); end; // This one is interesting. I think I understand the purpose, but I wonder if a bit more fuzzy of kicking could be done with getrandom. - Gear^.Timer:= 100 - Gear^.Tag * 3; + Gear^.Timer:= 100 - Gear^.Tag * 3; if (Gear^.Damage > 3000+Gear^.Tag*1500) then Gear^.Health:= 0 end end @@ -1568,31 +1568,31 @@ begin AllInactive:= false; if ((Gear^.Message and gm_Destroy) <> 0) then - begin - DeleteGear(Gear); - AfterAttack; - exit - end; + begin + DeleteGear(Gear); + AfterAttack; + exit + end; HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then - begin - Gear^.Tag:= hwRound(HHGear^.Y); - DrawTunnel(HHGear^.X - int2hwFloat(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 - end; + begin + Gear^.Tag:= hwRound(HHGear^.Y); + DrawTunnel(HHGear^.X - int2hwFloat(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 + end; HHGear^.dY:= HHGear^.dY + cGravity; if not (HHGear^.dY.isNegative) then - begin - HHGear^.State:= HHGear^.State or gstMoving; - DeleteGear(Gear); - AfterAttack; - exit - end; + begin + HHGear^.State:= HHGear^.State or gstMoving; + DeleteGear(Gear); + AfterAttack; + exit + end; if CheckLandValue(hwRound(HHGear^.X), hwRound(HHGear^.Y + HHGear^.dY + SignAs(_6,Gear^.dY)), COLOR_INDESTRUCTIBLE) then HHGear^.Y:= HHGear^.Y + HHGear^.dY @@ -1628,24 +1628,24 @@ inc(Gear^.Timer); if TestCollisionYwithGear(HHGear, 1) - or ((HHGear^.State and gstHHDriven) = 0) - or CheckGearDrowning(HHGear) - or ((Gear^.Message and gm_Attack) <> 0) then - begin - with HHGear^ do - begin - Message:= 0; - SetLittle(dX); - dY:= _0; - State:= State or gstMoving; - end; - DeleteGear(Gear); - isCursorVisible:= false; - exit - end; + or ((HHGear^.State and gstHHDriven) = 0) + or CheckGearDrowning(HHGear) + or ((Gear^.Message and gm_Attack) <> 0) then + begin + with HHGear^ do + begin + Message:= 0; + SetLittle(dX); + dY:= _0; + State:= State or gstMoving; + end; + DeleteGear(Gear); + isCursorVisible:= false; + exit + end; if not TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then - HHGear^.X:= HHGear^.X + cWindSpeed * 200; + 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; @@ -1684,19 +1684,19 @@ Gear^.X:= Gear^.X + cAirPlaneSpeed * Gear^.Tag; 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: FollowGear:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0); - 1: FollowGear:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMine, 0, cBombsSpeed * Gear^.Tag, _0, 0); - 2: for i:= -19 to 19 do - FollowGear:= AddGear(hwRound(Gear^.X) + i div 3, hwRound(Gear^.Y), gtFlame, 0, _0_001 * i, _0, 0); - end; - Gear^.dX:= Gear^.dX + int2hwFloat(30 * Gear^.Tag) - end; + begin + dec(Gear^.Health); + case Gear^.State of + 0: FollowGear:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0); + 1: FollowGear:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMine, 0, cBombsSpeed * Gear^.Tag, _0, 0); + 2: for i:= -19 to 19 do + FollowGear:= AddGear(hwRound(Gear^.X) + i div 3, hwRound(Gear^.Y), gtFlame, 0, _0_001 * i, _0, 0); + end; + Gear^.dX:= Gear^.dX + int2hwFloat(30 * Gear^.Tag) + end; if (GameTicks and $3F) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); if (hwRound(Gear^.X) > (LAND_WIDTH+1024)) or (hwRound(Gear^.X) < -1024) then DeleteGear(Gear) end; @@ -1706,21 +1706,21 @@ AllInactive:= false; if Gear^.X.QWordValue = 0 then - begin - Gear^.Tag:= 1; - Gear^.X:= -_1024; - end + begin + Gear^.Tag:= 1; + Gear^.X:= -_1024; + end else - begin - Gear^.Tag:= -1; - Gear^.X:= int2hwFloat(LAND_WIDTH + 1024); - end; + begin + Gear^.Tag:= -1; + Gear^.X:= int2hwFloat(LAND_WIDTH + 1024); + end; Gear^.Y:= int2hwFloat(topY-300); Gear^.dX:= int2hwFloat(TargetPoint.X - 5 * Gear^.Tag * 15); if (int2hwFloat(TargetPoint.Y) - Gear^.Y > _0) and (Gear^.State <> 2) then - Gear^.dX:= Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(TargetPoint.Y) - Gear^.Y) * 2 / cGravity) * Gear^.Tag; + Gear^.dX:= Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(TargetPoint.Y) - Gear^.Y) * 2 / cGravity) * Gear^.Tag; Gear^.Health:= 6; Gear^.doStep:= @doStepAirAttackWork; @@ -1733,13 +1733,13 @@ AllInactive:= false; doStepFallingGear(Gear); if (Gear^.State and gstCollision) <> 0 then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound); - DeleteGear(Gear); - exit - end; + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound); + DeleteGear(Gear); + exit + end; if (GameTicks and $3F) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) end; //////////////////////////////////////////////////////////////////////////////// @@ -1760,20 +1760,20 @@ not TryPlaceOnLand(TargetPoint.X - SpritesData[sprAmGirder].Width div 2, TargetPoint.Y - SpritesData[sprAmGirder].Height div 2, sprAmGirder, Gear^.State, true) then - begin + begin PlaySound(sndDenied); - HHGear^.Message:= HHGear^.Message and not gm_Attack; - HHGear^.State:= HHGear^.State and not gstAttacking; - HHGear^.State:= HHGear^.State or gstHHChooseTarget; - isCursorVisible:= true; - DeleteGear(Gear) - end + HHGear^.Message:= HHGear^.Message and not gm_Attack; + HHGear^.State:= HHGear^.State and not gstAttacking; + HHGear^.State:= HHGear^.State or gstHHChooseTarget; + isCursorVisible:= true; + DeleteGear(Gear) + end else begin PlaySound(sndPlaced); - DeleteGear(Gear); + DeleteGear(Gear); OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^) - end; + end; HHGear^.State:= HHGear^.State and not (gstAttacking or gstAttacked); HHGear^.Message:= HHGear^.Message and not gm_Attack; @@ -1789,23 +1789,23 @@ HHGear^.Y:= HHGear^.Y + HHGear^.dY; // hedgehog falling to collect cases HHGear^.dY:= HHGear^.dY + cGravity; if TestCollisionYwithGear(HHGear, 1) - or CheckGearDrowning(HHGear) then - begin - DeleteGear(Gear); - AfterAttack - end + or CheckGearDrowning(HHGear) then + begin + DeleteGear(Gear); + AfterAttack + end end; procedure doStepTeleportAnim(Gear: PGear); begin inc(Gear^.Timer); if Gear^.Timer = 65 then - begin - Gear^.Timer:= 0; - inc(Gear^.Pos); - if Gear^.Pos = 11 then - Gear^.doStep:= @doStepTeleportAfter - end; + begin + Gear^.Timer:= 0; + inc(Gear^.Pos); + if Gear^.Pos = 11 then + Gear^.doStep:= @doStepTeleportAfter + end; end; procedure doStepTeleport(Gear: PGear); @@ -1817,25 +1817,25 @@ if not TryPlaceOnLand(TargetPoint.X - SpritesData[sprHHTelepMask].Width div 2, TargetPoint.Y - SpritesData[sprHHTelepMask].Height div 2, sprHHTelepMask, 0, false) then - begin - HHGear^.Message:= HHGear^.Message and not gm_Attack; - HHGear^.State:= HHGear^.State and not gstAttacking; - HHGear^.State:= HHGear^.State or gstHHChooseTarget; - DeleteGear(Gear); - isCursorVisible:= true; - PlaySound(sndDenied) - end - else begin - DeleteCI(HHGear); - SetAllHHToActive; - Gear^.doStep:= @doStepTeleportAnim; - Gear^.X:= HHGear^.X; - Gear^.Y:= HHGear^.Y; - HHGear^.X:= int2hwFloat(TargetPoint.X); - HHGear^.Y:= int2hwFloat(TargetPoint.Y); - HHGear^.State:= HHGear^.State or gstMoving; - playSound(sndWarp) - end; + begin + HHGear^.Message:= HHGear^.Message and not gm_Attack; + HHGear^.State:= HHGear^.State and not gstAttacking; + HHGear^.State:= HHGear^.State or gstHHChooseTarget; + DeleteGear(Gear); + isCursorVisible:= true; + PlaySound(sndDenied) + end + else begin + DeleteCI(HHGear); + SetAllHHToActive; + Gear^.doStep:= @doStepTeleportAnim; + Gear^.X:= HHGear^.X; + Gear^.Y:= HHGear^.Y; + HHGear^.X:= int2hwFloat(TargetPoint.X); + HHGear^.Y:= int2hwFloat(TargetPoint.Y); + HHGear^.State:= HHGear^.State or gstMoving; + playSound(sndWarp) + end; TargetPoint.X:= NoPointX; end; @@ -1848,49 +1848,49 @@ AllInactive:= false; if ((Gear^.Message and not gm_Switch) <> 0) or (TurnTimeLeft = 0) then - begin - HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; - Msg:= Gear^.Message and not gm_Switch; - DeleteGear(Gear); - OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); - ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); + begin + HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; + Msg:= Gear^.Message and not gm_Switch; + DeleteGear(Gear); + OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); + ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); - HHGear:= CurrentHedgehog^.Gear; - ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); - HHGear^.Message:= Msg; - exit - end; + HHGear:= CurrentHedgehog^.Gear; + ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); + HHGear^.Message:= Msg; + exit + end; if (Gear^.Message and gm_Switch) <> 0 then - begin - HHGear:= CurrentHedgehog^.Gear; - HHGear^.Message:= HHGear^.Message and not gm_Switch; - Gear^.Message:= Gear^.Message and not gm_Switch; - State:= HHGear^.State; - HHGear^.State:= 0; - HHGear^.Active:= false; - HHGear^.Z:= cHHZ; - RemoveGearFromList(HHGear); - InsertGearToList(HHGear); + begin + HHGear:= CurrentHedgehog^.Gear; + HHGear^.Message:= HHGear^.Message and not gm_Switch; + Gear^.Message:= Gear^.Message and not gm_Switch; + State:= HHGear^.State; + HHGear^.State:= 0; + HHGear^.Active:= false; + HHGear^.Z:= cHHZ; + RemoveGearFromList(HHGear); + InsertGearToList(HHGear); - PlaySound(sndSwitchHog); - - repeat - CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.HedgehogsNumber); - until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil); + PlaySound(sndSwitchHog); + + repeat + CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.HedgehogsNumber); + until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil); - CurrentHedgehog:= @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]; + CurrentHedgehog:= @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]; - HHGear:= CurrentHedgehog^.Gear; - HHGear^.State:= State; - HHGear^.Active:= true; - FollowGear:= HHGear; - HHGear^.Z:= cCurrHHZ; - RemoveGearFromList(HHGear); - InsertGearToList(HHGear); - Gear^.X:= HHGear^.X; - Gear^.Y:= HHGear^.Y - end; + HHGear:= CurrentHedgehog^.Gear; + HHGear^.State:= State; + HHGear^.Active:= true; + FollowGear:= HHGear; + HHGear^.Z:= cCurrHHZ; + RemoveGearFromList(HHGear); + InsertGearToList(HHGear); + Gear^.X:= HHGear^.X; + Gear^.Y:= HHGear^.Y + end; end; procedure doStepSwitcher(Gear: PGear); @@ -1900,10 +1900,10 @@ HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; with HHGear^ do - begin - State:= State and not gstAttacking; - Message:= Message and not gm_Attack - end + begin + State:= State and not gstAttacking; + Message:= Message and not gm_Attack + end end; //////////////////////////////////////////////////////////////////////////////// @@ -1918,24 +1918,24 @@ doStepFallingGear(Gear); if (Gear^.State and gstCollision) <> 0 then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound); + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound); - Gear^.dX.isNegative:= not dxn; - Gear^.dY.isNegative:= not dyn; - for i:= 0 to 4 do - begin - dX:= Gear^.dX + (GetRandom - _0_5) * _0_03; - dY:= Gear^.dY + (GetRandom - _0_5) * _0_03; - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 25); - end; + Gear^.dX.isNegative:= not dxn; + Gear^.dY.isNegative:= not dyn; + for i:= 0 to 4 do + begin + dX:= Gear^.dX + (GetRandom - _0_5) * _0_03; + dY:= Gear^.dY + (GetRandom - _0_5) * _0_03; + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 25); + end; - DeleteGear(Gear); - exit - end; + DeleteGear(Gear); + exit + end; if (GameTicks and $3F) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) end; //////////////////////////////////////////////////////////////////////////////// @@ -1952,47 +1952,47 @@ i:= 2; repeat - Gear^.X:= Gear^.X + HHGear^.dX; - Gear^.Y:= Gear^.Y + HHGear^.dY; - HHGear^.X:= Gear^.X; - HHGear^.Y:= Gear^.Y; + Gear^.X:= Gear^.X + HHGear^.dX; + Gear^.Y:= Gear^.Y + HHGear^.dY; + HHGear^.X:= Gear^.X; + HHGear^.Y:= Gear^.Y; - inc(Gear^.Damage, 2); + inc(Gear^.Damage, 2); -// if TestCollisionXwithGear(HHGear, hwSign(Gear^.dX)) -// or TestCollisionYwithGear(HHGear, hwSign(Gear^.dY)) then inc(Gear^.Damage, 3); +// if TestCollisionXwithGear(HHGear, hwSign(Gear^.dX)) +// or TestCollisionYwithGear(HHGear, hwSign(Gear^.dY)) then inc(Gear^.Damage, 3); - dec(i) + dec(i) until (i = 0) or (Gear^.Damage > Gear^.Health); inc(upd); if upd > 3 then - begin - if Gear^.Health < 1500 then Gear^.Pos:= 2; + begin + if Gear^.Health < 1500 then Gear^.Pos:= 2; - AmmoShove(Gear, 30, 40); + AmmoShove(Gear, 30, 40); - DrawTunnel(HHGear^.X - HHGear^.dX * 10, - HHGear^.Y - _2 - HHGear^.dY * 10 + hwAbs(HHGear^.dY) * 2, - HHGear^.dX, - HHGear^.dY, - 20 + cHHRadius * 2, - cHHRadius * 2 + 6); + DrawTunnel(HHGear^.X - HHGear^.dX * 10, + HHGear^.Y - _2 - HHGear^.dY * 10 + hwAbs(HHGear^.dY) * 2, + HHGear^.dX, + HHGear^.dY, + 20 + cHHRadius * 2, + cHHRadius * 2 + 6); - upd:= 0 - end; + upd:= 0 + end; if Gear^.Health < Gear^.Damage then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound); - AfterAttack; - DeleteGear(Gear); - DeleteGear(HHGear); - end else - begin - dec(Gear^.Health, Gear^.Damage); - Gear^.Damage:= 0 - end + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound); + AfterAttack; + DeleteGear(Gear); + DeleteGear(HHGear); + end else + begin + dec(Gear^.Health, Gear^.Damage); + Gear^.Damage:= 0 + end end; procedure doStepKamikazeIdle(Gear: PGear); @@ -2000,11 +2000,11 @@ AllInactive:= false; dec(Gear^.Timer); if Gear^.Timer = 0 then - begin - Gear^.Pos:= 1; - PlaySound(sndKamikaze, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack); - Gear^.doStep:= @doStepKamikazeWork - end + begin + Gear^.Pos:= 1; + PlaySound(sndKamikaze, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack); + Gear^.doStep:= @doStepKamikazeWork + end end; procedure doStepKamikaze(Gear: PGear); @@ -2029,7 +2029,7 @@ const cakeh = 27; cakeDmg = 75; var CakePoints: array[0..Pred(cakeh)] of record x, y: hwFloat; end; - CakeI: Longword; + CakeI: Longword; procedure doStepCakeExpl(Gear: PGear); begin @@ -2045,7 +2045,7 @@ procedure doStepCakeDown(Gear: PGear); var gi: PGear; - dmg: LongInt; + dmg: LongInt; begin AllInactive:= false; @@ -2054,39 +2054,39 @@ Gear^.Tag:= 0; if Gear^.Pos = 0 then - begin - gi:= GearsList; - while gi <> nil do - begin - dmg:= cakeDmg * 2 - hwRound(Distance(gi^.X - Gear^.X, gi^.Y - Gear^.Y)); - if (dmg > 1) and (gi^.Kind = gtHedgehog) then + begin + gi:= GearsList; + while gi <> nil do + begin + dmg:= cakeDmg * 2 - hwRound(Distance(gi^.X - Gear^.X, gi^.Y - Gear^.Y)); + if (dmg > 1) and (gi^.Kind = gtHedgehog) then if (CurrentHedgehog^.Gear = gi) and (not gi^.Invulnerable) then - gi^.State:= gi^.State or gstLoser + gi^.State:= gi^.State or gstLoser else - gi^.State:= gi^.State or gstWinner; - gi:= gi^.NextGear - end; - Gear^.doStep:= @doStepCakeExpl; - PlaySound(sndCake) - end else dec(Gear^.Pos) + gi^.State:= gi^.State or gstWinner; + gi:= gi^.NextGear + end; + Gear^.doStep:= @doStepCakeExpl; + PlaySound(sndCake) + end else dec(Gear^.Pos) end; procedure doStepCakeWork(Gear: PGear); const dirs: array[0..3] of TPoint = ((x: 0; y: -1), (x: 1; y: 0),(x: 0; y: 1),(x: -1; y: 0)); var xx, yy, xxn, yyn: LongInt; - da: LongInt; - tdx, tdy: hwFloat; + da: LongInt; + tdx, tdy: hwFloat; - procedure PrevAngle; - begin - Gear^.Angle:= (LongInt(Gear^.Angle) + 4 - dA) mod 4 - end; + procedure PrevAngle; + begin + Gear^.Angle:= (LongInt(Gear^.Angle) + 4 - dA) mod 4 + end; - procedure NextAngle; - begin - Gear^.Angle:= (LongInt(Gear^.Angle) + 4 + dA) mod 4 - end; + procedure NextAngle; + begin + Gear^.Angle:= (LongInt(Gear^.Angle) + 4 + dA) mod 4 + end; begin AllInactive:= false; @@ -2101,49 +2101,49 @@ yyn:= dirs[(LongInt(Gear^.Angle) + 4 + dA) mod 4].y; if (xx = 0) then - if TestCollisionYwithGear(Gear, yy) then - PrevAngle - else begin - Gear^.Tag:= 0; - Gear^.Y:= Gear^.Y + int2hwFloat(yy); - if not TestCollisionXwithGear(Gear, xxn) then - begin - Gear^.X:= Gear^.X + int2hwFloat(xxn); - NextAngle - end; - end; + if TestCollisionYwithGear(Gear, yy) then + PrevAngle + else begin + Gear^.Tag:= 0; + Gear^.Y:= Gear^.Y + int2hwFloat(yy); + if not TestCollisionXwithGear(Gear, xxn) then + begin + Gear^.X:= Gear^.X + int2hwFloat(xxn); + NextAngle + end; + end; if (yy = 0) then - if TestCollisionXwithGear(Gear, xx) then - PrevAngle - else begin - Gear^.Tag:= 0; - Gear^.X:= Gear^.X + int2hwFloat(xx); - if not TestCollisionYwithGear(Gear, yyn) then - begin - Gear^.Y:= Gear^.Y + int2hwFloat(yyn); - NextAngle - end; - end; + if TestCollisionXwithGear(Gear, xx) then + PrevAngle + else begin + Gear^.Tag:= 0; + Gear^.X:= Gear^.X + int2hwFloat(xx); + if not TestCollisionYwithGear(Gear, yyn) then + begin + Gear^.Y:= Gear^.Y + int2hwFloat(yyn); + NextAngle + end; + end; if Gear^.Tag = 0 then - begin - CakeI:= (CakeI + 1) mod cakeh; - tdx:= CakePoints[CakeI].x - Gear^.X; - tdy:= - CakePoints[CakeI].y + Gear^.Y; - CakePoints[CakeI].x:= Gear^.X; - CakePoints[CakeI].y:= Gear^.Y; - Gear^.DirAngle:= DxDy2Angle(tdx, tdy); - end; + begin + CakeI:= (CakeI + 1) mod cakeh; + tdx:= CakePoints[CakeI].x - Gear^.X; + tdy:= - CakePoints[CakeI].y + Gear^.Y; + CakePoints[CakeI].x:= Gear^.X; + CakePoints[CakeI].y:= Gear^.Y; + Gear^.DirAngle:= DxDy2Angle(tdx, tdy); + end; dec(Gear^.Health); Gear^.Timer:= Gear^.Health*10; // This is not seconds, but at least it is *some* feedback if (Gear^.Health = 0) or ((Gear^.Message and gm_Attack) <> 0) then - begin - FollowGear:= Gear; + begin + FollowGear:= Gear; Gear^.RenderTimer:= false; - Gear^.doStep:= @doStepCakeDown - end + Gear^.doStep:= @doStepCakeDown + end end; procedure doStepCakeUp(Gear: PGear); @@ -2156,15 +2156,15 @@ Gear^.Tag:= 0; if Gear^.Pos = 6 then - begin - for i:= 0 to Pred(cakeh) do - begin - CakePoints[i].x:= Gear^.X; - CakePoints[i].y:= Gear^.Y - end; - CakeI:= 0; - Gear^.doStep:= @doStepCakeWork - end else inc(Gear^.Pos) + begin + for i:= 0 to Pred(cakeh) do + begin + CakePoints[i].x:= Gear^.X; + CakePoints[i].y:= Gear^.Y + end; + CakeI:= 0; + Gear^.doStep:= @doStepCakeWork + end else inc(Gear^.Pos) end; procedure doStepCakeFall(Gear: PGear); @@ -2173,12 +2173,12 @@ Gear^.dY:= Gear^.dY + cGravity; if TestCollisionYwithGear(Gear, 1) then - Gear^.doStep:= @doStepCakeUp + Gear^.doStep:= @doStepCakeUp else - begin - Gear^.Y:= Gear^.Y + Gear^.dY; - if CheckGearDrowning(Gear) then AfterAttack - end + begin + Gear^.Y:= Gear^.Y + Gear^.dY; + if CheckGearDrowning(Gear) then AfterAttack + end end; procedure doStepCake(Gear: PGear); @@ -2207,22 +2207,22 @@ y:= hwRound(Gear^.Y); if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) then - if (Land[y, x] <> 0) then - begin - Gear^.dX.isNegative:= not Gear^.dX.isNegative; - Gear^.dY.isNegative:= not Gear^.dY.isNegative; - Gear^.dX:= Gear^.dX * _1_5; - Gear^.dY:= Gear^.dY * _1_5 - _0_3; - AmmoShove(Gear, 0, 40); - AfterAttack; - DeleteGear(Gear) - end - else + if (Land[y, x] <> 0) then + begin + Gear^.dX.isNegative:= not Gear^.dX.isNegative; + Gear^.dY.isNegative:= not Gear^.dY.isNegative; + Gear^.dX:= Gear^.dX * _1_5; + Gear^.dY:= Gear^.dY * _1_5 - _0_3; + AmmoShove(Gear, 0, 40); + AfterAttack; + DeleteGear(Gear) + end + else else - begin - AfterAttack; - DeleteGear(Gear) - end + begin + AfterAttack; + DeleteGear(Gear) + end end; procedure doStepSeductionWear(Gear: PGear); @@ -2230,15 +2230,15 @@ AllInactive:= false; inc(Gear^.Timer); if Gear^.Timer > 250 then - begin - Gear^.Timer:= 0; - inc(Gear^.Pos); - if Gear^.Pos = 5 then - PlaySound(sndYoohoo, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack) - end; + begin + Gear^.Timer:= 0; + inc(Gear^.Pos); + if Gear^.Pos = 5 then + PlaySound(sndYoohoo, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack) + end; if Gear^.Pos = 14 then - Gear^.doStep:= @doStepSeductionWork + Gear^.doStep:= @doStepSeductionWork end; procedure doStepSeduction(Gear: PGear); @@ -2256,43 +2256,43 @@ inc(Gear^.Timer); if Gear^.Timer = 17 then - Gear^.Timer:= 0 + Gear^.Timer:= 0 else - exit; + exit; if cWaterLine > 0 then - begin - dec(cWaterLine); - for i:= 0 to LAND_WIDTH - 1 do - Land[cWaterLine, i]:= 0; - SetAllToActive - end; + begin + dec(cWaterLine); + for i:= 0 to LAND_WIDTH - 1 do + Land[cWaterLine, i]:= 0; + SetAllToActive + end; inc(Gear^.Tag); if (Gear^.Tag = 47) or (cWaterLine = 0) then - DeleteGear(Gear) + DeleteGear(Gear) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepDrillDrilling(Gear: PGear); var t: PGearArray; - ox, oy: hwFloat; + ox, oy: hwFloat; begin AllInactive:= false; if (Gear^.Timer > 0) and ((Gear^.Timer mod 10) = 0) then - begin - ox:= Gear^.X; - oy:= Gear^.Y; - Gear^.X:= Gear^.X + Gear^.dX; - Gear^.Y:= Gear^.Y + Gear^.dY; - DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 2, 6); + begin + ox:= Gear^.X; + oy:= Gear^.Y; + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.Y:= Gear^.Y + Gear^.dY; + DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 2, 6); if(CheckGearDrowning(Gear)) then begin StopSound(Gear^.SoundChannel); - exit + exit end - end; + end; t:= CheckGearsCollision(Gear); //fixes drill not exploding when touching HH bug if (Gear^.Timer = 0) @@ -2300,20 +2300,20 @@ or (not TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) or (Land[hwRound(Gear^.Y), hwRound(Gear^.X)] = COLOR_INDESTRUCTIBLE) then - begin //out of time or exited ground + begin //out of time or exited ground StopSound(Gear^.SoundChannel); - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); - DeleteGear(Gear); - exit - end; + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); + DeleteGear(Gear); + exit + end; dec(Gear^.Timer); end; procedure doStepDrill(Gear: PGear); var t: PGearArray; - oldDx, oldDy: hwFloat; - t2: hwFloat; + oldDx, oldDy: hwFloat; + t2: hwFloat; begin AllInactive:= false; @@ -2324,56 +2324,56 @@ doStepFallingGear(Gear); if (GameTicks and $3F) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); if ((Gear^.State and gstCollision) <> 0) then begin //hit - Gear^.dX:= oldDx; - Gear^.dY:= oldDy; + Gear^.dX:= oldDx; + Gear^.dY:= oldDy; - t:= CheckGearsCollision(Gear); - if (t^.Count = 0) then begin //hit the ground not the HH - t2 := _0_5 / Distance(Gear^.dX, Gear^.dY); - Gear^.dX:= Gear^.dX * t2; - Gear^.dY:= Gear^.dY * t2; - end else begin //explode right on contact with HH - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); - DeleteGear(Gear); - exit; - end; + t:= CheckGearsCollision(Gear); + if (t^.Count = 0) then begin //hit the ground not the HH + t2 := _0_5 / Distance(Gear^.dX, Gear^.dY); + Gear^.dX:= Gear^.dX * t2; + Gear^.dY:= Gear^.dY * t2; + end else begin //explode right on contact with HH + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); + DeleteGear(Gear); + exit; + end; Gear^.SoundChannel:= LoopSound(sndPickhammer); - Gear^.doStep:= @doStepDrillDrilling; - dec(Gear^.Timer) - end + Gear^.doStep:= @doStepDrillDrilling; + dec(Gear^.Timer) + end end; //////////////////////////////////////////////////////////////////////////////// procedure doStepBallgunWork(Gear: PGear); var HHGear: PGear; - rx, ry: hwFloat; + rx, ry: hwFloat; begin - AllInactive:= false; - dec(Gear^.Timer); - HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; - HedgehogChAngle(HHGear); - if (Gear^.Timer mod 100) = 0 then - begin - rx:= rndSign(getRandom * _0_1); - ry:= rndSign(getRandom * _0_1); + AllInactive:= false; + dec(Gear^.Timer); + HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; + HedgehogChAngle(HHGear); + if (Gear^.Timer mod 100) = 0 then + begin + rx:= rndSign(getRandom * _0_1); + ry:= rndSign(getRandom * _0_1); - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtBall, 0, - SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, - AngleCos(HHGear^.Angle) * ( - _0_8) + ry, - 0); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtBall, 0, + SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, + AngleCos(HHGear^.Angle) * ( - _0_8) + ry, + 0); - PlaySound(sndGun); - end; + PlaySound(sndGun); + end; - if (Gear^.Timer = 0) or (HHGear^.Damage <> 0) then - begin - DeleteGear(Gear); - AfterAttack - end + if (Gear^.Timer = 0) or (HHGear^.Damage <> 0) then + begin + DeleteGear(Gear); + AfterAttack + end end; procedure doStepBallgun(Gear: PGear); @@ -2389,11 +2389,11 @@ procedure doStepRCPlaneWork(Gear: PGear); const cAngleSpeed = 3; var HHGear: PGear; - i: LongInt; - dX, dY: hwFloat; - fChanged: boolean; - trueAngle: Longword; - t: PGear; + i: LongInt; + dX, dY: hwFloat; + fChanged: boolean; + trueAngle: Longword; + t: PGear; begin AllInactive:= false; @@ -2406,123 +2406,123 @@ fChanged:= false; if ((HHGear^.State and gstHHDriven) = 0) or (Gear^.Timer = 0) then - begin - fChanged:= true; - if Gear^.Angle > 2048 then dec(Gear^.Angle) else - if Gear^.Angle < 2048 then inc(Gear^.Angle) else fChanged:= false - end + begin + fChanged:= true; + if Gear^.Angle > 2048 then dec(Gear^.Angle) else + if Gear^.Angle < 2048 then inc(Gear^.Angle) else fChanged:= false + end else - begin - if ((Gear^.Message and gm_Left) <> 0) then - begin - fChanged:= true; - Gear^.Angle:= (Gear^.Angle + (4096 - cAngleSpeed)) mod 4096 - end; + begin + if ((Gear^.Message and gm_Left) <> 0) then + begin + fChanged:= true; + Gear^.Angle:= (Gear^.Angle + (4096 - cAngleSpeed)) mod 4096 + end; - if ((Gear^.Message and gm_Right) <> 0) then - begin - fChanged:= true; - Gear^.Angle:= (Gear^.Angle + cAngleSpeed) mod 4096 - end - end; + if ((Gear^.Message and gm_Right) <> 0) then + begin + fChanged:= true; + Gear^.Angle:= (Gear^.Angle + cAngleSpeed) mod 4096 + end + end; if fChanged then - begin - Gear^.dX.isNegative:= (Gear^.Angle > 2048); - if Gear^.dX.isNegative then - trueAngle:= 4096 - Gear^.Angle - else - trueAngle:= Gear^.Angle; + begin + Gear^.dX.isNegative:= (Gear^.Angle > 2048); + if Gear^.dX.isNegative then + trueAngle:= 4096 - Gear^.Angle + else + trueAngle:= Gear^.Angle; - Gear^.dX:= SignAs(AngleSin(trueAngle), Gear^.dX) * _0_25; - Gear^.dY:= AngleCos(trueAngle) * -_0_25; - end; + Gear^.dX:= SignAs(AngleSin(trueAngle), Gear^.dX) * _0_25; + Gear^.dY:= AngleCos(trueAngle) * -_0_25; + end; Gear^.X:= Gear^.X + Gear^.dX; Gear^.Y:= Gear^.Y + Gear^.dY; if (TrainingFlags and tfRCPlane) = 0 then - begin - if (GameTicks and $FF) = 0 then - if Gear^.Timer < 3500 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtEvilTrace, 0, _0, _0, 0) - else - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); + begin + if (GameTicks and $FF) = 0 then + if Gear^.Timer < 3500 then + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtEvilTrace, 0, _0, _0, 0) + else + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); - if ((HHGear^.Message and gm_Attack) <> 0) and (Gear^.Health <> 0) then - begin - HHGear^.Message := HHGear^.Message and not gm_Attack; - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, Gear^.dX * _0_5, Gear^.dY * _0_5, 0); - dec(Gear^.Health) - end; + if ((HHGear^.Message and gm_Attack) <> 0) and (Gear^.Health <> 0) then + begin + HHGear^.Message := HHGear^.Message and not gm_Attack; + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, Gear^.dX * _0_5, Gear^.dY * _0_5, 0); + dec(Gear^.Health) + end; - if ((HHGear^.Message and gm_LJump) <> 0) - and ((Gear^.State and gsttmpFlag) = 0) then - begin - Gear^.State:= Gear^.State or gsttmpFlag; - PauseMusic; - playSound(sndRideOfTheValkyries); - end; + if ((HHGear^.Message and gm_LJump) <> 0) + and ((Gear^.State and gsttmpFlag) = 0) then + begin + Gear^.State:= Gear^.State or gsttmpFlag; + PauseMusic; + playSound(sndRideOfTheValkyries); + end; - // pickup bonuses - t:= CheckGearNear(Gear, gtCase, 36, 36); - if t <> nil then - PickUp(HHGear, t); - end + // pickup bonuses + t:= CheckGearNear(Gear, gtCase, 36, 36); + if t <> nil then + PickUp(HHGear, t); + end else - begin - if (GameTicks and $FF) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); + begin + if (GameTicks and $FF) = 0 then + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); - // pickup targets - t:= CheckGearNear(Gear, gtTarget, 36, 36); - if t <> nil then - begin - if t^.Tag <> 0 then // collect it only once - exit; - PlaySound(sndShotgunReload); - t^.Tag:= 1; - TrainingTargetGear:= nil; // remove target cursor - exit; - end; + // pickup targets + t:= CheckGearNear(Gear, gtTarget, 36, 36); + if t <> nil then + begin + if t^.Tag <> 0 then // collect it only once + exit; + PlaySound(sndShotgunReload); + t^.Tag:= 1; + TrainingTargetGear:= nil; // remove target cursor + exit; + end; - if (TurnTimeLeft > 0) then - dec(TurnTimeLeft) - end; - + if (TurnTimeLeft > 0) then + dec(TurnTimeLeft) + end; + CheckCollision(Gear); if ((Gear^.State and gstCollision) <> 0) or (((TrainingFlags and tfRCPlane) <> 0) and (TurnTimeLeft = 0)) - or CheckGearDrowning(Gear) then - begin - if ((TrainingFlags and tfRCPlane) <> 0) and ((TrainingFlags and tfTimeTrial) <> 0 ) and (TimeTrialStopTime = 0) then TimeTrialStopTime:= RealTicks; - StopSound(Gear^.SoundChannel); - StopSound(sndRideOfTheValkyries); - ResumeMusic; + or CheckGearDrowning(Gear) then + begin + if ((TrainingFlags and tfRCPlane) <> 0) and ((TrainingFlags and tfTimeTrial) <> 0 ) and (TimeTrialStopTime = 0) then TimeTrialStopTime:= RealTicks; + StopSound(Gear^.SoundChannel); + StopSound(sndRideOfTheValkyries); + ResumeMusic; - if ((Gear^.State and gstCollision) <> 0) or (((TrainingFlags and tfRCPlane) <> 0) and (TurnTimeLeft = 0)) then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound); - for i:= 0 to 32 do - begin - dX:= AngleCos(i * 64) * _0_5 * (GetRandom + _1); - dY:= AngleSin(i * 64) * _0_5 * (GetRandom + _1); - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); - end; - DeleteGear(Gear) - end; + if ((Gear^.State and gstCollision) <> 0) or (((TrainingFlags and tfRCPlane) <> 0) and (TurnTimeLeft = 0)) then + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound); + for i:= 0 to 32 do + begin + dX:= AngleCos(i * 64) * _0_5 * (GetRandom + _1); + dY:= AngleSin(i * 64) * _0_5 * (GetRandom + _1); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); + end; + DeleteGear(Gear) + end; - AfterAttack; - CurAmmoGear:= nil; - TurnTimeLeft:= 14 * 125; - - if (TrainingFlags and tfRCPlane) <> 0 then - TurnTimeLeft:= 0; // HACK: RCPlane training allows unlimited plane starts in last 2 seconds + AfterAttack; + CurAmmoGear:= nil; + TurnTimeLeft:= 14 * 125; + + if (TrainingFlags and tfRCPlane) <> 0 then + TurnTimeLeft:= 0; // HACK: RCPlane training allows unlimited plane starts in last 2 seconds - HHGear^.Message:= 0; - ParseCommand('/taunt '#1, true) - end + HHGear^.Message:= 0; + ParseCommand('/taunt '#1, true) + end end; procedure doStepRCPlane(Gear: PGear); @@ -2599,24 +2599,24 @@ if (Gear^.Health = 0) or (HHGear^.Damage <> 0) - or CheckGearDrowning(HHGear) + or CheckGearDrowning(HHGear) or (TurnTimeLeft = 0) // allow brief ground touches - to be fair on this, might need another counter or (((GameTicks and $1FF) = 0) and (not HHGear^.dY.isNegative) and TestCollisionYwithGear(HHGear, 1)) - or ((Gear^.Message and gm_Attack) <> 0) then - begin - with HHGear^ do - begin - Message:= 0; + or ((Gear^.Message and gm_Attack) <> 0) then + begin + with HHGear^ do + begin + Message:= 0; Active:= true; - State:= State or gstMoving - end; - DeleteGear(Gear); - isCursorVisible:= false; + State:= State or gstMoving + end; + DeleteGear(Gear); + isCursorVisible:= false; // if Gear^.Tex <> nil then FreeTexture(Gear^.Tex); // Gear^.Tex:= RenderStringTex(trmsg[sidFuel] + ': ' + inttostr(round(Gear^.Health / 20)) + '%', cWhiteColor, fntSmall) //AddCaption(trmsg[sidFuel]+': '+inttostr(round(Gear^.Health/20))+'%', cWhiteColor, capgrpAmmostate); - end + end end; //////////////////////////////////////////////////////////////////////////////// @@ -2630,13 +2630,13 @@ OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); with HHGear^ do - begin - State:= State and not gstAttacking; - Message:= Message and not (gm_Attack or gm_Up or gm_Precise or gm_Left or gm_Right); + begin + State:= State and not gstAttacking; + Message:= Message and not (gm_Attack or gm_Up or gm_Precise or gm_Left or gm_Right); if (dY < _0_1) and (dY > -_0_1) then begin Gear^.State:= Gear^.State or gsttmpFlag; dY:= dY - _0_2 end - end + end end;