hedgewars/uStats.pas
changeset 13761 a0d6404a80a2
parent 13760 6908d1e65cdc
child 13762 f0cb47f0bfaf
equal deleted inserted replaced
13760:6908d1e65cdc 13761:a0d6404a80a2
    27     FinishedTurnsTotal: LongInt;
    27     FinishedTurnsTotal: LongInt;
    28     SendGameResultOn : boolean = true;
    28     SendGameResultOn : boolean = true;
    29     SendRankingStatsOn : boolean = true;
    29     SendRankingStatsOn : boolean = true;
    30     SendAchievementsStatsOn : boolean = true;
    30     SendAchievementsStatsOn : boolean = true;
    31     SendHealthStatsOn : boolean = true;
    31     SendHealthStatsOn : boolean = true;
       
    32     ClanDeathLog : PClanDeathLogEntry;
    32 
    33 
    33 procedure initModule;
    34 procedure initModule;
    34 procedure freeModule;
    35 procedure freeModule;
    35 
    36 
    36 procedure AmmoUsed(am: TAmmoType);
    37 procedure AmmoUsed(am: TAmmoType);
   136 isTurnSkipped:= true
   137 isTurnSkipped:= true
   137 end;
   138 end;
   138 
   139 
   139 procedure TurnStats;
   140 procedure TurnStats;
   140 var i, t: LongInt;
   141 var i, t: LongInt;
       
   142     c: Longword;
       
   143     newEntry: PClanDeathLogEntry;
   141 begin
   144 begin
   142 inc(FinishedTurnsTotal);
   145 inc(FinishedTurnsTotal);
   143 
   146 
   144 for t:= 0 to Pred(TeamsCount) do // send even on zero turn
   147 for t:= 0 to Pred(TeamsCount) do // send even on zero turn
   145     with TeamsArray[t]^ do
   148     with TeamsArray[t]^ do
   159                 StepDamageGiven:= 0;
   162                 StepDamageGiven:= 0;
   160                 StepPoisoned:= false;
   163                 StepPoisoned:= false;
   161                 StepDied:= false;
   164                 StepDied:= false;
   162                 end;
   165                 end;
   163 
   166 
   164 if SendHealthStatsOn then
   167 // Remember which clans died in this turn
   165     for t:= 0 to Pred(ClansCount) do
   168 c:= 0;
   166         with ClansArray[t]^ do
   169 newEntry:= nil;
       
   170 for t:= 0 to Pred(ClansCount) do
       
   171     with ClansArray[t]^ do
       
   172         begin
       
   173         if (ClanHealth = 0) and (ClansArray[t]^.DiedThisTurn = false) then
   167             begin
   174             begin
       
   175             ClansArray[t]^.DiedThisTurn:= true;
       
   176             if c = 0 then
       
   177                 begin
       
   178                 new(newEntry);
       
   179                 newEntry^.Turn := FinishedTurnsTotal;
       
   180                 newEntry^.NextEntry := nil;
       
   181                 end;
       
   182 
       
   183             newEntry^.KilledClans[c]:= ClansArray[t];
       
   184             inc(c);
       
   185             newEntry^.KilledClansCount := c;
       
   186             end;
       
   187 
       
   188         if SendHealthStatsOn then
   168             SendStat(siClanHealth, IntToStr(Color) + ' ' + IntToStr(ClanHealth));
   189             SendStat(siClanHealth, IntToStr(Color) + ' ' + IntToStr(ClanHealth));
   169             end;
   190         end;
       
   191 if newEntry <> nil then
       
   192     begin
       
   193     if ClanDeathLog <> nil then
       
   194         begin
       
   195         newEntry^.NextEntry:= ClanDeathLog;
       
   196         end;
       
   197     ClanDeathLog:= newEntry;
       
   198     end;
   170 
   199 
   171 Kills:= 0;
   200 Kills:= 0;
   172 KillsClan:= 0;
   201 KillsClan:= 0;
   173 DamageClan:= 0;
   202 DamageClan:= 0;
   174 DamageTurn:= 0;
   203 DamageTurn:= 0;
   270     WriteLnToConsole( '');
   299     WriteLnToConsole( '');
   271     end
   300     end
   272 end;
   301 end;
   273 
   302 
   274 procedure SendStats;
   303 procedure SendStats;
   275 var i, t: LongInt;
   304 var i, t, c: LongInt;
   276     msd, msk: Longword; msdhh, mskhh: PHedgehog;
   305     msd, msk: Longword; msdhh, mskhh: PHedgehog;
   277     mskcnt: Longword;
   306     mskcnt: Longword;
   278     maxTeamKills : Longword;
   307     maxTeamKills : Longword;
   279     maxTeamKillsName : shortstring;
   308     maxTeamKillsName : shortstring;
   280     maxTurnSkips : Longword;
   309     maxTurnSkips : Longword;
   281     maxTurnSkipsName : shortstring;
   310     maxTurnSkipsName : shortstring;
   282     maxTeamDamage : Longword;
   311     maxTeamDamage : Longword;
   283     maxTeamDamageName : shortstring;
   312     maxTeamDamageName : shortstring;
   284     winnersClan : PClan;
   313     winnersClan : PClan;
       
   314     deathEntry : PClanDeathLogEntry;
   285 begin
   315 begin
   286 if SendHealthStatsOn then
   316 if SendHealthStatsOn then
   287     msd:= 0; msdhh:= nil;
   317     msd:= 0; msdhh:= nil;
   288     msk:= 0; mskhh:= nil;
   318     msk:= 0; mskhh:= nil;
   289     mskcnt:= 0;
   319     mskcnt:= 0;
   313                         mskhh:= @Hedgehogs[i];
   343                         mskhh:= @Hedgehogs[i];
   314                         msk:= Hedgehogs[i].stats.MaxStepKills
   344                         msk:= Hedgehogs[i].stats.MaxStepKills
   315                         end;
   345                         end;
   316             end;
   346             end;
   317 
   347 
   318             { send player stats for winner teams }
   348             { Send player stats for winner clans/teams.
       
   349             The clan that survived is ranked 1st. }
   319             if Clan^.ClanHealth > 0 then
   350             if Clan^.ClanHealth > 0 then
   320                 begin
   351                 begin
   321                 winnersClan:= Clan;
   352                 winnersClan:= Clan;
   322                 if SendRankingStatsOn then
   353                 if SendRankingStatsOn then
   323                     SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' +
   354                     SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' +
   341                 maxTeamDamageName := TeamName;
   372                 maxTeamDamageName := TeamName;
   342             end;
   373             end;
   343 
   374 
   344         end;
   375         end;
   345 
   376 
   346     { now send player stats for loser teams }
   377     { Now send player stats for loser teams/clans.
       
   378     The losing clans are ranked in the reverse order they died.
       
   379     The clan that died last is ranked 2nd,
       
   380     the clan that died second to last is ranked 3rd,
       
   381     and so on. }
       
   382     deathEntry := ClanDeathLog;
   347     if SendRankingStatsOn then
   383     if SendRankingStatsOn then
   348         for t:= 0 to Pred(TeamsCount) do
   384         while (deathEntry <> nil) do
   349             begin
   385             begin
   350             with TeamsArray[t]^ do
   386             for c:= 0 to Pred(deathEntry^.KilledClansCount) do
   351                 begin
   387                 if ((deathEntry^.KilledClans[c]^.ClanHealth) = 0) and (not deathEntry^.KilledClans[c]^.StatsHandled) then
   352                 if Clan^.ClanHealth = 0 then
       
   353                     begin
   388                     begin
   354                     SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' +
   389                     for t:= 0 to Pred(TeamsCount) do
   355                         IntToStr(stats.Kills) + ' ' + TeamName);
   390                         if TeamsArray[t]^.Clan^.ClanIndex = deathEntry^.KilledClans[c]^.ClanIndex then
   356                 end;
   391                             begin
   357             end;
   392                             SendStat(siPlayerKills, IntToStr(deathEntry^.killedClans[c]^.Color) + ' ' +
   358         end;
   393                                 IntToStr(TeamsArray[t]^.stats.Kills) + ' ' + TeamsArray[t]^.TeamName);
       
   394                             end;
       
   395                     deathEntry^.KilledClans[c]^.StatsHandled:= true;
       
   396                     end;
       
   397             deathEntry:= deathEntry^.NextEntry;
       
   398             end;
   359 
   399 
   360     // “Achievements” / Details part of stats screen
   400     // “Achievements” / Details part of stats screen
   361     if SendAchievementsStatsOn then
   401     if SendAchievementsStatsOn then
   362         begin
   402         begin
   363         if msdhh <> nil then
   403         if msdhh <> nil then
   430     vpHurtSameClan:= nil;
   470     vpHurtSameClan:= nil;
   431     vpHurtEnemy:= nil;
   471     vpHurtEnemy:= nil;
   432     TotalRoundsPre:= -1;
   472     TotalRoundsPre:= -1;
   433     TotalRoundsReal:= -1;
   473     TotalRoundsReal:= -1;
   434     FinishedTurnsTotal:= -1;
   474     FinishedTurnsTotal:= -1;
       
   475     ClanDeathLog:= nil;
   435 end;
   476 end;
   436 
   477 
   437 procedure freeModule;
   478 procedure freeModule;
   438 begin
   479 begin
   439 end;
   480 end;