de.pewpewproject.lasertag.lasertaggame.statistics.StatsCalculator   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 77
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 38
dl 0
loc 77
rs 10
c 0
b 0
f 0
wmc 8

1 Method

Rating   Name   Duplication   Size   Complexity  
B calcStats(IServerLasertagManager,long) 0 75 8
1
package de.pewpewproject.lasertag.lasertaggame.statistics;
2
3
import de.pewpewproject.lasertag.common.types.ScoreHolding;
4
import de.pewpewproject.lasertag.common.types.Tuple;
5
import de.pewpewproject.lasertag.lasertaggame.state.management.server.IServerLasertagManager;
6
import de.pewpewproject.lasertag.lasertaggame.state.synced.implementation.TeamsConfigState;
7
8
import java.util.ArrayList;
9
import java.util.Comparator;
10
import java.util.HashMap;
11
12
/**
13
 * Class to calculate the lasertag game stats
14
 *
15
 * @author Étienne Muser
16
 */
17
public class StatsCalculator {
18
19
    public static GameStats calcStats(IServerLasertagManager gameManager, long gameTime) {
20
21
        // Get the game mangers
22
        var syncedState = gameManager.getSyncedState();
23
        var teamsConfig = syncedState.getTeamsConfigState();
24
        var teamsManager = gameManager.getTeamsManager();
25
        var playerNamesState = syncedState.getPlayerNamesState();
26
        var gameModeManager = gameManager.getGameModeManager();
27
28
        var gameMode = gameModeManager.getGameMode();
29
30
        // Init lists for sorting
31
        var playerScores = new ArrayList<Tuple<String, ScoreHolding>>();
32
        var teamScores = new ArrayList<Tuple<String, ScoreHolding>>();
33
        var teamPlayerScores = new HashMap<String, ArrayList<Tuple<String, ScoreHolding>>>();
34
35
        for (var team : teamsConfig.getTeams()) {
36
37
            // Get the players of the team
38
            var playerUuids = teamsManager.getPlayersOfTeam(team);
39
40
            // Skip spectators
41
            if (team.equals(TeamsConfigState.SPECTATORS)) {
42
                continue;
43
            }
44
45
            // Skip empty teams
46
            if (playerUuids.isEmpty()) {
47
                continue;
48
            }
49
50
            var playersOfThisTeam = new ArrayList<Tuple<String, ScoreHolding>>();
51
            for (var playerUuid : playerUuids) {
52
53
                var score = gameMode.getPlayerFinalScore(playerUuid, gameManager);
54
                var playerScoreTuple = new Tuple<>(playerNamesState.getPlayerUsername(playerUuid), score);
55
56
                playerScores.add(playerScoreTuple);
57
                playersOfThisTeam.add(playerScoreTuple);
58
            }
59
60
            var teamScore = gameMode.getTeamFinalScore(team, gameManager);
61
62
            teamPlayerScores.put(team.name(), playersOfThisTeam);
63
            teamScores.add(new Tuple<>(team.name(), teamScore));
64
        }
65
66
        // Sort stats
67
        teamScores.sort(Comparator.<Tuple<String, ScoreHolding>, ScoreHolding>comparing(Tuple::y).reversed());
68
        playerScores.sort(Comparator.<Tuple<String, ScoreHolding>, ScoreHolding>comparing(Tuple::y).reversed());
69
        for (var team : teamPlayerScores.values()) {
70
            team.sort(Comparator.<Tuple<String, ScoreHolding>, ScoreHolding>comparing(Tuple::y).reversed());
71
        }
72
73
        // Create stats object
74
        var stats = new GameStats();
75
76
        // Convert team scores
77
        stats.teamScores.addAll(teamScores.stream().map(v -> new Tuple<>(v.x(), v.y().getValueString())).toList());
78
79
        // Convert player scores
80
        stats.playerScores.addAll(playerScores.stream().map(v -> new Tuple<>(v.x(), v.y().getValueString())).toList());
81
82
        // Convert team player scores
83
        for (var entry : teamPlayerScores.entrySet()) {
84
            stats.teamPlayerScores.put(entry.getKey(), new ArrayList<>(entry.getValue().stream().map(v -> new Tuple<>(v.x(), v.y().getValueString())).toList()));
85
        }
86
87
        // If is game mode with infinite time
88
        if (gameMode.hasInfiniteTime()) {
89
            // Safe the game duration
90
            stats.gameDurationSeconds = gameTime;
91
        }
92
93
        return stats;
94
    }
95
}
96