mirror of
git://git.savannah.nongnu.org/eliot.git
synced 2025-01-18 10:26:15 +01:00
New command to handle changes of the current player. This fixes history navigation in free game mode
This commit is contained in:
parent
e8cd922186
commit
8e7c61e2d8
4 changed files with 81 additions and 6 deletions
|
@ -126,7 +126,7 @@ void FreeGame::start()
|
||||||
accessNavigation().addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_currPlayer = 0;
|
firstPlayer();
|
||||||
|
|
||||||
accessNavigation().newTurn();
|
accessNavigation().newTurn();
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#define _FREEGAME_H_
|
#define _FREEGAME_H_
|
||||||
|
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include "tile.h"
|
|
||||||
|
|
||||||
class Player;
|
class Player;
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#if ENABLE_NLS
|
#if ENABLE_NLS
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
|
@ -458,14 +459,29 @@ void Game::addPlayer(Player *iPlayer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Game::firstPlayer()
|
||||||
|
{
|
||||||
|
ASSERT(getNPlayers() != 0, "Expected at least one player");
|
||||||
|
// Make sure there is something to do
|
||||||
|
if (m_currPlayer == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Command *pCmd = new CurrentPlayerCmd(*this, 0);
|
||||||
|
accessNavigation().addAndExecute(pCmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Game::prevPlayer()
|
void Game::prevPlayer()
|
||||||
{
|
{
|
||||||
ASSERT(getNPlayers() != 0, "Expected at least one player");
|
ASSERT(getNPlayers() != 0, "Expected at least one player");
|
||||||
|
|
||||||
|
unsigned int newPlayerId;
|
||||||
if (m_currPlayer == 0)
|
if (m_currPlayer == 0)
|
||||||
m_currPlayer = getNPlayers() - 1;
|
newPlayerId = getNPlayers() - 1;
|
||||||
else
|
else
|
||||||
m_currPlayer--;
|
newPlayerId = m_currPlayer - 1;
|
||||||
|
Command *pCmd = new CurrentPlayerCmd(*this, newPlayerId);
|
||||||
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -473,10 +489,13 @@ void Game::nextPlayer()
|
||||||
{
|
{
|
||||||
ASSERT(getNPlayers() != 0, "Expected at least one player");
|
ASSERT(getNPlayers() != 0, "Expected at least one player");
|
||||||
|
|
||||||
|
unsigned int newPlayerId;
|
||||||
if (m_currPlayer == getNPlayers() - 1)
|
if (m_currPlayer == getNPlayers() - 1)
|
||||||
m_currPlayer = 0;
|
newPlayerId = 0;
|
||||||
else
|
else
|
||||||
m_currPlayer++;
|
newPlayerId = m_currPlayer + 1;
|
||||||
|
Command *pCmd = new CurrentPlayerCmd(*this, newPlayerId);
|
||||||
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -552,3 +571,36 @@ int Game::checkPlayedWord(const wstring &iCoord,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Game::CurrentPlayerCmd::CurrentPlayerCmd(Game &ioGame,
|
||||||
|
unsigned int iPlayerId)
|
||||||
|
: m_game(ioGame), m_newPlayerId(iPlayerId), m_oldPlayerId(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Game::CurrentPlayerCmd::doExecute()
|
||||||
|
{
|
||||||
|
m_oldPlayerId = m_game.currPlayer();
|
||||||
|
m_game.setCurrentPlayer(m_newPlayerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Game::CurrentPlayerCmd::doUndo()
|
||||||
|
{
|
||||||
|
m_game.setCurrentPlayer(m_oldPlayerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wstring Game::CurrentPlayerCmd::toString() const
|
||||||
|
{
|
||||||
|
wostringstream oss;
|
||||||
|
oss << L"CurrentPlayerCmd (new player: " << m_newPlayerId;
|
||||||
|
if (isExecuted())
|
||||||
|
{
|
||||||
|
oss << L" old player: " << m_oldPlayerId;
|
||||||
|
}
|
||||||
|
oss << L")";
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
24
game/game.h
24
game/game.h
|
@ -29,6 +29,7 @@
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "history.h"
|
#include "history.h"
|
||||||
#include "navigation.h"
|
#include "navigation.h"
|
||||||
|
#include "command.h"
|
||||||
|
|
||||||
class Dictionary;
|
class Dictionary;
|
||||||
class Player;
|
class Player;
|
||||||
|
@ -237,6 +238,28 @@ private:
|
||||||
|
|
||||||
int m_points;
|
int m_points;
|
||||||
|
|
||||||
|
/// Change the player who is supposed to play
|
||||||
|
void setCurrentPlayer(unsigned int iPlayerId) { m_currPlayer = iPlayerId; }
|
||||||
|
|
||||||
|
/// Command used to keep track of the current player changes
|
||||||
|
class CurrentPlayerCmd: public Command
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CurrentPlayerCmd(Game &ioGame,
|
||||||
|
unsigned int iPlayerId);
|
||||||
|
|
||||||
|
virtual wstring toString() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void doExecute();
|
||||||
|
virtual void doUndo();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Game &m_game;
|
||||||
|
unsigned int m_newPlayerId;
|
||||||
|
unsigned int m_oldPlayerId;
|
||||||
|
};
|
||||||
|
|
||||||
// TODO: check what should be private and what should be protected
|
// TODO: check what should be private and what should be protected
|
||||||
protected:
|
protected:
|
||||||
/// All the players, indexed by their ID
|
/// All the players, indexed by their ID
|
||||||
|
@ -289,6 +312,7 @@ protected:
|
||||||
*/
|
*/
|
||||||
int helperSetRackManual(unsigned int p, bool iCheck, const wstring &iLetters);
|
int helperSetRackManual(unsigned int p, bool iCheck, const wstring &iLetters);
|
||||||
|
|
||||||
|
void firstPlayer();
|
||||||
void prevPlayer();
|
void prevPlayer();
|
||||||
void nextPlayer();
|
void nextPlayer();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue