hedgewars/GSHandlers.inc
changeset 2983 25b6b554c516
parent 2982 4213c6a8aceb
child 2989 b49d87499398
equal deleted inserted replaced
2982:4213c6a8aceb 2983:25b6b554c516
  2665         Gear^.State:= Gear^.State or gsttmpFlag;
  2665         Gear^.State:= Gear^.State or gsttmpFlag;
  2666         dY:= dY - _0_2
  2666         dY:= dY - _0_2
  2667         end
  2667         end
  2668     end
  2668     end
  2669 end;
  2669 end;
       
  2670 
       
  2671 ////////////////////////////////////////////////////////////////////////////////
       
  2672 procedure doStepBirdyVanish(Gear: PGear);
       
  2673 begin
       
  2674 Gear^.Pos:= 0;
       
  2675 if Gear^.Timer < 500 then
       
  2676     inc(Gear^.Timer, 1)
       
  2677 else
       
  2678     DeleteGear(Gear);
       
  2679 end;
       
  2680 
       
  2681 ////////////////////////////////////////////////////////////////////////////////
       
  2682 procedure doStepBirdyFly(Gear: PGear);
       
  2683 var HHGear: PGear;
       
  2684     fuel: LongInt;
       
  2685     move: hwFloat;
       
  2686 begin
       
  2687 HHGear:=PHedgehog(Gear^.Hedgehog)^.Gear;
       
  2688 
       
  2689 move:= _0_1;
       
  2690 fuel:= 50;
       
  2691 
       
  2692 if Gear^.Pos > 0 then
       
  2693     dec(Gear^.Pos, 1)
       
  2694 else if (HHGear^.Message and (gm_Left or gm_Right or gm_Up)) <> 0 then
       
  2695     Gear^.Pos:= 500;
       
  2696 
       
  2697 if HHGear^.dX.isNegative then
       
  2698     Gear^.Tag:= -1
       
  2699 else
       
  2700     Gear^.Tag:= 1;
       
  2701 
       
  2702 if (HHGear^.Message and gm_Up) <> 0 then
       
  2703     begin
       
  2704     if (not HHGear^.dY.isNegative) or (HHGear^.Y > -_256) then
       
  2705         HHGear^.dY:= HHGear^.dY - move;
       
  2706     HHGear^.dY:= HHGear^.dY - move;
       
  2707     dec(Gear^.Health, fuel);
       
  2708     Gear^.MsgParam:= Gear^.MsgParam or gm_Up;
       
  2709     end;
       
  2710 if (HHGear^.Message and gm_Left) <> 0 then move.isNegative:= true;
       
  2711 if (HHGear^.Message and (gm_Left or gm_Right)) <> 0 then
       
  2712     begin
       
  2713     HHGear^.dX:= HHGear^.dX + (move * _0_2);
       
  2714     dec(Gear^.Health, fuel div 5);
       
  2715     Gear^.MsgParam:= Gear^.MsgParam or (HHGear^.Message and (gm_Left or gm_Right));
       
  2716     end;
       
  2717 
       
  2718 if Gear^.Health < 0 then Gear^.Health:= 0;
       
  2719 if (GameTicks and $3F) = 0 then
       
  2720        begin
       
  2721        if Gear^.Tex <> nil then FreeTexture(Gear^.Tex);
       
  2722        Gear^.Tex:= RenderStringTex(trmsg[sidFuel] + ': ' + inttostr(round(Gear^.Health / 20)) + '%', cWhiteColor, fntSmall)
       
  2723        end;
       
  2724 
       
  2725 if HHGear^.Message and (gm_Attack or gm_Up or gm_Precise or gm_Left or gm_Right) <> 0 then Gear^.State:= Gear^.State and not gsttmpFlag;
       
  2726 HHGear^.Message:= HHGear^.Message and not (gm_Up or gm_Precise or gm_Left or gm_Right);
       
  2727 HHGear^.State:= HHGear^.State or gstMoving;
       
  2728 
       
  2729 Gear^.X:= HHGear^.X;
       
  2730 Gear^.Y:= HHGear^.Y - int2hwFloat(32);
       
  2731 // For some reason I need to reapply followgear here, something else grabs it otherwise.
       
  2732 if not bShowAmmoMenu then FollowGear:= HHGear;
       
  2733 
       
  2734 if ((Gear^.State and gsttmpFlag) = 0) or (HHGear^.dY < _0) then doStepHedgehogMoving(HHGear);
       
  2735 
       
  2736 if  (Gear^.Health = 0)
       
  2737     or (HHGear^.Damage <> 0)
       
  2738     or CheckGearDrowning(HHGear)
       
  2739     or (TurnTimeLeft = 0)
       
  2740     // allow brief ground touches - to be fair on this, might need another counter
       
  2741     or (((GameTicks and $1FF) = 0) and (not HHGear^.dY.isNegative) and TestCollisionYwithGear(HHGear, 1))
       
  2742     or ((Gear^.Message and gm_Attack) <> 0) then
       
  2743     begin
       
  2744     with HHGear^ do
       
  2745         begin
       
  2746         Message:= 0;
       
  2747         Active:= true;
       
  2748         State:= State or gstMoving
       
  2749         end;
       
  2750     Gear^.doStep:= @doStepBirdyVanish;
       
  2751     isCursorVisible:= false;
       
  2752     end
       
  2753 end;
       
  2754 
       
  2755 ////////////////////////////////////////////////////////////////////////////////
       
  2756 procedure doStepBirdyDescend(Gear: PGear);
       
  2757 var HHGear: PGear;
       
  2758 begin
       
  2759 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
       
  2760 AllInactive:= false;
       
  2761 if Gear^.Timer > 0 then
       
  2762     dec(Gear^.Timer, 1)
       
  2763 else if CurrentHedgehog = nil then
       
  2764     begin
       
  2765     Gear^.doStep:= @doStepBirdyVanish;
       
  2766     end;
       
  2767 HHGear^.Message:= HHGear^.Message and not (gm_Up or gm_Precise or gm_Left or gm_Right);
       
  2768 if abs(hwRound(HHGear^.Y - Gear^.Y)) > 32 then
       
  2769     begin
       
  2770     if Gear^.Pos = 0 then
       
  2771         Gear^.Y:= Gear^.Y + _0_1
       
  2772     end
       
  2773 else
       
  2774     begin
       
  2775     Gear^.doStep:= @doStepBirdyFly;
       
  2776     HHGear^.dY:= -_0_2
       
  2777     end
       
  2778 end;
       
  2779 
       
  2780 ////////////////////////////////////////////////////////////////////////////////
       
  2781 procedure doStepBirdy(Gear: PGear);
       
  2782 var HHGear: PGear;
       
  2783 begin
       
  2784 Gear^.doStep:= @doStepBirdyDescend;
       
  2785 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
       
  2786 if HHGear^.dX.isNegative then
       
  2787     Gear^.Tag:= -1
       
  2788 else
       
  2789     Gear^.Tag:= 1;
       
  2790 Gear^.Pos:= 0;
       
  2791 AllInactive:= false;
       
  2792 FollowGear:= HHGear;
       
  2793 OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^);
       
  2794 ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
       
  2795 with HHGear^ do
       
  2796     begin
       
  2797     State:= State and not gstAttacking;
       
  2798     Message:= Message and not (gm_Attack or gm_Up or gm_Precise or gm_Left or gm_Right)
       
  2799     end
       
  2800 end;