hedgewars/uGearsUtils.pas
branchsdl2transition
changeset 9798 f2b18754742f
parent 9706 5178d2263521
child 9809 1e32628eb167
equal deleted inserted replaced
9711:7d0329f37181 9798:f2b18754742f
   133                             begin
   133                             begin
   134                             dmg:= ModifyDamage(min(dmg div 2, Radius), Gear);
   134                             dmg:= ModifyDamage(min(dmg div 2, Radius), Gear);
   135                             //AddFileLog('Damage: ' + inttostr(dmg));
   135                             //AddFileLog('Damage: ' + inttostr(dmg));
   136                             if (Mask and EXPLNoDamage) = 0 then
   136                             if (Mask and EXPLNoDamage) = 0 then
   137                                 begin
   137                                 begin
   138                                 if not Gear^.Invulnerable then
   138                                 if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then
   139                                     ApplyDamage(Gear, AttackingHog, dmg, dsExplosion)
   139                                     ApplyDamage(Gear, AttackingHog, dmg, dsExplosion)
   140                                 else
   140                                 else
   141                                     Gear^.State:= Gear^.State or gstWinner;
   141                                     Gear^.State:= Gear^.State or gstWinner;
   142                                 end;
   142                                 end;
   143                             if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then
   143                             if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then
   146                                 Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, tdX)/(Gear^.Density/_3);
   146                                 Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, tdX)/(Gear^.Density/_3);
   147                                 Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, tdY)/(Gear^.Density/_3);
   147                                 Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, tdY)/(Gear^.Density/_3);
   148 
   148 
   149                                 Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser);
   149                                 Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser);
   150                                 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision);
   150                                 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision);
   151                                 if not Gear^.Invulnerable then
   151                                 if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then
   152                                     Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner);
   152                                     Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner);
   153                                 Gear^.Active:= true;
   153                                 Gear^.Active:= true;
   154                                 if Gear^.Kind <> gtFlame then FollowGear:= Gear
   154                                 if Gear^.Kind <> gtFlame then FollowGear:= Gear
   155                                 end;
   155                                 end;
   156                             if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (not Gear^.Invulnerable) and ((Gear^.State and gstHHDeath) = 0) then
   156                             if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) and (Gear^.State and gstHHDeath = 0) then
   157                                 Gear^.Hedgehog^.Effects[hePoisoned] := 1;
   157                                 Gear^.Hedgehog^.Effects[hePoisoned] := 1;
   158                             end;
   158                             end;
   159 
   159 
   160                         end;
   160                         end;
   161                 gtGrave: begin
   161                 gtGrave: begin
   247                                 end;
   247                                 end;
   248                         inc(i, 5);
   248                         inc(i, 5);
   249                         end;
   249                         end;
   250                     end
   250                     end
   251                 end;
   251                 end;
   252         if ((GameFlags and gfKarma) <> 0) and 
   252         if (GameFlags and gfKarma <> 0) and (GameFlags and gfInvulnerable = 0) and 
   253         ((GameFlags and gfInvulnerable) = 0)
   253            (CurrentHedgehog^.Effects[heInvulnerable] = 0) then
   254         and (not CurrentHedgehog^.Gear^.Invulnerable) then
       
   255             begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid
   254             begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid
   256             inc(CurrentHedgehog^.Gear^.Karma, tmpDmg);
   255             inc(CurrentHedgehog^.Gear^.Karma, tmpDmg);
   257             CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog;
   256             CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog;
   258             spawnHealthTagForHH(CurrentHedgehog^.Gear, tmpDmg);
   257             spawnHealthTagForHH(CurrentHedgehog^.Gear, tmpDmg);
   259             end;
   258             end;
   320         particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust);
   319         particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust);
   321         if particle <> nil then
   320         if particle <> nil then
   322             particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480);
   321             particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480);
   323         end;
   322         end;
   324 
   323 
   325     if (Gear^.Invulnerable) then
   324     if ((Gear^.Hedgehog^.Effects[heInvulnerable] <> 0)) then
   326         exit;
   325         exit;
   327 
   326 
   328     //if _0_6 < Gear^.dY then
   327     //if _0_6 < Gear^.dY then
   329     //    PlaySound(sndOw4, Gear^.Hedgehog^.Team^.voicepack)
   328     //    PlaySound(sndOw4, Gear^.Hedgehog^.Team^.voicepack)
   330     //else
   329     //else
   703 CheckGearNear:= nil
   702 CheckGearNear:= nil
   704 end;
   703 end;
   705 
   704 
   706 procedure CheckCollision(Gear: PGear); inline;
   705 procedure CheckCollision(Gear: PGear); inline;
   707 begin
   706 begin
   708     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX))
   707     if (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0)
   709     or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then
   708     or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then
   710         Gear^.State := Gear^.State or gstCollision
   709         Gear^.State := Gear^.State or gstCollision
   711     else
   710     else
   712         Gear^.State := Gear^.State and (not gstCollision)
   711         Gear^.State := Gear^.State and (not gstCollision)
   713 end;
   712 end;
   714 
   713 
   715 procedure CheckCollisionWithLand(Gear: PGear); inline;
   714 procedure CheckCollisionWithLand(Gear: PGear); inline;
   716 begin
   715 begin
   717     if TestCollisionX(Gear, hwSign(Gear^.dX))
   716     if (TestCollisionX(Gear, hwSign(Gear^.dX)) <> 0)
   718     or TestCollisionY(Gear, hwSign(Gear^.dY)) then
   717     or (TestCollisionY(Gear, hwSign(Gear^.dY)) <> 0) then
   719         Gear^.State := Gear^.State or gstCollision
   718         Gear^.State := Gear^.State or gstCollision
   720     else 
   719     else 
   721         Gear^.State := Gear^.State and (not gstCollision)
   720         Gear^.State := Gear^.State and (not gstCollision)
   722 end;
   721 end;
   723 
   722 
   724 function MakeHedgehogsStep(Gear: PGear) : boolean;
   723 function MakeHedgehogsStep(Gear: PGear) : boolean;
   725 begin
   724 begin
   726     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   725     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   727         begin
   726         begin
   728         Gear^.Y:= Gear^.Y - _1;
   727         Gear^.Y:= Gear^.Y - _1;
   729     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   728     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   730         begin
   729         begin
   731         Gear^.Y:= Gear^.Y - _1;
   730         Gear^.Y:= Gear^.Y - _1;
   732     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   731     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   733         begin
   732         begin
   734         Gear^.Y:= Gear^.Y - _1;
   733         Gear^.Y:= Gear^.Y - _1;
   735     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   734     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   736         begin
   735         begin
   737         Gear^.Y:= Gear^.Y - _1;
   736         Gear^.Y:= Gear^.Y - _1;
   738     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   737     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   739         begin
   738         begin
   740         Gear^.Y:= Gear^.Y - _1;
   739         Gear^.Y:= Gear^.Y - _1;
   741     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   740     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   742         begin
   741         begin
   743         Gear^.Y:= Gear^.Y - _1;
   742         Gear^.Y:= Gear^.Y - _1;
   744         if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   743         if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then
   745             Gear^.Y:= Gear^.Y + _6
   744             Gear^.Y:= Gear^.Y + _6
   746         end else Gear^.Y:= Gear^.Y + _5 else
   745         end else Gear^.Y:= Gear^.Y + _5 else
   747         end else Gear^.Y:= Gear^.Y + _4 else
   746         end else Gear^.Y:= Gear^.Y + _4 else
   748         end else Gear^.Y:= Gear^.Y + _3 else
   747         end else Gear^.Y:= Gear^.Y + _3 else
   749         end else Gear^.Y:= Gear^.Y + _2 else
   748         end else Gear^.Y:= Gear^.Y + _2 else
   750         end else Gear^.Y:= Gear^.Y + _1
   749         end else Gear^.Y:= Gear^.Y + _1
   751         end;
   750         end;
   752 
   751 
   753     if not TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   752     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) = 0 then
   754         begin
   753         begin
   755         Gear^.X:= Gear^.X + SignAs(_1, Gear^.dX);
   754         Gear^.X:= Gear^.X + SignAs(_1, Gear^.dX);
   756         MakeHedgehogsStep:= true
   755         MakeHedgehogsStep:= true
   757         end else
   756         end else
   758         MakeHedgehogsStep:= false;
   757         MakeHedgehogsStep:= false;
   821                         dist:= hwRound(Distance(dx, dy));
   820                         dist:= hwRound(Distance(dx, dy));
   822                         dmg:= ModifyDamage(min(r - dist, 25), t);
   821                         dmg:= ModifyDamage(min(r - dist, 25), t);
   823                         end;
   822                         end;
   824                     if dmg > 0 then
   823                     if dmg > 0 then
   825                         begin
   824                         begin
   826                         if (not t^.Invulnerable) then
   825                         if t^.Hedgehog^.Effects[heInvulnerable] = 0 then
   827                             ApplyDamage(t, Gear^.Hedgehog, dmg, dsBullet)
   826                             ApplyDamage(t, Gear^.Hedgehog, dmg, dsBullet)
   828                         else
   827                         else
   829                             Gear^.State:= Gear^.State or gstWinner;
   828                             Gear^.State:= Gear^.State or gstWinner;
   830 
   829 
   831                         DeleteCI(t);
   830                         DeleteCI(t);
   917             if (Ammo^.Kind = gtDrill) then
   916             if (Ammo^.Kind = gtDrill) then
   918                 begin
   917                 begin
   919                 Ammo^.Timer:= 0;
   918                 Ammo^.Timer:= 0;
   920                 exit;
   919                 exit;
   921                 end;
   920                 end;
   922             if (not Gear^.Invulnerable) then
   921             if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then
   923                 begin
   922                 begin
   924                 if (Ammo^.Kind = gtKnife) and (tmpDmg > 0) then
   923                 if (Ammo^.Kind = gtKnife) and (tmpDmg > 0) then
   925                     for j:= 1 to max(1,min(3,tmpDmg div 5)) do
   924                     for j:= 1 to max(1,min(3,tmpDmg div 5)) do
   926                         begin
   925                         begin
   927                         VGear:= AddVisualGear(hwRound(Ammo^.X-((Ammo^.X-Gear^.X)/_2)), hwRound(Ammo^.Y-((Ammo^.Y-Gear^.Y)/_2)), vgtStraightShot);
   926                         VGear:= AddVisualGear(hwRound(Ammo^.X-((Ammo^.X-Gear^.X)/_2)), hwRound(Ammo^.Y-((Ammo^.Y-Gear^.Y)/_2)), vgtStraightShot);
   967                 Gear^.Active:= true;
   966                 Gear^.Active:= true;
   968                 DeleteCI(Gear);
   967                 DeleteCI(Gear);
   969                 Gear^.State:= Gear^.State or gstMoving;
   968                 Gear^.State:= Gear^.State or gstMoving;
   970                 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision);
   969                 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision);
   971                 // move the gear upwards a bit to throw it over tiny obstacles at start
   970                 // move the gear upwards a bit to throw it over tiny obstacles at start
   972                 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   971                 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then
   973                     begin
   972                     begin
   974                     if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX))
   973                     if (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) = 0) and
   975                     or (TestCollisionYwithGear(Gear, -1) <> 0)) then
   974                        (TestCollisionYwithGear(Gear, -1) = 0) then
   976                         Gear^.Y:= Gear^.Y - _1;
   975                         Gear^.Y:= Gear^.Y - _1;
   977                     if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX))
   976                     if (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) = 0) and
   978                     or (TestCollisionYwithGear(Gear, -1) <> 0)) then
   977                        (TestCollisionYwithGear(Gear, -1) = 0) then
   979                         Gear^.Y:= Gear^.Y - _1;
   978                         Gear^.Y:= Gear^.Y - _1;
   980                     if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX))
   979                     if (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) = 0) and
   981                     or (TestCollisionYwithGear(Gear, -1) <> 0)) then
   980                        (TestCollisionYwithGear(Gear, -1) = 0) then
   982                         Gear^.Y:= Gear^.Y - _1;
   981                         Gear^.Y:= Gear^.Y - _1;
   983                     end
   982                     end
   984                 end;
   983                 end;
   985 
   984 
   986 
   985