added sync point after trump determination

This commit is contained in:
2022-01-10 04:06:27 +01:00
parent b4ecfbb32e
commit 5c0c9c280e
11 changed files with 116 additions and 96 deletions

View File

@@ -0,0 +1,53 @@
package eu.jonahbauer.wizard.core.machine.states;
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
import eu.jonahbauer.wizard.common.messages.player.ContinueMessage;
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
import eu.jonahbauer.wizard.core.machine.Game;
import eu.jonahbauer.wizard.core.machine.GameState;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.SYNC;
import static eu.jonahbauer.wizard.core.machine.states.GameData.PLAYERS;
public abstract class SyncState extends GameState {
private final transient Set<UUID> ready = new HashSet<>();
public SyncState(GameData data) {
super(data);
}
@Override
public Optional<GameState> onEnter(Game game) {
game.notify(new UserInputMessage(null, SYNC, getSyncTimeout(game, true)));
return syncTimeout(game);
}
@Override
public Optional<GameState> onMessage(Game game, UUID player, PlayerMessage message) {
if (message instanceof ContinueMessage) {
ready.add(player);
if (ready.size() == get(PLAYERS).size()) {
return Optional.of(getNextState());
} else {
return Optional.empty();
}
} else {
return super.onMessage(game, player, message);
}
}
@Override
public Optional<GameState> onTimeout(Game game) {
game.notify(new TimeoutMessage());
return Optional.of(getNextState());
}
protected abstract GameState getNextState();
}

View File

@@ -103,6 +103,6 @@ public final class DeterminingTrump extends RoundState {
} else {
game.notify(new TrumpMessage(get(TRUMP_CARD), trumpSuit));
}
return transition(new Predicting(data));
return transition(new TrumpDetermined(data));
}
}

View File

@@ -8,8 +8,12 @@ import java.util.UUID;
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
public abstract class RoundState extends GameState {
public static GameData requirements(GameData data) {
return data.require(PLAYERS, ROUND, SCORE);
}
public RoundState(GameData data) {
super(data.require(PLAYERS, ROUND, SCORE));
super(requirements(data));
}
protected UUID getDealer() {

View File

@@ -1,52 +1,17 @@
package eu.jonahbauer.wizard.core.machine.states.round;
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
import eu.jonahbauer.wizard.common.messages.player.ContinueMessage;
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
import eu.jonahbauer.wizard.core.machine.Game;
import eu.jonahbauer.wizard.core.machine.GameState;
import eu.jonahbauer.wizard.core.machine.states.GameData;
import eu.jonahbauer.wizard.core.machine.states.SyncState;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.SYNC;
import static eu.jonahbauer.wizard.core.machine.states.GameData.PLAYERS;
public final class StartingRound extends RoundState {
private final transient Set<UUID> ready = new HashSet<>();
public final class StartingRound extends SyncState {
public StartingRound(GameData data) {
super(data);
super(RoundState.requirements(data));
}
@Override
public Optional<GameState> onEnter(Game game) {
game.notify(new UserInputMessage(null, SYNC, getSyncTimeout(game, true)));
return syncTimeout(game);
}
@Override
public Optional<GameState> onMessage(Game game, UUID player, PlayerMessage message) {
if (message instanceof ContinueMessage) {
ready.add(player);
if (ready.size() == get(PLAYERS).size()) {
return Optional.of(new Dealing(getData()));
} else {
return Optional.empty();
}
} else {
return super.onMessage(game, player, message);
}
}
@Override
public Optional<GameState> onTimeout(Game game) {
game.notify(new TimeoutMessage());
return Optional.of(new Dealing(getData()));
protected GameState getNextState() {
return new Dealing(getData());
}
}

View File

@@ -0,0 +1,19 @@
package eu.jonahbauer.wizard.core.machine.states.round;
import eu.jonahbauer.wizard.core.machine.GameState;
import eu.jonahbauer.wizard.core.machine.states.GameData;
import eu.jonahbauer.wizard.core.machine.states.SyncState;
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
public final class TrumpDetermined extends SyncState {
public TrumpDetermined(GameData data) {
super(RoundState.requirements(data).requireEach(PLAYERS, HANDS).require(PREDICTIONS, TRUMP_SUIT, CURRENT_PLAYER));
}
@Override
protected GameState getNextState() {
return new Predicting(getData());
}
}

View File

@@ -1,52 +1,18 @@
package eu.jonahbauer.wizard.core.machine.states.trick;
import eu.jonahbauer.wizard.common.messages.observer.TimeoutMessage;
import eu.jonahbauer.wizard.common.messages.observer.UserInputMessage;
import eu.jonahbauer.wizard.common.messages.player.ContinueMessage;
import eu.jonahbauer.wizard.common.messages.player.PlayerMessage;
import eu.jonahbauer.wizard.core.machine.Game;
import eu.jonahbauer.wizard.core.machine.states.GameData;
import eu.jonahbauer.wizard.core.machine.GameState;
import eu.jonahbauer.wizard.core.machine.states.GameData;
import eu.jonahbauer.wizard.core.machine.states.SyncState;
import eu.jonahbauer.wizard.core.machine.states.round.RoundState;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import static eu.jonahbauer.wizard.common.messages.observer.UserInputMessage.Action.SYNC;
import static eu.jonahbauer.wizard.core.machine.states.GameData.PLAYERS;
public final class StartingTrick extends TrickState {
private final transient Set<UUID> ready = new HashSet<>();
public final class StartingTrick extends SyncState {
public StartingTrick(GameData data) {
super(data);
super(RoundState.requirements(TrickState.requirements(data)));
}
@Override
public Optional<GameState> onEnter(Game game) {
game.notify(new UserInputMessage(null, SYNC, getSyncTimeout(game, true)));
return syncTimeout(game);
}
@Override
public Optional<GameState> onMessage(Game game, UUID player, PlayerMessage message) {
if (message instanceof ContinueMessage) {
ready.add(player);
if (ready.size() == get(PLAYERS).size()) {
return Optional.of(new PlayingCard(getData()));
} else {
return Optional.empty();
}
} else {
return super.onMessage(game, player, message);
}
}
@Override
public Optional<GameState> onTimeout(Game game) {
game.notify(new TimeoutMessage());
return Optional.of(new PlayingCard(getData()));
protected GameState getNextState() {
return new PlayingCard(getData());
}
}

View File

@@ -6,12 +6,14 @@ import eu.jonahbauer.wizard.core.machine.states.round.RoundState;
import static eu.jonahbauer.wizard.core.machine.states.GameData.*;
public abstract class TrickState extends RoundState {
public static GameData requirements(GameData data) {
return data.requireEach(PLAYERS, HANDS)
.requireEach(PLAYERS, PREDICTIONS)
.require(TRUMP_SUIT, TRICK, TRICKS, CURRENT_PLAYER)
.keep(CLOUDED_PLAYER);
}
public TrickState(GameData data) {
super(
data.requireEach(PLAYERS, HANDS)
.requireEach(PLAYERS, PREDICTIONS)
.require(TRUMP_SUIT, TRICK, TRICKS, CURRENT_PLAYER)
.keep(CLOUDED_PLAYER)
);
super(requirements(data));
}
}