Skip to content

Commit

Permalink
Make game scores on BattleBall and SnowStorm thread-safe
Browse files Browse the repository at this point in the history
  • Loading branch information
Quackster committed Jul 29, 2023
1 parent cf5d1b6 commit e790ba6
Show file tree
Hide file tree
Showing 9 changed files with 56 additions and 32 deletions.
Expand Up @@ -260,23 +260,26 @@ public void finishGame() {
var gameHistoryData = new GameHistoryData();
var gameHistory = new GameHistory(gameHistoryData);

this.teams.values().forEach(GameTeam::calculateScore);

if (this.teams.size() > 0) {
var sortedTeamList = new ArrayList<>(this.teams.values());
sortedTeamList.sort(Comparator.comparingInt(GameTeam::getScore).reversed());
List<GameTeam> sortedTeamList = new ArrayList<>(this.teams.values());
sortedTeamList.sort(Comparator.comparingInt(GameTeam::getPoints).reversed());

var winningTeam = sortedTeamList.get(0);

gameHistoryData.setTeamCount(sortedTeamList.size());

for (GameTeam team : sortedTeamList) {
for (GamePlayer gamePlayer : team.getPlayers()) {
gamePlayer.calculateScore();
gameHistoryData.addPlayer(gamePlayer.getUserId(), gamePlayer.getScore(), gamePlayer.getTeamId());
}
}

gameHistory.setName(this.getName());
gameHistory.setWinningTeam(winningTeam.getId());
gameHistory.setWinningTeamScore(winningTeam.getScore());
gameHistory.setWinningTeamScore(winningTeam.getPoints());
gameHistory.setGameType(this.gameType);
gameHistory.setMapId(this.getMapId());

Expand Down Expand Up @@ -769,9 +772,9 @@ public void addPlayerMove(PlayerMoveEvent event) {
* Method called when the game initially began
*/
public void gamePrepare() {
for (GameTeam gameTeam : this.getTeams().values()) {
gameTeam.setScore(0);
}
// for (GameTeam gameTeam : this.getTeams().values()) {
// gameTeam.setScore(0);
// }

for (GamePlayer gamePlayer : this.getActivePlayers()) {
gamePlayer.setXp(0);
Expand Down
Expand Up @@ -10,6 +10,7 @@
import org.alexdev.havana.game.games.battleball.objects.PowerUpUpdateObject;
import org.alexdev.havana.game.games.enums.GameState;
import org.alexdev.havana.game.games.player.GamePlayer;
import org.alexdev.havana.game.games.player.GameTeam;
import org.alexdev.havana.game.pathfinder.Position;
import org.alexdev.havana.game.pathfinder.Rotation;
import org.alexdev.havana.game.player.Player;
Expand Down Expand Up @@ -50,6 +51,7 @@ public void run() {
this.game.getObjectsQueue().drainTo(objects);
this.game.getUpdateTilesQueue().drainTo(updateTiles);
this.game.getFillTilesQueue().drainTo(fillTiles);
this.game.getTeams().values().forEach(GameTeam::calculateScore);

for (GamePlayer gamePlayer : this.game.getActivePlayers()) {
Player player = gamePlayer.getPlayer();
Expand Down
Expand Up @@ -11,6 +11,8 @@
import org.alexdev.havana.game.player.Player;
import org.alexdev.havana.game.games.snowstorm.util.SnowStormAttributes;

import java.util.concurrent.atomic.AtomicInteger;

public class GamePlayer {
private Player player;
private GameObject gameObject;
Expand All @@ -27,7 +29,7 @@ public class GamePlayer {
private GamePlayer harlequinPlayer;

private boolean assignedSpawn;
private int score;
private AtomicInteger score;
private int xp;

private SnowStormAttributes snowStormAttributes;
Expand All @@ -42,7 +44,7 @@ public GamePlayer(Player player) {
this.enteringGame = false;
this.clickedRestart = false;
this.position = new Position();
this.score = 0;
this.score = new AtomicInteger(0);
this.xp = 0;
this.snowStormAttributes = new SnowStormAttributes();
}
Expand All @@ -53,21 +55,23 @@ public GamePlayer(Player player) {
* @param score the score
*/
public void setScore(int score) {
this.score = score;
this.score.set(score);
}

/**
* Get the score of the current player, the team score is generated by adding all scores from all players
*
* @return the score
*/
public int getScore() {
public void calculateScore() {
if (!this.inGame) {
return 0;
this.score.set(0);
return;
}

if (this.getGame() instanceof BattleBallGame) {
this.score = 0;
this.score.set(0);

BattleBallGame battleBallGame = (BattleBallGame) this.getGame();

for (BattleBallTile battleBallTile : battleBallGame.getTiles()) {
Expand All @@ -76,12 +80,14 @@ public int getScore() {
continue;
}

this.score += scoreReference.getScore();
this.score.addAndGet(scoreReference.getScore());
}
}
}
}

return this.score;
public int getScore() {
return score.get();
}

/**
Expand Down
Expand Up @@ -7,19 +7,22 @@

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

public class GameTeam {
private int id;
private Game game;
private List<GamePlayer> playerList;
private int score;

public AtomicInteger points;
public AtomicInteger snowstormPoints;

public GameTeam(int id, Game game) {
this.id = id;
this.game = game;
this.playerList = new CopyOnWriteArrayList<>();
this.score = 0;
this.points = new AtomicInteger(0);
}

public int getId() {
Expand All @@ -30,10 +33,10 @@ public List<GamePlayer> getPlayers() {
return playerList;
}

public int getScore() {
if (this.game instanceof BattleBallGame) {
this.score = 0;
public void calculateScore() {
this.points.set(0);

if (this.game instanceof BattleBallGame) {
BattleBallGame battleBallGame = (BattleBallGame) this.game;

for (BattleBallTile battleBallTile : battleBallGame.getTiles()) {
Expand All @@ -42,18 +45,27 @@ public int getScore() {
continue;
}

this.score += scoreReference.getScore();
this.points.addAndGet(scoreReference.getScore());
}
}
}

return this.score;
else {
this.points.set(0);

int totalScore = this.playerList.stream()
.mapToInt(player -> player.getScore())
.sum();

this.points.addAndGet(totalScore);
}
}

public void setScore(int score) {
this.score = score;
public int getPoints() {
return points.get();
}



public List<GamePlayer> getActivePlayers() {
return playerList.stream().filter(GamePlayer::isInGame).collect(Collectors.toList());
}
Expand Down
Expand Up @@ -116,7 +116,8 @@ public void finishGame() {
}

for (GameTeam team : this.getTeams().values()) {
team.setScore(team.getPlayers().stream().mapToInt(GamePlayer::getScore).sum());
team.calculateScore();
// team.setScore(team.getPlayers().stream().mapToInt(GamePlayer::getScore).sum());
}

super.finishGame();
Expand Down
Expand Up @@ -24,12 +24,12 @@

public class GameFinishTask implements Runnable {
private final List<GamePlayer> players;
private final ArrayList<GameTeam> sortedTeamList;
private final List<GameTeam> sortedTeamList;
private final GameType gameType;
private final Game game;
private final GameHistory gameHistory;

public GameFinishTask(Game game, GameHistory gameHistory, GameType gameType, ArrayList<GameTeam> sortedTeamList, List<GamePlayer> players) {
public GameFinishTask(Game game, GameHistory gameHistory, GameType gameType, List<GameTeam> sortedTeamList, List<GamePlayer> players) {
this.game = game;
this.gameHistory = gameHistory;
this.gameType = gameType;
Expand Down Expand Up @@ -58,8 +58,8 @@ public void run() {

if (this.game.canIncreasePoints()) {
if ((this.sortedTeamList.size() == 1 && this.sortedTeamList.get(0).getPlayers().size() > 1) || (this.sortedTeamList.size() > 1
&& this.sortedTeamList.get(0).getScore() > 0
&& this.sortedTeamList.get(0).getScore() != this.sortedTeamList.get(1).getScore()) &&
&& this.sortedTeamList.get(0).getPoints() > 0
&& this.sortedTeamList.get(0).getPoints() != this.sortedTeamList.get(1).getPoints()) &&
this.sortedTeamList.get(0).getPlayers().size() > 0 &&
this.sortedTeamList.get(1).getPlayers().size() > 0) {

Expand Down
Expand Up @@ -81,7 +81,7 @@ public class FinishedGameTeam {
private List<Pair<String, Integer>> playerScores;

private FinishedGameTeam(GameTeam gameTeam) {
this.score = gameTeam.getScore();
this.score = gameTeam.getPoints();
this.playerScores = new ArrayList<>();

for (var gamePlayer : gameTeam.getPlayers()) {
Expand Down
Expand Up @@ -34,7 +34,7 @@ public void compose(NettyResponse response) {
response.writeInt(gamePlayer.getScore());
}

response.writeInt(team.getScore());
response.writeInt(team.getPoints());
}
}
}
Expand Down
Expand Up @@ -83,7 +83,7 @@ public void compose(NettyResponse response) {
response.writeInt(this.gameTeams.size());

for (GameTeam team : this.gameTeams) {
response.writeInt(team.getScore());
response.writeInt(team.getPoints());
}

response.writeInt(1);
Expand Down

0 comments on commit e790ba6

Please sign in to comment.