/** * 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.util.rule; import org.jskat.data.JSkatOptions; import org.jskat.data.SkatGameData; import org.jskat.data.SkatTableOptions.RamschSkatOwner; import org.jskat.data.Trick; import org.jskat.util.Player; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Implementation of skat rules for Ramsch games */ public class RamschRule extends SuitGrandRamschRule { private static final Logger log = LoggerFactory.getLogger(RamschRule.class); /** * {@inheritDoc} */ @Override public int getGameValueForWonGame(final SkatGameData gameData) { int highestPlayerPoints = getGetHighestPlayerPoints(gameData); return highestPlayerPoints * getMultiplier(gameData); } /** * {@inheritDoc} */ @Override public int calcGameResult(final SkatGameData gameData) { return getGameValueForWonGame(gameData); } private static int getGetHighestPlayerPoints(final SkatGameData gameData) { int result = 0; int foreHandPoints = gameData.getPlayerPoints(Player.FOREHAND); int middleHandPoints = gameData.getPlayerPoints(Player.MIDDLEHAND); int rearHandPoints = gameData.getPlayerPoints(Player.REARHAND); int skatPoints = JSkatOptions.instance().getRamschSkatOwner() == RamschSkatOwner.LOSER ? gameData .getSkat().getTotalValue() : 0; // FIXME (jan 18.11.2011) make this simpler // FIXME (markus 22.02.2012) consider skat points - seems to be missing if (foreHandPoints > middleHandPoints && foreHandPoints > rearHandPoints) { result = (foreHandPoints + skatPoints) * -1; } else if (middleHandPoints > foreHandPoints && middleHandPoints > rearHandPoints) { result = (middleHandPoints + skatPoints) * -1; } else if (rearHandPoints > foreHandPoints && rearHandPoints > middleHandPoints) { result = (rearHandPoints + skatPoints) * -1; } else if (middleHandPoints > foreHandPoints && middleHandPoints == rearHandPoints) { result = middleHandPoints * -1; } else if (foreHandPoints > middleHandPoints && foreHandPoints == rearHandPoints) { result = foreHandPoints * -1; } else if (foreHandPoints > rearHandPoints && foreHandPoints == middleHandPoints) { result = foreHandPoints * -1; } else { // all player have 40 points result = -40; } return result; } /** * @see SkatRule#isGameWon(SkatGameData) */ @Override public boolean isGameWon(final SkatGameData gameData) { return false; } /** * Checks whether a player did a durchmarsch (walkthrough) in a ramsch game<br> * durchmarsch means one player made all tricks * * @param player * player to be checked * @param gameData * Game data * @return TRUE if the player played a durchmarsch */ public static final boolean isDurchmarsch(final Player player, final SkatGameData gameData) { if (gameData.getTricks().size() == 10) { for (Trick t : gameData.getTricks()) { if (t.getTrickWinner() != player) { return false; } } return true; } return false; } /** * Checks whether a player was jungfrau (virgin) in a ramsch game<br> * jungfrau means one player made no trick<br> * two players who played jungfrau means a durchmarsch for the third player * * @param player * player to be checked * @param gameData * Game data * @return TRUE if the player was jungfrau */ public static final boolean isJungfrau(final Player player, final SkatGameData gameData) { if (gameData.getTricks().size() == 10) { for (Trick t : gameData.getTricks()) { if (t.getTrickWinner() == player) { return false; } } return true; } return false; } /** * {@inheritDoc} */ @Override public int getMultiplier(final SkatGameData gameData) { int multiplier = 1; if (gameData.isJungfrau()) { log.debug("One player is jungfrau"); //$NON-NLS-1$ multiplier = 2; } log.debug(gameData.getGeschoben() + " player did schieben"); //$NON-NLS-1$ multiplier = (int) (multiplier * Math.pow(2, gameData.getGeschoben())); return multiplier; } /** * {@inheritDoc} */ @Override public boolean isPlayWithJacks(final SkatGameData gameData) { return false; } }