org.ggp.base.player.request.grammar.StartRequest Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of alloy-ggp-base Show documentation
Show all versions of alloy-ggp-base Show documentation
A modified version of the GGP-Base library for Alloy.
The newest version!
package org.ggp.base.player.request.grammar;
import org.ggp.base.player.event.PlayerTimeEvent;
import org.ggp.base.player.gamer.Gamer;
import org.ggp.base.player.gamer.event.GamerNewMatchEvent;
import org.ggp.base.player.gamer.event.GamerUnrecognizedMatchEvent;
import org.ggp.base.player.gamer.exception.MetaGamingException;
import org.ggp.base.util.game.Game;
import org.ggp.base.util.gdl.grammar.GdlConstant;
import org.ggp.base.util.logging.GamerLogger;
import org.ggp.base.util.match.Match;
public final class StartRequest extends Request
{
private final Game game;
private final Gamer gamer;
private final String matchId;
private final int playClock;
private final GdlConstant roleName;
private final int startClock;
public StartRequest(Gamer gamer, String matchId, GdlConstant roleName, Game theGame, int startClock, int playClock)
{
this.gamer = gamer;
this.matchId = matchId;
this.roleName = roleName;
this.game = theGame;
this.startClock = startClock;
this.playClock = playClock;
}
@Override
public String getMatchId() {
return matchId;
}
@Override
public String process(long receptionTime)
{
// Ensure that we aren't already playing a match. If we are,
// ignore the message, saying that we're busy.
if (gamer.getMatch() != null) {
GamerLogger.logError("GamePlayer", "Got start message while already busy playing a game: ignoring.");
gamer.notifyObservers(new GamerUnrecognizedMatchEvent(matchId));
return "busy";
}
// Create the new match, and handle all of the associated logistics
// in the gamer to indicate that we're starting a new match.
Match match = new Match(matchId, -1, startClock, playClock, game, null);
gamer.setMatch(match);
gamer.setRoleName(roleName);
gamer.notifyObservers(new GamerNewMatchEvent(match, roleName));
// Finally, have the gamer begin metagaming.
try {
gamer.notifyObservers(new PlayerTimeEvent(gamer.getMatch().getStartClock() * 1000));
gamer.metaGame(gamer.getMatch().getStartClock() * 1000 + receptionTime);
} catch (MetaGamingException e) {
GamerLogger.logStackTrace("GamePlayer", e);
// Upon encountering an uncaught exception during metagaming,
// assume that indicates that we aren't actually able to play
// right now, and tell the server that we're busy.
gamer.setMatch(null);
gamer.setRoleName(null);
return "busy";
}
return "ready";
}
@Override
public String toString()
{
return "start";
}
}