From 42eb2abbcddbc813410f56f7205ae8c3b26b250b Mon Sep 17 00:00:00 2001 From: velnias75 Date: Fri, 26 Dec 2014 20:31:10 +0100 Subject: [PATCH] final polish and fixes for V0.7 --- src/engine/engine.cpp | 34 ++++++++++++++++++---------------- src/engine/iruleset.h | 1 + src/engine/stdruleset.cpp | 6 +++++- src/engine/stdruleset.h | 1 + 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 72002f6..341d08e 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -168,26 +168,27 @@ bool Engine::distributeCards() throw(Common::Exception::SocketException) { if(m_state == NOCARDS || m_state == ACCEPT_PLAYERS) { - PLAYERS::const_iterator pi(m_players.begin()); - const PLAYERS::const_iterator &pe(m_players.end()); - - for(; pi != pe; ++pi) { + std::vector > cards(m_players.size()); - Player::IPlayer *p = *pi; - - std::vector cards; - cards.reserve(5); + for(std::size_t i = 0; i < m_ruleset->initialCardCount(); ++i) { - for(std::size_t i = 0; i < 5; ++i) { - if(m_talon->empty()) return false; + if(m_talon->empty()) return false; - cards.push_back(m_talon->top()); + for(PLAYERS::size_type j = 0; j < m_players.size(); ++j) { + cards[j].push_back(m_talon->top()); m_talon->pop(); } + } - p->receiveCardSet(cards); - m_eventHandler.cardsDistributed(p, cards); + PLAYERS::const_iterator pi(m_players.begin()); + const PLAYERS::const_iterator &pe(m_players.end()); + + for(std::size_t k = 0; pi != pe; ++pi, ++k) { + Player::IPlayer *p = *pi; + + p->receiveCardSet(cards[k]); + m_eventHandler.cardsDistributed(p, cards[k]); } m_turn = 1; @@ -277,9 +278,8 @@ bool Engine::nextTurn() { const bool csuspend = m_ruleset->hasToSuspend(); const Common::ICard::SUIT js = m_ruleset->getJackSuit(); - assert(uc->getRank() != Common::ICard::JACK || - (uc->getRank() == Common::ICard::JACK && (m_jackMode || m_initialJack) && - js != Common::ICard::SUIT_ILLEGAL)); + assert(uc->getRank() != Common::ICard::JACK || (uc->getRank() == Common::ICard::JACK && + ((m_jackMode || m_initialJack) && js != Common::ICard::SUIT_ILLEGAL))); Common::ICard *pc = !csuspend ? player->requestCard(uc, (m_jackMode || m_initialJack) ? &js : 0L) : 0L; @@ -369,6 +369,8 @@ bool Engine::nextTurn() { std::advance(f, m_nxtPlayer); const PLAYERS::iterator nxt = m_players.erase(f); + m_ruleset->setCurPlayers(m_players.size()); + m_nxtPlayer = nxt != m_players.end() ? std::distance(m_players.begin(), nxt) : 0; diff --git a/src/engine/iruleset.h b/src/engine/iruleset.h index a29f0f6..ea1cc74 100644 --- a/src/engine/iruleset.h +++ b/src/engine/iruleset.h @@ -48,6 +48,7 @@ class IRuleSet { virtual std::size_t takeCards(const Common::ICard *playedCard) const = 0;; virtual void hasTakenCards() = 0; + virtual std::size_t initialCardCount() const = 0; virtual bool suspendIfNoMatchingCard() const = 0; virtual bool takeIfLost() const = 0; diff --git a/src/engine/stdruleset.cpp b/src/engine/stdruleset.cpp index c64178b..2850242 100644 --- a/src/engine/stdruleset.cpp +++ b/src/engine/stdruleset.cpp @@ -88,7 +88,7 @@ bool StdRuleSet::checkCard(const NetMauMau::Player::IPlayer *player, if(accepted && playedCard->getRank() == NetMauMau::Common::ICard::SEVEN) { m_takeCardCount += 2; } else if(accepted && playedCard->getRank() == NetMauMau::Common::ICard::JACK && - (player->getCardCount() > 1 && m_curPlayers >= 2)) { + (m_curPlayers > 2 || player->getCardCount() > 1)) { m_jackSuit = player->getJackChoice(uncoveredCard ? uncoveredCard : playedCard, playedCard); m_jackMode = true; } @@ -117,6 +117,10 @@ void StdRuleSet::hasTakenCards() { m_takeCardCount = 0; } +std::size_t StdRuleSet::initialCardCount() const { + return 5; +} + bool StdRuleSet::suspendIfNoMatchingCard() const { return false; } diff --git a/src/engine/stdruleset.h b/src/engine/stdruleset.h index a03ee4b..82ff418 100644 --- a/src/engine/stdruleset.h +++ b/src/engine/stdruleset.h @@ -45,6 +45,7 @@ class StdRuleSet : public IRuleSet { virtual bool hasToSuspend() const _PURE; virtual void hasSuspended(); + virtual std::size_t initialCardCount() const _CONST; virtual bool suspendIfNoMatchingCard() const _CONST; virtual bool takeIfLost() const _CONST;