839 //////////////////////////////////////////////////////////////////////////////// |
840 //////////////////////////////////////////////////////////////////////////////// |
840 procedure doStepBeeWork(Gear: PGear); |
841 procedure doStepBeeWork(Gear: PGear); |
841 var |
842 var |
842 t: hwFloat; |
843 t: hwFloat; |
843 gX,gY,i: LongInt; |
844 gX,gY,i: LongInt; |
844 nuw: boolean; |
845 uw, nuw: boolean; |
845 flower: PVisualGear; |
846 flower: PVisualGear; |
846 |
847 |
847 const uw: boolean = false; |
|
848 begin |
848 begin |
849 AllInactive := false; |
849 AllInactive := false; |
850 gX := hwRound(Gear^.X); |
850 gX := hwRound(Gear^.X); |
851 gY := hwRound(Gear^.Y); |
851 gY := hwRound(Gear^.Y); |
852 nuw := (cWaterLine < gy + Gear^.Radius); |
852 uw := (Gear^.Tag <> 0); // was bee underwater last tick? |
853 if nuw and not uw then |
853 nuw := (cWaterLine < gy + Gear^.Radius); // is bee underwater now? |
|
854 |
|
855 // if water entered or left |
|
856 if nuw <> uw then |
854 begin |
857 begin |
855 AddVisualGear(gX, cWaterLine, vgtSplash); |
858 AddVisualGear(gX, cWaterLine, vgtSplash); |
856 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
859 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
857 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
860 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
858 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
861 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
859 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
862 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
860 StopSound(Gear^.SoundChannel); |
863 StopSound(Gear^.SoundChannel); |
861 Gear^.SoundChannel := LoopSound(sndBeeWater); |
864 if nuw then |
862 uw := nuw |
865 begin |
863 end |
866 Gear^.SoundChannel := LoopSound(sndBeeWater); |
864 else if not nuw and uw then |
867 Gear^.Tag := 1; |
865 begin |
868 end |
866 AddVisualGear(gX, cWaterLine, vgtSplash); |
869 else |
867 StopSound(Gear^.SoundChannel); |
870 begin |
868 Gear^.SoundChannel := LoopSound(sndBee); |
871 Gear^.SoundChannel := LoopSound(sndBee); |
869 uw := nuw |
872 Gear^.Tag := 0; |
870 end; |
873 end; |
871 |
874 end; |
872 |
875 |
873 if (GameTicks and $F) = 0 then |
876 |
874 begin |
877 if Gear^.Timer = 0 then |
875 if (GameTicks and $30) = 0 then |
878 Gear^.RenderTimer:= false |
876 AddVisualGear(gX, gY, vgtBeeTrace); |
879 else |
877 Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (Gear^.Target.X - gX)); |
880 begin |
878 Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (Gear^.Target.Y - gY)); |
881 if (GameTicks and $F) = 0 then |
879 // make sure new speed isn't higher than original one (which we stored in Friction variable) |
882 begin |
880 t := Gear^.Friction / Distance(Gear^.dX, Gear^.dY); |
883 if (GameTicks and $30) = 0 then |
881 Gear^.dX := Gear^.dX * t; |
884 AddVisualGear(gX, gY, vgtBeeTrace); |
882 Gear^.dY := Gear^.dY * t; |
885 Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (Gear^.Target.X - gX)); |
883 end; |
886 Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (Gear^.Target.Y - gY)); |
884 |
887 // make sure new speed isn't higher than original one (which we stored in Friction variable) |
885 Gear^.X := Gear^.X + Gear^.dX; |
888 t := Gear^.Friction / Distance(Gear^.dX, Gear^.dY); |
886 Gear^.Y := Gear^.Y + Gear^.dY; |
889 Gear^.dX := Gear^.dX * t; |
|
890 Gear^.dY := Gear^.dY * t; |
|
891 end; |
|
892 |
|
893 Gear^.X := Gear^.X + Gear^.dX; |
|
894 Gear^.Y := Gear^.Y + Gear^.dY; |
|
895 |
|
896 end; |
|
897 |
887 |
898 |
888 CheckCollision(Gear); |
899 CheckCollision(Gear); |
889 dec(Gear^.Timer); |
900 if ((Gear^.State and gstCollision) <> 0) then |
890 if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then |
|
891 begin |
901 begin |
892 StopSound(Gear^.SoundChannel); |
902 StopSound(Gear^.SoundChannel); |
893 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound); |
903 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound); |
894 for i:= 0 to 31 do |
904 for i:= 0 to 31 do |
895 begin |
905 begin |
1276 SetLittle(HHGear^.dX); |
1298 SetLittle(HHGear^.dX); |
1277 HHGear^.dY := _0; |
1299 HHGear^.dY := _0; |
1278 end |
1300 end |
1279 else |
1301 else |
1280 begin |
1302 begin |
1281 Gear^.dY := Gear^.dY + cGravity; |
1303 if CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y + Gear^.dY + cGravity), lfIndestructible) then |
1282 Gear^.Y := Gear^.Y + Gear^.dY; |
1304 begin |
|
1305 Gear^.dY := Gear^.dY + cGravity; |
|
1306 Gear^.Y := Gear^.Y + Gear^.dY |
|
1307 end; |
1283 if hwRound(Gear^.Y) > cWaterLine then Gear^.Timer := 1 |
1308 if hwRound(Gear^.Y) > cWaterLine then Gear^.Timer := 1 |
1284 end; |
1309 end; |
1285 |
1310 |
1286 Gear^.X := Gear^.X + HHGear^.dX; |
1311 Gear^.X := Gear^.X + HHGear^.dX; |
1287 HHGear^.X := Gear^.X; |
1312 if CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y)-cHHRadius, lfIndestructible) then |
1288 HHGear^.Y := Gear^.Y - int2hwFloat(cHHRadius); |
1313 begin |
|
1314 HHGear^.X := Gear^.X; |
|
1315 HHGear^.Y := Gear^.Y - int2hwFloat(cHHRadius) |
|
1316 end; |
1289 |
1317 |
1290 if (Gear^.Message and gmAttack) <> 0 then |
1318 if (Gear^.Message and gmAttack) <> 0 then |
1291 if (Gear^.State and gsttmpFlag) <> 0 then Gear^.Timer := 1 |
1319 if (Gear^.State and gsttmpFlag) <> 0 then Gear^.Timer := 1 |
1292 else |
1320 else |
1293 else |
1321 else |
3621 HHGear^.State := HHGear^.State or gstMoving; |
3652 HHGear^.State := HHGear^.State or gstMoving; |
3622 |
3653 |
3623 Gear^.X := HHGear^.X; |
3654 Gear^.X := HHGear^.X; |
3624 Gear^.Y := HHGear^.Y; |
3655 Gear^.Y := HHGear^.Y; |
3625 // For some reason I need to reapply followgear here, something else grabs it otherwise. |
3656 // For some reason I need to reapply followgear here, something else grabs it otherwise. |
3626 if not bShowAmmoMenu and not CurrentTeam^.ExtDriven then FollowGear := HHGear; |
3657 // This is probably not needed anymore |
|
3658 if not CurrentTeam^.ExtDriven then FollowGear := HHGear; |
3627 |
3659 |
3628 if not isUnderWater and hasBorder and ((HHGear^.X < _0) or (hwRound(HHGear^.X) > LAND_WIDTH)) then HHGear^.dY.isNegative:= false; |
3660 if not isUnderWater and hasBorder and ((HHGear^.X < _0) or (hwRound(HHGear^.X) > LAND_WIDTH)) then HHGear^.dY.isNegative:= false; |
3629 if ((Gear^.State and gsttmpFlag) = 0) or (HHGear^.dY < _0) then doStepHedgehogMoving(HHGear); |
3661 if ((Gear^.State and gsttmpFlag) = 0) or (HHGear^.dY < _0) then doStepHedgehogMoving(HHGear); |
3630 |
3662 |
3631 if // (Gear^.Health = 0) |
3663 if // (Gear^.Health = 0) |
4392 else PlaySound(sndPiano8); |
4425 else PlaySound(sndPiano8); |
4393 end; |
4426 end; |
4394 AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote); |
4427 AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote); |
4395 CurrentHedgehog^.Gear^.MsgParam := 0; |
4428 CurrentHedgehog^.Gear^.MsgParam := 0; |
4396 CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and not gmSlot; |
4429 CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and not gmSlot; |
4397 end; |
4430 end; |
4398 |
4431 |
4399 if (*((Gear^.Pos = 3) and ((GameFlags and gfSolidLand) <> 0)) or*) (Gear^.Pos = 5) then |
4432 if (*((Gear^.Pos = 3) and ((GameFlags and gfSolidLand) <> 0)) or*) (Gear^.Pos = 5) then |
4400 // bounce up to 10 times (3 times on gameflagged solid land) before dropping past landscape |
4433 begin |
4401 begin |
|
4402 Gear^.dY := Gear^.dY + cGravity * 2; |
4434 Gear^.dY := Gear^.dY + cGravity * 2; |
4403 Gear^.Y := Gear^.Y + Gear^.dY; |
4435 Gear^.Y := Gear^.Y + Gear^.dY; |
4404 CheckGearDrowning(Gear); |
4436 CheckGearDrowning(Gear); |
4405 if (Gear^.State and gstDrowning) <> 0 then |
4437 if (Gear^.State and gstDrowning) <> 0 then |
4406 begin |
4438 begin |
|
4439 OnUsedAmmo(CurrentHedgehog^); |
4407 if CurrentHedgehog^.Gear <> nil then |
4440 if CurrentHedgehog^.Gear <> nil then |
4408 begin |
4441 begin |
4409 // Drown the hedgehog. Could also just delete it, but hey, this gets a caption |
4442 // Drown the hedgehog. Could also just delete it, but hey, this gets a caption |
4410 CurrentHedgehog^.Gear^.Active := true; |
4443 CurrentHedgehog^.Gear^.Active := true; |
4411 CurrentHedgehog^.Gear^.X := Gear^.X; |
4444 CurrentHedgehog^.Gear^.X := Gear^.X; |
4412 CurrentHedgehog^.Gear^.Y := int2hwFloat(cWaterLine+cVisibleWater)+_128; |
4445 CurrentHedgehog^.Gear^.Y := int2hwFloat(cWaterLine+cVisibleWater)+_128; |
4413 CurrentHedgehog^.Unplaced := false; |
4446 CurrentHedgehog^.Unplaced := false; |
4414 if TagTurnTimeLeft = 0 then TagTurnTimeLeft:= TurnTimeLeft; |
4447 if TagTurnTimeLeft = 0 then TagTurnTimeLeft:= TurnTimeLeft; |
4415 TurnTimeLeft:= 0 |
4448 TurnTimeLeft:= 0 |
4416 end; |
4449 end; |
4417 ResumeMusic |
4450 ResumeMusic |
4418 end; |
4451 end; |
4419 exit |
4452 exit |
4420 end; |
4453 end; |
4421 |
4454 |
4422 odY:= Gear^.dY; |
4455 odY:= Gear^.dY; |
4423 doStepFallingGear(Gear); |
4456 doStepFallingGear(Gear); |
4424 |
4457 |
4425 if (Gear^.State and gstDrowning) <> 0 then |
4458 if (Gear^.State and gstDrowning) <> 0 then |
4426 begin |
4459 begin |
|
4460 OnUsedAmmo(CurrentHedgehog^); |
4427 if CurrentHedgehog^.Gear <> nil then |
4461 if CurrentHedgehog^.Gear <> nil then |
4428 begin |
4462 begin |
4429 // Drown the hedgehog. Could also just delete it, but hey, this gets a caption |
4463 // Drown the hedgehog. Could also just delete it, but hey, this gets a caption |
4430 CurrentHedgehog^.Gear^.Active := true; |
4464 CurrentHedgehog^.Gear^.Active := true; |
4431 CurrentHedgehog^.Gear^.X := Gear^.X; |
4465 CurrentHedgehog^.Gear^.X := Gear^.X; |
4432 CurrentHedgehog^.Gear^.Y := int2hwFloat(cWaterLine+cVisibleWater)+_128; |
4466 CurrentHedgehog^.Gear^.Y := int2hwFloat(cWaterLine+cVisibleWater)+_128; |
4433 CurrentHedgehog^.Unplaced := false; |
4467 CurrentHedgehog^.Unplaced := false; |
4434 if TagTurnTimeLeft = 0 then TagTurnTimeLeft:= TurnTimeLeft; |
4468 if TagTurnTimeLeft = 0 then TagTurnTimeLeft:= TurnTimeLeft; |
4435 TurnTimeLeft:= 0 |
4469 TurnTimeLeft:= 0 |
4436 end; |
4470 end; |
4437 ResumeMusic |
4471 ResumeMusic |
4438 end |
4472 end |
4439 else if (Gear^.State and gstCollision) <> 0 then |
4473 else if (Gear^.State and gstCollision) <> 0 then |
4440 begin |
4474 begin |
4441 r0 := GetRandom(21); |
4475 r0 := GetRandom(21); |
4442 r1 := GetRandom(21); |
4476 r1 := GetRandom(21); |
4443 doMakeExplosion(hwRound(Gear^.X) - 30 - r0, hwRound(Gear^.Y) + 40, 40 + r1, Gear^.Hedgehog, 0); |
4477 doMakeExplosion(hwRound(Gear^.X) - 30 - r0, hwRound(Gear^.Y) + 40, 40 + r1, Gear^.Hedgehog, 0); |
4444 doMakeExplosion(hwRound(Gear^.X) + 30 + r1, hwRound(Gear^.Y) + 40, 40 + r0, Gear^.Hedgehog, 0); |
4478 doMakeExplosion(hwRound(Gear^.X) + 30 + r1, hwRound(Gear^.Y) + 40, 40 + r0, Gear^.Hedgehog, 0); |
4445 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 80 + r0, Gear^.Hedgehog, EXPLAutoSound); |
4479 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 80 + r0, Gear^.Hedgehog, EXPLAutoSound); |
4446 for r0:= 0 to 4 do |
4480 for r0:= 0 to 4 do |
4447 AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote); |
4481 AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote); |
4448 Gear^.dY := odY * -1 + cGravity * 2; |
4482 Gear^.dY := odY * -1 + cGravity * 2; |
4449 Gear^.Pos := Gear^.Pos + 1; |
4483 Gear^.Pos := Gear^.Pos + 1; |
4450 end |
4484 end |
4451 else |
4485 else |
4452 Gear^.dY := Gear^.dY + cGravity * 2; |
4486 Gear^.dY := Gear^.dY + cGravity * 2; |
4453 // let it fall faster so itdoesn't take too long for the whole attack |
4487 // let it fall faster so itdoesn't take too long for the whole attack |
4454 end; |
4488 end; |