hedgewars/HHHandlers.inc
changeset 108 08f1fe6f21f8
parent 107 b08ce0293a51
child 113 d975a426ebf7
equal deleted inserted replaced
107:b08ce0293a51 108:08f1fe6f21f8
    61         if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then
    61         if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then
    62            begin
    62            begin
    63            StopTPUSound;
    63            StopTPUSound;
    64            PlaySound(sndThrowRelease);
    64            PlaySound(sndThrowRelease);
    65            end;
    65            end;
    66         xx:= Sign(dX)*Sin(Angle*pi/cMaxAngle);
    66         xx:= hwSign(dX)*Sin(Angle*pi/cMaxAngle);
    67         yy:= -Cos(Angle*pi/cMaxAngle);
    67         yy:= -Cos(Angle*pi/cMaxAngle);
    68              case Ammo[CurSlot, CurAmmo].AmmoType of
    68              case Ammo[CurSlot, CurAmmo].AmmoType of
    69                       amGrenade: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Bomb,    0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer);
    69                       amGrenade: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Bomb,    0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer);
    70                   amClusterBomb: FollowGear:= AddGear(round(X), round(Y), gtClusterBomb,  0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer);
    70                   amClusterBomb: FollowGear:= AddGear(round(X), round(Y), gtClusterBomb,  0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer);
    71                       amBazooka: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor);
    71                       amBazooka: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor);
    75                                  CurAmmoGear:= AddGear(round(X), round(Y), gtShotgunShot,  0, xx * 0.5, yy * 0.5);
    75                                  CurAmmoGear:= AddGear(round(X), round(Y), gtShotgunShot,  0, xx * 0.5, yy * 0.5);
    76                                  end;
    76                                  end;
    77                    amPickHammer: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y) + cHHRadius, gtPickHammer, 0);
    77                    amPickHammer: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y) + cHHRadius, gtPickHammer, 0);
    78                          amSkip: TurnTimeLeft:= 0;
    78                          amSkip: TurnTimeLeft:= 0;
    79                          amRope: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtRope, 0, xx, yy);
    79                          amRope: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtRope, 0, xx, yy);
    80                          amMine: AddGear(round(X) + Sign(dX) * 7, round(Y), gtMine, 0, Sign(dX) * 0.02, 0, 3000);
    80                          amMine: AddGear(round(X) + hwSign(dX) * 7, round(Y), gtMine, 0, hwSign(dX) * 0.02, 0, 3000);
    81                        amDEagle: AddGear(round(X), round(Y), gtDEagleShot, 0, xx * 0.5, yy * 0.5);
    81                        amDEagle: AddGear(round(X), round(Y), gtDEagleShot, 0, xx * 0.5, yy * 0.5);
    82                      amDynamite: AddGear(round(X) + Sign(dX) * 7, round(Y), gtDynamite, 0, Sign(dX) * 0.035, 0, 5000);
    82                      amDynamite: AddGear(round(X) + hwSign(dX) * 7, round(Y), gtDynamite, 0, hwSign(dX) * 0.035, 0, 5000);
    83                   amBaseballBat: AddGear(round(X) + Sign(dX) * 10, round(Y), gtShover, 0, xx * 0.5, yy * 0.5).Radius:= 20;
    83                   amBaseballBat: AddGear(round(X) + hwSign(dX) * 10, round(Y), gtShover, 0, xx * 0.5, yy * 0.5).Radius:= 20;
    84                     amFirePunch: CurAmmoGear:= AddGear(round(X) + Sign(dX) * 10, round(Y), gtFirePunch, 0);
    84                     amFirePunch: CurAmmoGear:= AddGear(round(X) + hwSign(dX) * 10, round(Y), gtFirePunch, 0);
    85                   end;
    85                   end;
    86         Power:= 0;
    86         Power:= 0;
    87         if CurAmmoGear <> nil then
    87         if CurAmmoGear <> nil then
    88            begin
    88            begin
    89            Message:= Message or gm_Attack;
    89            Message:= Message or gm_Attack;
   142 DeleteCI(Gear);
   142 DeleteCI(Gear);
   143 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then
   143 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then
   144    begin
   144    begin
   145    TurnTimeLeft:= 0;
   145    TurnTimeLeft:= 0;
   146    if ((Gear.State and (gstMoving or gstFalling)) = 0)
   146    if ((Gear.State and (gstMoving or gstFalling)) = 0)
   147       and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
   147       and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   148    Gear.State:= Gear.State and not gstHHDriven;
   148    Gear.State:= Gear.State and not gstHHDriven;
   149    if Gear.Damage > 0 then
   149    if Gear.Damage > 0 then
   150       Gear.State:= Gear.State and not gstHHJumping;
   150       Gear.State:= Gear.State and not gstHHJumping;
   151    exit
   151    exit
   152    end;
   152    end;
   174    // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump
   174    // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump
   175    if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then
   175    if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then
   176       if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then
   176       if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then
   177          begin
   177          begin
   178          Gear.dY:= -0.25;
   178          Gear.dY:= -0.25;
   179          Gear.dX:= Sign(Gear.dX) * 0.02
   179          Gear.dX:= hwSign(Gear.dX) * 0.02
   180          end;
   180          end;
   181    Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump);     
   181    Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump);     
   182    if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
   182    if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   183    Gear.X:= Gear.X + Gear.dX;
   183    Gear.X:= Gear.X + Gear.dX;
   184    Gear.dY:= Gear.dY + cGravity;
   184    Gear.dY:= Gear.dY + cGravity;
   185    if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   185    if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   186    Gear.Y:= Gear.Y + Gear.dY;
   186    Gear.Y:= Gear.Y + Gear.dY;
   187    if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then
   187    if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then
   188       begin
   188       begin
   189       CheckHHDamage(Gear);
   189       CheckHHDamage(Gear);
   190       if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   190       if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   191          and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
   191          and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   192       Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   192       Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   193       StepTicks:= 300; 
   193       StepTicks:= 300; 
   194       Gear.dY:= 0
   194       Gear.dY:= 0
   195       end;
   195       end;
   196    CheckGearDrowning(Gear);
   196    CheckGearDrowning(Gear);
   208    begin
   208    begin
   209    if ((Gear.Message and gm_LJump ) <> 0) then
   209    if ((Gear.Message and gm_LJump ) <> 0) then
   210       begin
   210       begin
   211       Gear.Message:= 0;
   211       Gear.Message:= 0;
   212       if not TestCollisionYwithGear(Gear, -1) then
   212       if not TestCollisionYwithGear(Gear, -1) then
   213          if not TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX)) then Gear.Y:= Gear.Y - 2 else
   213          if not TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX)) then Gear.Y:= Gear.Y - 2 else
   214          if not TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX)) then Gear.Y:= Gear.Y - 1;
   214          if not TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX)) then Gear.Y:= Gear.Y - 1;
   215       if not (TestCollisionXwithGear(Gear, Sign(Gear.dX))
   215       if not (TestCollisionXwithGear(Gear, hwSign(Gear.dX))
   216          or   TestCollisionYwithGear(Gear, -1)) then
   216          or   TestCollisionYwithGear(Gear, -1)) then
   217          begin
   217          begin
   218          Gear.dY:= -0.15;
   218          Gear.dY:= -0.15;
   219          Gear.dX:= Sign(Gear.dX) * 0.15;
   219          Gear.dX:= hwSign(Gear.dX) * 0.15;
   220          Gear.State:= Gear.State or gstFalling or gstHHJumping;
   220          Gear.State:= Gear.State or gstFalling or gstHHJumping;
   221          exit
   221          exit
   222          end;
   222          end;
   223       end;
   223       end;
   224    if ((Gear.Message and gm_HJump ) <> 0) then
   224    if ((Gear.Message and gm_HJump ) <> 0) then
   225       begin
   225       begin
   226       Gear.Message:= 0;
   226       Gear.Message:= 0;
   227       if not TestCollisionYwithGear(Gear, -1) then
   227       if not TestCollisionYwithGear(Gear, -1) then
   228          begin
   228          begin
   229          Gear.dY:= -0.20;
   229          Gear.dY:= -0.20;
   230          Gear.dX:= 0.0000001 * Sign(Gear.dX);
   230          Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   231          Gear.X:= Gear.X - Sign(Gear.dX)*0.00008; // shift compensation
   231          Gear.X:= Gear.X - hwSign(Gear.dX)*0.00008; // shift compensation
   232          Gear.State:= Gear.State or gstFalling or gstHHJumping;
   232          Gear.State:= Gear.State or gstFalling or gstHHJumping;
   233          exit
   233          exit
   234          end;
   234          end;
   235       end;
   235       end;
   236    PrevdX:= Sign(Gear.dX);
   236    PrevdX:= hwSign(Gear.dX);
   237    if (Gear.Message and gm_Left  )<>0 then Gear.dX:= -1.0 else
   237    if (Gear.Message and gm_Left  )<>0 then Gear.dX:= -1.0 else
   238    if (Gear.Message and gm_Right )<>0 then Gear.dX:=  1.0 else exit;
   238    if (Gear.Message and gm_Right )<>0 then Gear.dX:=  1.0 else exit;
   239    StepTicks:= cHHStepTicks;
   239    StepTicks:= cHHStepTicks;
   240    if PrevdX <> Sign(Gear.dX) then exit;
   240    if PrevdX <> hwSign(Gear.dX) then exit;
   241    PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7;
   241    PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7;
   242    if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then
   242    if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then
   243       begin
   243       begin
   244       if not (TestCollisionXwithXYShift(Gear, 0, -6, Sign(Gear.dX))
   244       if not (TestCollisionXwithXYShift(Gear, 0, -6, hwSign(Gear.dX))
   245          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   245          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   246       if not (TestCollisionXwithXYShift(Gear, 0, -5, Sign(Gear.dX))
   246       if not (TestCollisionXwithXYShift(Gear, 0, -5, hwSign(Gear.dX))
   247          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   247          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   248       if not (TestCollisionXwithXYShift(Gear, 0, -4, Sign(Gear.dX))
   248       if not (TestCollisionXwithXYShift(Gear, 0, -4, hwSign(Gear.dX))
   249          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   249          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   250       if not (TestCollisionXwithXYShift(Gear, 0, -3, Sign(Gear.dX))
   250       if not (TestCollisionXwithXYShift(Gear, 0, -3, hwSign(Gear.dX))
   251          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   251          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   252       if not (TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX))
   252       if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX))
   253          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   253          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   254       if not (TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX))
   254       if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX))
   255          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   255          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   256       end;
   256       end;
   257    if not TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.X:= Gear.X + Gear.dX;
   257    if not TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.X:= Gear.X + Gear.dX;
   258    Gear.dX:= 0.0000001 * Sign(Gear.dX);
   258    Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   259    SetAllHHToActive;
   259    SetAllHHToActive;
   260 
   260 
   261    if not TestCollisionYwithGear(Gear, 1) then
   261    if not TestCollisionYwithGear(Gear, 1) then
   262    begin
   262    begin
   263    Gear.Y:= Gear.Y + 1;
   263    Gear.Y:= Gear.Y + 1;
   278    Gear.Y:= Gear.Y + 1;
   278    Gear.Y:= Gear.Y + 1;
   279    if not TestCollisionYwithGear(Gear, 1) then
   279    if not TestCollisionYwithGear(Gear, 1) then
   280       begin
   280       begin
   281       Gear.Y:= Gear.Y - 6;
   281       Gear.Y:= Gear.Y - 6;
   282       Gear.dY:= 0;
   282       Gear.dY:= 0;
   283       Gear.dX:= 0.0000001 * Sign(Gear.dX);
   283       Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   284       Gear.State:= Gear.State or gstFalling
   284       Gear.State:= Gear.State or gstFalling
   285       end;
   285       end;
   286    end
   286    end
   287    end
   287    end
   288    end
   288    end
   302    Gear.State:= Gear.State or gstFalling or gstMoving;
   302    Gear.State:= Gear.State or gstFalling or gstMoving;
   303    Gear.dY:= Gear.dY + cGravity
   303    Gear.dY:= Gear.dY + cGravity
   304    end else begin
   304    end else begin
   305    CheckHHDamage(Gear);
   305    CheckHHDamage(Gear);
   306    if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   306    if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   307       and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
   307       and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   308    Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   308    Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   309    if Gear.dY > 0 then Gear.dY:= 0;
   309    if Gear.dY > 0 then Gear.dY:= 0;
   310    if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction
   310    if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction
   311    end;
   311    end;
   312 
   312 
   313 if (Gear.State <> 0) then DeleteCI(Gear);
   313 if (Gear.State <> 0) then DeleteCI(Gear);
   314 
   314 
   315 if (Gear.State and gstMoving) <> 0 then
   315 if (Gear.State and gstMoving) <> 0 then
   316    if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then
   316    if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then
   317       if ((Gear.State and gstFalling) = 0) then
   317       if ((Gear.State and gstFalling) = 0) then
   318          if abs(Gear.dX) > 0.01 then
   318          if abs(Gear.dX) > 0.01 then
   319             if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -1, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.96; Gear.Y:= Gear.Y - 1 end else
   319             if not TestCollisionXwithXYShift(Gear, 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
   320             if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -2, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.93; Gear.Y:= Gear.Y - 2 end else
   320             if not TestCollisionXwithXYShift(Gear, 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
   321             if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -3, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.90; Gear.Y:= Gear.Y - 3 end else
   321             if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -3, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.90; Gear.Y:= Gear.Y - 3 end else
   322             if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -4, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else
   322             if not TestCollisionXwithXYShift(Gear, 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
   323             if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -5, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else
   323             if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -5, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else
   324             if abs(Gear.dX) > 0.02 then Gear.dX:= -0.5 * Gear.dX
   324             if abs(Gear.dX) > 0.02 then Gear.dX:= -0.5 * Gear.dX
   325                                    else begin
   325                                    else begin
   326                                         Gear.State:= Gear.State and not gstMoving;
   326                                         Gear.State:= Gear.State and not gstMoving;
   327                                         Gear.dX:= 0.0000001 * Sign(Gear.dX)
   327                                         Gear.dX:= 0.0000001 * hwSign(Gear.dX)
   328                                         end
   328                                         end
   329                                    else begin
   329                                    else begin
   330                                         Gear.State:= Gear.State and not gstMoving;
   330                                         Gear.State:= Gear.State and not gstMoving;
   331                                         Gear.dX:= 0.0000001 * Sign(Gear.dX)
   331                                         Gear.dX:= 0.0000001 * hwSign(Gear.dX)
   332                                         end
   332                                         end
   333          else Gear.dX:= -Gear.dX;
   333          else Gear.dX:= -Gear.dX;
   334 
   334 
   335 if ((Gear.State and gstFalling) = 0)and
   335 if ((Gear.State and gstFalling) = 0)and
   336    (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then
   336    (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then
   337    begin
   337    begin
   338    Gear.State:= Gear.State and not gstMoving;
   338    Gear.State:= Gear.State and not gstMoving;
   339    Gear.dX:= 0.0000001 * Sign(Gear.dX);
   339    Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   340    Gear.dY:= 0
   340    Gear.dY:= 0
   341    end else Gear.State:= Gear.State or gstMoving;
   341    end else Gear.State:= Gear.State or gstMoving;
   342 
   342 
   343 if (Gear.State and gstMoving) <> 0 then
   343 if (Gear.State and gstMoving) <> 0 then
   344    begin
   344    begin