hedgewars/HHHandlers.inc
changeset 542 ec26095f1bed
parent 540 b06c5aace2fa
child 543 465e2ec8f05f
equal deleted inserted replaced
541:bc7be7f6d3e8 542:ec26095f1bed
    22 begin
    22 begin
    23 with Gear^,
    23 with Gear^,
    24      PHedgehog(Gear^.Hedgehog)^ do
    24      PHedgehog(Gear^.Hedgehog)^ do
    25      begin
    25      begin
    26      if ((State and gstHHDriven) <> 0)and
    26      if ((State and gstHHDriven) <> 0)and
    27  //       (((State and gstAttacking) <> 0) or ((Message and gm_Attack) <> 0))and
    27         ((State and (gstAttacked or gstHHChooseTarget)) = 0)and
    28         ((State and (gstAttacked or gstMoving or gstHHChooseTarget)) = 0)and
    28         (((State and gstMoving) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInMove) <> 0))and
    29         (((State and gstFalling  ) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInFall) <> 0))and
    29           ((TargetPoint.X <> NoPointX) or ((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_NeedTarget) = 0)) then
    30         (((State and gstHHJumping) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInJump) <> 0))and
       
    31           ((TargetPoint.X <> NoPointX) or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_NeedTarget) = 0)) then
       
    32         begin
    30         begin
    33         State:= State or gstAttacking;
    31         State:= State or gstAttacking;
    34         if Power = cMaxPower then Message:= Message and not gm_Attack
    32         if Power = cMaxPower then Message:= Message and not gm_Attack
    35         else if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Message:= Message and not gm_Attack
    33         else if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Message:= Message and not gm_Attack
    36         else begin
    34         else begin
   133 const StepTicks: LongWord = 0;
   131 const StepTicks: LongWord = 0;
   134 
   132 
   135 procedure HedgehogStep(Gear: PGear);
   133 procedure HedgehogStep(Gear: PGear);
   136 var PrevdX: LongInt;
   134 var PrevdX: LongInt;
   137 begin
   135 begin
   138 if ((Gear^.State and (gstAttacking or gstMoving or gstFalling)) = 0) then
   136 if ((Gear^.State and (gstAttacking or gstMoving)) = 0) then
   139    begin
   137    begin
   140    if isCursorVisible then
   138    if isCursorVisible then
   141       with PHedgehog(Gear^.Hedgehog)^ do
   139       with PHedgehog(Gear^.Hedgehog)^ do
   142         with Ammo^[CurSlot, CurAmmo] do
   140         with Ammo^[CurSlot, CurAmmo] do
   143           begin
   141           begin
   144           if (Gear^.Message and gm_Left  )<>0 then
   142           if (Gear^.Message and gm_Left  ) <> 0 then
   145              Pos:= (Pos + Ammoz[AmmoType].PosCount - 1) mod Ammoz[AmmoType].PosCount
   143              Pos:= (Pos + Ammoz[AmmoType].PosCount - 1) mod Ammoz[AmmoType].PosCount
   146           else
   144           else
   147           if (Gear^.Message and gm_Right )<>0 then
   145           if (Gear^.Message and gm_Right ) <> 0 then
   148              Pos:= (Pos + 1) mod Ammoz[AmmoType].PosCount
   146              Pos:= (Pos + 1) mod Ammoz[AmmoType].PosCount
   149           else exit;
   147           else exit;
   150           StepTicks:= 200;
   148           StepTicks:= 200;
   151           exit
   149           exit
   152           end;
   150           end;
   153 
   151 
   154    if ((Gear^.Message and gm_LJump ) <> 0) then
   152    if ((Gear^.Message and gm_LJump ) <> 0) then
   155       begin
   153       begin
   156       Gear^.Message:= 0;
   154       Gear^.Message:= Gear^.Message and not gm_LJump;
   157       DeleteCI(Gear);
   155       DeleteCI(Gear);
   158       if not TestCollisionYwithGear(Gear, -1) then
   156       if not TestCollisionYwithGear(Gear, -1) then
   159          if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _2 else
   157          if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _2 else
   160          if not TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _1;
   158          if not TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _1;
   161       if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX))
   159       if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX))
   162          or   TestCollisionYwithGear(Gear, -1)) then
   160          or   TestCollisionYwithGear(Gear, -1)) then
   163          begin
   161          begin
   164          Gear^.dY:= -_0_15;
   162          Gear^.dY:= -_0_15;
   165          Gear^.dX:= SignAs(_0_15, Gear^.dX);
   163          Gear^.dX:= SignAs(_0_15, Gear^.dX);
   166          Gear^.State:= Gear^.State or gstFalling or gstHHJumping;
   164          Gear^.State:= Gear^.State or gstMoving or gstHHJumping;
   167          exit
   165          exit
   168          end;
   166          end;
   169       end;
   167       end;
   170 
   168 
   171    if ((Gear^.Message and gm_HJump ) <> 0) then
   169    if ((Gear^.Message and gm_HJump ) <> 0) then
   172       begin
   170       begin
   173       DeleteCI(Gear);
   171       DeleteCI(Gear);
   174       Gear^.Message:= 0;
   172       Gear^.Message:= Gear^.Message and not gm_HJump;
   175       if not TestCollisionYwithGear(Gear, -1) then
   173       if not TestCollisionYwithGear(Gear, -1) then
   176          begin
   174          begin
   177          Gear^.dY:= -_0_2;
   175          Gear^.dY:= -_0_2;
   178          SetLittle(Gear^.dX);
   176          SetLittle(Gear^.dX);
   179          Gear^.State:= Gear^.State or gstFalling or gstHHJumping;
   177          Gear^.State:= Gear^.State or gstMoving or gstHHJumping;
   180          exit
   178          exit
   181          end;
   179          end;
   182       end;
   180       end;
   183 
   181 
   184    PrevdX:= hwSign(Gear^.dX);
   182    PrevdX:= hwSign(Gear^.dX);
   229    Gear^.Y:= Gear^.Y + _1;
   227    Gear^.Y:= Gear^.Y + _1;
   230    if not TestCollisionYwithGear(Gear, 1) then
   228    if not TestCollisionYwithGear(Gear, 1) then
   231       begin
   229       begin
   232       Gear^.Y:= Gear^.Y - _6;
   230       Gear^.Y:= Gear^.Y - _6;
   233       Gear^.dY:= _0;
   231       Gear^.dY:= _0;
   234       Gear^.State:= Gear^.State or gstFalling;
   232       Gear^.State:= Gear^.State or gstMoving;
   235       exit
   233       exit
   236       end;
   234       end;
   237    end
   235    end
   238    end
   236    end
   239    end
   237    end
   244    end
   242    end
   245 end;
   243 end;
   246 
   244 
   247 procedure HedgehogChAngle(Gear: PGear);
   245 procedure HedgehogChAngle(Gear: PGear);
   248 begin
   246 begin
   249 if ((Gear^.State and (gstMoving or gstFalling)) = 0) then
   247 if ((Gear^.State and gstMoving) = 0) then
   250    if (Gear^.Message and gm_Up    )<>0 then if Gear^.Angle > CurMinAngle then dec(Gear^.Angle)
   248    if (Gear^.Message and gm_Up    )<>0 then if Gear^.Angle > CurMinAngle then dec(Gear^.Angle)
   251    else else
   249    else else
   252    if (Gear^.Message and gm_Down  )<>0 then if Gear^.Angle < CurMaxAngle then inc(Gear^.Angle);
   250    if (Gear^.Message and gm_Down  )<>0 then if Gear^.Angle < CurMaxAngle then inc(Gear^.Angle);
   253 end;
   251 end;
   254 
   252 
   255 procedure doStepHedgehog(Gear: PGear); forward;
   253 procedure doStepHedgehog(Gear: PGear); forward;
   256 ////////////////////////////////////////////////////////////////////////////////
   254 ////////////////////////////////////////////////////////////////////////////////
   257 procedure doStepHedgehogMoving(Gear: PGear);
   255 procedure doStepHedgehogMoving(Gear: PGear);
   258 var prevState: Longword;
   256 var prevState: Longword;
       
   257     isFalling: boolean;
   259 begin
   258 begin
   260 prevState:= Gear^.State;
   259 prevState:= Gear^.State;
   261 if not TestCollisionYKick(Gear, 1) then
   260 isFalling:= not TestCollisionYKick(Gear, 1);
       
   261 if isFalling then
   262    begin
   262    begin
   263    if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0;
   263    if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0;
   264    Gear^.State:= Gear^.State or gstFalling or gstMoving;
   264    Gear^.State:= Gear^.State or gstMoving;
   265    Gear^.dY:= Gear^.dY + cGravity
   265    Gear^.dY:= Gear^.dY + cGravity
   266    end else
   266    end else
   267    begin
   267    begin
   268    if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55)
   268    if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55)
   269       and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX);
   269       and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX);
   270 
   270 
   271    if not Gear^.dY.isNegative then
   271    if not Gear^.dY.isNegative then
   272       begin
   272       begin
   273       CheckHHDamage(Gear);
   273       CheckHHDamage(Gear);
   274       Gear^.State:= Gear^.State and not (gstFalling or gstHHJumping or gstHHHJump);
   274       Gear^.State:= Gear^.State and not (gstHHJumping or gstHHHJump);
   275       Gear^.dY:= _0;
   275       Gear^.dY:= _0;
   276       end else Gear^.dY:= Gear^.dY + cGravity;
   276       end else Gear^.dY:= Gear^.dY + cGravity;
   277 
   277 
   278    if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction
   278    if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction
   279    end;
   279    end;
   280 
   280 
   281 if (Gear^.State <> 0) then DeleteCI(Gear);
   281 if (Gear^.State <> 0) then DeleteCI(Gear);
   282                 
   282                 
   283 if (Gear^.State and gstMoving) <> 0 then
   283 if (Gear^.State and gstMoving) <> 0 then
   284    if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then
   284    if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then
   285       if ((Gear^.State and gstFalling) = 0) then
   285       if not isFalling then
   286          if hwAbs(Gear^.dX) > _0_01 then
   286          if hwAbs(Gear^.dX) > _0_01 then
   287             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -1, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_96; Gear^.Y:= Gear^.Y - _1 end else
   287             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -1, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_96; Gear^.Y:= Gear^.Y - _1 end else
   288             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -2, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_93; Gear^.Y:= Gear^.Y - _2 end else
   288             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -2, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_93; Gear^.Y:= Gear^.Y - _2 end else
   289             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -3, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_9 ; Gear^.Y:= Gear^.Y - _3 end else
   289             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -3, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_9 ; Gear^.Y:= Gear^.Y - _3 end else
   290             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -4, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_87; Gear^.Y:= Gear^.Y - _4 end else
   290             if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -4, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_87; Gear^.Y:= Gear^.Y - _4 end else
   299                  SetLittle(Gear^.dX)
   299                  SetLittle(Gear^.dX)
   300                  end
   300                  end
   301          else if hwAbs(Gear^.dX) > cLittle then Gear^.dX:= -Gear^.Elasticity * Gear^.dX
   301          else if hwAbs(Gear^.dX) > cLittle then Gear^.dX:= -Gear^.Elasticity * Gear^.dX
   302                                            else SetLittle(Gear^.dX);
   302                                            else SetLittle(Gear^.dX);
   303 
   303 
   304 if ((Gear^.State and gstFalling) = 0)and
   304 if (not isFalling) and
   305    (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then
   305    (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then
   306    begin
   306    begin
   307    Gear^.State:= Gear^.State and not gstMoving;
   307    Gear^.State:= Gear^.State and not gstMoving;
   308    SetLittle(Gear^.dX);
   308    SetLittle(Gear^.dX);
   309    Gear^.dY:= _0
   309    Gear^.dY:= _0
   341    Gear^.State:= Gear^.State and not gstHHDriven;
   341    Gear^.State:= Gear^.State and not gstHHDriven;
   342    if Gear^.Damage > 0 then
   342    if Gear^.Damage > 0 then
   343       Gear^.State:= Gear^.State and not (gstHHJumping or gstHHHJump);
   343       Gear^.State:= Gear^.State and not (gstHHJumping or gstHHHJump);
   344    exit
   344    exit
   345    end;
   345    end;
   346    
   346 
   347 if ((Gear^.State and (gstFalling or gstMoving)) <> 0)
   347 if ((Gear^.State and gstMoving) <> 0)
   348    or (StepTicks = cHHStepTicks)
   348    or (StepTicks = cHHStepTicks)
   349    or (CurAmmoGear <> nil) then // we're moving
   349    or (CurAmmoGear <> nil) then // we're moving
   350    begin
   350    begin
   351    // check for case with ammo
   351    // check for case with ammo
   352    t:= CheckGearNear(Gear, gtCase, 36, 36);
   352    t:= CheckGearNear(Gear, gtCase, 36, 36);
   359    CurAmmoGear^.Message:= Gear^.Message;
   359    CurAmmoGear^.Message:= Gear^.Message;
   360    exit
   360    exit
   361    end;
   361    end;
   362 
   362 
   363 if ((Gear^.Message and gm_Attack) <> 0) or
   363 if ((Gear^.Message and gm_Attack) <> 0) or
   364    ((Gear^.State and gstAttacking) <> 0)then Attack(Gear);
   364    ((Gear^.State and gstAttacking) <> 0) then Attack(Gear);
   365 
   365 
   366 if (Gear^.State and (gstFalling or gstMoving)) <> 0 then
   366 if (Gear^.State and gstMoving) <> 0 then
   367    begin
   367    begin
   368    if ((Gear^.Message and gm_HJump) <> 0) and
   368    if ((Gear^.Message and gm_HJump) <> 0) and
   369       ((Gear^.State and gstHHJumping) <> 0) and
   369       ((Gear^.State and gstHHJumping) <> 0) and
   370       ((Gear^.State and gstHHHJump) = 0) then
   370       ((Gear^.State and gstHHHJump) = 0) then
   371       if (not (hwAbs(Gear^.dX) > cLittle)) and (Gear^.dY < -_0_02) then
   371       if (not (hwAbs(Gear^.dX) > cLittle)) and (Gear^.dY < -_0_02) then
   372          begin
   372          begin
   373          Gear^.State:= Gear^.State or gstHHHJump;
   373          Gear^.State:= Gear^.State or gstHHHJump or gstMoving;
   374          Gear^.dY:= -_0_25;
   374          Gear^.dY:= -_0_25;
   375          Gear^.dX:= SignAs(_0_02, Gear^.dX)
   375          Gear^.dX:= SignAs(_0_02, Gear^.dX)
   376          end;
   376          end;
   377    Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump);
   377    Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump);
   378 
   378 
   379    if ((Gear^.State and gstHHJumping) <> 0) and
   379    if ((Gear^.State and gstHHJumping) <> 0) and
   380       TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then SetLittle(Gear^.dX);
   380       TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then SetLittle(Gear^.dX);
   381 
   381 
   382    doStepHedgehogMoving(Gear);
   382    doStepHedgehogMoving(Gear);
   383    
   383 
   384    if (Gear^.State and (gstFalling or gstMoving)) = 0 then
   384    if (Gear^.State and gstMoving) = 0 then
   385       begin
   385       begin
   386       AddGearCI(Gear);
   386       AddGearCI(Gear);
   387       StepTicks:= 300
   387       StepTicks:= 350
   388       end;
   388       end;
   389    exit
   389    exit
   390    end;
   390    end;
   391 
   391 
   392    HedgehogChAngle(Gear);
   392    HedgehogChAngle(Gear);