private bool CheckGameEndingConditions() { var logger = NLog.LogManager.GetCurrentClassLogger(); EndGameConditionsChecker Checker = new EndGameConditionsChecker(); bool returnConditions = Checker.CheckGameEndingConditions(ref finishedPlayers, PlayersCurrentData); if (ExtendedLogging) { logger.Info($"Return Conditions: {returnConditions}."); } return(returnConditions); }
//main method /// <summary> /// TakeCardsOrPutCards - true is puting cards and false when taking cards /// </summary> public bool PutCardsOnTheTable(bool TakeCardsOrPutCards, List <PlayingCard> CardsList, int playerNumber, bool isDemanding, CardRanks demandedRank, CardSuits demandedSuit, bool skipTheMove) { var logger = NLog.LogManager.GetCurrentClassLogger(); if (ExtendedLogging) { logger.Info("Makao engine main method - making a move fired"); } bool thisPlayerStartedRankDemanding = false; bool cardsPuted = false; bool cardstaken = false; bool endgame = false; bool justEndedFours = false; bool fourOrJokerCard; bool holdMoveOfThisPlayer = false; /*ALGORITHM * 1. Check if player that put the card is current player * 2. Check if this player heeds to stop * 2a. Check if player wants to take or to lay cards * 3. Check potentiality of the move * 4. Check card corectness * 5. Check if player which turn it is, started demanding * 6. check if it is 4 * 7. check if it is demanding card, and set demanding options * 8. Actually put the card or cards on the table * 9. taking cards from deck by player who lost battle * 10. Determination of next player * 11. End the demanding * 12. Check end game conditions * 13. End game if there are conditions * 14. Send data actualization to players * */ //1. bool moveMadeByCurrentPlayer = CheckIfItIsCurrentPlayer(playerNumber); if (moveMadeByCurrentPlayer) { if (ExtendedLogging) { logger.Info("Correct player number condition passed"); } //2. if (ExtendedLogging) { logger.Info($"STATUS BEFORE DECREMENTATION OF STOPS: {status.ToString().ToUpper()}."); } if (DecrementStopTurnsOfPlayer(playerNumber, false)) //if this player do not need to pause { if (ExtendedLogging) { logger.Info("amount of stops condition passed"); } if (!skipTheMove) { //2a. if (TakeCardsOrPutCards) //placing cards on the table { if (ExtendedLogging) { logger.Info("Puting cards on the table condition passed"); } //3. if (ExtendedLogging) { logger.Info($"STATUS BEFORE CHECKING POTENTIALITY OF MOVE: {status.ToString().ToUpper()}."); } if (CheckPotentialiTyOfMove(playerNumber)) //if this player can make move { if (ExtendedLogging) { logger.Info("Potentiality of the move condition passed"); } //4. if (CorectnessOfPutedCard(CardsList[0])) { if (ExtendedLogging) { logger.Info("First card correctness condition passed"); } //5. if (ExtendedLogging) { logger.Info($"STATUS BEFORE GETTING PLAYER NAMBER WHO STARTE DEMANDING: {status.ToString().ToUpper()}."); } if (currentPlayer == CardsDemandingHandler.GetPlayerNumberWhoStartedDemanding(PlayersCurrentData, false)) { thisPlayerStartedRankDemanding = true; } else { thisPlayerStartedRankDemanding = false; } if (ExtendedLogging) { logger.Info($"This player started rank demanding: {thisPlayerStartedRankDemanding}."); } //8. if (ExtendedLogging) { logger.Info($"STATUS BEFORE PUTING CARDS ON THE TABLE: {status.ToString().ToUpper()}."); } cardsPuted = PutAllCardsOnTheTable(CardsList, playerNumber); logger.Info($"Cards puted on the table: {cardsPuted}."); //6. if (ExtendedLogging) { logger.Info($"STATUS BEFORE FOUR HANDLING: {status.ToString().ToUpper()}."); } (fourOrJokerCard, justEndedFours) = RankFourHandling(CardsList, playerNumber); if (ExtendedLogging) { logger.Info($"STATUS AFTER FOUR HANDLING: {status.ToString().ToUpper()}."); } logger.Info($"Fours in player hand: {fourOrJokerCard}."); //7. if (isDemanding && (CardsList[0].Rank == CardRanks.Ace || CardsList[0].Rank == CardRanks.Jack)) { CheckDemandPossibilities(demandedRank, demandedSuit, playerNumber); } CheckStopOfSuitDemanding(CardsList[0]); } } ResetoMoveHoldingForPlayers(); } else { (cardstaken, holdMoveOfThisPlayer) = TakeCardsFromDeck(playerNumber); if (currentPlayer == CardsDemandingHandler.GetPlayerNumberWhoStartedDemanding(PlayersCurrentData, false)) { thisPlayerStartedRankDemanding = true; } else { thisPlayerStartedRankDemanding = false; } EndDemanding(thisPlayerStartedRankDemanding, playerNumber); } } else { if (!PlayersCurrentData[playerNumber].FirstCardInBattleModeTakenMatches) { (_, justEndedFours) = MakePauseOnPlayersWish(new List <PlayingCard>(), playerNumber); } ResetoMoveHoldingForPlayers(); } } //if either new cards are on the table or some cards are taken from deck if (cardsPuted || cardstaken || skipTheMove) { if (ExtendedLogging) { logger.Info($"Tha card was taken: {cardstaken} / cards was puted: {cardsPuted} / Move skipped: {skipTheMove}."); } //9. - choosing next player as long, as he do not need to pause //caused by four rank cards if (!holdMoveOfThisPlayer) { bool nextPlayer = false; while (!nextPlayer) { DetermineTheNextPlayer(AlreadyUsedCards[0]); nextPlayer = DecrementStopTurnsOfPlayer(currentPlayer, justEndedFours); if (ExtendedLogging) { logger.Info($"Next player number - ASSIGNED: {nextPlayer}"); } } } //10. EndDemanding(thisPlayerStartedRankDemanding, playerNumber); //11. if (CurrentDeck.Count <= 5) { RestoreCardsFromTableToDeck(); } //12. endgame = CheckGameEndingConditions(); } if (!cardsPuted) { CardsLatelyPutedOnTheTable.Clear(); if (ExtendedLogging) { logger.Info($"Cards lately puted on the table cleared."); } } //here start sending info to player with data actualization OnStartUpdatingTheGame(cardsPuted || cardstaken || skipTheMove);//if (!endgame) if (endgame) { if (ExtendedLogging) { logger.Info("GAME ENDED - STARTING SENDING INFO ABOUT THIS TO ALL PLAYERS"); } //adding last player to finished players list EndGameConditionsChecker Checker = new EndGameConditionsChecker(); Checker.AddLastPlayerToFinishedList(ref finishedPlayers, PlayersCurrentData); //sending data with game ended info OnEndTheGame(); } } if (ExtendedLogging) { logger.Info("Makao engine main method - making a move ended"); } if (ExtendedLogging) { logger.Info($"GAME STATE AFTER EXECUION OF ENGINE MAIN METHOD: {status.ToString().ToUpper()}"); } return(cardsPuted || cardstaken || skipTheMove); }