2527 or (not TryPlaceOnLand(Gear^.Target.X - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Width div 2, Gear^.Target.Y - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Height div 2, Ammoz[Gear^.AmmoType].PosSprite, Gear^.State, true, LandFlags)) then |
2527 or (not TryPlaceOnLand(Gear^.Target.X - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Width div 2, Gear^.Target.Y - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Height div 2, Ammoz[Gear^.AmmoType].PosSprite, Gear^.State, true, LandFlags)) then |
2528 begin |
2528 begin |
2529 PlaySound(sndDenied); |
2529 PlaySound(sndDenied); |
2530 if not distFail then |
2530 if not distFail then |
2531 begin |
2531 begin |
2532 warn:= AddVisualGear(Gear^.Target.X, Gear^.Target.Y, vgtNoPlaceWarn, 0); |
2532 warn:= AddVisualGear(Gear^.Target.X, Gear^.Target.Y, vgtNoPlaceWarn, 0, true); |
2533 if warn <> nil then |
2533 if warn <> nil then |
2534 warn^.Tex := GetPlaceCollisionTex(Gear^.Target.X - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Width div 2, Gear^.Target.Y - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Height div 2, Ammoz[Gear^.AmmoType].PosSprite, Gear^.State); |
2534 warn^.Tex := GetPlaceCollisionTex(Gear^.Target.X - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Width div 2, Gear^.Target.Y - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Height div 2, Ammoz[Gear^.AmmoType].PosSprite, Gear^.State); |
2535 end; |
2535 end; |
2536 HHGear^.Message := HHGear^.Message and (not gmAttack); |
2536 HHGear^.Message := HHGear^.Message and (not gmAttack); |
2537 HHGear^.State := HHGear^.State and (not gstAttacking); |
2537 HHGear^.State := HHGear^.State and (not gstAttacking); |
2585 end; |
2585 end; |
2586 end; |
2586 end; |
2587 |
2587 |
2588 procedure doStepTeleport(Gear: PGear); |
2588 procedure doStepTeleport(Gear: PGear); |
2589 var |
2589 var |
2590 HHGear: PGear; |
2590 lx, ty, y, oy: LongInt; |
|
2591 HHGear : PGear; |
|
2592 valid : Boolean; |
|
2593 warn : PVisualGear; |
|
2594 const |
|
2595 ytol = cHHRadius; |
2591 begin |
2596 begin |
2592 AllInactive := false; |
2597 AllInactive := false; |
2593 |
2598 |
2594 HHGear := Gear^.Hedgehog^.Gear; |
2599 HHGear := Gear^.Hedgehog^.Gear; |
2595 if not TryPlaceOnLand(Gear^.Target.X - SpritesData[sprHHTelepMask].Width div 2, |
2600 |
2596 Gear^.Target.Y - SpritesData[sprHHTelepMask].Height div 2, |
2601 valid:= false; |
2597 sprHHTelepMask, 0, false, not hasBorder, 0) then |
2602 |
|
2603 lx:= Gear^.Target.X - SpritesData[sprHHTelepMask].Width div 2; // left |
|
2604 ty:= Gear^.Target.Y - SpritesData[sprHHTelepMask].Height div 2; // top |
|
2605 |
|
2606 // remember original target location |
|
2607 oy:= Gear^.Target.Y; |
|
2608 |
|
2609 for y:= ty downto ty - ytol do |
|
2610 begin |
|
2611 if TryPlaceOnLand(lx, y, sprHHTelepMask, 0, false, not hasBorder, 0) then |
|
2612 begin |
|
2613 valid:= true; |
|
2614 break; |
|
2615 end; |
|
2616 dec(Gear^.Target.Y); |
|
2617 end; |
|
2618 |
|
2619 if not valid then |
2598 begin |
2620 begin |
2599 HHGear^.Message := HHGear^.Message and (not gmAttack); |
2621 HHGear^.Message := HHGear^.Message and (not gmAttack); |
2600 HHGear^.State := HHGear^.State and (not gstAttacking); |
2622 HHGear^.State := HHGear^.State and (not gstAttacking); |
2601 HHGear^.State := HHGear^.State or gstHHChooseTarget; |
2623 HHGear^.State := HHGear^.State or gstHHChooseTarget; |
2602 DeleteGear(Gear); |
2624 DeleteGear(Gear); |
2603 isCursorVisible := true; |
2625 isCursorVisible := true; |
|
2626 warn:= AddVisualGear(Gear^.Target.X, oy, vgtNoPlaceWarn, 0, true); |
|
2627 if warn <> nil then |
|
2628 warn^.Tex := GetPlaceCollisionTex(lx, ty, sprHHTelepMask, 0); |
2604 PlaySound(sndDenied) |
2629 PlaySound(sndDenied) |
2605 end |
2630 end |
2606 else |
2631 else |
2607 begin |
2632 begin |
2608 DeleteCI(HHGear); |
2633 DeleteCI(HHGear); |