/**
* Copyright (C) 2017 Jan Schäfer (jansch@users.sourceforge.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jskat.control.event.skatgame;
import org.jskat.data.SkatGameData;
import org.jskat.data.Trick;
import org.jskat.util.Card;
import org.jskat.util.Player;
import org.jskat.util.rule.SkatRuleFactory;
/**
* Event for a card played in the trick.
*/
public final class TrickCardPlayedEvent extends AbstractPlayerMoveEvent {
public final Card card;
public TrickCardPlayedEvent(Player player, Card card) {
super(player);
this.card = card;
}
@Override
public final void processForward(SkatGameData data) {
data.removePlayerCard(player, card);
if (isNoTricksPlayed(data)) {
data.addTrick(new Trick(0, Player.FOREHAND));
}
data.addTrickCard(card);
if (isTrickCompleted(data)) {
Trick trick = data.getCurrentTrick();
Player trickWinner = SkatRuleFactory.getSkatRules(
data.getGameType()).calculateTrickWinner(
data.getGameType(), trick);
trick.setTrickWinner(trickWinner);
if (data.getTricks().size() < 10) {
data.addTrick(new Trick(data.getTricks().size(), trickWinner));
}
}
}
private boolean isNoTricksPlayed(SkatGameData data) {
return data.getTricks().size() == 0;
}
private boolean isTrickCompleted(SkatGameData data) {
return data.getCurrentTrick().getThirdCard() != null;
}
@Override
public final void processBackward(SkatGameData data) {
if (isEmptyTrick(data)) {
data.removeLastTrick();
}
data.removeTrickCard(card);
data.addPlayerCard(player, card);
}
private boolean isEmptyTrick(SkatGameData data) {
return data.getCurrentTrick().getFirstCard() == null
&& data.getCurrentTrick().getSecondCard() == null
&& data.getCurrentTrick().getThirdCard() == null;
}
@Override
protected String getMoveDetails() {
return card.toString();
}
}