/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package xunome.game.multiplayerg;
import xunome.game.BaseGame;
import xunome.xUnoME;
import xunome.game.Card;
import xunome.game.Player;
import xunome.game.InvalidMove;
import java.util.Vector;
import xunome.graphics.EndGame;
/**
*
* @author Sem iNick
* @since 3.0
*/
public final class MultiPlayer extends BaseGame {
private MultiPlayerManager comunicator;
public MultiPlayer(Vector deck, int pos, int numberPlayers, MultiPlayerManager com,
xUnoME mid) {
super(deck, numberPlayers, pos, mid);
comunicator = com;
setGameStatus(true);
}
public final synchronized boolean jogada(Player player, Card card) throws InvalidMove {
Card atualUP = getTable().getUpCard();
if ((card.getType() != Card.JOKER4) && (isValidMove(card))) {
switch (card.getType()) {
case Card.GET2:
penalize(getNextPlayer(), 2);
setColor(card.getColor());
break;
case Card.REVERSE:
changeDirection();
setColor(card.getColor());
break;
case Card.SKIP:
super.nextPlayer();
setColor(card.getColor());
break;
case Card.NORMAL:
setColor(card.getColor());
break;
}
} else if ((card.getType() == Card.JOKER4)
&& (player.checkHaveCard(getAtualColor(), atualUP) == Player.JOKER)) {
penalize(getNextPlayer(), 4);
getCanvas().refresh();
super.nextPlayer();
} else {
throw new InvalidMove();
}
super.nextPlayer();
if ((card.getType() == Card.JOKER) || (card.getType() == Card.JOKER4)) {
if (player.isLocalPlayer()) {
//Show color chooser
getCanvas().chooseColor();
//Wait until player chooses color
while(getChoose()) {}
}
}
int numberBefore = player.getNumberOfCards();
int cardPlayedPos = player.getAtualCardP();
getTable().add2Discarded(player.discard());
if (player.isLocalPlayer()) {
if (numberBefore == 2) {
getCanvas().refresh();
setCallUno(true);
try {
Thread.sleep(3000);
} catch (InterruptedException ie) {}
}
comunicator.getDataListener().sendMove(cardPlayedPos,
getAtualColor(),
player.getMasterPos(),
getCallUno());
if (getCallUno()) {
penalize(player, 3);
}
setCallUno(false);
}
return (player.getNumberOfCards() == 0);
}
public final void nextPlayerRemote() {
//#ifdef DEBUG
System.out.println("Next remote");
//#endif
comunicator.getDataListener().nextPlayer(getLocalPlayerPos());
super.nextPlayer();
}
public final void getEndForm(boolean winner) {
if (winner) {
comunicator.getDataListener().sendData(DataListener.MESSAGE + "Server"
+ DataListener.MSG_SEPARATOR + comunicator.getName() + " win. \\o/"
+ DataListener.DATA_DELIMITER);
}
EndGame end = new EndGame(winner);
end.startEffect();
getMidlet().getLCD().setCurrent(end);
try {
Thread.sleep(5000L);
} catch (InterruptedException ie) {}
comunicator.showChatForm();
}
public final void stopPlaying() {
if (comunicator.isServer()) {
DataListener data = comunicator.getDataListener();
data.sendData(DataListener.MESSAGE + "Server" + DataListener.MSG_SEPARATOR
+ "Server player's destroyed the game." + DataListener.DATA_DELIMITER);
data.sendData(DataListener.BACK_CHAT + "" + DataListener.DATA_DELIMITER);
comunicator.showChatForm();
}
super.stopPlaying();
}
}