hedgewars/uStats.pas
changeset 14035 ecfd13128100
parent 14034 f9281c294a4c
child 14037 bf8b7c166b3c
equal deleted inserted replaced
14034:f9281c294a4c 14035:ecfd13128100
    62     Kills       : LongWord = 0;
    62     Kills       : LongWord = 0;
    63     KillsTotal  : LongWord = 0;
    63     KillsTotal  : LongWord = 0;
    64     HitTargets  : LongWord = 0; // Target (gtTarget) hits per turn
    64     HitTargets  : LongWord = 0; // Target (gtTarget) hits per turn
    65     AmmoUsedCount : Longword = 0;
    65     AmmoUsedCount : Longword = 0;
    66     AmmoDamagingUsed : boolean = false;
    66     AmmoDamagingUsed : boolean = false;
       
    67     LeaveMeAlone : boolean = false;
    67     SkippedTurns: LongWord = 0;
    68     SkippedTurns: LongWord = 0;
    68     isTurnSkipped: boolean = false;
    69     isTurnSkipped: boolean = false;
    69     vpHurtSameClan: PVoicepack = nil;
    70     vpHurtSameClan: PVoicepack = nil;
    70     vpHurtEnemy: PVoicepack = nil;
    71     vpHurtEnemy: PVoicepack = nil;
    71 
    72 
    97 else
    98 else
    98     begin
    99     begin
    99     vpHurtEnemy:= Gear^.Hedgehog^.Team^.voicepack;
   100     vpHurtEnemy:= Gear^.Hedgehog^.Team^.voicepack;
   100     if (not killed) then
   101     if (not killed) then
   101         begin
   102         begin
       
   103         // Check if victim got attacked by RevengeHog again
       
   104         if (Gear^.Hedgehog^.RevengeHog <> nil) and (Gear^.Hedgehog^.RevengeHog = Attacker) then
       
   105             LeaveMeAlone:= true;
   102         // Check if attacker got revenge
   106         // Check if attacker got revenge
   103         if (Attacker^.RevengeHog <> nil) and (Attacker^.RevengeHog = Gear^.Hedgehog) then
   107         if (Attacker^.RevengeHog <> nil) and (Attacker^.RevengeHog = Gear^.Hedgehog) then
   104             begin
   108             begin
   105             Attacker^.stats.GotRevenge:= true;
   109             Attacker^.stats.GotRevenge:= true;
       
   110             // Also reset the "in-row" counter to restore LeaveMeAlone/CutItOut taunts
       
   111             Attacker^.stats.StepDamageRecvInRow:= 0;
   106             Attacker^.RevengeHog:= nil;
   112             Attacker^.RevengeHog:= nil;
   107             end
   113             end
   108         // If not, victim remembers their attacker to plan *their* revenge
   114         // If not, victim remembers their attacker to plan *their* revenge
   109         else
   115         else
   110             Gear^.Hedgehog^.RevengeHog:= Attacker;
   116             Gear^.Hedgehog^.RevengeHog:= Attacker;
   159 inc(FinishedTurnsTotal);
   165 inc(FinishedTurnsTotal);
   160 
   166 
   161 for t:= 0 to Pred(TeamsCount) do // send even on zero turn
   167 for t:= 0 to Pred(TeamsCount) do // send even on zero turn
   162     with TeamsArray[t]^ do
   168     with TeamsArray[t]^ do
   163         for i:= 0 to cMaxHHIndex do
   169         for i:= 0 to cMaxHHIndex do
       
   170             begin
   164             with Hedgehogs[i].stats do
   171             with Hedgehogs[i].stats do
   165                 begin
   172                 begin
   166                 inc(DamageRecv, StepDamageRecv);
   173                 inc(DamageRecv, StepDamageRecv);
   167                 inc(DamageGiven, StepDamageGiven);
   174                 inc(DamageGiven, StepDamageGiven);
   168                 if StepDamageRecv > MaxStepDamageRecv then
   175                 if StepDamageRecv > MaxStepDamageRecv then
   169                     MaxStepDamageRecv:= StepDamageRecv;
   176                     MaxStepDamageRecv:= StepDamageRecv;
   170                 if StepDamageGiven > MaxStepDamageGiven then
   177                 if StepDamageGiven > MaxStepDamageGiven then
   171                     MaxStepDamageGiven:= StepDamageGiven;
   178                     MaxStepDamageGiven:= StepDamageGiven;
   172                 if StepKills > MaxStepKills then
   179                 if StepKills > MaxStepKills then
   173                     MaxStepKills:= StepKills;
   180                     MaxStepKills:= StepKills;
       
   181                 if (Hedgehogs[i].Team <> nil) and (Hedgehogs[i].Team^.Clan^.ClanIndex <> CurrentHedgehog^.Team^.Clan^.ClanIndex) then
       
   182                     begin
       
   183                     if StepDamageRecv > 0 then
       
   184                         inc(StepDamageRecvInRow)
       
   185                     else
       
   186                         StepDamageRecvInRow:= 0;
       
   187                     if StepDamageRecvInRow >= 3 then
       
   188                         LeaveMeAlone:= true;
       
   189                     end;
   174                 end;
   190                 end;
       
   191             end;
       
   192 
   175 
   193 
   176 // Write into the death log which clans died in this turn,
   194 // Write into the death log which clans died in this turn,
   177 // important for final rankings.
   195 // important for final rankings.
   178 c:= 0;
   196 c:= 0;
   179 newEntry:= nil;
   197 newEntry:= nil;
   274         // 1 kill
   292         // 1 kill
   275         else if Kills = (killsCheck + 1) then
   293         else if Kills = (killsCheck + 1) then
   276             AddVoice(sndEnemyDown, CurrentTeam^.voicepack)
   294             AddVoice(sndEnemyDown, CurrentTeam^.voicepack)
   277         // 0 kills, only damage or poison
   295         // 0 kills, only damage or poison
   278         else
   296         else
       
   297             // possible reactions of victim, in the order of preference:
       
   298             // 1. claiming revenge
       
   299             // 2. complaining about getting attacked too often
       
   300             // 3. threatening enemy with retaliation
   279             if CurrentHedgehog^.stats.GotRevenge then
   301             if CurrentHedgehog^.stats.GotRevenge then
   280                 AddVoice(sndRevenge, CurrentHedgehog^.Team^.voicepack)
   302                 AddVoice(sndRevenge, CurrentHedgehog^.Team^.voicepack)
   281             else
   303             else
   282                 // TODO: Maybe play sndExcellent for a high damage shot.
   304                 if LeaveMeAlone then
   283                 // Not done yet because the fallback is sndEnemyDown.
   305                     if random(2) = 0 then
   284                 if random(2) = 0 then
   306                         AddVoice(sndCutItOut, vpHurtEnemy)
   285                     AddVoice(sndRegret, vpHurtEnemy)
   307                     else
       
   308                         AddVoice(sndLeaveMeAlone, vpHurtEnemy)
   286                 else
   309                 else
   287                     AddVoice(sndGonnaGetYou, vpHurtEnemy)
   310                     if random(2) = 0 then
       
   311                         AddVoice(sndRegret, vpHurtEnemy)
       
   312                     else
       
   313                         AddVoice(sndGonnaGetYou, vpHurtEnemy)
   288 
   314 
   289     // Missed shot
   315     // Missed shot
   290     // A miss is defined as a shot with a damaging weapon with 0 kills, 0 damage, 0 hogs poisoned and 0 targets hit
   316     // A miss is defined as a shot with a damaging weapon with 0 kills, 0 damage, 0 hogs poisoned and 0 targets hit
   291     else if AmmoDamagingUsed and (Kills <= killsCheck) and (PoisonTurn = 0) and (PoisonClan = 0) and (DamageTurn = 0) and (HitTargets = 0) then
   317     else if AmmoDamagingUsed and (Kills <= killsCheck) and (PoisonTurn = 0) and (PoisonClan = 0) and (DamageTurn = 0) and (HitTargets = 0) then
   292         // Chance to call hedgehog stupid or nutter if sacrificed for nothing
   318         // Chance to call hedgehog stupid or nutter if sacrificed for nothing
   334 DamageTurn:= 0;
   360 DamageTurn:= 0;
   335 HitTargets:= 0;
   361 HitTargets:= 0;
   336 PoisonClan:= 0;
   362 PoisonClan:= 0;
   337 PoisonTurn:= 0;
   363 PoisonTurn:= 0;
   338 AmmoUsedCount:= 0;
   364 AmmoUsedCount:= 0;
       
   365 LeaveMeAlone:= false;
   339 AmmoDamagingUsed:= false;
   366 AmmoDamagingUsed:= false;
   340 isTurnSkipped:= false;
   367 isTurnSkipped:= false;
   341 end;
   368 end;
   342 
   369 
   343 procedure AmmoUsed(am: TAmmoType);
   370 procedure AmmoUsed(am: TAmmoType);
   539     Kills       := 0;
   566     Kills       := 0;
   540     KillsTotal  := 0;
   567     KillsTotal  := 0;
   541     HitTargets  := 0;
   568     HitTargets  := 0;
   542     AmmoUsedCount := 0;
   569     AmmoUsedCount := 0;
   543     AmmoDamagingUsed := false;
   570     AmmoDamagingUsed := false;
       
   571     LeaveMeAlone := false;
   544     SkippedTurns:= 0;
   572     SkippedTurns:= 0;
   545     isTurnSkipped:= false;
   573     isTurnSkipped:= false;
   546     vpHurtSameClan:= nil;
   574     vpHurtSameClan:= nil;
   547     vpHurtEnemy:= nil;
   575     vpHurtEnemy:= nil;
   548     TotalRoundsPre:= -1;
   576     TotalRoundsPre:= -1;