1092 procedure doStepBee(Gear: PGear); |
1092 procedure doStepBee(Gear: PGear); |
1093 begin |
1093 begin |
1094 AllInactive := false; |
1094 AllInactive := false; |
1095 Gear^.X := Gear^.X + Gear^.dX; |
1095 Gear^.X := Gear^.X + Gear^.dX; |
1096 Gear^.Y := Gear^.Y + Gear^.dY; |
1096 Gear^.Y := Gear^.Y + Gear^.dY; |
|
1097 WorldWrap(Gear); |
1097 Gear^.dY := Gear^.dY + cGravity; |
1098 Gear^.dY := Gear^.dY + cGravity; |
1098 CheckGearDrowning(Gear); |
1099 CheckGearDrowning(Gear); |
1099 CheckCollision(Gear); |
1100 CheckCollision(Gear); |
1100 if (Gear^.State and gstCollision) <> 0 then |
1101 if (Gear^.State and gstCollision) <> 0 then |
1101 begin |
1102 begin |
1957 // TODO: do real calculation? |
1958 // TODO: do real calculation? |
1958 land:= TestCollisionXwithGear(Gear, 2); |
1959 land:= TestCollisionXwithGear(Gear, 2); |
1959 if land = 0 then land:= TestCollisionYwithGear(Gear,-2); |
1960 if land = 0 then land:= TestCollisionYwithGear(Gear,-2); |
1960 if land = 0 then land:= TestCollisionXwithGear(Gear,-2); |
1961 if land = 0 then land:= TestCollisionXwithGear(Gear,-2); |
1961 if land = 0 then land:= TestCollisionYwithGear(Gear, 2); |
1962 if land = 0 then land:= TestCollisionYwithGear(Gear, 2); |
1962 if (land <> 0) and (land and lfBouncy = 0) then |
1963 if (land <> 0) and ((land and lfBouncy = 0) or ((Gear^.State and gstMoving) = 0)) then |
1963 begin |
1964 begin |
1964 if ((Gear^.State and gstMoving) <> 0) or (not isZero(Gear^.dX)) or (not isZero(Gear^.dY)) then |
1965 if ((Gear^.State and gstMoving) <> 0) or (not isZero(Gear^.dX)) or (not isZero(Gear^.dY)) then |
1965 begin |
1966 begin |
1966 PlaySound(sndRopeAttach); |
1967 PlaySound(sndRopeAttach); |
1967 Gear^.dX:= _0; |
1968 Gear^.dX:= _0; |
2673 2: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtNapalmBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0); |
2674 2: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtNapalmBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0); |
2674 3: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtDrill, gsttmpFlag, cBombsSpeed * Gear^.Tag, _0, Gear^.Timer + 1); |
2675 3: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtDrill, gsttmpFlag, cBombsSpeed * Gear^.Tag, _0, Gear^.Timer + 1); |
2675 //4: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtWaterMelon, 0, cBombsSpeed * |
2676 //4: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtWaterMelon, 0, cBombsSpeed * |
2676 // Gear^.Tag, _0, 5000); |
2677 // Gear^.Tag, _0, 5000); |
2677 end; |
2678 end; |
2678 Gear^.dX := Gear^.dX + int2hwFloat(30 * Gear^.Tag); |
2679 Gear^.dX := Gear^.dX + int2hwFloat(Gear^.Damage * Gear^.Tag); |
2679 if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then |
2680 if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then |
2680 FollowGear^.State:= FollowGear^.State or gstSubmersible; |
2681 FollowGear^.State:= FollowGear^.State or gstSubmersible; |
2681 StopSoundChan(Gear^.SoundChannel, 4000); |
2682 StopSoundChan(Gear^.SoundChannel, 4000); |
2682 end; |
2683 end; |
2683 |
2684 |
2706 Gear^.Tag := -1; |
2707 Gear^.Tag := -1; |
2707 Gear^.X := int2hwFloat(max(LAND_WIDTH,4096) + 2048); |
2708 Gear^.X := int2hwFloat(max(LAND_WIDTH,4096) + 2048); |
2708 end; |
2709 end; |
2709 |
2710 |
2710 Gear^.Y := int2hwFloat(topY-300); |
2711 Gear^.Y := int2hwFloat(topY-300); |
2711 Gear^.dX := int2hwFloat(Gear^.Target.X - 5 * Gear^.Tag * 15); |
2712 Gear^.dX := int2hwFloat(Gear^.Target.X) - int2hwFloat(Gear^.Tag * Gear^.Health * Gear^.Damage) / 2; |
2712 |
2713 |
2713 // calcs for Napalm Strike, so that it will hit the target (without wind at least :P) |
2714 // calcs for Napalm Strike, so that it will hit the target (without wind at least :P) |
2714 if (Gear^.State = 2) then |
2715 if (Gear^.State = 2) then |
2715 Gear^.dX := Gear^.dX - cBombsSpeed * Gear^.Tag * 900 |
2716 Gear^.dX := Gear^.dX - cBombsSpeed * Gear^.Tag * 900 |
2716 // calcs for regular falling gears |
2717 // calcs for regular falling gears |
2717 else if (int2hwFloat(Gear^.Target.Y) - Gear^.Y > _0) then |
2718 else if (int2hwFloat(Gear^.Target.Y) - Gear^.Y > _0) then |
2718 Gear^.dX := Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(Gear^.Target.Y) - Gear^.Y) * 2 / |
2719 Gear^.dX := Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(Gear^.Target.Y) - Gear^.Y) * 2 / |
2719 cGravity) * Gear^.Tag; |
2720 cGravity) * Gear^.Tag; |
2720 |
2721 |
2721 Gear^.Health := 6; |
|
2722 Gear^.doStep := @doStepAirAttackWork; |
2722 Gear^.doStep := @doStepAirAttackWork; |
2723 Gear^.SoundChannel := LoopSound(sndPlane, 4000); |
2723 Gear^.SoundChannel := LoopSound(sndPlane, 4000); |
2724 |
2724 |
2725 end; |
2725 end; |
2726 |
2726 |
5252 // do 1/2 current hp worth of damage if extra damage is enabled (1/3 damage if not) |
5254 // do 1/2 current hp worth of damage if extra damage is enabled (1/3 damage if not) |
5253 if cDamageModifier > _1 then |
5255 if cDamageModifier > _1 then |
5254 d:= 2 |
5256 d:= 2 |
5255 else |
5257 else |
5256 d:= 3; |
5258 d:= 3; |
5257 // always round up |
5259 |
5258 if dmg mod d > 0 then |
5260 // always rounding down |
5259 dmg:= dmg div d + 1 |
5261 dmg:= dmg div d; |
5260 else |
5262 |
5261 dmg:= dmg div d; |
5263 if dmg > 0 then |
5262 |
5264 ApplyDamage(tmp, CurrentHedgehog, dmg, dsUnknown); |
5263 ApplyDamage(tmp, CurrentHedgehog, dmg, dsUnknown); |
|
5264 end; |
5265 end; |
5265 end; |
5266 end; |
5266 |
5267 |
5267 if (tmp^.Kind <> gtHedgehog) or (dmg > 0) or (tmp^.Health > tmp^.Damage) then |
5268 if (tmp^.Kind <> gtHedgehog) or (dmg > 0) or (tmp^.Health > tmp^.Damage) then |
5268 begin |
5269 begin |
5428 begin |
5429 begin |
5429 // now really resurrect the hogs with the hp saved in the graves |
5430 // now really resurrect the hogs with the hp saved in the graves |
5430 for i:= 0 to graves.size - 1 do |
5431 for i:= 0 to graves.size - 1 do |
5431 if graves.ar^[i]^.Health > 0 then |
5432 if graves.ar^[i]^.Health > 0 then |
5432 begin |
5433 begin |
5433 resgear := AddGear(hwRound(graves.ar^[i]^.X), hwRound(graves.ar^[i]^.Y), gtHedgehog, gstWait, _0, _0, 0); |
5434 resgear := AddGear(hwRound(graves.ar^[i]^.X), hwRound(graves.ar^[i]^.Y), gtHedgehog, gstWait, _0, _0, 0,graves.ar^[i]^.Pos); |
5434 resgear^.Hedgehog := graves.ar^[i]^.Hedgehog; |
5435 resgear^.Hedgehog := graves.ar^[i]^.Hedgehog; |
5435 resgear^.Health := graves.ar^[i]^.Health; |
5436 resgear^.Health := graves.ar^[i]^.Health; |
5436 PHedgehog(graves.ar^[i]^.Hedgehog)^.Gear := resgear; |
5437 PHedgehog(graves.ar^[i]^.Hedgehog)^.Gear := resgear; |
5437 graves.ar^[i]^.Message:= graves.ar^[i]^.Message or gmDestroy; |
5438 graves.ar^[i]^.Message:= graves.ar^[i]^.Message or gmDestroy; |
5438 graves.ar^[i]^.Active:= true; |
5439 graves.ar^[i]^.Active:= true; |
5790 spewing ice cubes. The cubes will be visual gears only. The scatter from them and the impact snow dust should help hide imprecisions in things like the GearsNear effect. |
5791 spewing ice cubes. The cubes will be visual gears only. The scatter from them and the impact snow dust should help hide imprecisions in things like the GearsNear effect. |
5791 For now we assume a "ray" like a deagle projected out from the gun. |
5792 For now we assume a "ray" like a deagle projected out from the gun. |
5792 All these effects assume the ray's angle is not changed and that the target type was unchanged over a number of ticks. This is a simplifying assumption for "gun was applying freezing effect to the same target". |
5793 All these effects assume the ray's angle is not changed and that the target type was unchanged over a number of ticks. This is a simplifying assumption for "gun was applying freezing effect to the same target". |
5793 * When fired at water a layer of ice textured land is added above the water. |
5794 * When fired at water a layer of ice textured land is added above the water. |
5794 * When fired at non-ice land (land and lfLandMask and not lfIce) the land is overlaid with a thin layer of ice textured land around that point (say, 1 or 2px into land, 1px above). For attractiveness, a slope would probably be needed. |
5795 * When fired at non-ice land (land and lfLandMask and not lfIce) the land is overlaid with a thin layer of ice textured land around that point (say, 1 or 2px into land, 1px above). For attractiveness, a slope would probably be needed. |
5795 * When fired at a hog (land and $00FF <> 0), while the hog is targetted, the hog's state is set to frozen. As long as the gun is on the hog, a frozen hog sprite creeps up from the feet to the head. If the effect is interrupted before reaching the top, the freezing state is cleared. |
5796 * When fired at a hog (land and $00FF <> 0), while the hog is targetted, the hog's state is set to frozen. |
5796 A frozen hog will animate differently. To be decided, but possibly in a similar fashion to a grave when it comes to explosions. The hog might (possibly) not be damaged by explosions. This might make freezing potentially useful for friendlies in a bad position. It might be better to allow damage though. |
5797 As long as the gun is on the hog, a frozen hog sprite creeps up from the feet to the head. |
5797 A frozen hog stays frozen for a certain number of turns. Each turn the frozen overlay becomes fainter, until it fades and the hog animates normally again. |
5798 If the effect is interrupted before reaching the top, the freezing state is cleared. |
|
5799 A frozen hog will animate differently. |
|
5800 To be decided, but possibly in a similar fashion to a grave when it comes to explosions. |
|
5801 The hog might (possibly) not be damaged by explosions. |
|
5802 This might make freezing potentially useful for friendlies in a bad position. |
|
5803 It might be better to allow damage though. |
|
5804 A frozen hog stays frozen for a certain number of turns. |
|
5805 Each turn the frozen overlay becomes fainter, until it fades and the hog animates normally again. |
5798 *) |
5806 *) |
5799 |
5807 |
5800 |
5808 |
5801 procedure updateFuel(Gear: PGear); |
5809 procedure updateFuel(Gear: PGear); |
5802 var |
5810 var |