fixed a bug where if two player rolled the same number in DSP u would be stuck in an infinite loop
This commit is contained in:
		@@ -37,7 +37,6 @@ public GameState(ServerGameLogic logic) {
 | 
			
		||||
        this.determineStartPlayerState = new DetermineStartPlayerState(this, logic);
 | 
			
		||||
        this.animationState = new AnimationState(this, logic);
 | 
			
		||||
        this.turnState = new TurnState(this, logic);
 | 
			
		||||
        this.setCurrentState(this.determineStartPlayerState);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -46,6 +45,7 @@ public GameState(ServerGameLogic logic) {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Entered GameState state.");
 | 
			
		||||
        this.setCurrentState(this.determineStartPlayerState);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,10 @@ public class DetermineStartPlayerState extends GameAutomatonState {
 | 
			
		||||
     * Create DetermineStartPlayerState attributes.
 | 
			
		||||
     */
 | 
			
		||||
    private final Map<Integer, Integer> diceResults = new HashMap<>();
 | 
			
		||||
    private final Map<Integer, Integer> finalDiceResults = new HashMap<>();
 | 
			
		||||
    private final List<Integer> playersHaveToRoll = new ArrayList<>();
 | 
			
		||||
    private final Set<Integer> messageReceived = new HashSet<>();;
 | 
			
		||||
    private int playerToStart;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
@@ -45,12 +47,13 @@ public DetermineStartPlayerState(GameState gameAutomaton, ServerGameLogic logic)
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Entered DetermineStartPlayerState state.");
 | 
			
		||||
        LOGGER.log(System.Logger.Level.INFO, "Entered DetermineStartPlayerState state.");
 | 
			
		||||
        playerToStart = this.logic.getGame().getPlayers().size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited DetermineStartPlayerState state.");
 | 
			
		||||
        LOGGER.log(Level.INFO, "Exited DetermineStartPlayerState state.");
 | 
			
		||||
        this.diceResults.clear();
 | 
			
		||||
        this.messageReceived.clear();
 | 
			
		||||
    }
 | 
			
		||||
@@ -67,23 +70,21 @@ public void received(RequestDieMessage msg, int from) {
 | 
			
		||||
        int roll = this.logic.getGame().getDie().shuffle();
 | 
			
		||||
        this.logic.getServerSender().send(from, new DieMessage(roll));
 | 
			
		||||
        this.diceResults.put(from, roll);
 | 
			
		||||
        if (this.diceResults.size() == this.logic.getGame().getPlayers().size()) {
 | 
			
		||||
        if (this.diceResults.size() == playerToStart) {
 | 
			
		||||
            int maximumRoll = 0;
 | 
			
		||||
 | 
			
		||||
            for (Map.Entry<Integer, Integer> entry : this.diceResults.entrySet()) {
 | 
			
		||||
                if (maximumRoll == entry.getValue()) {
 | 
			
		||||
                    this.playersHaveToRoll.add(entry.getKey());
 | 
			
		||||
                    LOGGER.log(Level.INFO, "Players have to roll(RD same as maximum): {0}", this.playersHaveToRoll.size());
 | 
			
		||||
                }
 | 
			
		||||
                else if (maximumRoll < entry.getValue()) {
 | 
			
		||||
                    maximumRoll = entry.getValue();
 | 
			
		||||
                    this.playersHaveToRoll.clear();
 | 
			
		||||
                    this.playersHaveToRoll.add(entry.getKey());
 | 
			
		||||
                    LOGGER.log(Level.INFO, "Players have to roll(RD higher as maximum): {0}", this.playersHaveToRoll.size());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (int id: this.playersHaveToRoll) {
 | 
			
		||||
                this.diceResults.remove(id);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -97,18 +98,24 @@ else if (maximumRoll < entry.getValue()) {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(AnimationEndMessage msg, int from) {
 | 
			
		||||
        this.messageReceived.add(from);
 | 
			
		||||
        if (this.messageReceived.size() == this.logic.getGame().getPlayers().size()) {
 | 
			
		||||
        if (this.messageReceived.size() == playerToStart) {
 | 
			
		||||
            this.messageReceived.clear();
 | 
			
		||||
            LOGGER.log(Level.INFO, "Players have to roll(Animation End): {0}", this.playersHaveToRoll.size());
 | 
			
		||||
            if (this.playersHaveToRoll.size() > 1) {
 | 
			
		||||
                playerToStart = this.playersHaveToRoll.size();
 | 
			
		||||
                for (Integer id : this.playersHaveToRoll) {
 | 
			
		||||
                    diceResults.remove(id);
 | 
			
		||||
                    this.logic.getServerSender().send(id, new DiceNowMessage());
 | 
			
		||||
                }
 | 
			
		||||
                finalDiceResults.putAll(this.diceResults);
 | 
			
		||||
                diceResults.clear();
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                finalDiceResults.putAll(this.diceResults);
 | 
			
		||||
                LOGGER.log(Level.INFO, "Players have to roll: %s".formatted(this.logic.getGame().getPlayerById(this.playersHaveToRoll.get(0))));
 | 
			
		||||
                Color color = this.logic.getGame().getPlayerById(this.playersHaveToRoll.get(0)).getColor();
 | 
			
		||||
                this.logic.getGame().setActiveColor(color);
 | 
			
		||||
                this.logic.getServerSender().broadcast(new RankingResponseMessage(this.diceResults));
 | 
			
		||||
                this.logic.getServerSender().broadcast(new RankingResponseMessage(this.finalDiceResults));
 | 
			
		||||
                this.logic.getServerSender().broadcast(new ActivePlayerMessage(color));
 | 
			
		||||
                this.gameAutomaton.setCurrentState(this.gameAutomaton.getAnimationState());
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user