package bingo.game; import java.rmi.*; import java.rmi.server.*; import java.util.Random; import bingo.shared.*; class RegistrarImpl extends UnicastRemoteObject implements Registrar, Constants { private RingMaster ringMaster; private GameParameters gameParameters; private Roster roster; RegistrarImpl(RingMaster ringMaster) throws RemoteException { super(); this.ringMaster = ringMaster; gameParameters = ringMaster.getGameParameters(); roster = ringMaster.getRoster(); } public String whatsHappening() throws RemoteException { return ringMaster.statusString(); } public Ticket mayIPlay(String playerName, int numCards, long seed) throws RemoteException { if (!ringMaster.ready()) return new Ticket("BINGO server not ready. You can't play."); else if (!ringMaster.isRegistering()) return new Ticket("Registration not open. You can't play."); if (numCards > gameParameters.getMaxCards()) numCards = gameParameters.getMaxCards(); synchronized (roster) { if (roster.size() == gameParameters.getMaxPlayers()) return new Ticket("Game full. You can't play."); Card[] cards = new Card[numCards]; Random generator = new Random(seed); for (int i = 0; i < numCards; i ++) cards[i] = new Card(generator); ringMaster.signTheCards(cards); PlayerRecord p = new PlayerRecord(roster.nextPlayerID(), playerName, numCards); String welcomeMessage = "Welcome to game # " + ringMaster.getGameNumber() + "."; Ticket ticket = new Ticket(welcomeMessage, p.ID, cards); roster.addElement(p, ringMaster); return ticket; } } public Answer BINGO(int playerID, Card c) throws RemoteException { PlayerRecord p = roster.searchForPlayerWithID(playerID); if (p == null) return new Answer(false, "Can't find player with ID: " + playerID + "."); if (p.wolfCries >= MAX_WOLF_CRIES) return new Answer(false, "Sorry, wolf cryer, you're out of the game."); synchronized (ringMaster) { ringMaster.setCheckingForWinner(); if (ringMaster.verify(c)) { ringMaster.setGameOver(); return new Answer(true, "You won! Congratulations!"); } else { p.wolfCries++; ringMaster.setGameResumed(); ringMaster.sendPlayerStatusMessage(p); if (p.wolfCries == MAX_WOLF_CRIES) { return new Answer(false, "You've cried wolf 3 times. You're out."); } else { return new Answer(false, "You cried wolf..." + (MAX_WOLF_CRIES - p.wolfCries) + " more and you're out."); } } } } }